From 69ba8f0c31a3988629743ffbb5de23d75e0e7a76 Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Thu, 26 Feb 2026 13:10:18 +0100 Subject: [PATCH 01/33] walletkit-db: fix sqlite-wasm-rs FFI compatibility Map close_v2 wrapper to sqlite3_close on wasm and use SQLITE_TRANSIENT() for bind blob/text destructor arguments to match sqlite-wasm-rs 0.5 signatures. Co-authored-by: otto@toolsforhumanity.com --- walletkit-db/src/ffi.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/walletkit-db/src/ffi.rs b/walletkit-db/src/ffi.rs index 03f920200..32ca5e3b8 100644 --- a/walletkit-db/src/ffi.rs +++ b/walletkit-db/src/ffi.rs @@ -515,7 +515,7 @@ mod raw { wasm::sqlite3_open_v2(filename.cast(), pp_db.cast(), flags, z_vfs.cast()) } pub unsafe fn sqlite3_close_v2(db: *mut c_void) -> c_int { - wasm::sqlite3_close_v2(db.cast()) + wasm::sqlite3_close(db.cast()) } pub unsafe fn sqlite3_exec( db: *mut c_void, @@ -567,7 +567,9 @@ mod raw { n: c_int, destructor: isize, ) -> c_int { - wasm::sqlite3_bind_blob(stmt.cast(), index, value, n, destructor) + // WASM bindings use typed destructor callbacks; all callers pass SQLITE_TRANSIENT. + let _ = destructor; + wasm::sqlite3_bind_blob(stmt.cast(), index, value, n, wasm::SQLITE_TRANSIENT()) } pub unsafe fn sqlite3_bind_text( stmt: *mut c_void, @@ -576,7 +578,9 @@ mod raw { n: c_int, destructor: isize, ) -> c_int { - wasm::sqlite3_bind_text(stmt.cast(), index, value.cast(), n, destructor) + // WASM bindings use typed destructor callbacks; all callers pass SQLITE_TRANSIENT. + let _ = destructor; + wasm::sqlite3_bind_text(stmt.cast(), index, value.cast(), n, wasm::SQLITE_TRANSIENT()) } pub unsafe fn sqlite3_bind_null(stmt: *mut c_void, index: c_int) -> c_int { wasm::sqlite3_bind_null(stmt.cast(), index) From bccaa00583863e8d903e8538e7af9c168035b0bd Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Thu, 26 Feb 2026 13:30:43 +0100 Subject: [PATCH 02/33] ci: add wasm32 walletkit-db compile check Add a dedicated CI job that installs wasm32 target, selects a wasm-capable clang, and runs cargo check for walletkit-db on wasm32-unknown-unknown. Co-authored-by: otto@toolsforhumanity.com --- .github/workflows/ci.yml | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 439dbc731..16fa7b850 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,6 +45,45 @@ jobs: - name: Run clippy (no default features) run: cargo clippy --workspace --all-targets --no-default-features -- -D warnings + wasm-check: + name: WASM walletkit-db compile check + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Set up Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: 1.92.0 + targets: wasm32-unknown-unknown + + - name: Select wasm-capable clang + shell: bash + run: | + set -euo pipefail + + CLANG_VERSION="$(clang --version | head -n1 || true)" + CLANG_MAJOR="$(echo "$CLANG_VERSION" | sed -nE 's/.*clang version ([0-9]+).*/\1/p')" + + if [ -n "$CLANG_MAJOR" ] && [ "$CLANG_MAJOR" -ge 15 ]; then + echo "Using system clang: $CLANG_VERSION" + echo "CC_wasm32_unknown_unknown=clang" >> "$GITHUB_ENV" + echo "AR_wasm32_unknown_unknown=llvm-ar" >> "$GITHUB_ENV" + else + echo "System clang is missing/too old for sqlite-wasm-rs; installing clang-18" + sudo apt-get update + sudo apt-get install -y clang-18 llvm-18 + echo "CC_wasm32_unknown_unknown=clang-18" >> "$GITHUB_ENV" + echo "AR_wasm32_unknown_unknown=llvm-ar-18" >> "$GITHUB_ENV" + fi + + - name: Run WASM compile check + run: cargo check -p walletkit-db --target wasm32-unknown-unknown + swift-build-and-test: name: Swift Build & Foreign Binding Tests runs-on: macos-14 From a213aca6e20ffcc7f6d428102008257c60c36e5f Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Thu, 26 Feb 2026 13:49:30 +0100 Subject: [PATCH 03/33] fmt --- walletkit-db/src/ffi.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/walletkit-db/src/ffi.rs b/walletkit-db/src/ffi.rs index 32ca5e3b8..605a0b5be 100644 --- a/walletkit-db/src/ffi.rs +++ b/walletkit-db/src/ffi.rs @@ -580,7 +580,13 @@ mod raw { ) -> c_int { // WASM bindings use typed destructor callbacks; all callers pass SQLITE_TRANSIENT. let _ = destructor; - wasm::sqlite3_bind_text(stmt.cast(), index, value.cast(), n, wasm::SQLITE_TRANSIENT()) + wasm::sqlite3_bind_text( + stmt.cast(), + index, + value.cast(), + n, + wasm::SQLITE_TRANSIENT(), + ) } pub unsafe fn sqlite3_bind_null(stmt: *mut c_void, index: c_int) -> c_int { wasm::sqlite3_bind_null(stmt.cast(), index) From 441ab5a7650a2cc7bffc0f005c85de1d8f0381e5 Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Thu, 26 Feb 2026 13:51:41 +0100 Subject: [PATCH 04/33] ci: make wasm archiver selection robust Detect available llvm-ar variants (or fallback to ar) instead of assuming llvm-ar is on PATH when using system clang for wasm builds. Co-authored-by: otto@toolsforhumanity.com --- .github/workflows/ci.yml | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 16fa7b850..f0140411a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -71,16 +71,34 @@ jobs: if [ -n "$CLANG_MAJOR" ] && [ "$CLANG_MAJOR" -ge 15 ]; then echo "Using system clang: $CLANG_VERSION" - echo "CC_wasm32_unknown_unknown=clang" >> "$GITHUB_ENV" - echo "AR_wasm32_unknown_unknown=llvm-ar" >> "$GITHUB_ENV" + CC_BIN="clang" else echo "System clang is missing/too old for sqlite-wasm-rs; installing clang-18" sudo apt-get update sudo apt-get install -y clang-18 llvm-18 - echo "CC_wasm32_unknown_unknown=clang-18" >> "$GITHUB_ENV" - echo "AR_wasm32_unknown_unknown=llvm-ar-18" >> "$GITHUB_ENV" + CC_BIN="clang-18" + CLANG_MAJOR="18" fi + AR_BIN="" + if command -v llvm-ar >/dev/null 2>&1; then + AR_BIN="llvm-ar" + elif [ -n "$CLANG_MAJOR" ] && command -v "llvm-ar-${CLANG_MAJOR}" >/dev/null 2>&1; then + AR_BIN="llvm-ar-${CLANG_MAJOR}" + elif command -v llvm-ar-18 >/dev/null 2>&1; then + AR_BIN="llvm-ar-18" + elif command -v ar >/dev/null 2>&1; then + AR_BIN="ar" + else + echo "No suitable archiver found for wasm build" >&2 + exit 1 + fi + + echo "Using CC: $CC_BIN" + echo "Using AR: $AR_BIN" + echo "CC_wasm32_unknown_unknown=$CC_BIN" >> "$GITHUB_ENV" + echo "AR_wasm32_unknown_unknown=$AR_BIN" >> "$GITHUB_ENV" + - name: Run WASM compile check run: cargo check -p walletkit-db --target wasm32-unknown-unknown From 3d94e7789a1262ef85cc81c96cc081e150d46c4b Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Thu, 26 Feb 2026 13:54:41 +0100 Subject: [PATCH 05/33] ci: pin wasm C toolchain to llvm 18 Co-authored-by: otto@toolsforhumanity.com --- .github/workflows/ci.yml | 44 ++++++++++------------------------------ 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f0140411a..da9d4407e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,43 +61,21 @@ jobs: toolchain: 1.92.0 targets: wasm32-unknown-unknown - - name: Select wasm-capable clang + - name: Install LLVM toolchain for WASM C build shell: bash run: | set -euo pipefail + sudo apt-get update + sudo apt-get install -y clang-18 llvm-18 - CLANG_VERSION="$(clang --version | head -n1 || true)" - CLANG_MAJOR="$(echo "$CLANG_VERSION" | sed -nE 's/.*clang version ([0-9]+).*/\1/p')" - - if [ -n "$CLANG_MAJOR" ] && [ "$CLANG_MAJOR" -ge 15 ]; then - echo "Using system clang: $CLANG_VERSION" - CC_BIN="clang" - else - echo "System clang is missing/too old for sqlite-wasm-rs; installing clang-18" - sudo apt-get update - sudo apt-get install -y clang-18 llvm-18 - CC_BIN="clang-18" - CLANG_MAJOR="18" - fi - - AR_BIN="" - if command -v llvm-ar >/dev/null 2>&1; then - AR_BIN="llvm-ar" - elif [ -n "$CLANG_MAJOR" ] && command -v "llvm-ar-${CLANG_MAJOR}" >/dev/null 2>&1; then - AR_BIN="llvm-ar-${CLANG_MAJOR}" - elif command -v llvm-ar-18 >/dev/null 2>&1; then - AR_BIN="llvm-ar-18" - elif command -v ar >/dev/null 2>&1; then - AR_BIN="ar" - else - echo "No suitable archiver found for wasm build" >&2 - exit 1 - fi - - echo "Using CC: $CC_BIN" - echo "Using AR: $AR_BIN" - echo "CC_wasm32_unknown_unknown=$CC_BIN" >> "$GITHUB_ENV" - echo "AR_wasm32_unknown_unknown=$AR_BIN" >> "$GITHUB_ENV" + - name: Configure C toolchain for wasm32 + shell: bash + run: | + set -euo pipefail + echo "CC_wasm32_unknown_unknown=clang-18" >> "$GITHUB_ENV" + echo "AR_wasm32_unknown_unknown=llvm-ar-18" >> "$GITHUB_ENV" + clang-18 --version | head -n1 + llvm-ar-18 --version | head -n1 - name: Run WASM compile check run: cargo check -p walletkit-db --target wasm32-unknown-unknown From 7e67b177745ec86dc7b40efaa83213dcd8291317 Mon Sep 17 00:00:00 2001 From: Otto Samson Date: Thu, 26 Feb 2026 15:38:13 +0000 Subject: [PATCH 06/33] refactor(walletkit-core): remove `storage` feature flag Make the SQLite-backed credential storage an always-compiled part of walletkit-core instead of an optional feature. This unifies the code path for native and future WASM builds. Changes: - Make ciborium, hkdf, rand, sha2, uuid, walletkit-db non-optional deps - Remove `storage` feature definition from walletkit-core and walletkit - Remove all `#[cfg(feature = "storage")]" gates from source and tests - Remove non-storage Authenticator constructors (the ones without paths/store params); only storage-aware constructors remain BREAKING CHANGE: Authenticator::init and Authenticator::init_with_defaults now always require Arc and Arc parameters. Co-authored-by: otto@toolsforhumanity.com --- walletkit-core/Cargo.toml | 28 +++--- walletkit-core/src/authenticator/mod.rs | 85 +------------------ walletkit-core/src/error.rs | 2 - walletkit-core/src/lib.rs | 1 - .../tests/authenticator_integration.rs | 2 - walletkit-core/tests/common.rs | 1 - .../tests/credential_storage_integration.rs | 2 - .../tests/proof_generation_integration.rs | 1 - walletkit/Cargo.toml | 6 +- 9 files changed, 16 insertions(+), 112 deletions(-) diff --git a/walletkit-core/Cargo.toml b/walletkit-core/Cargo.toml index f48bd83b5..a1e2a9e8a 100644 --- a/walletkit-core/Cargo.toml +++ b/walletkit-core/Cargo.toml @@ -27,9 +27,9 @@ backon = "1.6" base64 = { version = "0.22", optional = true } ctor = "0.2" hex = "0.4" -hkdf = { version = "0.12", optional = true } +hkdf = "0.12" log = "0.4" -rand = { version = "0.8", optional = true } +rand = "0.8" reqwest = { version = "0.12", default-features = false, features = [ "json", "brotli", @@ -42,7 +42,7 @@ secrecy = "0.10" semaphore-rs = { version = "0.5", optional = true } serde = "1" serde_json = "1" -sha2 = { version = "0.10", optional = true } +sha2 = "0.10" strum = { version = "0.27", features = ["derive"] } subtle = "2" thiserror = "2" @@ -51,7 +51,7 @@ tracing = "0.1" tracing-log = "0.2" tracing-subscriber = { version = "0.3", features = ["env-filter"] } zeroize = "1" -uuid = { version = "1.10", features = ["v4"], optional = true } +uuid = { version = "1.10", features = ["v4"] } uniffi = { workspace = true } world-id-core = { workspace = true, features = [ @@ -59,8 +59,8 @@ world-id-core = { workspace = true, features = [ "embed-zkeys", "zstd-compress-zkeys", ] } -ciborium = { version = "0.2.2", optional = true } -walletkit-db = { workspace = true, optional = true } +ciborium = "0.2.2" +walletkit-db = { workspace = true } [dev-dependencies] @@ -85,29 +85,25 @@ rand = "0.8" [features] -default = ["issuers", "storage"] +default = ["common-apps", "semaphore", "issuers"] # Enables point-compression on all verifying keys. This results in ~2x smaller bundle size, but decompression is very expensive, # using it requires proper handling to ensure decompression is done once and cached. By default walletkit-swift and walletkit-android # ship with compressed keys. But this is disabled for tests. compress-zkeys = ["world-id-core/compress-zkeys"] issuers = ["dep:base64"] -storage = [ - "dep:ciborium", - "dep:hkdf", - "dep:rand", - "dep:sha2", - "dep:uuid", - "dep:walletkit-db", -] # SECTION: V3 Feature Flags +common-apps = [] # Before conventions were introduced for external nullifiers with `app_id` & `action`, raw field elements were used. # This feature flag adds support to operate with such external nullifiers. legacy-nullifiers = [] semaphore = ["dep:semaphore-rs", "semaphore-rs/depth_30"] v3 = ["semaphore", "legacy-nullifiers", "ruint/ark-ff-04"] - [lints] workspace = true + +[package.metadata.docs.rs] +no-default-features = true +features = ["issuers"] diff --git a/walletkit-core/src/authenticator/mod.rs b/walletkit-core/src/authenticator/mod.rs index 90b03f47e..0fcee3d69 100644 --- a/walletkit-core/src/authenticator/mod.rs +++ b/walletkit-core/src/authenticator/mod.rs @@ -14,22 +14,16 @@ use world_id_core::{ InitializingAuthenticator as CoreInitializingAuthenticator, }; -#[cfg(feature = "storage")] use world_id_core::{ requests::{ProofResponse as CoreProofResponse, ResponseItem}, FieldElement as CoreFieldElement, }; -#[cfg(feature = "storage")] use crate::storage::{CredentialStore, StoragePaths}; - -#[cfg(feature = "storage")] use crate::requests::{ProofRequest, ProofResponse}; -#[cfg(feature = "storage")] use rand::rngs::OsRng; -#[cfg(feature = "storage")] mod with_storage; type Groth16Materials = ( @@ -37,29 +31,7 @@ type Groth16Materials = ( Arc, ); -#[cfg(not(feature = "storage"))] -/// Loads embedded Groth16 query/nullifier material for authenticator initialization. -/// -/// # Errors -/// Returns an error if embedded material cannot be loaded or verified. -fn load_embedded_materials() -> Result { - let query_material = - world_id_core::proof::load_embedded_query_material().map_err(|error| { - WalletKitError::Groth16MaterialEmbeddedLoad { - error: error.to_string(), - } - })?; - let nullifier_material = world_id_core::proof::load_embedded_nullifier_material() - .map_err(|error| { - WalletKitError::Groth16MaterialEmbeddedLoad { - error: error.to_string(), - } - })?; - - Ok((Arc::new(query_material), Arc::new(nullifier_material))) -} -#[cfg(feature = "storage")] /// Loads cached Groth16 query/nullifier material from the provided storage paths. /// /// # Errors @@ -79,7 +51,6 @@ fn load_cached_materials( Ok((Arc::new(query_material), Arc::new(nullifier_material))) } -#[cfg(feature = "storage")] /// Loads cached query material from zkey/graph paths. /// /// # Errors @@ -99,7 +70,6 @@ fn load_query_material_from_cache( }) } -#[cfg(feature = "storage")] #[expect( clippy::unnecessary_wraps, reason = "Temporary wrapper until world-id-core returns Result for nullifier path loader" @@ -125,7 +95,6 @@ fn load_nullifier_material_from_cache( #[derive(Debug, uniffi::Object)] pub struct Authenticator { inner: CoreAuthenticator, - #[cfg(feature = "storage")] store: Arc, } @@ -222,58 +191,6 @@ impl Authenticator { } } -#[cfg(not(feature = "storage"))] -#[uniffi::export(async_runtime = "tokio")] -impl Authenticator { - /// Initializes a new Authenticator from a seed and with SDK defaults. - /// - /// The user's World ID must already be registered in the `WorldIDRegistry`, - /// otherwise a [`WalletKitError::AccountDoesNotExist`] error will be returned. - /// - /// # Errors - /// See `CoreAuthenticator::init` for potential errors. - #[uniffi::constructor] - pub async fn init_with_defaults( - seed: &[u8], - rpc_url: Option, - environment: &Environment, - region: Option, - ) -> Result { - let config = Config::from_environment(environment, rpc_url, region)?; - let authenticator = CoreAuthenticator::init(seed, config).await?; - let (query_material, nullifier_material) = load_embedded_materials()?; - let authenticator = - authenticator.with_proof_materials(query_material, nullifier_material); - Ok(Self { - inner: authenticator, - }) - } - - /// Initializes a new Authenticator from a seed and config. - /// - /// The user's World ID must already be registered in the `WorldIDRegistry`, - /// otherwise a [`WalletKitError::AccountDoesNotExist`] error will be returned. - /// - /// # Errors - /// Will error if the provided seed is not valid or if the config is not valid. - #[uniffi::constructor] - pub async fn init(seed: &[u8], config: &str) -> Result { - let config = - Config::from_json(config).map_err(|_| WalletKitError::InvalidInput { - attribute: "config".to_string(), - reason: "Invalid config".to_string(), - })?; - let authenticator = CoreAuthenticator::init(seed, config).await?; - let (query_material, nullifier_material) = load_embedded_materials()?; - let authenticator = - authenticator.with_proof_materials(query_material, nullifier_material); - Ok(Self { - inner: authenticator, - }) - } -} - -#[cfg(feature = "storage")] #[uniffi::export(async_runtime = "tokio")] impl Authenticator { /// Initializes a new Authenticator from a seed and with SDK defaults. @@ -534,7 +451,7 @@ impl InitializingAuthenticator { } } -#[cfg(all(test, feature = "storage"))] +#[cfg(test)] mod tests { use super::*; use crate::storage::cache_embedded_groth16_material; diff --git a/walletkit-core/src/error.rs b/walletkit-core/src/error.rs index 773b68542..36c24bfc7 100644 --- a/walletkit-core/src/error.rs +++ b/walletkit-core/src/error.rs @@ -1,7 +1,6 @@ use thiserror::Error; use world_id_core::{primitives::PrimitiveError, AuthenticatorError}; -#[cfg(feature = "storage")] use crate::storage::StorageError; /// Error outputs from `WalletKit` @@ -159,7 +158,6 @@ impl From for WalletKitError { } } -#[cfg(feature = "storage")] impl From for WalletKitError { fn from(error: StorageError) -> Self { Self::Generic { diff --git a/walletkit-core/src/lib.rs b/walletkit-core/src/lib.rs index 9bbe4c3c8..2246efebe 100644 --- a/walletkit-core/src/lib.rs +++ b/walletkit-core/src/lib.rs @@ -114,7 +114,6 @@ mod credential; pub use credential::Credential; /// Credential storage primitives for World ID v4. -#[cfg(feature = "storage")] pub mod storage; mod authenticator; diff --git a/walletkit-core/tests/authenticator_integration.rs b/walletkit-core/tests/authenticator_integration.rs index 0a77c080a..7d4de74d9 100644 --- a/walletkit-core/tests/authenticator_integration.rs +++ b/walletkit-core/tests/authenticator_integration.rs @@ -1,5 +1,3 @@ -#![allow(missing_docs)] -#![cfg(feature = "storage")] mod common; diff --git a/walletkit-core/tests/common.rs b/walletkit-core/tests/common.rs index 9ef1e8f19..948afdc39 100644 --- a/walletkit-core/tests/common.rs +++ b/walletkit-core/tests/common.rs @@ -6,7 +6,6 @@ clippy::missing_panics_doc, clippy::must_use_candidate )] -#![cfg(feature = "storage")] //! Common test utilities shared across integration tests. diff --git a/walletkit-core/tests/credential_storage_integration.rs b/walletkit-core/tests/credential_storage_integration.rs index b320d8027..404172676 100644 --- a/walletkit-core/tests/credential_storage_integration.rs +++ b/walletkit-core/tests/credential_storage_integration.rs @@ -1,5 +1,3 @@ -#![allow(missing_docs)] -#![cfg(feature = "storage")] mod common; diff --git a/walletkit-core/tests/proof_generation_integration.rs b/walletkit-core/tests/proof_generation_integration.rs index def118da1..c78c424c4 100644 --- a/walletkit-core/tests/proof_generation_integration.rs +++ b/walletkit-core/tests/proof_generation_integration.rs @@ -6,7 +6,6 @@ clippy::similar_names, clippy::too_many_lines )] -#![cfg(feature = "storage")] //! End-to-end integration test for `Authenticator::generate_proof` (World ID v4) //! using **staging infrastructure** (real OPRF nodes, indexer, gateway, on-chain registries). diff --git a/walletkit/Cargo.toml b/walletkit/Cargo.toml index 21b5660c2..67061e706 100644 --- a/walletkit/Cargo.toml +++ b/walletkit/Cargo.toml @@ -21,13 +21,13 @@ name = "walletkit" [dependencies] uniffi = { workspace = true } -walletkit-core = { workspace = true } +walletkit-core = { workspace = true, features = ["legacy-nullifiers", "common-apps", "issuers"] } [features] -default = ["issuers", "storage"] +default = ["semaphore"] +semaphore = ["walletkit-core/semaphore"] compress-zkeys = ["walletkit-core/compress-zkeys"] issuers = ["walletkit-core/issuers"] -storage = ["walletkit-core/storage"] # v3 features v3 = ["walletkit-core/v3"] From b8b38e3b12522827df55962b10cca28feab23d97 Mon Sep 17 00:00:00 2001 From: Otto Samson Date: Thu, 26 Feb 2026 18:18:41 +0000 Subject: [PATCH 07/33] refactor: introduce Groth16Materials and decouple from Authenticator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the `paths: Arc` parameter in Authenticator constructors with `materials: Arc`, decoupling Groth16 material loading from authenticator initialization. Groth16Materials provides two constructors: - `from_embedded()`: loads compiled-in zkeys/graphs (all platforms) - `from_cache(paths)`: loads from filesystem cache (native only) This enables WASM builds where no filesystem is available — callers use `from_embedded()` directly instead of caching to disk first. Also gates `groth16_cache` module behind `cfg(not(wasm32))` since it depends on `std::fs`. BREAKING CHANGE: Authenticator::init and init_with_defaults now take `Arc` instead of `Arc`. Co-authored-by: otto@toolsforhumanity.com --- walletkit-core/src/authenticator/mod.rs | 169 ++++++++++-------- walletkit-core/src/lib.rs | 4 +- walletkit-core/src/storage/mod.rs | 2 + .../tests/authenticator_integration.rs | 12 +- .../tests/proof_generation_integration.rs | 16 +- 5 files changed, 118 insertions(+), 85 deletions(-) diff --git a/walletkit-core/src/authenticator/mod.rs b/walletkit-core/src/authenticator/mod.rs index 0fcee3d69..9f341fa68 100644 --- a/walletkit-core/src/authenticator/mod.rs +++ b/walletkit-core/src/authenticator/mod.rs @@ -19,47 +19,81 @@ use world_id_core::{ FieldElement as CoreFieldElement, }; -use crate::storage::{CredentialStore, StoragePaths}; use crate::requests::{ProofRequest, ProofResponse}; +use crate::storage::CredentialStore; +#[cfg(not(target_arch = "wasm32"))] +use crate::storage::StoragePaths; use rand::rngs::OsRng; mod with_storage; -type Groth16Materials = ( - Arc, - Arc, -); - - -/// Loads cached Groth16 query/nullifier material from the provided storage paths. +/// Pre-loaded Groth16 proving material (query circuit + nullifier circuit). /// -/// # Errors -/// Returns an error if cached material cannot be loaded or verified. -fn load_cached_materials( - paths: &StoragePaths, -) -> Result { - let query_zkey = paths.query_zkey_path(); - let nullifier_zkey = paths.nullifier_zkey_path(); - let query_graph = paths.query_graph_path(); - let nullifier_graph = paths.nullifier_graph_path(); - - let query_material = load_query_material_from_cache(&query_zkey, &query_graph)?; - let nullifier_material = - load_nullifier_material_from_cache(&nullifier_zkey, &nullifier_graph)?; - - Ok((Arc::new(query_material), Arc::new(nullifier_material))) +/// Construct via [`Groth16Materials::from_embedded`] (all platforms) or +/// [`Groth16Materials::from_cache`] (native only, loads from filesystem). +#[derive(Clone, uniffi::Object)] +pub struct Groth16Materials { + query: Arc, + nullifier: Arc, } -/// Loads cached query material from zkey/graph paths. -/// -/// # Errors -/// Returns an error if the cached query material cannot be loaded or verified. -fn load_query_material_from_cache( - query_zkey: &std::path::Path, - query_graph: &std::path::Path, -) -> Result { - world_id_core::proof::load_query_material_from_paths(query_zkey, query_graph) +impl std::fmt::Debug for Groth16Materials { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Groth16Materials").finish_non_exhaustive() + } +} + +#[uniffi::export] +impl Groth16Materials { + /// Loads Groth16 material from the embedded (compiled-in) zkeys and graphs. + /// + /// This works on every platform including WASM. The material is baked into + /// the binary at compile time so no filesystem access is required. + /// + /// # Errors + /// + /// Returns an error if the embedded material cannot be loaded or verified. + #[uniffi::constructor] + pub fn from_embedded() -> Result { + let query = world_id_core::proof::load_embedded_query_material().map_err( + |error| WalletKitError::Groth16MaterialEmbeddedLoad { + error: error.to_string(), + }, + )?; + let nullifier = world_id_core::proof::load_embedded_nullifier_material() + .map_err(|error| WalletKitError::Groth16MaterialEmbeddedLoad { + error: error.to_string(), + })?; + Ok(Self { + query: Arc::new(query), + nullifier: Arc::new(nullifier), + }) + } + + /// Loads Groth16 material from cached files on disk. + /// + /// Use [`cache_embedded_groth16_material`](crate::storage::cache_embedded_groth16_material) + /// to populate the cache before calling this. + /// + /// Not available on WASM (no filesystem). + /// + /// # Errors + /// + /// Returns an error if the cached files cannot be read or verified. + #[cfg(not(target_arch = "wasm32"))] + #[uniffi::constructor] + #[allow(clippy::needless_pass_by_value)] + pub fn from_cache(paths: Arc) -> Result { + let query_zkey = paths.query_zkey_path(); + let nullifier_zkey = paths.nullifier_zkey_path(); + let query_graph = paths.query_graph_path(); + let nullifier_graph = paths.nullifier_graph_path(); + + let query = world_id_core::proof::load_query_material_from_paths( + &query_zkey, + &query_graph, + ) .map_err(|error| WalletKitError::Groth16MaterialCacheInvalid { path: format!( "{} and {}", @@ -67,28 +101,20 @@ fn load_query_material_from_cache( query_graph.to_string_lossy() ), error: error.to_string(), - }) -} + })?; -#[expect( - clippy::unnecessary_wraps, - reason = "Temporary wrapper until world-id-core returns Result for nullifier path loader" -)] -/// Loads cached nullifier material from zkey/graph paths. -/// -/// # Errors -/// This currently mirrors a panicking upstream API and does not return an error path yet. -/// It is intentionally wrapped in `Result` for forward compatibility with upstream. -fn load_nullifier_material_from_cache( - nullifier_zkey: &std::path::Path, - nullifier_graph: &std::path::Path, -) -> Result { - // TODO: Switch to error mapping once world-id-core exposes - // `load_nullifier_material_from_paths` as `Result` instead of panicking. - Ok(world_id_core::proof::load_nullifier_material_from_paths( - nullifier_zkey, - nullifier_graph, - )) + // TODO: Switch to error mapping once world-id-core exposes + // `load_nullifier_material_from_paths` as `Result` instead of panicking. + let nullifier = world_id_core::proof::load_nullifier_material_from_paths( + &nullifier_zkey, + &nullifier_graph, + ); + + Ok(Self { + query: Arc::new(query), + nullifier: Arc::new(nullifier), + }) + } } /// The Authenticator is the main component with which users interact with the World ID Protocol. @@ -206,14 +232,17 @@ impl Authenticator { rpc_url: Option, environment: &Environment, region: Option, - paths: &StoragePaths, + materials: Arc, store: Arc, ) -> Result { let config = Config::from_environment(environment, rpc_url, region)?; - let authenticator = CoreAuthenticator::init(seed, config).await?; - let (query_material, nullifier_material) = load_cached_materials(paths)?; - let authenticator = - authenticator.with_proof_materials(query_material, nullifier_material); + let authenticator = CoreAuthenticator::init( + seed, + config, + Arc::clone(&materials.query), + Arc::clone(&materials.nullifier), + ) + .await?; Ok(Self { inner: authenticator, store, @@ -231,7 +260,7 @@ impl Authenticator { pub async fn init( seed: &[u8], config: &str, - paths: &StoragePaths, + materials: Arc, store: Arc, ) -> Result { let config = @@ -239,11 +268,13 @@ impl Authenticator { attribute: "config".to_string(), reason: "Invalid config".to_string(), })?; - - let authenticator = CoreAuthenticator::init(seed, config).await?; - let (query_material, nullifier_material) = load_cached_materials(paths)?; - let authenticator = - authenticator.with_proof_materials(query_material, nullifier_material); + let authenticator = CoreAuthenticator::init( + seed, + config, + Arc::clone(&materials.query), + Arc::clone(&materials.nullifier), + ) + .await?; Ok(Self { inner: authenticator, store, @@ -454,14 +485,13 @@ impl InitializingAuthenticator { #[cfg(test)] mod tests { use super::*; - use crate::storage::cache_embedded_groth16_material; use crate::storage::tests_utils::{ cleanup_test_storage, temp_root_path, InMemoryStorageProvider, }; use alloy::primitives::address; #[tokio::test] - async fn test_init_with_config_and_storage() { + async fn test_init_with_config_and_materials() { // Install default crypto provider for rustls let _ = rustls::crypto::ring::default_provider().install_default(); @@ -500,11 +530,10 @@ mod tests { let provider = InMemoryStorageProvider::new(&root); let store = CredentialStore::from_provider(&provider).expect("store"); store.init(42, 100).expect("init storage"); - cache_embedded_groth16_material(&store.storage_paths().expect("paths")) - .expect("cache material"); - let paths = store.storage_paths().expect("paths"); - Authenticator::init(&seed, &config, &paths, Arc::new(store)) + let materials = + Arc::new(Groth16Materials::from_embedded().expect("load materials")); + Authenticator::init(&seed, &config, materials, Arc::new(store)) .await .unwrap(); drop(mock_server); diff --git a/walletkit-core/src/lib.rs b/walletkit-core/src/lib.rs index 2246efebe..1eb1dc3b4 100644 --- a/walletkit-core/src/lib.rs +++ b/walletkit-core/src/lib.rs @@ -117,7 +117,9 @@ pub use credential::Credential; pub mod storage; mod authenticator; -pub use authenticator::{Authenticator, InitializingAuthenticator, RegistrationStatus}; +pub use authenticator::{ + Authenticator, Groth16Materials, InitializingAuthenticator, RegistrationStatus, +}; /// Default configuration values for each [`Environment`]. pub mod defaults; diff --git a/walletkit-core/src/storage/mod.rs b/walletkit-core/src/storage/mod.rs index c24caacab..67e42f0b2 100644 --- a/walletkit-core/src/storage/mod.rs +++ b/walletkit-core/src/storage/mod.rs @@ -4,6 +4,7 @@ pub mod cache; pub mod credential_storage; pub mod envelope; pub mod error; +#[cfg(not(target_arch = "wasm32"))] pub mod groth16_cache; pub mod keys; pub mod lock; @@ -15,6 +16,7 @@ pub mod vault; pub use cache::CacheDb; pub use credential_storage::CredentialStore; pub use error::{StorageError, StorageResult}; +#[cfg(not(target_arch = "wasm32"))] pub use groth16_cache::cache_embedded_groth16_material; pub use keys::StorageKeys; pub use lock::{StorageLock, StorageLockGuard}; diff --git a/walletkit-core/tests/authenticator_integration.rs b/walletkit-core/tests/authenticator_integration.rs index 7d4de74d9..cdbf0f6c4 100644 --- a/walletkit-core/tests/authenticator_integration.rs +++ b/walletkit-core/tests/authenticator_integration.rs @@ -7,8 +7,7 @@ use alloy::providers::ProviderBuilder; use alloy::signers::local::PrivateKeySigner; use walletkit_core::defaults::STAGING_WORLD_ID_REGISTRY; use walletkit_core::error::WalletKitError; -use walletkit_core::storage::cache_embedded_groth16_material; -use walletkit_core::{Authenticator, Environment}; +use walletkit_core::{Authenticator, Environment, Groth16Materials}; use world_id_core::world_id_registry::WorldIdRegistry; fn setup_anvil() -> AnvilInstance { @@ -34,8 +33,9 @@ async fn test_authenticator_integration() { let authenticator_seeder = PrivateKeySigner::random(); let store = common::create_test_credential_store(); - let paths = store.storage_paths().unwrap(); - cache_embedded_groth16_material(&paths).expect("cache groth16 material"); + let materials = std::sync::Arc::new( + Groth16Materials::from_embedded().expect("load groth16 materials"), + ); // When account doesn't exist, this should fail let authenticator = Authenticator::init_with_defaults( @@ -43,7 +43,7 @@ async fn test_authenticator_integration() { Some(anvil.endpoint()), &Environment::Staging, None, - &paths, + materials.clone(), store.clone(), ) .await @@ -79,7 +79,7 @@ async fn test_authenticator_integration() { Some(anvil.endpoint()), &Environment::Staging, None, - &paths, + materials, store, ) .await diff --git a/walletkit-core/tests/proof_generation_integration.rs b/walletkit-core/tests/proof_generation_integration.rs index c78c424c4..adcdcab4c 100644 --- a/walletkit-core/tests/proof_generation_integration.rs +++ b/walletkit-core/tests/proof_generation_integration.rs @@ -33,9 +33,8 @@ use alloy::sol; use alloy_primitives::U160; use eyre::{Context as _, Result}; use taceo_oprf::types::OprfKeyId; -use walletkit_core::storage::cache_embedded_groth16_material; -use walletkit_core::{defaults::DefaultConfig, Authenticator, Environment}; -use world_id_core::primitives::{rp::RpId, FieldElement, Nullifier}; +use walletkit_core::{defaults::DefaultConfig, Authenticator, Environment, Groth16Materials}; +use world_id_core::primitives::{rp::RpId, FieldElement}; use world_id_core::{ requests::{ProofRequest, RequestItem, RequestVersion}, Authenticator as CoreAuthenticator, EdDSAPrivateKey, @@ -143,16 +142,17 @@ async fn e2e_authenticator_generate_proof() -> Result<()> { // Phase 2: Authenticator init with walletkit wrapper // ---------------------------------------------------------------- let store = common::create_test_credential_store(); - let paths = store.storage_paths().wrap_err("storage_paths failed")?; - cache_embedded_groth16_material(&paths) - .wrap_err("cache_embedded_groth16_material failed")?; + let materials = Arc::new( + Groth16Materials::from_embedded() + .wrap_err("failed to load embedded groth16 materials")?, + ); let authenticator = Authenticator::init_with_defaults( &seed, Some(rpc_url.clone()), &Environment::Staging, None, - &paths, + materials, store.clone(), ) .await @@ -265,7 +265,7 @@ async fn e2e_authenticator_generate_proof() -> Result<()> { let nullifier = response_item .nullifier .expect("uniqueness proof should have nullifier"); - assert_ne!(nullifier, Nullifier::new(FieldElement::ZERO)); // TODO: Add `Nullifier::ZERO` + assert_ne!(nullifier, FieldElement::ZERO); eprintln!("Phase 4 complete: proof generated (nullifier={nullifier:?})"); From 0119cb7f20f614069bf77ae5ba1c67544b984fb8 Mon Sep 17 00:00:00 2001 From: Otto Samson Date: Fri, 27 Feb 2026 14:14:08 +0000 Subject: [PATCH 08/33] feat: enable wasm32-unknown-unknown compilation Platform-gate all native-only dependencies and uniffi attributes for WASM compatibility. Both `walletkit-core` and `walletkit` now compile cleanly for `wasm32-unknown-unknown`. Key changes: - Gate `uniffi::` derives/attributes with `cfg_attr(not(wasm32), ...)` across all public types (~17 source files). uniffi requires Send which is unavailable on WASM's single-threaded model. - Move `ctor`, `reqwest[rustls-tls,brotli]`, `rustls` to native-only deps. Base `reqwest` kept with just `json` feature (WASM-compatible). - Gate `groth16_cache` module (uses std::fs), `generate_proof` (uses SystemTime), `fetch_inclusion_proof_with_cache` for non-WASM. - Gate `is_connect()` check in http_request.rs (requires hyper, native only). - Add WASM no-op doc comments on storage lock methods. Depends on upstream WASM-compat PRs: - worldcoin/world-id-protocol#512 (authenticator + proof crate gating) - TaceoLabs/oprf-service#488 (gloo-net WebSocket transport for OPRF) - worldcoin/semaphore-rs#131 (mmap-rs + lazy tree gating) Uses `[patch.crates-io]` git refs pointing to those PR branches until they are merged and released. Co-authored-by: otto@toolsforhumanity.com --- Cargo.toml | 17 ++++++++ walletkit-core/Cargo.toml | 17 ++++---- walletkit-core/src/authenticator/mod.rs | 42 +++++++++++-------- .../src/authenticator/with_storage.rs | 18 +++++--- walletkit-core/src/credential.rs | 7 ++-- walletkit-core/src/error.rs | 3 +- walletkit-core/src/field_element.rs | 11 ++--- walletkit-core/src/http_request.rs | 6 ++- walletkit-core/src/issuers/tfh_nfc.rs | 8 ++-- walletkit-core/src/lib.rs | 13 +++--- walletkit-core/src/logger.rs | 7 ++-- walletkit-core/src/requests.rs | 12 +++--- walletkit-core/src/storage/groth16_cache.rs | 2 +- walletkit-core/src/storage/lock.rs | 3 ++ walletkit-core/src/v3/common_apps.rs | 6 +-- walletkit-core/src/v3/credential_type.rs | 13 +----- walletkit-core/src/v3/merkle_tree.rs | 9 ++-- walletkit-core/src/v3/proof.rs | 22 +++++----- walletkit-core/src/v3/world_id.rs | 7 ++-- .../tests/authenticator_integration.rs | 1 - .../tests/credential_storage_integration.rs | 1 - .../tests/proof_generation_integration.rs | 4 +- walletkit/Cargo.toml | 4 +- walletkit/src/lib.rs | 2 + 24 files changed, 141 insertions(+), 94 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ea2552f46..b66a90fb6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,6 +37,23 @@ nursery = { level = "deny", priority = -1 } missing_docs = "deny" dead_code = "deny" +# Temporary patches for WASM compatibility (until upstream releases) +[patch.crates-io] +# WASM compat: https://github.com/worldcoin/world-id-protocol/pull/512 +world-id-core = { git = "https://github.com/worldcoin/world-id-protocol.git", branch = "main" } +world-id-authenticator = { git = "https://github.com/worldcoin/world-id-protocol.git", branch = "main" } +world-id-primitives = { git = "https://github.com/worldcoin/world-id-protocol.git", branch = "main" } +world-id-proof = { git = "https://github.com/worldcoin/world-id-protocol.git", branch = "main" } +# WASM compat: https://github.com/TaceoLabs/oprf-service/pull/488 +taceo-oprf = { git = "https://github.com/Dzejkop/oprf-service.git", branch = "feat/wasm-compat" } +taceo-oprf-client = { git = "https://github.com/Dzejkop/oprf-service.git", branch = "feat/wasm-compat" } +taceo-oprf-core = { git = "https://github.com/Dzejkop/oprf-service.git", branch = "feat/wasm-compat" } +taceo-oprf-types = { git = "https://github.com/Dzejkop/oprf-service.git", branch = "feat/wasm-compat" } +# WASM compat: https://github.com/worldcoin/semaphore-rs/pull/131 +semaphore-rs = { git = "https://github.com/worldcoin/semaphore-rs.git", branch = "feat/wasm-compat" } +semaphore-rs-storage = { git = "https://github.com/worldcoin/semaphore-rs.git", branch = "feat/wasm-compat" } +semaphore-rs-trees = { git = "https://github.com/worldcoin/semaphore-rs.git", branch = "feat/wasm-compat" } + [profile.release] opt-level = 'z' # Optimize for size. lto = true # Enable Link Time Optimization. diff --git a/walletkit-core/Cargo.toml b/walletkit-core/Cargo.toml index a1e2a9e8a..e0e2829f1 100644 --- a/walletkit-core/Cargo.toml +++ b/walletkit-core/Cargo.toml @@ -25,19 +25,13 @@ alloy-core = { workspace = true } alloy-primitives = { workspace = true } backon = "1.6" base64 = { version = "0.22", optional = true } -ctor = "0.2" hex = "0.4" hkdf = "0.12" log = "0.4" rand = "0.8" -reqwest = { version = "0.12", default-features = false, features = [ - "json", - "brotli", - "rustls-tls", -] } +reqwest = { version = "0.12", default-features = false, features = ["json"] } ruint = { version = "1.17", default-features = false, features = ["alloc"] } ruint-uniffi = { version = "0.1", features = ["serde"] } -rustls = { version = "0.23", features = ["ring"] } secrecy = "0.10" semaphore-rs = { version = "0.5", optional = true } serde = "1" @@ -53,7 +47,7 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } zeroize = "1" uuid = { version = "1.10", features = ["v4"] } uniffi = { workspace = true } - +taceo-oprf = { version = "0.7", default-features = false, features = ["client"] } world-id-core = { workspace = true, features = [ "authenticator", "embed-zkeys", @@ -63,6 +57,13 @@ ciborium = "0.2.2" walletkit-db = { workspace = true } +# Native-only dependencies (not available on wasm32) +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +ctor = "0.2" +reqwest = { version = "0.12", default-features = false, features = ["brotli", "rustls-tls"] } +rustls = { version = "0.23", features = ["ring"] } +uniffi = { workspace = true, features = ["build", "tokio"] } + [dev-dependencies] alloy = { version = "1", default-features = false, features = [ "getrandom", diff --git a/walletkit-core/src/authenticator/mod.rs b/walletkit-core/src/authenticator/mod.rs index 9f341fa68..f47c42d61 100644 --- a/walletkit-core/src/authenticator/mod.rs +++ b/walletkit-core/src/authenticator/mod.rs @@ -32,7 +32,8 @@ mod with_storage; /// /// Construct via [`Groth16Materials::from_embedded`] (all platforms) or /// [`Groth16Materials::from_cache`] (native only, loads from filesystem). -#[derive(Clone, uniffi::Object)] +#[derive(Clone)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] pub struct Groth16Materials { query: Arc, nullifier: Arc, @@ -44,7 +45,7 @@ impl std::fmt::Debug for Groth16Materials { } } -#[uniffi::export] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] impl Groth16Materials { /// Loads Groth16 material from the embedded (compiled-in) zkeys and graphs. /// @@ -54,13 +55,14 @@ impl Groth16Materials { /// # Errors /// /// Returns an error if the embedded material cannot be loaded or verified. - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub fn from_embedded() -> Result { - let query = world_id_core::proof::load_embedded_query_material().map_err( - |error| WalletKitError::Groth16MaterialEmbeddedLoad { - error: error.to_string(), - }, - )?; + let query = + world_id_core::proof::load_embedded_query_material().map_err(|error| { + WalletKitError::Groth16MaterialEmbeddedLoad { + error: error.to_string(), + } + })?; let nullifier = world_id_core::proof::load_embedded_nullifier_material() .map_err(|error| WalletKitError::Groth16MaterialEmbeddedLoad { error: error.to_string(), @@ -118,13 +120,14 @@ impl Groth16Materials { } /// The Authenticator is the main component with which users interact with the World ID Protocol. -#[derive(Debug, uniffi::Object)] +#[derive(Debug)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] pub struct Authenticator { inner: CoreAuthenticator, store: Arc, } -#[uniffi::export(async_runtime = "tokio")] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(async_runtime = "tokio"))] impl Authenticator { /// Returns the packed account data for the holder's World ID. /// @@ -178,6 +181,7 @@ impl Authenticator { /// /// - Will generally error if there are network issues or if the OPRF Nodes return an error. /// - Raises an error if the OPRF Nodes configuration is not correctly set. + #[cfg(not(target_arch = "wasm32"))] pub async fn generate_credential_blinding_factor_remote( &self, issuer_schema_id: u64, @@ -217,7 +221,7 @@ impl Authenticator { } } -#[uniffi::export(async_runtime = "tokio")] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(async_runtime = "tokio"))] impl Authenticator { /// Initializes a new Authenticator from a seed and with SDK defaults. /// @@ -226,7 +230,7 @@ impl Authenticator { /// /// # Errors /// See `CoreAuthenticator::init` for potential errors. - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub async fn init_with_defaults( seed: &[u8], rpc_url: Option, @@ -256,7 +260,7 @@ impl Authenticator { /// /// # Errors /// Will error if the provided seed is not valid or if the config is not valid. - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub async fn init( seed: &[u8], config: &str, @@ -285,6 +289,7 @@ impl Authenticator { /// /// # Errors /// Returns an error if proof generation fails. + #[cfg(not(target_arch = "wasm32"))] pub async fn generate_proof( &self, proof_request: &ProofRequest, @@ -375,7 +380,8 @@ impl Authenticator { } /// Registration status for a World ID being created through the gateway. -#[derive(Debug, Clone, uniffi::Enum)] +#[derive(Debug, Clone)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Enum))] pub enum RegistrationStatus { /// Request queued but not yet batched. Queued, @@ -413,10 +419,10 @@ impl From for RegistrationStatus { /// /// The account is not yet registered in the `WorldIDRegistry` contract. /// Use this for non-blocking registration flows where you want to poll the status yourself. -#[derive(uniffi::Object)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] pub struct InitializingAuthenticator(CoreInitializingAuthenticator); -#[uniffi::export(async_runtime = "tokio")] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(async_runtime = "tokio"))] impl InitializingAuthenticator { /// Registers a new World ID with SDK defaults. /// @@ -425,7 +431,7 @@ impl InitializingAuthenticator { /// /// # Errors /// See `CoreAuthenticator::register` for potential errors. - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub async fn register_with_defaults( seed: &[u8], rpc_url: Option, @@ -451,7 +457,7 @@ impl InitializingAuthenticator { /// /// # Errors /// See `CoreAuthenticator::register` for potential errors. - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub async fn register( seed: &[u8], config: &str, diff --git a/walletkit-core/src/authenticator/with_storage.rs b/walletkit-core/src/authenticator/with_storage.rs index 72e30f943..bfabd9214 100644 --- a/walletkit-core/src/authenticator/with_storage.rs +++ b/walletkit-core/src/authenticator/with_storage.rs @@ -1,16 +1,21 @@ +use crate::error::WalletKitError; + +use super::Authenticator; + +#[cfg(not(target_arch = "wasm32"))] use serde::{Deserialize, Serialize}; +#[cfg(not(target_arch = "wasm32"))] use world_id_core::primitives::authenticator::AuthenticatorPublicKeySet; +#[cfg(not(target_arch = "wasm32"))] use world_id_core::primitives::merkle::MerkleInclusionProof; +#[cfg(not(target_arch = "wasm32"))] use world_id_core::primitives::TREE_DEPTH; -use crate::error::WalletKitError; - -use super::Authenticator; - /// The amount of time a Merkle inclusion proof remains valid in the cache. +#[cfg(not(target_arch = "wasm32"))] const MERKLE_PROOF_VALIDITY_SECONDS: u64 = 60 * 15; -#[uniffi::export] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] impl Authenticator { /// Initializes storage using the authenticator's leaf index. /// @@ -23,6 +28,7 @@ impl Authenticator { } } +#[cfg(not(target_arch = "wasm32"))] impl Authenticator { /// Fetches a [`MerkleInclusionProof`] from the indexer, or from cache if it's available and fresh. /// @@ -65,12 +71,14 @@ impl Authenticator { } } +#[cfg(not(target_arch = "wasm32"))] #[derive(Debug, Clone, Serialize, Deserialize)] struct CachedInclusionProof { inclusion_proof: MerkleInclusionProof, authenticator_keyset: AuthenticatorPublicKeySet, } +#[cfg(not(target_arch = "wasm32"))] impl CachedInclusionProof { fn serialize(&self) -> Result, WalletKitError> { let mut bytes = Vec::new(); diff --git a/walletkit-core/src/credential.rs b/walletkit-core/src/credential.rs index e478c7e48..96f8f9a73 100644 --- a/walletkit-core/src/credential.rs +++ b/walletkit-core/src/credential.rs @@ -11,17 +11,18 @@ use crate::FieldElement; /// /// Encapsulates the credential and exposes accessors for fields that FFI /// callers need. -#[derive(Debug, Clone, uniffi::Object)] +#[derive(Debug, Clone)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] pub struct Credential(CoreCredential); -#[uniffi::export] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] impl Credential { /// Deserializes a `Credential` from a JSON byte blob. /// /// # Errors /// /// Returns an error if the bytes cannot be deserialized. - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] #[allow(clippy::needless_pass_by_value)] pub fn from_bytes(bytes: Vec) -> Result { let credential: CoreCredential = diff --git a/walletkit-core/src/error.rs b/walletkit-core/src/error.rs index 36c24bfc7..5acdde126 100644 --- a/walletkit-core/src/error.rs +++ b/walletkit-core/src/error.rs @@ -4,7 +4,8 @@ use world_id_core::{primitives::PrimitiveError, AuthenticatorError}; use crate::storage::StorageError; /// Error outputs from `WalletKit` -#[derive(Debug, Error, uniffi::Error)] +#[derive(Debug, Error)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Error))] pub enum WalletKitError { /// Invalid input provided (e.g., incorrect length, format, etc.) #[error("invalid_input_{attribute}")] diff --git a/walletkit-core/src/field_element.rs b/walletkit-core/src/field_element.rs index 2ea02aade..5fea33bd7 100644 --- a/walletkit-core/src/field_element.rs +++ b/walletkit-core/src/field_element.rs @@ -15,17 +15,18 @@ use crate::error::WalletKitError; /// /// Field elements are typically 32 bytes when serialized. #[allow(clippy::module_name_repetitions)] -#[derive(Debug, Clone, uniffi::Object)] +#[derive(Debug, Clone)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] pub struct FieldElement(pub CoreFieldElement); -#[uniffi::export] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] impl FieldElement { /// Creates a `FieldElement` from raw bytes (big-endian). /// /// # Errors /// /// Returns an error if the bytes cannot be deserialized into a valid field element. - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub fn from_bytes(bytes: Vec) -> Result { let len = bytes.len(); let val: [u8; 32] = @@ -42,7 +43,7 @@ impl FieldElement { /// /// This is useful for testing or when working with small field element values. #[must_use] - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub fn from_u64(value: u64) -> Self { Self(CoreFieldElement::from(value)) } @@ -62,7 +63,7 @@ impl FieldElement { /// # Errors /// /// Returns an error if the hex string is invalid or cannot be parsed. - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub fn try_from_hex_string(hex_string: &str) -> Result { let fe = CoreFieldElement::from_str(hex_string)?; Ok(Self(fe)) diff --git a/walletkit-core/src/http_request.rs b/walletkit-core/src/http_request.rs index 233e22079..5c1d8ac9f 100644 --- a/walletkit-core/src/http_request.rs +++ b/walletkit-core/src/http_request.rs @@ -153,7 +153,11 @@ async fn execute_request_builder( Ok(resp) } Err(err) => { - if err.is_timeout() || err.is_connect() { + #[cfg(not(target_arch = "wasm32"))] + let is_retryable = err.is_timeout() || err.is_connect(); + #[cfg(target_arch = "wasm32")] + let is_retryable = err.is_timeout(); + if is_retryable { return Err(RequestHandleError::retryable( url, None, diff --git a/walletkit-core/src/issuers/tfh_nfc.rs b/walletkit-core/src/issuers/tfh_nfc.rs index 8864f70cc..df6ba6d79 100644 --- a/walletkit-core/src/issuers/tfh_nfc.rs +++ b/walletkit-core/src/issuers/tfh_nfc.rs @@ -35,16 +35,16 @@ impl NfcRefreshResultRaw { } /// TFH NFC credential issuer API client -#[derive(uniffi::Object)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] pub struct TfhNfcIssuer { base_url: String, request: Request, } -#[uniffi::export] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] impl TfhNfcIssuer { /// Create a new TFH NFC issuer for the specified environment - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] #[must_use] pub fn new(environment: &Environment) -> Self { let base_url = match environment { @@ -60,7 +60,7 @@ impl TfhNfcIssuer { } } -#[uniffi::export(async_runtime = "tokio")] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(async_runtime = "tokio"))] impl TfhNfcIssuer { /// Refresh an NFC credential (migrate PCP to v4). /// diff --git a/walletkit-core/src/lib.rs b/walletkit-core/src/lib.rs index 1eb1dc3b4..348fefbc8 100644 --- a/walletkit-core/src/lib.rs +++ b/walletkit-core/src/lib.rs @@ -50,7 +50,9 @@ use strum::{Display, EnumString}; /// Installs the ring crypto provider as the default for rustls. /// Uses the `ctor` crate to ensure this runs when the dynamic library loads, /// before any user code executes. -#[cfg(not(test))] +/// +/// On WASM targets, rustls is not used (reqwest uses the browser fetch API). +#[cfg(all(not(test), not(target_arch = "wasm32")))] #[ctor::ctor] fn init() { rustls::crypto::ring::default_provider() @@ -63,7 +65,8 @@ fn init() { /// Each environment uses different sources of truth for the World ID credentials. /// /// More information on testing for the World ID Protocol can be found in: `https://docs.world.org/world-id/quick-start/testing` -#[derive(Debug, Clone, PartialEq, Eq, EnumString, uniffi::Enum)] +#[derive(Debug, Clone, PartialEq, Eq, EnumString)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Enum))] #[strum(serialize_all = "lowercase")] pub enum Environment { /// For testing purposes ONLY. @@ -87,9 +90,8 @@ impl Environment { } /// Region for node selection. -#[derive( - Debug, Clone, Copy, PartialEq, Eq, Default, uniffi::Enum, EnumString, Display, -)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, EnumString, Display)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Enum))] #[strum(serialize_all = "lowercase")] pub enum Region { /// United States @@ -154,6 +156,7 @@ pub mod v3; mod http_request; pub(crate) mod primitives; +#[cfg(not(target_arch = "wasm32"))] uniffi::setup_scaffolding!("walletkit_core"); ruint_uniffi::register_types!(Uint256); diff --git a/walletkit-core/src/logger.rs b/walletkit-core/src/logger.rs index 6603a396d..790e8f1c1 100644 --- a/walletkit-core/src/logger.rs +++ b/walletkit-core/src/logger.rs @@ -57,14 +57,15 @@ use tracing_subscriber::{ /// /// WalletKit.initLogging(logger: WalletKitLoggerBridge.shared, level: .debug) /// ``` -#[uniffi::export(with_foreign)] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(with_foreign))] pub trait Logger: Sync + Send { /// Receives a log `message` with its corresponding `level`. fn log(&self, level: LogLevel, message: String); } /// Enumeration of possible log levels for foreign logger callbacks. -#[derive(Debug, Clone, Copy, uniffi::Enum)] +#[derive(Debug, Clone, Copy)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Enum))] pub enum LogLevel { /// Very detailed diagnostic messages. Trace, @@ -258,7 +259,7 @@ pub fn emit_log(level: LogLevel, message: String) { /// # Panics /// /// Panics if the dedicated logger delivery thread cannot be spawned. -#[uniffi::export] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] pub fn init_logging(logger: Arc, level: Option) { if LOGGING_INITIALIZED.get().is_some() { return; diff --git a/walletkit-core/src/requests.rs b/walletkit-core/src/requests.rs index e1f0959a7..cfd91c5b3 100644 --- a/walletkit-core/src/requests.rs +++ b/walletkit-core/src/requests.rs @@ -6,16 +6,17 @@ use crate::error::WalletKitError; /// A request from the RP to the Authenticator. See [`CoreProofRequest`] for more details. /// This is a wrapper type to expose to foreign language bindings. -#[derive(Debug, Clone, uniffi::Object)] +#[derive(Debug, Clone)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] pub struct ProofRequest(pub(crate) CoreProofRequest); -#[uniffi::export] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] impl ProofRequest { /// Deserializes a `ProofRequest` from a JSON string. /// /// # Errors /// Returns an error if the JSON is invalid or cannot be parsed. - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub fn from_json(json: &str) -> Result { let core_request: CoreProofRequest = serde_json::from_str(json).map_err(|e| WalletKitError::Generic { @@ -50,10 +51,11 @@ impl ProofRequest { /// A response from the Authenticator to the RP. See [`CoreProofResponse`] for more details. /// /// This is a wrapper type to expose to foreign language bindings. -#[derive(Debug, Clone, uniffi::Object)] +#[derive(Debug, Clone)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] pub struct ProofResponse(pub CoreProofResponse); -#[uniffi::export] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] impl ProofResponse { /// Serializes the proof response to a JSON string. /// diff --git a/walletkit-core/src/storage/groth16_cache.rs b/walletkit-core/src/storage/groth16_cache.rs index 06e05474b..9b57f15e3 100644 --- a/walletkit-core/src/storage/groth16_cache.rs +++ b/walletkit-core/src/storage/groth16_cache.rs @@ -17,7 +17,7 @@ use super::{StorageError, StoragePaths, StorageResult}; /// # Errors /// /// Returns an error if embedded material cannot be loaded or cache files cannot be written. -#[uniffi::export] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] #[allow(clippy::needless_pass_by_value)] pub fn cache_embedded_groth16_material(paths: &StoragePaths) -> StorageResult<()> { if has_valid_cached_material(paths)? { diff --git a/walletkit-core/src/storage/lock.rs b/walletkit-core/src/storage/lock.rs index 25fdb7a90..8a36f1b15 100644 --- a/walletkit-core/src/storage/lock.rs +++ b/walletkit-core/src/storage/lock.rs @@ -26,14 +26,17 @@ mod imp { pub struct StorageLockGuard; impl StorageLock { + /// Opens a no-op lock (WASM is single-threaded). pub fn open(_path: &Path) -> StorageResult { Ok(Self) } + /// Acquires a no-op lock (always succeeds). pub fn lock(&self) -> StorageResult { Ok(StorageLockGuard) } + /// Attempts to acquire a no-op lock (always succeeds). pub fn try_lock(&self) -> StorageResult> { Ok(Some(StorageLockGuard)) } diff --git a/walletkit-core/src/v3/common_apps.rs b/walletkit-core/src/v3/common_apps.rs index 2e9658c1a..ff92b9345 100644 --- a/walletkit-core/src/v3/common_apps.rs +++ b/walletkit-core/src/v3/common_apps.rs @@ -15,7 +15,7 @@ use { /// /// The contract of the address book can be found at: `0x57b930d551e677cc36e2fa036ae2fe8fdae0330d` #[cfg(feature = "legacy-nullifiers")] -#[derive(uniffi::Object)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] pub struct AddressBook {} /// The external nullifier used in the `WorldIDAddressBook` contract. @@ -35,10 +35,10 @@ impl Default for AddressBook { } #[cfg(feature = "legacy-nullifiers")] -#[uniffi::export] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] impl AddressBook { /// Initializes a new `AddressBook` instance. - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] #[must_use] pub const fn new() -> Self { Self {} diff --git a/walletkit-core/src/v3/credential_type.rs b/walletkit-core/src/v3/credential_type.rs index 556bcadf6..270231885 100644 --- a/walletkit-core/src/v3/credential_type.rs +++ b/walletkit-core/src/v3/credential_type.rs @@ -10,18 +10,9 @@ use crate::Environment; /// /// More details in `https://docs.world.org/world-id/concepts#proof-of-personhood` #[derive( - Debug, - Clone, - Copy, - PartialEq, - Eq, - EnumString, - Hash, - Display, - Serialize, - Deserialize, - uniffi::Enum, + Debug, Clone, Copy, PartialEq, Eq, EnumString, Hash, Display, Serialize, Deserialize, )] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Enum))] #[strum(serialize_all = "snake_case")] #[serde(rename_all = "snake_case")] pub enum CredentialType { diff --git a/walletkit-core/src/v3/merkle_tree.rs b/walletkit-core/src/v3/merkle_tree.rs index 8f4ebfc93..c8ac9d199 100644 --- a/walletkit-core/src/v3/merkle_tree.rs +++ b/walletkit-core/src/v3/merkle_tree.rs @@ -23,7 +23,8 @@ struct InclusionProofResponse { const CREDENTIAL_NOT_ISSUED_RESPONSE: &str = "provided identity commitment not found"; const MINED_STATUS: &str = "mined"; // https://github.com/worldcoin/signup-sequencer/blob/f6050fbb3131ee6a61b2f44db3813f9150a045f5/schemas/openapi.yaml#L163 -#[derive(Debug, uniffi::Object)] +#[derive(Debug)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] #[allow(clippy::module_name_repetitions)] pub struct MerkleTreeProof { poseidon_proof: Proof, @@ -38,14 +39,14 @@ impl MerkleTreeProof { } } -#[uniffi::export] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] impl MerkleTreeProof { /// Retrieves a Merkle inclusion proof from the sign up sequencer for a given identity commitment. /// Each credential/environment pair uses a different sign up sequencer. /// /// # Errors /// Will throw an error if the request fails or parsing the response fails. - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub async fn from_identity_commitment( identity_commitment: &Uint256, sequencer_host: &str, @@ -99,7 +100,7 @@ impl MerkleTreeProof { } } - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub fn from_json_proof( json_proof: &str, merkle_root: &str, diff --git a/walletkit-core/src/v3/proof.rs b/walletkit-core/src/v3/proof.rs index 94a3b5a16..cfecd26b6 100644 --- a/walletkit-core/src/v3/proof.rs +++ b/walletkit-core/src/v3/proof.rs @@ -17,7 +17,8 @@ use super::{credential_type::CredentialType, merkle_tree::MerkleTreeProof}; /// It is required to generate a `Proof` and will generally be initialized from an `app_id` and `action`. /// /// Note on naming: `ProofContext` is used to make it clear in FFIs which may not respect the module structure. -#[derive(Clone, PartialEq, Eq, Debug, uniffi::Object)] +#[derive(Clone, PartialEq, Eq, Debug)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] pub struct ProofContext { /// The `external_nullifier` is the computed result of a specific context for which a World ID Proof is generated. /// It is used in the Sempahore ZK circuit and in the computation of the `nullifier_hash` to guarantee uniqueness in a privacy-preserving way. @@ -31,7 +32,7 @@ pub struct ProofContext { pub require_mined_proof: bool, } -#[uniffi::export] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] impl ProofContext { /// Initializes a `ProofContext`. /// @@ -49,7 +50,7 @@ impl ProofContext { /// * `credential_type` - The type of credential being requested. /// #[must_use] - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub fn new( app_id: &str, action: Option, @@ -75,7 +76,7 @@ impl ProofContext { /// See `ProofContext::new` for reference. The `action` and `signal` need to be provided as raw bytes. /// #[must_use] - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] #[allow(clippy::needless_pass_by_value)] pub fn new_from_bytes( app_id: &str, @@ -113,7 +114,7 @@ impl ProofContext { /// # Errors /// /// - Returns an error if the signal is not a valid number in the field. - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub fn new_from_signal_hash( app_id: &str, action: Option>, @@ -176,7 +177,7 @@ impl ProofContext { } } -#[uniffi::export] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] #[cfg(feature = "legacy-nullifiers")] impl ProofContext { /// LEGACY AND ADVANCED USE ONLY. @@ -196,7 +197,7 @@ impl ProofContext { /// * `credential_type` - The type of credential being requested. /// * `signal` - Optional. The signal is included in the ZKP and is committed to in the proof. #[must_use] - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub fn legacy_new_from_pre_image_external_nullifier( external_nullifier: &[u8], credential_type: CredentialType, @@ -232,7 +233,7 @@ impl ProofContext { /// # Errors /// /// - Returns an error if the external nullifier is not a valid number in the field. - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub fn legacy_new_from_raw_external_nullifier( external_nullifier: &Uint256, credential_type: CredentialType, @@ -258,7 +259,8 @@ impl ProofContext { /// For on-chain verification, the `proof` (which is packed) should generally be deserialized into `uint256[8]`. /// /// More information on: [On-Chain Verification](https://docs.world.org/world-id/id/on-chain) -#[derive(Clone, PartialEq, Eq, Debug, Serialize, uniffi::Object)] +#[derive(Clone, PartialEq, Eq, Debug, Serialize)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] #[allow(clippy::module_name_repetitions)] pub struct ProofOutput { /// The root hash of the Merkle tree used to prove membership. This root hash should match published hashes in the World ID @@ -277,7 +279,7 @@ pub struct ProofOutput { pub credential_type: CredentialType, } -#[uniffi::export] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] impl ProofOutput { /// Converts the entire proof output to a JSON string with standard attribute names. /// diff --git a/walletkit-core/src/v3/world_id.rs b/walletkit-core/src/v3/world_id.rs index 6d37c9c44..51cb8ecbc 100644 --- a/walletkit-core/src/v3/world_id.rs +++ b/walletkit-core/src/v3/world_id.rs @@ -15,7 +15,8 @@ use super::{ /// A base World ID identity which can be used to generate World ID Proofs for different credentials. /// /// Most essential primitive for World ID. -#[derive(Debug, uniffi::Object)] +#[derive(Debug)] +#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] pub struct WorldId { /// The hashed hex-encoded World ID secret (32 byte secret -> 64 byte hex-encoded) /// Note: we need to store this hex-encoded because `semaphore-rs` performs operations on it hex-encoded. Can be improved in the future. @@ -24,11 +25,11 @@ pub struct WorldId { environment: Environment, } -#[uniffi::export(async_runtime = "tokio")] +#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(async_runtime = "tokio"))] impl WorldId { /// Initializes a new `Identity` from a World ID secret. The identity is initialized for a specific environment. #[must_use] - #[uniffi::constructor] + #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] pub fn new(secret: &[u8], environment: &Environment) -> Self { let hashed_secret_hex: SecretBox<[u8; 64]> = SecretBox::init_with(|| seed_hex(secret)); diff --git a/walletkit-core/tests/authenticator_integration.rs b/walletkit-core/tests/authenticator_integration.rs index cdbf0f6c4..d6c486a77 100644 --- a/walletkit-core/tests/authenticator_integration.rs +++ b/walletkit-core/tests/authenticator_integration.rs @@ -1,4 +1,3 @@ - mod common; use alloy::node_bindings::AnvilInstance; diff --git a/walletkit-core/tests/credential_storage_integration.rs b/walletkit-core/tests/credential_storage_integration.rs index 404172676..5beb988fb 100644 --- a/walletkit-core/tests/credential_storage_integration.rs +++ b/walletkit-core/tests/credential_storage_integration.rs @@ -1,4 +1,3 @@ - mod common; use rand::rngs::OsRng; diff --git a/walletkit-core/tests/proof_generation_integration.rs b/walletkit-core/tests/proof_generation_integration.rs index adcdcab4c..d42829c34 100644 --- a/walletkit-core/tests/proof_generation_integration.rs +++ b/walletkit-core/tests/proof_generation_integration.rs @@ -33,7 +33,9 @@ use alloy::sol; use alloy_primitives::U160; use eyre::{Context as _, Result}; use taceo_oprf::types::OprfKeyId; -use walletkit_core::{defaults::DefaultConfig, Authenticator, Environment, Groth16Materials}; +use walletkit_core::{ + defaults::DefaultConfig, Authenticator, Environment, Groth16Materials, +}; use world_id_core::primitives::{rp::RpId, FieldElement}; use world_id_core::{ requests::{ProofRequest, RequestItem, RequestVersion}, diff --git a/walletkit/Cargo.toml b/walletkit/Cargo.toml index 67061e706..713b3f3c9 100644 --- a/walletkit/Cargo.toml +++ b/walletkit/Cargo.toml @@ -20,9 +20,11 @@ crate-type = ["lib", "staticlib", "cdylib"] name = "walletkit" [dependencies] -uniffi = { workspace = true } walletkit-core = { workspace = true, features = ["legacy-nullifiers", "common-apps", "issuers"] } +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +uniffi = { workspace = true, features = ["build", "tokio"] } + [features] default = ["semaphore"] semaphore = ["walletkit-core/semaphore"] diff --git a/walletkit/src/lib.rs b/walletkit/src/lib.rs index eb5139ed9..1400d5c52 100644 --- a/walletkit/src/lib.rs +++ b/walletkit/src/lib.rs @@ -1,8 +1,10 @@ #![doc = include_str!("../README.md")] extern crate walletkit_core; +#[cfg(not(target_arch = "wasm32"))] walletkit_core::uniffi_reexport_scaffolding!(); pub use walletkit_core::*; +#[cfg(not(target_arch = "wasm32"))] uniffi::setup_scaffolding!("walletkit"); From 81a22a48ee59951aabd67891ca7f9679e1437dce Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Fri, 27 Feb 2026 16:01:55 +0100 Subject: [PATCH 09/33] enable CI for walletkit --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index da9d4407e..5b4e5d9df 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,7 +46,7 @@ jobs: run: cargo clippy --workspace --all-targets --no-default-features -- -D warnings wasm-check: - name: WASM walletkit-db compile check + name: WASM walletkit compile check runs-on: ubuntu-latest permissions: contents: read @@ -78,7 +78,7 @@ jobs: llvm-ar-18 --version | head -n1 - name: Run WASM compile check - run: cargo check -p walletkit-db --target wasm32-unknown-unknown + run: cargo check -p walletkit --target wasm32-unknown-unknown swift-build-and-test: name: Swift Build & Foreign Binding Tests From 13368df02604b9842056aece1f1afe9c41f313be Mon Sep 17 00:00:00 2001 From: Jakub Trad Date: Fri, 13 Mar 2026 19:11:09 +0100 Subject: [PATCH 10/33] chore: refresh Cargo.lock for wasm patch sources --- Cargo.lock | 817 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 600 insertions(+), 217 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f11b572ac..e77d5864c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -312,7 +312,7 @@ checksum = "ff42cd777eea61f370c0b10f2648a1c81e0b783066cd7269228aa993afd487f7" dependencies = [ "alloy-primitives", "alloy-sol-types", - "http", + "http 1.4.0", "serde", "serde_json", "thiserror 2.0.18", @@ -439,7 +439,7 @@ dependencies = [ "lru", "parking_lot", "pin-project", - "reqwest", + "reqwest 0.12.28", "serde", "serde_json", "thiserror 2.0.18", @@ -483,7 +483,7 @@ dependencies = [ "alloy-transport-http", "futures", "pin-project", - "reqwest", + "reqwest 0.12.28", "serde", "serde_json", "tokio", @@ -685,7 +685,7 @@ dependencies = [ "alloy-json-rpc", "alloy-transport", "itertools 0.14.0", - "reqwest", + "reqwest 0.12.28", "serde_json", "tower", "tracing", @@ -751,18 +751,48 @@ dependencies = [ "derive_arbitrary", ] +[[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", + "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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3a13b34da09176a8baba701233fdffbaa7c1b1192ce031a3da4e55ce1f1a56" +dependencies = [ + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-relations 0.4.0", + "ark-serialize 0.4.2", + "ark-snark 0.4.0", + "ark-std 0.4.0", + "blake2", + "derivative", + "digest 0.10.7", + "rayon", + "sha2", +] + [[package]] name = "ark-crypto-primitives" version = "0.5.0" @@ -771,11 +801,11 @@ checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" dependencies = [ "ahash", "ark-crypto-primitives-macros", - "ark-ec", + "ark-ec 0.5.0", "ark-ff 0.5.0", - "ark-relations", + "ark-relations 0.5.1", "ark-serialize 0.5.0", - "ark-snark", + "ark-snark 0.5.1", "ark-std 0.5.0", "blake2", "derivative", @@ -797,6 +827,24 @@ dependencies = [ "syn 2.0.114", ] +[[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", + "rayon", + "zeroize", +] + [[package]] name = "ark-ec" version = "0.5.0" @@ -805,7 +853,7 @@ checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" dependencies = [ "ahash", "ark-ff 0.5.0", - "ark-poly", + "ark-poly 0.5.0", "ark-serialize 0.5.0", "ark-std 0.5.0", "educe", @@ -853,6 +901,7 @@ dependencies = [ "num-bigint", "num-traits", "paste", + "rayon", "rustc_version 0.4.1", "zeroize", ] @@ -946,22 +995,52 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "ark-groth16" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20ceafa83848c3e390f1cbf124bc3193b3e639b3f02009e0e290809a501b95fc" +dependencies = [ + "ark-crypto-primitives 0.4.0", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-poly 0.4.2", + "ark-relations 0.4.0", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "rayon", +] + [[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-crypto-primitives 0.5.0", + "ark-ec 0.5.0", "ark-ff 0.5.0", - "ark-poly", - "ark-relations", + "ark-poly 0.5.0", + "ark-relations 0.5.1", "ark-serialize 0.5.0", "ark-std 0.5.0", "rayon", ] +[[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", + "rayon", +] + [[package]] name = "ark-poly" version = "0.5.0" @@ -984,9 +1063,9 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" dependencies = [ - "ark-ec", + "ark-ec 0.5.0", "ark-ff 0.5.0", - "ark-relations", + "ark-relations 0.5.1", "ark-std 0.5.0", "educe", "num-bigint", @@ -995,6 +1074,18 @@ dependencies = [ "tracing", ] +[[package]] +name = "ark-relations" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00796b6efc05a3f48225e59cb6a2cda78881e7c390872d5786aaf112f31fb4f0" +dependencies = [ + "ark-ff 0.4.2", + "ark-std 0.4.0", + "tracing", + "tracing-subscriber 0.2.25", +] + [[package]] name = "ark-relations" version = "0.5.1" @@ -1023,6 +1114,7 @@ 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", @@ -1034,7 +1126,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" dependencies = [ - "ark-serialize-derive", + "ark-serialize-derive 0.5.0", "ark-std 0.5.0", "arrayvec", "digest 0.10.7", @@ -1042,6 +1134,17 @@ dependencies = [ "rayon", ] +[[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" @@ -1053,6 +1156,18 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "ark-snark" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d3cc6833a335bb8a600241889ead68ee89a3cf8448081fb7694c0fe503da63" +dependencies = [ + "ark-ff 0.4.2", + "ark-relations 0.4.0", + "ark-serialize 0.4.2", + "ark-std 0.4.0", +] + [[package]] name = "ark-snark" version = "0.5.1" @@ -1060,7 +1175,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" dependencies = [ "ark-ff 0.5.0", - "ark-relations", + "ark-relations 0.5.1", "ark-serialize 0.5.0", "ark-std 0.5.0", ] @@ -1083,6 +1198,7 @@ checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", "rand 0.8.5", + "rayon", ] [[package]] @@ -1307,9 +1423,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.16.2" +version = "1.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" +checksum = "7b7b6141e96a8c160799cc2d5adecd5cbbe5054cb8c7c4af53da0f83bb7ad256" dependencies = [ "aws-lc-sys", "zeroize", @@ -1317,9 +1433,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.39.0" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa7e52a4c5c547c741610a2c6f123f3881e409b714cd27e6798ef020c514f0a" +checksum = "b092fe214090261288111db7a2b2c2118e5a7f30dc2569f1732c4069a6840549" dependencies = [ "cc", "cmake", @@ -1361,9 +1477,9 @@ checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" -version = "0.13.1" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" @@ -1724,7 +1840,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35778373aee12ef3d04966187eeae7a04f1451c9226058311f21488df6f28780" dependencies = [ - "ark-bn254", + "ark-bn254 0.5.0", "ark-ff 0.5.0", "ark-serialize 0.5.0", "byteorder", @@ -1841,7 +1957,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] @@ -1923,6 +2039,16 @@ dependencies = [ "unicode-segmentation", ] +[[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" @@ -2285,18 +2411,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "embed-doc-image" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af36f591236d9d822425cb6896595658fa558fcebf5ee8accac1d4b92c47166e" -dependencies = [ - "base64 0.13.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "embedded-io" version = "0.4.0" @@ -2309,6 +2423,15 @@ 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-as-inner" version = "0.6.1" @@ -2660,7 +2783,7 @@ dependencies = [ "futures-core", "futures-sink", "gloo-utils", - "http", + "http 1.4.0", "js-sys", "pin-project", "thiserror 1.0.69", @@ -2714,6 +2837,25 @@ dependencies = [ "subtle", ] +[[package]] +name = "h2" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.13.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "h2" version = "0.4.13" @@ -2725,7 +2867,7 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http", + "http 1.4.0", "indexmap 2.13.0", "slab", "tokio", @@ -2759,6 +2901,15 @@ 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" @@ -2853,6 +3004,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.4.0" @@ -2863,6 +3025,17 @@ 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" @@ -2870,7 +3043,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http", + "http 1.4.0", ] [[package]] @@ -2881,8 +3054,8 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http", - "http-body", + "http 1.4.0", + "http-body 1.0.1", "pin-project-lite", ] @@ -2898,6 +3071,30 @@ 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.27", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", +] + [[package]] name = "hyper" version = "1.8.1" @@ -2908,9 +3105,9 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "h2", - "http", - "http-body", + "h2 0.4.13", + "http 1.4.0", + "http-body 1.0.1", "httparse", "httpdate", "itoa", @@ -2921,19 +3118,33 @@ 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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "http", - "hyper", + "http 1.4.0", + "hyper 1.8.1", "hyper-util", - "rustls", + "rustls 0.23.37", "rustls-pki-types", "tokio", - "tokio-rustls", + "tokio-rustls 0.26.4", "tower-service", "webpki-roots 1.0.6", ] @@ -2948,14 +3159,14 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http", - "http-body", - "hyper", + "http 1.4.0", + "http-body 1.0.1", + "hyper 1.8.1", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -3402,6 +3613,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -3456,10 +3673,10 @@ dependencies = [ "bytes", "colored", "futures-core", - "http", - "http-body", + "http 1.4.0", + "http-body 1.0.1", "http-body-util", - "hyper", + "hyper 1.8.1", "hyper-util", "log", "pin-project-lite", @@ -3884,8 +4101,8 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls", - "socket2", + "rustls 0.23.37", + "socket2 0.5.10", "thiserror 2.0.18", "tokio", "tracing", @@ -3904,7 +4121,7 @@ dependencies = [ "rand 0.9.2", "ring", "rustc-hash", - "rustls", + "rustls 0.23.37", "rustls-pki-types", "slab", "thiserror 2.0.18", @@ -3922,7 +4139,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.5.10", "tracing", "windows-sys 0.60.2", ] @@ -4115,6 +4332,47 @@ version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" +[[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.27", + "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", + "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.28" @@ -4126,25 +4384,25 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "http", - "http-body", + "http 1.4.0", + "http-body 1.0.1", "http-body-util", - "hyper", - "hyper-rustls", + "hyper 1.8.1", + "hyper-rustls 0.27.7", "hyper-util", "js-sys", "log", "percent-encoding", "pin-project-lite", "quinn", - "rustls", + "rustls 0.23.37", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", - "tokio-rustls", + "tokio-rustls 0.26.4", "tower", "tower-http", "tower-service", @@ -4293,6 +4551,18 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki 0.101.7", + "sct", +] + [[package]] name = "rustls" version = "0.23.37" @@ -4304,11 +4574,20 @@ dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki", + "rustls-webpki 0.103.9", "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.14.0" @@ -4321,9 +4600,19 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.10" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" dependencies = [ "aws-lc-rs", "ring", @@ -4420,6 +4709,16 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "sec1" version = "0.7.3" @@ -4467,16 +4766,15 @@ dependencies = [ [[package]] name = "semaphore-rs" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4dcafeb7c18ace731a44780a765e00a50de79c5b12f85d5afb14b2d96cd519" +version = "0.5.0" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-groth16", - "ark-relations", - "ark-std 0.5.0", + "ark-bn254 0.4.0", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-groth16 0.4.0", + "ark-relations 0.4.0", + "ark-std 0.4.0", "bincode", "bytemuck", "color-eyre", @@ -4488,7 +4786,7 @@ dependencies = [ "once_cell", "rand 0.8.5", "rayon", - "reqwest", + "reqwest 0.11.27", "ruint", "semaphore-rs-ark-circom", "semaphore-rs-ark-zkey", @@ -4511,18 +4809,17 @@ dependencies = [ [[package]] name = "semaphore-rs-ark-circom" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4104c2d18f5dd1780ca1de7294b02e69e24452df4c6ddfa300e225c9e22fa2f" +version = "0.5.0" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" dependencies = [ - "ark-bn254", - "ark-crypto-primitives", - "ark-ff 0.5.0", - "ark-groth16", - "ark-poly", - "ark-relations", - "ark-serialize 0.5.0", - "ark-std 0.5.0", + "ark-bn254 0.4.0", + "ark-crypto-primitives 0.4.0", + "ark-ff 0.4.2", + "ark-groth16 0.4.0", + "ark-poly 0.4.2", + "ark-relations 0.4.0", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "byteorder", "num-bigint", "num-traits", @@ -4533,16 +4830,15 @@ dependencies = [ [[package]] name = "semaphore-rs-ark-zkey" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f37286d3d240684b472d838458ce795cc71ecb99521fc168dfbce57c53f81eb" +version = "0.5.0" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-groth16", - "ark-relations", - "ark-serialize 0.5.0", + "ark-bn254 0.4.0", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-groth16 0.4.0", + "ark-relations 0.4.0", + "ark-serialize 0.4.2", "color-eyre", "memmap2", "semaphore-rs-ark-circom", @@ -4550,15 +4846,13 @@ dependencies = [ [[package]] name = "semaphore-rs-depth-config" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6cb6aaf2165d2aabfe9fac793ece97c766259aef275b214b52b0126d3f9af6" +version = "0.5.0" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" [[package]] name = "semaphore-rs-depth-macros" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea0f60977350f28f5fec580649ed723bae7dc6e70ac36018c552cb68e437f56" +version = "0.5.0" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" dependencies = [ "itertools 0.13.0", "proc-macro2", @@ -4569,18 +4863,16 @@ dependencies = [ [[package]] name = "semaphore-rs-hasher" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e049c2f066c7769f228ed054cbbca95133587a89fb9fa6fea5c7c0be199aa9" +version = "0.5.0" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" dependencies = [ "bytemuck", ] [[package]] name = "semaphore-rs-keccak" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cbc9827d528c035e3d7eeb1b6762568b308e055871d4fd4b75851d4c9b63aba" +version = "0.5.0" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" dependencies = [ "semaphore-rs-hasher", "tiny-keccak", @@ -4588,12 +4880,11 @@ dependencies = [ [[package]] name = "semaphore-rs-poseidon" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f8b1e143951cfa604298f71ef97982530fb06df578cdcb31fb4b6296b5e8f6" +version = "0.5.0" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" dependencies = [ - "ark-bn254", - "ark-ff 0.5.0", + "ark-bn254 0.4.0", + "ark-ff 0.4.2", "once_cell", "ruint", "semaphore-rs-hasher", @@ -4601,14 +4892,13 @@ dependencies = [ [[package]] name = "semaphore-rs-proof" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ef5301da85d40fdb9434d8987b21cbb56fb4af36fa11411682e83e771b45e7" +version = "0.5.0" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" dependencies = [ "alloy-core", - "ark-bn254", - "ark-ec", - "ark-groth16", + "ark-bn254 0.4.0", + "ark-ec 0.4.2", + "ark-groth16 0.4.0", "getrandom 0.2.17", "hex", "lazy_static", @@ -4621,9 +4911,8 @@ dependencies = [ [[package]] name = "semaphore-rs-storage" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1359917938ff075c00f3dcf4b81b90bc7673f1f7d09161b62ec2c27103a0df4c" +version = "0.5.0" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" dependencies = [ "bytemuck", "color-eyre", @@ -4633,20 +4922,18 @@ dependencies = [ [[package]] name = "semaphore-rs-trees" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d62c52e5f57db7cfdb20f755ee05c6e9678d18e230da33f429ae420f88ce74" +version = "0.5.0" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-groth16", - "ark-relations", - "ark-std 0.5.0", + "ark-bn254 0.4.0", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-groth16 0.4.0", + "ark-relations 0.4.0", + "ark-std 0.4.0", "bytemuck", "color-eyre", "derive-where", - "getrandom 0.2.17", "hex", "hex-literal", "itertools 0.13.0", @@ -4664,9 +4951,8 @@ dependencies = [ [[package]] name = "semaphore-rs-utils" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0f9e801b84373a9659aea27ada2938aec8abd832e01be4efee795a64dfd2304" +version = "0.5.0" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" dependencies = [ "hex", "serde", @@ -4675,13 +4961,12 @@ dependencies = [ [[package]] name = "semaphore-rs-witness" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf2173db3d44dd27857393f8ff72ff296b91ab70167f8d86be4c560f22df1c5" +version = "0.5.0" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" dependencies = [ - "ark-bn254", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", + "ark-bn254 0.4.0", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", "byteorder", "color-eyre", "cxx-build", @@ -4932,6 +5217,16 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" +[[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 = "socket2" version = "0.6.2" @@ -5052,6 +5347,12 @@ dependencies = [ "syn 2.0.114", ] +[[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" @@ -5086,14 +5387,35 @@ dependencies = [ "walkdir", ] +[[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 = "taceo-ark-babyjubjub" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55b5a2cc31c90e79778c4f6375e5d9828171d320db3f8c911a8ad47af4a70069" dependencies = [ - "ark-bn254", - "ark-ec", + "ark-bn254 0.5.0", + "ark-ec 0.5.0", "ark-ff 0.5.0", "ark-std 0.5.0", ] @@ -5104,8 +5426,8 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07528b4dd1a0c9e49ef352f96219c611af0aa2f7cbd97ddb7276dcf3c2cf8dd0" dependencies = [ - "ark-bn254", - "ark-ec", + "ark-bn254 0.5.0", + "ark-ec 0.5.0", "ark-ff 0.5.0", "ark-serialize 0.5.0", "num-bigint", @@ -5119,12 +5441,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677eb3ed8275b2f179d4b1a93126a51c5b4f409c5ea9d7bc50398b13e517e30b" dependencies = [ - "ark-bn254", - "ark-ec", + "ark-bn254 0.5.0", + "ark-ec 0.5.0", "ark-ff 0.5.0", - "ark-groth16", - "ark-poly", - "ark-relations", + "ark-groth16 0.5.0", + "ark-poly 0.5.0", + "ark-relations 0.5.1", "ark-serialize 0.5.0", "ark-std 0.5.0", "byteorder", @@ -5143,7 +5465,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75dbec63f7a89093b4116a7164e6a92d3cda33dec248da8c8a5922a80a06e7dd" dependencies = [ - "ark-ec", + "ark-ec 0.5.0", "ark-ff 0.5.0", "ark-serialize 0.5.0", "blake3", @@ -5163,11 +5485,11 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4983857c95d20ca2dc0400a3a116e6931c012ecc4b78ccede8238cfb0c298e3" dependencies = [ - "ark-ec", + "ark-ec 0.5.0", "ark-ff 0.5.0", - "ark-groth16", - "ark-poly", - "ark-relations", + "ark-groth16 0.5.0", + "ark-poly 0.5.0", + "ark-relations 0.5.1", "eyre", "num-traits", "rayon", @@ -5180,11 +5502,11 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "936b1e6b8a77f931796917501fe13a2ae93304e7eb384ed29d80ddc370b011bd" dependencies = [ - "ark-bn254", - "ark-ec", + "ark-bn254 0.5.0", + "ark-ec 0.5.0", "ark-ff 0.5.0", - "ark-groth16", - "ark-relations", + "ark-groth16 0.5.0", + "ark-relations 0.5.1", "ark-serialize 0.5.0", "circom-witness-rs", "eyre", @@ -5206,10 +5528,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c6a7b90f2ecb6db1212557550890d9d9d114447688f6146d726024ec7a3410b" dependencies = [ "alloy-primitives", - "ark-bn254", - "ark-ec", + "ark-bn254 0.5.0", + "ark-ec 0.5.0", "ark-ff 0.5.0", - "ark-groth16", + "ark-groth16 0.5.0", "askama 0.15.4", "eyre", "ruint", @@ -5217,9 +5539,8 @@ dependencies = [ [[package]] name = "taceo-oprf" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be862ba49094098f945f1375f704a2c47b4e267a6e564462a43ad142b4b1469e" +version = "0.7.1" +source = "git+https://github.com/Dzejkop/oprf-service.git?branch=feat%2Fwasm-compat#c5df01233032c87f9cdc43b6cb4da4392f50ed15" dependencies = [ "taceo-oprf-client", "taceo-oprf-core", @@ -5228,16 +5549,15 @@ dependencies = [ [[package]] name = "taceo-oprf-client" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "696c4b03e8b570d1d0486f7bc2273b85951b316d7f720fc2f95e79f2b053f649" +version = "0.8.0" +source = "git+https://github.com/Dzejkop/oprf-service.git?branch=feat%2Fwasm-compat#c5df01233032c87f9cdc43b6cb4da4392f50ed15" dependencies = [ - "ark-ec", + "ark-ec 0.5.0", "ciborium", "futures", "getrandom 0.2.17", "gloo-net", - "http", + "http 1.4.0", "serde", "taceo-ark-babyjubjub", "taceo-oprf-core", @@ -5252,11 +5572,10 @@ dependencies = [ [[package]] name = "taceo-oprf-core" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e55cbbe8357f837939f9cec171f44a217db4d897bea679521d555a24296ee39b" +version = "0.4.3" +source = "git+https://github.com/Dzejkop/oprf-service.git?branch=feat%2Fwasm-compat#c5df01233032c87f9cdc43b6cb4da4392f50ed15" dependencies = [ - "ark-ec", + "ark-ec 0.5.0", "ark-ff 0.5.0", "ark-serialize 0.5.0", "blake3", @@ -5274,16 +5593,15 @@ dependencies = [ [[package]] name = "taceo-oprf-types" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "540ce620b9d45c2c3d417c8f4b0c82e112f2621f2419e1c9fd207b8d5a3310d4" +version = "0.9.1" +source = "git+https://github.com/Dzejkop/oprf-service.git?branch=feat%2Fwasm-compat#c5df01233032c87f9cdc43b6cb4da4392f50ed15" dependencies = [ "alloy", "ark-ff 0.5.0", "ark-serialize 0.5.0", "async-trait", "eyre", - "http", + "http 1.4.0", "serde", "taceo-ark-babyjubjub", "taceo-ark-serde-compat", @@ -5299,7 +5617,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac59d3df4c827b3496bff929aebd6440997a5c2e946f46ff4fdd76f318447581" dependencies = [ - "ark-bn254", + "ark-bn254 0.5.0", "ark-ff 0.5.0", "ark-std 0.5.0", "num-bigint", @@ -5488,7 +5806,7 @@ dependencies = [ "mio", "parking_lot", "pin-project-lite", - "socket2", + "socket2 0.6.2", "tokio-macros", "windows-sys 0.61.2", ] @@ -5504,13 +5822,23 @@ dependencies = [ "syn 2.0.114", ] +[[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.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls", + "rustls 0.23.37", "tokio", ] @@ -5545,10 +5873,10 @@ checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" dependencies = [ "futures-util", "log", - "rustls", + "rustls 0.23.37", "rustls-pki-types", "tokio", - "tokio-rustls", + "tokio-rustls 0.26.4", "tungstenite", "webpki-roots 0.26.11", ] @@ -5626,7 +5954,7 @@ dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", "tower-layer", "tower-service", @@ -5643,8 +5971,8 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http", - "http-body", + "http 1.4.0", + "http-body 1.0.1", "http-body-util", "iri-string", "pin-project-lite", @@ -5761,11 +6089,11 @@ checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" dependencies = [ "bytes", "data-encoding", - "http", + "http 1.4.0", "httparse", "log", "rand 0.9.2", - "rustls", + "rustls 0.23.37", "rustls-pki-types", "sha1", "thiserror 2.0.18", @@ -5837,6 +6165,7 @@ dependencies = [ "cargo_metadata", "clap", "uniffi_bindgen", + "uniffi_build", "uniffi_core", "uniffi_macros", "uniffi_pipeline", @@ -5844,7 +6173,7 @@ dependencies = [ [[package]] name = "uniffi-bindgen" -version = "0.11.0" +version = "0.10.0" dependencies = [ "uniffi", ] @@ -5875,6 +6204,17 @@ dependencies = [ "uniffi_udl", ] +[[package]] +name = "uniffi_build" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b78fd9271a4c2e85bd2c266c5a9ede1fac676eb39fd77f636c27eaf67426fd5f" +dependencies = [ + "anyhow", + "camino", + "uniffi_bindgen", +] + [[package]] name = "uniffi_core" version = "0.31.0" @@ -6041,7 +6381,7 @@ dependencies = [ [[package]] name = "walletkit" -version = "0.11.0" +version = "0.10.0" dependencies = [ "uniffi", "walletkit-core", @@ -6049,7 +6389,7 @@ dependencies = [ [[package]] name = "walletkit-core" -version = "0.11.0" +version = "0.10.0" dependencies = [ "alloy", "alloy-core", @@ -6068,10 +6408,10 @@ dependencies = [ "mockito", "rand 0.8.5", "regex", - "reqwest", + "reqwest 0.12.28", "ruint", "ruint-uniffi", - "rustls", + "rustls 0.23.37", "secrecy", "semaphore-rs", "serde", @@ -6095,7 +6435,7 @@ dependencies = [ [[package]] name = "walletkit-db" -version = "0.11.0" +version = "0.10.0" dependencies = [ "cc", "hex", @@ -6266,6 +6606,12 @@ 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 = "webpki-roots" version = "0.26.11" @@ -6305,7 +6651,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] @@ -6376,6 +6722,15 @@ 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" @@ -6598,6 +6953,16 @@ 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" version = "0.51.0" @@ -6688,9 +7053,9 @@ dependencies = [ [[package]] name = "world-id-authenticator" -version = "0.6.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07d061f3e1150294b0eaab3c3a8311343c144995097c6f08cd7babbe8610faca" +checksum = "75a2f1c50923bc65b243355f4663e1ab6bbfa9f8ac918a7db65003cead2600f0" dependencies = [ "alloy", "anyhow", @@ -6698,9 +7063,9 @@ dependencies = [ "backon", "eyre", "rand 0.8.5", - "reqwest", + "reqwest 0.12.28", "ruint", - "rustls", + "rustls 0.23.37", "secrecy", "serde", "serde_json", @@ -6718,9 +7083,9 @@ dependencies = [ [[package]] name = "world-id-core" -version = "0.6.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88fbe3660167654a014924faeeec87d7aebb9ff13a43dbb51958045f0aa3ed6" +checksum = "4212c964ed123b51202435a98695bce9b228b40f4f39f6e77ccfb1d32a83208a" dependencies = [ "taceo-eddsa-babyjubjub", "world-id-authenticator", @@ -6730,17 +7095,16 @@ dependencies = [ [[package]] name = "world-id-primitives" -version = "0.6.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022157c68f1c49bb3d7256b9199174d6de6cc9d4b07c5ea757f2f6b35597b4a2" +checksum = "13939e35b7f9a77ad4f7cf268a1a5cd29597a4cb60377395457eafd8df0b5839" dependencies = [ "alloy", "alloy-primitives", - "ark-bn254", + "ark-bn254 0.5.0", "ark-ff 0.5.0", - "ark-groth16", + "ark-groth16 0.5.0", "arrayvec", - "embed-doc-image", "eyre", "getrandom 0.2.17", "hex", @@ -6767,20 +7131,19 @@ dependencies = [ [[package]] name = "world-id-proof" -version = "0.6.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091e4902d84a827900db7f030fc6bb3f9705e0abe6d20aca943148727bb625b8" +checksum = "cf858169c8dec236c7e95661381829cc270d8c70d8eb34b3bb9312fa0cad0097" dependencies = [ - "ark-bn254", - "ark-ec", + "ark-bn254 0.5.0", + "ark-ec 0.5.0", "ark-ff 0.5.0", - "ark-groth16", + "ark-groth16 0.5.0", "ark-serialize 0.5.0", "eyre", "rand 0.8.5", "rayon", - "reqwest", - "serde", + "reqwest 0.12.28", "taceo-ark-babyjubjub", "taceo-circom-types", "taceo-eddsa-babyjubjub", @@ -6999,3 +7362,23 @@ dependencies = [ "cc", "pkg-config", ] + +[[patch.unused]] +name = "world-id-authenticator" +version = "0.5.1" +source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" + +[[patch.unused]] +name = "world-id-core" +version = "0.5.1" +source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" + +[[patch.unused]] +name = "world-id-primitives" +version = "0.5.1" +source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" + +[[patch.unused]] +name = "world-id-proof" +version = "0.5.1" +source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" From f30c3503f3fbc5b6b851818b7a04674dc4699ca5 Mon Sep 17 00:00:00 2001 From: Jakub Trad Date: Fri, 13 Mar 2026 19:15:40 +0100 Subject: [PATCH 11/33] fix: align lockfile and remove stale storage cfg --- Cargo.lock | 50 ++++++++++----------------------------- walletkit-core/src/lib.rs | 2 +- 2 files changed, 14 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e77d5864c..992561803 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1957,7 +1957,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -3166,7 +3166,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.6.2", "tokio", "tower-service", "tracing", @@ -4102,7 +4102,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls 0.23.37", - "socket2 0.5.10", + "socket2 0.6.2", "thiserror 2.0.18", "tokio", "tracing", @@ -4139,7 +4139,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.2", "tracing", "windows-sys 0.60.2", ] @@ -6651,7 +6651,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -7053,9 +7053,8 @@ dependencies = [ [[package]] name = "world-id-authenticator" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a2f1c50923bc65b243355f4663e1ab6bbfa9f8ac918a7db65003cead2600f0" +version = "0.5.1" +source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" dependencies = [ "alloy", "anyhow", @@ -7083,9 +7082,8 @@ dependencies = [ [[package]] name = "world-id-core" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4212c964ed123b51202435a98695bce9b228b40f4f39f6e77ccfb1d32a83208a" +version = "0.5.1" +source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" dependencies = [ "taceo-eddsa-babyjubjub", "world-id-authenticator", @@ -7095,9 +7093,8 @@ dependencies = [ [[package]] name = "world-id-primitives" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13939e35b7f9a77ad4f7cf268a1a5cd29597a4cb60377395457eafd8df0b5839" +version = "0.5.1" +source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" dependencies = [ "alloy", "alloy-primitives", @@ -7131,9 +7128,8 @@ dependencies = [ [[package]] name = "world-id-proof" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf858169c8dec236c7e95661381829cc270d8c70d8eb34b3bb9312fa0cad0097" +version = "0.5.1" +source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" dependencies = [ "ark-bn254 0.5.0", "ark-ec 0.5.0", @@ -7362,23 +7358,3 @@ dependencies = [ "cc", "pkg-config", ] - -[[patch.unused]] -name = "world-id-authenticator" -version = "0.5.1" -source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" - -[[patch.unused]] -name = "world-id-core" -version = "0.5.1" -source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" - -[[patch.unused]] -name = "world-id-primitives" -version = "0.5.1" -source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" - -[[patch.unused]] -name = "world-id-proof" -version = "0.5.1" -source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" diff --git a/walletkit-core/src/lib.rs b/walletkit-core/src/lib.rs index 348fefbc8..4c1c986ed 100644 --- a/walletkit-core/src/lib.rs +++ b/walletkit-core/src/lib.rs @@ -152,7 +152,7 @@ pub mod v3; // Private modules //////////////////////////////////////////////////////////////////////////////// -#[cfg(any(feature = "issuers", feature = "storage"))] +#[cfg(any(feature = "issuers", feature = "v3"))] mod http_request; pub(crate) mod primitives; From 27c7df562bab94735cf99e901b5c56616ffdd1a6 Mon Sep 17 00:00:00 2001 From: Jakub Trad Date: Fri, 13 Mar 2026 19:18:21 +0100 Subject: [PATCH 12/33] fix: gate uint256 uniffi registration for non-wasm --- walletkit-core/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/walletkit-core/src/lib.rs b/walletkit-core/src/lib.rs index 4c1c986ed..82a76e939 100644 --- a/walletkit-core/src/lib.rs +++ b/walletkit-core/src/lib.rs @@ -159,4 +159,5 @@ pub(crate) mod primitives; #[cfg(not(target_arch = "wasm32"))] uniffi::setup_scaffolding!("walletkit_core"); +#[cfg(not(target_arch = "wasm32"))] ruint_uniffi::register_types!(Uint256); From 225e0d13ae505a3a26f4261ce8d8e65e55fbd33d Mon Sep 17 00:00:00 2001 From: Jakub Trad Date: Fri, 13 Mar 2026 21:15:22 +0100 Subject: [PATCH 13/33] feat: enable UniFFI exports for wasm target --- Cargo.toml | 2 +- walletkit-core/Cargo.toml | 2 +- walletkit-core/src/authenticator/mod.rs | 29 +++++----- .../src/authenticator/with_storage.rs | 2 +- walletkit-core/src/credential.rs | 7 ++- walletkit-core/src/error.rs | 3 +- walletkit-core/src/field_element.rs | 11 ++-- walletkit-core/src/issuers/tfh_nfc.rs | 8 +-- walletkit-core/src/lib.rs | 10 ++-- walletkit-core/src/logger.rs | 53 +++++++++++++------ walletkit-core/src/requests.rs | 12 ++--- .../src/storage/credential_storage.rs | 8 +-- walletkit-core/src/storage/error.rs | 3 +- walletkit-core/src/storage/groth16_cache.rs | 2 +- walletkit-core/src/storage/paths.rs | 7 ++- walletkit-core/src/storage/traits.rs | 6 +-- walletkit-core/src/storage/types.rs | 12 ++--- walletkit-core/src/v3/common_apps.rs | 6 +-- walletkit-core/src/v3/credential_type.rs | 13 ++++- walletkit-core/src/v3/merkle_tree.rs | 9 ++-- walletkit-core/src/v3/proof.rs | 22 ++++---- walletkit-core/src/v3/world_id.rs | 7 ++- walletkit/Cargo.toml | 2 - walletkit/src/lib.rs | 2 - 24 files changed, 123 insertions(+), 115 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b66a90fb6..2ae6e0bcf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ alloy-core = { version = "1", default-features = false, features = [ "sol-types", ] } alloy-primitives = { version = "1", default-features = false } -uniffi = { version = "0.31", features = ["tokio"] } +uniffi = { version = "0.31", features = ["tokio", "wasm-unstable-single-threaded"] } world-id-core = { version = "0.6", default-features = false } # internal diff --git a/walletkit-core/Cargo.toml b/walletkit-core/Cargo.toml index e0e2829f1..68b0db33a 100644 --- a/walletkit-core/Cargo.toml +++ b/walletkit-core/Cargo.toml @@ -32,6 +32,7 @@ rand = "0.8" reqwest = { version = "0.12", default-features = false, features = ["json"] } ruint = { version = "1.17", default-features = false, features = ["alloc"] } ruint-uniffi = { version = "0.1", features = ["serde"] } +uniffi = { workspace = true, features = ["build", "tokio"] } secrecy = "0.10" semaphore-rs = { version = "0.5", optional = true } serde = "1" @@ -62,7 +63,6 @@ walletkit-db = { workspace = true } ctor = "0.2" reqwest = { version = "0.12", default-features = false, features = ["brotli", "rustls-tls"] } rustls = { version = "0.23", features = ["ring"] } -uniffi = { workspace = true, features = ["build", "tokio"] } [dev-dependencies] alloy = { version = "1", default-features = false, features = [ diff --git a/walletkit-core/src/authenticator/mod.rs b/walletkit-core/src/authenticator/mod.rs index f47c42d61..56efe2a2c 100644 --- a/walletkit-core/src/authenticator/mod.rs +++ b/walletkit-core/src/authenticator/mod.rs @@ -32,8 +32,7 @@ mod with_storage; /// /// Construct via [`Groth16Materials::from_embedded`] (all platforms) or /// [`Groth16Materials::from_cache`] (native only, loads from filesystem). -#[derive(Clone)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(Clone, uniffi::Object)] pub struct Groth16Materials { query: Arc, nullifier: Arc, @@ -45,7 +44,7 @@ impl std::fmt::Debug for Groth16Materials { } } -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] impl Groth16Materials { /// Loads Groth16 material from the embedded (compiled-in) zkeys and graphs. /// @@ -55,7 +54,7 @@ impl Groth16Materials { /// # Errors /// /// Returns an error if the embedded material cannot be loaded or verified. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub fn from_embedded() -> Result { let query = world_id_core::proof::load_embedded_query_material().map_err(|error| { @@ -120,14 +119,13 @@ impl Groth16Materials { } /// The Authenticator is the main component with which users interact with the World ID Protocol. -#[derive(Debug)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(Debug, uniffi::Object)] pub struct Authenticator { inner: CoreAuthenticator, store: Arc, } -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(async_runtime = "tokio"))] +#[uniffi::export(async_runtime = "tokio")] impl Authenticator { /// Returns the packed account data for the holder's World ID. /// @@ -221,7 +219,7 @@ impl Authenticator { } } -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(async_runtime = "tokio"))] +#[uniffi::export(async_runtime = "tokio")] impl Authenticator { /// Initializes a new Authenticator from a seed and with SDK defaults. /// @@ -230,7 +228,7 @@ impl Authenticator { /// /// # Errors /// See `CoreAuthenticator::init` for potential errors. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub async fn init_with_defaults( seed: &[u8], rpc_url: Option, @@ -260,7 +258,7 @@ impl Authenticator { /// /// # Errors /// Will error if the provided seed is not valid or if the config is not valid. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub async fn init( seed: &[u8], config: &str, @@ -380,8 +378,7 @@ impl Authenticator { } /// Registration status for a World ID being created through the gateway. -#[derive(Debug, Clone)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Enum))] +#[derive(Debug, Clone, uniffi::Enum)] pub enum RegistrationStatus { /// Request queued but not yet batched. Queued, @@ -419,10 +416,10 @@ impl From for RegistrationStatus { /// /// The account is not yet registered in the `WorldIDRegistry` contract. /// Use this for non-blocking registration flows where you want to poll the status yourself. -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(uniffi::Object)] pub struct InitializingAuthenticator(CoreInitializingAuthenticator); -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(async_runtime = "tokio"))] +#[uniffi::export(async_runtime = "tokio")] impl InitializingAuthenticator { /// Registers a new World ID with SDK defaults. /// @@ -431,7 +428,7 @@ impl InitializingAuthenticator { /// /// # Errors /// See `CoreAuthenticator::register` for potential errors. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub async fn register_with_defaults( seed: &[u8], rpc_url: Option, @@ -457,7 +454,7 @@ impl InitializingAuthenticator { /// /// # Errors /// See `CoreAuthenticator::register` for potential errors. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub async fn register( seed: &[u8], config: &str, diff --git a/walletkit-core/src/authenticator/with_storage.rs b/walletkit-core/src/authenticator/with_storage.rs index bfabd9214..a03529036 100644 --- a/walletkit-core/src/authenticator/with_storage.rs +++ b/walletkit-core/src/authenticator/with_storage.rs @@ -15,7 +15,7 @@ use world_id_core::primitives::TREE_DEPTH; #[cfg(not(target_arch = "wasm32"))] const MERKLE_PROOF_VALIDITY_SECONDS: u64 = 60 * 15; -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] impl Authenticator { /// Initializes storage using the authenticator's leaf index. /// diff --git a/walletkit-core/src/credential.rs b/walletkit-core/src/credential.rs index 96f8f9a73..e478c7e48 100644 --- a/walletkit-core/src/credential.rs +++ b/walletkit-core/src/credential.rs @@ -11,18 +11,17 @@ use crate::FieldElement; /// /// Encapsulates the credential and exposes accessors for fields that FFI /// callers need. -#[derive(Debug, Clone)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(Debug, Clone, uniffi::Object)] pub struct Credential(CoreCredential); -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] impl Credential { /// Deserializes a `Credential` from a JSON byte blob. /// /// # Errors /// /// Returns an error if the bytes cannot be deserialized. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] #[allow(clippy::needless_pass_by_value)] pub fn from_bytes(bytes: Vec) -> Result { let credential: CoreCredential = diff --git a/walletkit-core/src/error.rs b/walletkit-core/src/error.rs index 5acdde126..36c24bfc7 100644 --- a/walletkit-core/src/error.rs +++ b/walletkit-core/src/error.rs @@ -4,8 +4,7 @@ use world_id_core::{primitives::PrimitiveError, AuthenticatorError}; use crate::storage::StorageError; /// Error outputs from `WalletKit` -#[derive(Debug, Error)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Error))] +#[derive(Debug, Error, uniffi::Error)] pub enum WalletKitError { /// Invalid input provided (e.g., incorrect length, format, etc.) #[error("invalid_input_{attribute}")] diff --git a/walletkit-core/src/field_element.rs b/walletkit-core/src/field_element.rs index 5fea33bd7..2ea02aade 100644 --- a/walletkit-core/src/field_element.rs +++ b/walletkit-core/src/field_element.rs @@ -15,18 +15,17 @@ use crate::error::WalletKitError; /// /// Field elements are typically 32 bytes when serialized. #[allow(clippy::module_name_repetitions)] -#[derive(Debug, Clone)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(Debug, Clone, uniffi::Object)] pub struct FieldElement(pub CoreFieldElement); -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] impl FieldElement { /// Creates a `FieldElement` from raw bytes (big-endian). /// /// # Errors /// /// Returns an error if the bytes cannot be deserialized into a valid field element. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub fn from_bytes(bytes: Vec) -> Result { let len = bytes.len(); let val: [u8; 32] = @@ -43,7 +42,7 @@ impl FieldElement { /// /// This is useful for testing or when working with small field element values. #[must_use] - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub fn from_u64(value: u64) -> Self { Self(CoreFieldElement::from(value)) } @@ -63,7 +62,7 @@ impl FieldElement { /// # Errors /// /// Returns an error if the hex string is invalid or cannot be parsed. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub fn try_from_hex_string(hex_string: &str) -> Result { let fe = CoreFieldElement::from_str(hex_string)?; Ok(Self(fe)) diff --git a/walletkit-core/src/issuers/tfh_nfc.rs b/walletkit-core/src/issuers/tfh_nfc.rs index df6ba6d79..8864f70cc 100644 --- a/walletkit-core/src/issuers/tfh_nfc.rs +++ b/walletkit-core/src/issuers/tfh_nfc.rs @@ -35,16 +35,16 @@ impl NfcRefreshResultRaw { } /// TFH NFC credential issuer API client -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(uniffi::Object)] pub struct TfhNfcIssuer { base_url: String, request: Request, } -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] impl TfhNfcIssuer { /// Create a new TFH NFC issuer for the specified environment - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] #[must_use] pub fn new(environment: &Environment) -> Self { let base_url = match environment { @@ -60,7 +60,7 @@ impl TfhNfcIssuer { } } -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(async_runtime = "tokio"))] +#[uniffi::export(async_runtime = "tokio")] impl TfhNfcIssuer { /// Refresh an NFC credential (migrate PCP to v4). /// diff --git a/walletkit-core/src/lib.rs b/walletkit-core/src/lib.rs index 82a76e939..381090f2d 100644 --- a/walletkit-core/src/lib.rs +++ b/walletkit-core/src/lib.rs @@ -65,8 +65,7 @@ fn init() { /// Each environment uses different sources of truth for the World ID credentials. /// /// More information on testing for the World ID Protocol can be found in: `https://docs.world.org/world-id/quick-start/testing` -#[derive(Debug, Clone, PartialEq, Eq, EnumString)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Enum))] +#[derive(Debug, Clone, PartialEq, Eq, EnumString, uniffi::Enum)] #[strum(serialize_all = "lowercase")] pub enum Environment { /// For testing purposes ONLY. @@ -90,8 +89,9 @@ impl Environment { } /// Region for node selection. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, EnumString, Display)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Enum))] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Default, EnumString, Display, uniffi::Enum, +)] #[strum(serialize_all = "lowercase")] pub enum Region { /// United States @@ -156,8 +156,6 @@ pub mod v3; mod http_request; pub(crate) mod primitives; -#[cfg(not(target_arch = "wasm32"))] uniffi::setup_scaffolding!("walletkit_core"); -#[cfg(not(target_arch = "wasm32"))] ruint_uniffi::register_types!(Uint256); diff --git a/walletkit-core/src/logger.rs b/walletkit-core/src/logger.rs index 790e8f1c1..c0d929468 100644 --- a/walletkit-core/src/logger.rs +++ b/walletkit-core/src/logger.rs @@ -1,9 +1,11 @@ use std::{ fmt, sync::{mpsc, Arc, Mutex, OnceLock}, - thread, }; +#[cfg(not(target_arch = "wasm32"))] +use std::thread; + use tracing::{Event, Level, Subscriber}; use tracing_subscriber::{ layer::{Context, SubscriberExt}, @@ -57,15 +59,14 @@ use tracing_subscriber::{ /// /// WalletKit.initLogging(logger: WalletKitLoggerBridge.shared, level: .debug) /// ``` -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(with_foreign))] +#[uniffi::export(with_foreign)] pub trait Logger: Sync + Send { /// Receives a log `message` with its corresponding `level`. fn log(&self, level: LogLevel, message: String); } /// Enumeration of possible log levels for foreign logger callbacks. -#[derive(Debug, Clone, Copy)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Enum))] +#[derive(Debug, Clone, Copy, uniffi::Enum)] pub enum LogLevel { /// Very detailed diagnostic messages. Trace, @@ -134,6 +135,8 @@ struct LogEvent { // queue — and the dedicated delivery thread calls `Logger::log` from a clean // stack with no active FFI frames. static LOG_CHANNEL: OnceLock>> = OnceLock::new(); +#[cfg(target_arch = "wasm32")] +static LOGGER_INSTANCE: OnceLock> = OnceLock::new(); static LOGGING_INITIALIZED: OnceLock<()> = OnceLock::new(); impl Layer for ForeignLoggerLayer @@ -141,10 +144,16 @@ where S: Subscriber + for<'span> LookupSpan<'span>, { fn on_event(&self, event: &Event<'_>, _ctx: Context<'_, S>) { + #[cfg(not(target_arch = "wasm32"))] let Some(sender) = LOG_CHANNEL.get() else { return; }; + #[cfg(target_arch = "wasm32")] + if LOGGER_INSTANCE.get().is_none() { + return; + } + let mut visitor = EventFieldVisitor::default(); event.record(&mut visitor); let metadata = event.metadata(); @@ -170,6 +179,12 @@ where let formatted = sanitize_hex_secrets(format!("{} {message}", metadata.target())); + #[cfg(target_arch = "wasm32")] + if let Some(logger) = LOGGER_INSTANCE.get() { + logger.log(log_level(*metadata.level()), formatted.clone()); + } + + #[cfg(not(target_arch = "wasm32"))] if let Ok(sender) = sender.lock() { let _ = sender.send(LogEvent { level: log_level(*metadata.level()), @@ -259,23 +274,31 @@ pub fn emit_log(level: LogLevel, message: String) { /// # Panics /// /// Panics if the dedicated logger delivery thread cannot be spawned. -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] pub fn init_logging(logger: Arc, level: Option) { if LOGGING_INITIALIZED.get().is_some() { return; } - let (tx, rx) = mpsc::channel::(); - let _ = LOG_CHANNEL.set(Mutex::new(tx)); + #[cfg(not(target_arch = "wasm32"))] + { + let (tx, rx) = mpsc::channel::(); + let _ = LOG_CHANNEL.set(Mutex::new(tx)); + + thread::Builder::new() + .name("walletkit-logger".into()) + .spawn(move || { + for event in rx { + logger.log(event.level, event.message); + } + }) + .expect("failed to spawn walletkit logger thread"); + } - thread::Builder::new() - .name("walletkit-logger".into()) - .spawn(move || { - for event in rx { - logger.log(event.level, event.message); - } - }) - .expect("failed to spawn walletkit logger thread"); + #[cfg(target_arch = "wasm32")] + { + let _ = LOGGER_INSTANCE.set(logger); + } let _ = tracing_log::LogTracer::init(); diff --git a/walletkit-core/src/requests.rs b/walletkit-core/src/requests.rs index cfd91c5b3..e1f0959a7 100644 --- a/walletkit-core/src/requests.rs +++ b/walletkit-core/src/requests.rs @@ -6,17 +6,16 @@ use crate::error::WalletKitError; /// A request from the RP to the Authenticator. See [`CoreProofRequest`] for more details. /// This is a wrapper type to expose to foreign language bindings. -#[derive(Debug, Clone)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(Debug, Clone, uniffi::Object)] pub struct ProofRequest(pub(crate) CoreProofRequest); -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] impl ProofRequest { /// Deserializes a `ProofRequest` from a JSON string. /// /// # Errors /// Returns an error if the JSON is invalid or cannot be parsed. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub fn from_json(json: &str) -> Result { let core_request: CoreProofRequest = serde_json::from_str(json).map_err(|e| WalletKitError::Generic { @@ -51,11 +50,10 @@ impl ProofRequest { /// A response from the Authenticator to the RP. See [`CoreProofResponse`] for more details. /// /// This is a wrapper type to expose to foreign language bindings. -#[derive(Debug, Clone)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(Debug, Clone, uniffi::Object)] pub struct ProofResponse(pub CoreProofResponse); -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] impl ProofResponse { /// Serializes the proof response to a JSON string. /// diff --git a/walletkit-core/src/storage/credential_storage.rs b/walletkit-core/src/storage/credential_storage.rs index 584e77d19..baba5c5a3 100644 --- a/walletkit-core/src/storage/credential_storage.rs +++ b/walletkit-core/src/storage/credential_storage.rs @@ -41,7 +41,7 @@ impl Drop for CleanupFile { } /// Concrete storage implementation backed by `SQLCipher` databases. -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(uniffi::Object)] pub struct CredentialStore { inner: Mutex, /// Channel sender for the vault-changed notification thread. @@ -120,14 +120,14 @@ impl CredentialStoreInner { } } -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] impl CredentialStore { /// Creates a new storage handle from explicit components. /// /// # Errors /// /// Returns an error if the storage lock cannot be opened. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub fn new_with_components( paths: Arc, keystore: Arc, @@ -147,7 +147,7 @@ impl CredentialStore { /// # Errors /// /// Returns an error if the storage lock cannot be opened. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] #[allow(clippy::needless_pass_by_value)] pub fn from_provider_arc( provider: Arc, diff --git a/walletkit-core/src/storage/error.rs b/walletkit-core/src/storage/error.rs index 1b97146fb..4279a80d7 100644 --- a/walletkit-core/src/storage/error.rs +++ b/walletkit-core/src/storage/error.rs @@ -6,8 +6,7 @@ use thiserror::Error; pub type StorageResult = Result; /// Errors raised by credential storage primitives. -#[derive(Debug, Error)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Error))] +#[derive(Debug, Error, uniffi::Error)] pub enum StorageError { /// Errors coming from the device keystore. #[error("keystore error: {0}")] diff --git a/walletkit-core/src/storage/groth16_cache.rs b/walletkit-core/src/storage/groth16_cache.rs index 9b57f15e3..06e05474b 100644 --- a/walletkit-core/src/storage/groth16_cache.rs +++ b/walletkit-core/src/storage/groth16_cache.rs @@ -17,7 +17,7 @@ use super::{StorageError, StoragePaths, StorageResult}; /// # Errors /// /// Returns an error if embedded material cannot be loaded or cache files cannot be written. -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] #[allow(clippy::needless_pass_by_value)] pub fn cache_embedded_groth16_material(paths: &StoragePaths) -> StorageResult<()> { if has_valid_cached_material(paths)? { diff --git a/walletkit-core/src/storage/paths.rs b/walletkit-core/src/storage/paths.rs index ee37944c4..138803b40 100644 --- a/walletkit-core/src/storage/paths.rs +++ b/walletkit-core/src/storage/paths.rs @@ -12,8 +12,7 @@ const QUERY_GRAPH_FILENAME: &str = "OPRFQueryGraph.bin"; const NULLIFIER_GRAPH_FILENAME: &str = "OPRFNullifierGraph.bin"; /// Paths for credential storage artifacts under `/worldid`. -#[derive(Debug, Clone)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(Debug, Clone, uniffi::Object)] pub struct StoragePaths { root: PathBuf, worldid_dir: PathBuf, @@ -89,10 +88,10 @@ impl StoragePaths { } } -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] impl StoragePaths { /// Builds storage paths rooted at `root`. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] #[must_use] pub fn from_root(root: String) -> Self { Self::new(PathBuf::from(root)) diff --git a/walletkit-core/src/storage/traits.rs b/walletkit-core/src/storage/traits.rs index 838007197..f5743c210 100644 --- a/walletkit-core/src/storage/traits.rs +++ b/walletkit-core/src/storage/traits.rs @@ -20,7 +20,7 @@ use super::error::StorageResult; use super::paths::StoragePaths; /// Device keystore interface used to seal and open account keys. -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(with_foreign))] +#[uniffi::export(with_foreign)] pub trait DeviceKeystore: Send + Sync { /// Seals plaintext under the device-bound key, authenticating `associated_data`. /// @@ -52,7 +52,7 @@ pub trait DeviceKeystore: Send + Sync { } /// Atomic blob store for small binary files (e.g., `account_keys.bin`). -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(with_foreign))] +#[uniffi::export(with_foreign)] pub trait AtomicBlobStore: Send + Sync { /// Reads the blob at `path`, if present. /// @@ -77,7 +77,7 @@ pub trait AtomicBlobStore: Send + Sync { } /// Provider responsible for platform-specific storage components and paths. -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(with_foreign))] +#[uniffi::export(with_foreign)] pub trait StorageProvider: Send + Sync { /// Returns the device keystore implementation. fn keystore(&self) -> Arc; diff --git a/walletkit-core/src/storage/types.rs b/walletkit-core/src/storage/types.rs index 1ec80939b..edbea91cd 100644 --- a/walletkit-core/src/storage/types.rs +++ b/walletkit-core/src/storage/types.rs @@ -6,8 +6,7 @@ use super::error::{StorageError, StorageResult}; /// /// Blob records (stored in the `blob_objects` table) carry a kind tag that /// distinguishes credential payloads from associated data. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Enum))] +#[derive(Debug, Clone, Copy, PartialEq, Eq, uniffi::Enum)] #[repr(u8)] pub enum BlobKind { /// Credential blob payload. @@ -47,8 +46,7 @@ pub type Nullifier = [u8; 32]; /// /// This is intentionally small and excludes blobs; full credential payloads can /// be fetched separately to avoid heavy list queries. -#[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Record))] +#[derive(Debug, Clone, PartialEq, Eq, uniffi::Record)] pub struct CredentialRecord { /// Credential identifier. pub credential_id: u64, @@ -63,8 +61,7 @@ pub struct CredentialRecord { } /// FFI-friendly replay guard result kind. -#[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Enum))] +#[derive(Debug, Clone, PartialEq, Eq, uniffi::Enum)] pub enum ReplayGuardKind { /// Stored bytes for the first disclosure of a request. Fresh, @@ -73,8 +70,7 @@ pub enum ReplayGuardKind { } /// Replay guard result. -#[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Record))] +#[derive(Debug, Clone, PartialEq, Eq, uniffi::Record)] pub struct ReplayGuardResult { /// Result kind. pub kind: ReplayGuardKind, diff --git a/walletkit-core/src/v3/common_apps.rs b/walletkit-core/src/v3/common_apps.rs index ff92b9345..2e9658c1a 100644 --- a/walletkit-core/src/v3/common_apps.rs +++ b/walletkit-core/src/v3/common_apps.rs @@ -15,7 +15,7 @@ use { /// /// The contract of the address book can be found at: `0x57b930d551e677cc36e2fa036ae2fe8fdae0330d` #[cfg(feature = "legacy-nullifiers")] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(uniffi::Object)] pub struct AddressBook {} /// The external nullifier used in the `WorldIDAddressBook` contract. @@ -35,10 +35,10 @@ impl Default for AddressBook { } #[cfg(feature = "legacy-nullifiers")] -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] impl AddressBook { /// Initializes a new `AddressBook` instance. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] #[must_use] pub const fn new() -> Self { Self {} diff --git a/walletkit-core/src/v3/credential_type.rs b/walletkit-core/src/v3/credential_type.rs index 270231885..556bcadf6 100644 --- a/walletkit-core/src/v3/credential_type.rs +++ b/walletkit-core/src/v3/credential_type.rs @@ -10,9 +10,18 @@ use crate::Environment; /// /// More details in `https://docs.world.org/world-id/concepts#proof-of-personhood` #[derive( - Debug, Clone, Copy, PartialEq, Eq, EnumString, Hash, Display, Serialize, Deserialize, + Debug, + Clone, + Copy, + PartialEq, + Eq, + EnumString, + Hash, + Display, + Serialize, + Deserialize, + uniffi::Enum, )] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Enum))] #[strum(serialize_all = "snake_case")] #[serde(rename_all = "snake_case")] pub enum CredentialType { diff --git a/walletkit-core/src/v3/merkle_tree.rs b/walletkit-core/src/v3/merkle_tree.rs index c8ac9d199..8f4ebfc93 100644 --- a/walletkit-core/src/v3/merkle_tree.rs +++ b/walletkit-core/src/v3/merkle_tree.rs @@ -23,8 +23,7 @@ struct InclusionProofResponse { const CREDENTIAL_NOT_ISSUED_RESPONSE: &str = "provided identity commitment not found"; const MINED_STATUS: &str = "mined"; // https://github.com/worldcoin/signup-sequencer/blob/f6050fbb3131ee6a61b2f44db3813f9150a045f5/schemas/openapi.yaml#L163 -#[derive(Debug)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(Debug, uniffi::Object)] #[allow(clippy::module_name_repetitions)] pub struct MerkleTreeProof { poseidon_proof: Proof, @@ -39,14 +38,14 @@ impl MerkleTreeProof { } } -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] impl MerkleTreeProof { /// Retrieves a Merkle inclusion proof from the sign up sequencer for a given identity commitment. /// Each credential/environment pair uses a different sign up sequencer. /// /// # Errors /// Will throw an error if the request fails or parsing the response fails. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub async fn from_identity_commitment( identity_commitment: &Uint256, sequencer_host: &str, @@ -100,7 +99,7 @@ impl MerkleTreeProof { } } - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub fn from_json_proof( json_proof: &str, merkle_root: &str, diff --git a/walletkit-core/src/v3/proof.rs b/walletkit-core/src/v3/proof.rs index cfecd26b6..94a3b5a16 100644 --- a/walletkit-core/src/v3/proof.rs +++ b/walletkit-core/src/v3/proof.rs @@ -17,8 +17,7 @@ use super::{credential_type::CredentialType, merkle_tree::MerkleTreeProof}; /// It is required to generate a `Proof` and will generally be initialized from an `app_id` and `action`. /// /// Note on naming: `ProofContext` is used to make it clear in FFIs which may not respect the module structure. -#[derive(Clone, PartialEq, Eq, Debug)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(Clone, PartialEq, Eq, Debug, uniffi::Object)] pub struct ProofContext { /// The `external_nullifier` is the computed result of a specific context for which a World ID Proof is generated. /// It is used in the Sempahore ZK circuit and in the computation of the `nullifier_hash` to guarantee uniqueness in a privacy-preserving way. @@ -32,7 +31,7 @@ pub struct ProofContext { pub require_mined_proof: bool, } -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] impl ProofContext { /// Initializes a `ProofContext`. /// @@ -50,7 +49,7 @@ impl ProofContext { /// * `credential_type` - The type of credential being requested. /// #[must_use] - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub fn new( app_id: &str, action: Option, @@ -76,7 +75,7 @@ impl ProofContext { /// See `ProofContext::new` for reference. The `action` and `signal` need to be provided as raw bytes. /// #[must_use] - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] #[allow(clippy::needless_pass_by_value)] pub fn new_from_bytes( app_id: &str, @@ -114,7 +113,7 @@ impl ProofContext { /// # Errors /// /// - Returns an error if the signal is not a valid number in the field. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub fn new_from_signal_hash( app_id: &str, action: Option>, @@ -177,7 +176,7 @@ impl ProofContext { } } -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] #[cfg(feature = "legacy-nullifiers")] impl ProofContext { /// LEGACY AND ADVANCED USE ONLY. @@ -197,7 +196,7 @@ impl ProofContext { /// * `credential_type` - The type of credential being requested. /// * `signal` - Optional. The signal is included in the ZKP and is committed to in the proof. #[must_use] - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub fn legacy_new_from_pre_image_external_nullifier( external_nullifier: &[u8], credential_type: CredentialType, @@ -233,7 +232,7 @@ impl ProofContext { /// # Errors /// /// - Returns an error if the external nullifier is not a valid number in the field. - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub fn legacy_new_from_raw_external_nullifier( external_nullifier: &Uint256, credential_type: CredentialType, @@ -259,8 +258,7 @@ impl ProofContext { /// For on-chain verification, the `proof` (which is packed) should generally be deserialized into `uint256[8]`. /// /// More information on: [On-Chain Verification](https://docs.world.org/world-id/id/on-chain) -#[derive(Clone, PartialEq, Eq, Debug, Serialize)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(Clone, PartialEq, Eq, Debug, Serialize, uniffi::Object)] #[allow(clippy::module_name_repetitions)] pub struct ProofOutput { /// The root hash of the Merkle tree used to prove membership. This root hash should match published hashes in the World ID @@ -279,7 +277,7 @@ pub struct ProofOutput { pub credential_type: CredentialType, } -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export)] +#[uniffi::export] impl ProofOutput { /// Converts the entire proof output to a JSON string with standard attribute names. /// diff --git a/walletkit-core/src/v3/world_id.rs b/walletkit-core/src/v3/world_id.rs index 51cb8ecbc..6d37c9c44 100644 --- a/walletkit-core/src/v3/world_id.rs +++ b/walletkit-core/src/v3/world_id.rs @@ -15,8 +15,7 @@ use super::{ /// A base World ID identity which can be used to generate World ID Proofs for different credentials. /// /// Most essential primitive for World ID. -#[derive(Debug)] -#[cfg_attr(not(target_arch = "wasm32"), derive(uniffi::Object))] +#[derive(Debug, uniffi::Object)] pub struct WorldId { /// The hashed hex-encoded World ID secret (32 byte secret -> 64 byte hex-encoded) /// Note: we need to store this hex-encoded because `semaphore-rs` performs operations on it hex-encoded. Can be improved in the future. @@ -25,11 +24,11 @@ pub struct WorldId { environment: Environment, } -#[cfg_attr(not(target_arch = "wasm32"), uniffi::export(async_runtime = "tokio"))] +#[uniffi::export(async_runtime = "tokio")] impl WorldId { /// Initializes a new `Identity` from a World ID secret. The identity is initialized for a specific environment. #[must_use] - #[cfg_attr(not(target_arch = "wasm32"), uniffi::constructor)] + #[uniffi::constructor] pub fn new(secret: &[u8], environment: &Environment) -> Self { let hashed_secret_hex: SecretBox<[u8; 64]> = SecretBox::init_with(|| seed_hex(secret)); diff --git a/walletkit/Cargo.toml b/walletkit/Cargo.toml index 713b3f3c9..538b495eb 100644 --- a/walletkit/Cargo.toml +++ b/walletkit/Cargo.toml @@ -21,8 +21,6 @@ name = "walletkit" [dependencies] walletkit-core = { workspace = true, features = ["legacy-nullifiers", "common-apps", "issuers"] } - -[target.'cfg(not(target_arch = "wasm32"))'.dependencies] uniffi = { workspace = true, features = ["build", "tokio"] } [features] diff --git a/walletkit/src/lib.rs b/walletkit/src/lib.rs index 1400d5c52..eb5139ed9 100644 --- a/walletkit/src/lib.rs +++ b/walletkit/src/lib.rs @@ -1,10 +1,8 @@ #![doc = include_str!("../README.md")] extern crate walletkit_core; -#[cfg(not(target_arch = "wasm32"))] walletkit_core::uniffi_reexport_scaffolding!(); pub use walletkit_core::*; -#[cfg(not(target_arch = "wasm32"))] uniffi::setup_scaffolding!("walletkit"); From 1e7d137f6d131aadc8f168cf59e40c1dff34f43a Mon Sep 17 00:00:00 2001 From: Jakub Trad Date: Mon, 16 Mar 2026 14:34:56 +0100 Subject: [PATCH 14/33] chore: switch semaphore-rs wasm patch to main --- Cargo.lock | 27 ++++++++++++++------------- Cargo.toml | 6 +++--- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 992561803..0cec51cdd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4767,7 +4767,7 @@ dependencies = [ [[package]] name = "semaphore-rs" version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" dependencies = [ "ark-bn254 0.4.0", "ark-ec 0.4.2", @@ -4810,7 +4810,7 @@ dependencies = [ [[package]] name = "semaphore-rs-ark-circom" version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" dependencies = [ "ark-bn254 0.4.0", "ark-crypto-primitives 0.4.0", @@ -4831,7 +4831,7 @@ dependencies = [ [[package]] name = "semaphore-rs-ark-zkey" version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" dependencies = [ "ark-bn254 0.4.0", "ark-ec 0.4.2", @@ -4847,12 +4847,12 @@ dependencies = [ [[package]] name = "semaphore-rs-depth-config" version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" [[package]] name = "semaphore-rs-depth-macros" version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" dependencies = [ "itertools 0.13.0", "proc-macro2", @@ -4864,7 +4864,7 @@ dependencies = [ [[package]] name = "semaphore-rs-hasher" version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" dependencies = [ "bytemuck", ] @@ -4872,7 +4872,7 @@ dependencies = [ [[package]] name = "semaphore-rs-keccak" version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" dependencies = [ "semaphore-rs-hasher", "tiny-keccak", @@ -4881,7 +4881,7 @@ dependencies = [ [[package]] name = "semaphore-rs-poseidon" version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", @@ -4893,7 +4893,7 @@ dependencies = [ [[package]] name = "semaphore-rs-proof" version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" dependencies = [ "alloy-core", "ark-bn254 0.4.0", @@ -4912,7 +4912,7 @@ dependencies = [ [[package]] name = "semaphore-rs-storage" version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" dependencies = [ "bytemuck", "color-eyre", @@ -4923,7 +4923,7 @@ dependencies = [ [[package]] name = "semaphore-rs-trees" version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" dependencies = [ "ark-bn254 0.4.0", "ark-ec 0.4.2", @@ -4934,6 +4934,7 @@ dependencies = [ "bytemuck", "color-eyre", "derive-where", + "getrandom 0.2.17", "hex", "hex-literal", "itertools 0.13.0", @@ -4952,7 +4953,7 @@ dependencies = [ [[package]] name = "semaphore-rs-utils" version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" dependencies = [ "hex", "serde", @@ -4962,7 +4963,7 @@ dependencies = [ [[package]] name = "semaphore-rs-witness" version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=feat%2Fwasm-compat#8e1b5b67339c2b685b61209e2a6e92395f68f020" +source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", diff --git a/Cargo.toml b/Cargo.toml index 2ae6e0bcf..5a88ebed7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,9 +50,9 @@ taceo-oprf-client = { git = "https://github.com/Dzejkop/oprf-service.git", branc taceo-oprf-core = { git = "https://github.com/Dzejkop/oprf-service.git", branch = "feat/wasm-compat" } taceo-oprf-types = { git = "https://github.com/Dzejkop/oprf-service.git", branch = "feat/wasm-compat" } # WASM compat: https://github.com/worldcoin/semaphore-rs/pull/131 -semaphore-rs = { git = "https://github.com/worldcoin/semaphore-rs.git", branch = "feat/wasm-compat" } -semaphore-rs-storage = { git = "https://github.com/worldcoin/semaphore-rs.git", branch = "feat/wasm-compat" } -semaphore-rs-trees = { git = "https://github.com/worldcoin/semaphore-rs.git", branch = "feat/wasm-compat" } +semaphore-rs = { git = "https://github.com/worldcoin/semaphore-rs.git", branch = "main" } +semaphore-rs-storage = { git = "https://github.com/worldcoin/semaphore-rs.git", branch = "main" } +semaphore-rs-trees = { git = "https://github.com/worldcoin/semaphore-rs.git", branch = "main" } [profile.release] opt-level = 'z' # Optimize for size. From a5c47f0037bf714d548a4d921287399b51bf2bf8 Mon Sep 17 00:00:00 2001 From: Jakub Trad Date: Mon, 16 Mar 2026 16:10:21 +0100 Subject: [PATCH 15/33] chore: use released world-id and taceo crates --- Cargo.lock | 46 +++++++++++++++++++++++---------------- Cargo.toml | 10 --------- walletkit-core/Cargo.toml | 2 +- 3 files changed, 28 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0cec51cdd..daaec5cc4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1957,7 +1957,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] @@ -3166,7 +3166,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -4102,7 +4102,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls 0.23.37", - "socket2 0.6.2", + "socket2 0.5.10", "thiserror 2.0.18", "tokio", "tracing", @@ -4139,7 +4139,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.2", + "socket2 0.5.10", "tracing", "windows-sys 0.60.2", ] @@ -5541,7 +5541,8 @@ dependencies = [ [[package]] name = "taceo-oprf" version = "0.7.1" -source = "git+https://github.com/Dzejkop/oprf-service.git?branch=feat%2Fwasm-compat#c5df01233032c87f9cdc43b6cb4da4392f50ed15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "412211d4d43aeb060c369a69213bd7ae941f769cc4361df83195d2a7936f22d5" dependencies = [ "taceo-oprf-client", "taceo-oprf-core", @@ -5550,8 +5551,9 @@ dependencies = [ [[package]] name = "taceo-oprf-client" -version = "0.8.0" -source = "git+https://github.com/Dzejkop/oprf-service.git?branch=feat%2Fwasm-compat#c5df01233032c87f9cdc43b6cb4da4392f50ed15" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de42daf867ed4d1ed661258a4541d5dcf1ebe3f43f923acc3ec7716b8824670d" dependencies = [ "ark-ec 0.5.0", "ciborium", @@ -5574,7 +5576,8 @@ dependencies = [ [[package]] name = "taceo-oprf-core" version = "0.4.3" -source = "git+https://github.com/Dzejkop/oprf-service.git?branch=feat%2Fwasm-compat#c5df01233032c87f9cdc43b6cb4da4392f50ed15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2baf9c72e6687fa8839c3e3368236b36237a905b8c7fcd445250a7a57ab063" dependencies = [ "ark-ec 0.5.0", "ark-ff 0.5.0", @@ -5594,8 +5597,9 @@ dependencies = [ [[package]] name = "taceo-oprf-types" -version = "0.9.1" -source = "git+https://github.com/Dzejkop/oprf-service.git?branch=feat%2Fwasm-compat#c5df01233032c87f9cdc43b6cb4da4392f50ed15" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447b96ee4bb69a16b05fa1e581501c426338698263cde39fc8fbfdbf5d24b616" dependencies = [ "alloy", "ark-ff 0.5.0", @@ -6652,7 +6656,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] @@ -7054,8 +7058,9 @@ dependencies = [ [[package]] name = "world-id-authenticator" -version = "0.5.1" -source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9f1532f0fd610cff4b6c8c92f049245a204d917715095d1300c7499c15fafdc" dependencies = [ "alloy", "anyhow", @@ -7083,8 +7088,9 @@ dependencies = [ [[package]] name = "world-id-core" -version = "0.5.1" -source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe1aeed0d47a8932f23938814f942465aaab3b5c71ddf6c5f44f53ca506a8468" dependencies = [ "taceo-eddsa-babyjubjub", "world-id-authenticator", @@ -7094,8 +7100,9 @@ dependencies = [ [[package]] name = "world-id-primitives" -version = "0.5.1" -source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb4aa561b0b99df193a638b9081da74e299e4d608d0c5d2c0f76ebfe537caba" dependencies = [ "alloy", "alloy-primitives", @@ -7129,8 +7136,9 @@ dependencies = [ [[package]] name = "world-id-proof" -version = "0.5.1" -source = "git+https://github.com/worldcoin/world-id-protocol.git?branch=main#cd85e978e0668d9ca535cd7588a12ca584568677" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc3f2025b9a6475a838b07ad48381f00e4515d158d1fd10d2aebb3c10dfb81d" dependencies = [ "ark-bn254 0.5.0", "ark-ec 0.5.0", diff --git a/Cargo.toml b/Cargo.toml index 5a88ebed7..e60099650 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,16 +39,6 @@ dead_code = "deny" # Temporary patches for WASM compatibility (until upstream releases) [patch.crates-io] -# WASM compat: https://github.com/worldcoin/world-id-protocol/pull/512 -world-id-core = { git = "https://github.com/worldcoin/world-id-protocol.git", branch = "main" } -world-id-authenticator = { git = "https://github.com/worldcoin/world-id-protocol.git", branch = "main" } -world-id-primitives = { git = "https://github.com/worldcoin/world-id-protocol.git", branch = "main" } -world-id-proof = { git = "https://github.com/worldcoin/world-id-protocol.git", branch = "main" } -# WASM compat: https://github.com/TaceoLabs/oprf-service/pull/488 -taceo-oprf = { git = "https://github.com/Dzejkop/oprf-service.git", branch = "feat/wasm-compat" } -taceo-oprf-client = { git = "https://github.com/Dzejkop/oprf-service.git", branch = "feat/wasm-compat" } -taceo-oprf-core = { git = "https://github.com/Dzejkop/oprf-service.git", branch = "feat/wasm-compat" } -taceo-oprf-types = { git = "https://github.com/Dzejkop/oprf-service.git", branch = "feat/wasm-compat" } # WASM compat: https://github.com/worldcoin/semaphore-rs/pull/131 semaphore-rs = { git = "https://github.com/worldcoin/semaphore-rs.git", branch = "main" } semaphore-rs-storage = { git = "https://github.com/worldcoin/semaphore-rs.git", branch = "main" } diff --git a/walletkit-core/Cargo.toml b/walletkit-core/Cargo.toml index 68b0db33a..a6be15e7f 100644 --- a/walletkit-core/Cargo.toml +++ b/walletkit-core/Cargo.toml @@ -48,7 +48,7 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } zeroize = "1" uuid = { version = "1.10", features = ["v4"] } uniffi = { workspace = true } -taceo-oprf = { version = "0.7", default-features = false, features = ["client"] } +taceo-oprf = { version = "0.7.1", default-features = false, features = ["client"] } world-id-core = { workspace = true, features = [ "authenticator", "embed-zkeys", From 765f62caa99d4e12a86ffbcb9ce4dde7d27de64a Mon Sep 17 00:00:00 2001 From: Jakub Trad Date: Mon, 16 Mar 2026 16:40:59 +0100 Subject: [PATCH 16/33] chore: use released semaphore crates --- Cargo.lock | 75 +++++++++++-------- Cargo.toml | 7 -- walletkit-core/Cargo.toml | 2 +- .../tests/proof_generation_integration.rs | 4 +- 4 files changed, 47 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index daaec5cc4..b68fc46ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1957,7 +1957,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -3166,7 +3166,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.6.2", "tokio", "tower-service", "tracing", @@ -4102,7 +4102,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls 0.23.37", - "socket2 0.5.10", + "socket2 0.6.2", "thiserror 2.0.18", "tokio", "tracing", @@ -4139,7 +4139,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.2", "tracing", "windows-sys 0.60.2", ] @@ -4766,8 +4766,9 @@ dependencies = [ [[package]] name = "semaphore-rs" -version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32d5b9ca8358e07c51d7fa2daaf125fe00464b05724cd284192e5d8f2ba91b26" dependencies = [ "ark-bn254 0.4.0", "ark-ec 0.4.2", @@ -4809,8 +4810,9 @@ dependencies = [ [[package]] name = "semaphore-rs-ark-circom" -version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4079c8ec080fc77ca429b8a832b18300fa918a453d4ee39f480b166246810fec" dependencies = [ "ark-bn254 0.4.0", "ark-crypto-primitives 0.4.0", @@ -4830,8 +4832,9 @@ dependencies = [ [[package]] name = "semaphore-rs-ark-zkey" -version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2fec03531d0e3fbb2d360eecc15c34f50ac70ab10b914a06c19256444f4cf4f" dependencies = [ "ark-bn254 0.4.0", "ark-ec 0.4.2", @@ -4846,13 +4849,15 @@ dependencies = [ [[package]] name = "semaphore-rs-depth-config" -version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd542c7b04389072e4723f3282ec5587ffad30ee3f05da32f9d117926d36a94" [[package]] name = "semaphore-rs-depth-macros" -version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e398cc3b3d6469e9a4ce114a2602b5b7a459e74a8020ff52944474bfc7f7c7b3" dependencies = [ "itertools 0.13.0", "proc-macro2", @@ -4863,16 +4868,18 @@ dependencies = [ [[package]] name = "semaphore-rs-hasher" -version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447cdf2b8cc673d0a9ee734194272552235882d69feed7c316291b11bfadfb3b" dependencies = [ "bytemuck", ] [[package]] name = "semaphore-rs-keccak" -version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c7a0670f962c7bcf24adbf2ae9f7c8693a33b24990880c2e6736291673d4c8" dependencies = [ "semaphore-rs-hasher", "tiny-keccak", @@ -4880,8 +4887,9 @@ dependencies = [ [[package]] name = "semaphore-rs-poseidon" -version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ddf96cdb88c33b5cf3c9aa4589b130dffc314ba1de86384cfc1d986dc4fd67" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", @@ -4892,8 +4900,9 @@ dependencies = [ [[package]] name = "semaphore-rs-proof" -version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "798c75f87f59e586b311904e2924d0514fc361b7f5bb27fe54b45926323e991b" dependencies = [ "alloy-core", "ark-bn254 0.4.0", @@ -4911,8 +4920,9 @@ dependencies = [ [[package]] name = "semaphore-rs-storage" -version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b869701f2fbd28470faf672224b61dda005c6049ac61b78209b6c5597225e868" dependencies = [ "bytemuck", "color-eyre", @@ -4922,8 +4932,9 @@ dependencies = [ [[package]] name = "semaphore-rs-trees" -version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38a199ba771d9da62ea548d82ac93172ad8669ec79175c54470ea9c7973898a4" dependencies = [ "ark-bn254 0.4.0", "ark-ec 0.4.2", @@ -4952,8 +4963,9 @@ dependencies = [ [[package]] name = "semaphore-rs-utils" -version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516abca0dadcac9c5213b0ed54611f01f23da5ea3c4955abf493ef7496a1601f" dependencies = [ "hex", "serde", @@ -4962,8 +4974,9 @@ dependencies = [ [[package]] name = "semaphore-rs-witness" -version = "0.5.0" -source = "git+https://github.com/worldcoin/semaphore-rs.git?branch=main#c324183db598e4deb65061556789498616616d62" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c68ab7115ac00c88a69dadd737742af139da4554d8ea893e5a8051f315ea51e" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", @@ -6656,7 +6669,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index e60099650..95625a32d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,13 +37,6 @@ nursery = { level = "deny", priority = -1 } missing_docs = "deny" dead_code = "deny" -# Temporary patches for WASM compatibility (until upstream releases) -[patch.crates-io] -# WASM compat: https://github.com/worldcoin/semaphore-rs/pull/131 -semaphore-rs = { git = "https://github.com/worldcoin/semaphore-rs.git", branch = "main" } -semaphore-rs-storage = { git = "https://github.com/worldcoin/semaphore-rs.git", branch = "main" } -semaphore-rs-trees = { git = "https://github.com/worldcoin/semaphore-rs.git", branch = "main" } - [profile.release] opt-level = 'z' # Optimize for size. lto = true # Enable Link Time Optimization. diff --git a/walletkit-core/Cargo.toml b/walletkit-core/Cargo.toml index a6be15e7f..cc0da1cd4 100644 --- a/walletkit-core/Cargo.toml +++ b/walletkit-core/Cargo.toml @@ -34,7 +34,7 @@ ruint = { version = "1.17", default-features = false, features = ["alloc"] } ruint-uniffi = { version = "0.1", features = ["serde"] } uniffi = { workspace = true, features = ["build", "tokio"] } secrecy = "0.10" -semaphore-rs = { version = "0.5", optional = true } +semaphore-rs = { version = "0.5.1", optional = true } serde = "1" serde_json = "1" sha2 = "0.10" diff --git a/walletkit-core/tests/proof_generation_integration.rs b/walletkit-core/tests/proof_generation_integration.rs index d42829c34..030c6c37e 100644 --- a/walletkit-core/tests/proof_generation_integration.rs +++ b/walletkit-core/tests/proof_generation_integration.rs @@ -36,7 +36,7 @@ use taceo_oprf::types::OprfKeyId; use walletkit_core::{ defaults::DefaultConfig, Authenticator, Environment, Groth16Materials, }; -use world_id_core::primitives::{rp::RpId, FieldElement}; +use world_id_core::primitives::{rp::RpId, FieldElement, Nullifier}; use world_id_core::{ requests::{ProofRequest, RequestItem, RequestVersion}, Authenticator as CoreAuthenticator, EdDSAPrivateKey, @@ -267,7 +267,7 @@ async fn e2e_authenticator_generate_proof() -> Result<()> { let nullifier = response_item .nullifier .expect("uniqueness proof should have nullifier"); - assert_ne!(nullifier, FieldElement::ZERO); + assert_ne!(nullifier, Nullifier::new(FieldElement::ZERO)); eprintln!("Phase 4 complete: proof generated (nullifier={nullifier:?})"); From 7db90c86c48a2042d802b2c28db44c2f759da12c Mon Sep 17 00:00:00 2001 From: Jakub Trad Date: Mon, 16 Mar 2026 17:22:06 +0100 Subject: [PATCH 17/33] feat: widen wasm authenticator support --- walletkit-core/src/authenticator/mod.rs | 27 ++++++++++++------- .../src/authenticator/with_storage.rs | 8 ------ walletkit-core/src/storage/error.rs | 1 - 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/walletkit-core/src/authenticator/mod.rs b/walletkit-core/src/authenticator/mod.rs index 56efe2a2c..ff028abf7 100644 --- a/walletkit-core/src/authenticator/mod.rs +++ b/walletkit-core/src/authenticator/mod.rs @@ -179,7 +179,6 @@ impl Authenticator { /// /// - Will generally error if there are network issues or if the OPRF Nodes return an error. /// - Raises an error if the OPRF Nodes configuration is not correctly set. - #[cfg(not(target_arch = "wasm32"))] pub async fn generate_credential_blinding_factor_remote( &self, issuer_schema_id: u64, @@ -287,7 +286,6 @@ impl Authenticator { /// /// # Errors /// Returns an error if proof generation fails. - #[cfg(not(target_arch = "wasm32"))] pub async fn generate_proof( &self, proof_request: &ProofRequest, @@ -296,13 +294,24 @@ impl Authenticator { let now = if let Some(n) = now { n } else { - let start = std::time::SystemTime::now(); - start - .duration_since(std::time::UNIX_EPOCH) - .map_err(|e| WalletKitError::Generic { - error: format!("Critical. Unable to determine SystemTime: {e}"), - })? - .as_secs() + #[cfg(target_arch = "wasm32")] + { + return Err(WalletKitError::InvalidInput { + attribute: "now".to_string(), + reason: "`now` must be provided on wasm32 targets".to_string(), + }); + } + + #[cfg(not(target_arch = "wasm32"))] + { + let start = std::time::SystemTime::now(); + start + .duration_since(std::time::UNIX_EPOCH) + .map_err(|e| WalletKitError::Generic { + error: format!("Critical. Unable to determine SystemTime: {e}"), + })? + .as_secs() + } }; // First check if the request can be fulfilled and which credentials should be used diff --git a/walletkit-core/src/authenticator/with_storage.rs b/walletkit-core/src/authenticator/with_storage.rs index a03529036..2792588b8 100644 --- a/walletkit-core/src/authenticator/with_storage.rs +++ b/walletkit-core/src/authenticator/with_storage.rs @@ -2,17 +2,12 @@ use crate::error::WalletKitError; use super::Authenticator; -#[cfg(not(target_arch = "wasm32"))] use serde::{Deserialize, Serialize}; -#[cfg(not(target_arch = "wasm32"))] use world_id_core::primitives::authenticator::AuthenticatorPublicKeySet; -#[cfg(not(target_arch = "wasm32"))] use world_id_core::primitives::merkle::MerkleInclusionProof; -#[cfg(not(target_arch = "wasm32"))] use world_id_core::primitives::TREE_DEPTH; /// The amount of time a Merkle inclusion proof remains valid in the cache. -#[cfg(not(target_arch = "wasm32"))] const MERKLE_PROOF_VALIDITY_SECONDS: u64 = 60 * 15; #[uniffi::export] @@ -28,7 +23,6 @@ impl Authenticator { } } -#[cfg(not(target_arch = "wasm32"))] impl Authenticator { /// Fetches a [`MerkleInclusionProof`] from the indexer, or from cache if it's available and fresh. /// @@ -71,14 +65,12 @@ impl Authenticator { } } -#[cfg(not(target_arch = "wasm32"))] #[derive(Debug, Clone, Serialize, Deserialize)] struct CachedInclusionProof { inclusion_proof: MerkleInclusionProof, authenticator_keyset: AuthenticatorPublicKeySet, } -#[cfg(not(target_arch = "wasm32"))] impl CachedInclusionProof { fn serialize(&self) -> Result, WalletKitError> { let mut bytes = Vec::new(); diff --git a/walletkit-core/src/storage/error.rs b/walletkit-core/src/storage/error.rs index 4279a80d7..dd49ef3fb 100644 --- a/walletkit-core/src/storage/error.rs +++ b/walletkit-core/src/storage/error.rs @@ -88,7 +88,6 @@ pub enum StorageError { UnexpectedUniFFICallbackError(String), } -#[cfg(not(target_arch = "wasm32"))] impl From for StorageError { fn from(error: uniffi::UnexpectedUniFFICallbackError) -> Self { Self::UnexpectedUniFFICallbackError(error.reason) From ee6321b0776ace7342fa4ad971350ea378c64a3b Mon Sep 17 00:00:00 2001 From: Jakub Trad Date: Mon, 16 Mar 2026 18:11:07 +0100 Subject: [PATCH 18/33] refactor: minimize cargo changes and widen wasm support --- walletkit-core/Cargo.toml | 5 ++--- walletkit/Cargo.toml | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/walletkit-core/Cargo.toml b/walletkit-core/Cargo.toml index cc0da1cd4..517b33efd 100644 --- a/walletkit-core/Cargo.toml +++ b/walletkit-core/Cargo.toml @@ -32,7 +32,7 @@ rand = "0.8" reqwest = { version = "0.12", default-features = false, features = ["json"] } ruint = { version = "1.17", default-features = false, features = ["alloc"] } ruint-uniffi = { version = "0.1", features = ["serde"] } -uniffi = { workspace = true, features = ["build", "tokio"] } +uniffi = { workspace = true } secrecy = "0.10" semaphore-rs = { version = "0.5.1", optional = true } serde = "1" @@ -86,7 +86,7 @@ rand = "0.8" [features] -default = ["common-apps", "semaphore", "issuers"] +default = ["issuers"] # Enables point-compression on all verifying keys. This results in ~2x smaller bundle size, but decompression is very expensive, # using it requires proper handling to ensure decompression is done once and cached. By default walletkit-swift and walletkit-android @@ -95,7 +95,6 @@ compress-zkeys = ["world-id-core/compress-zkeys"] issuers = ["dep:base64"] # SECTION: V3 Feature Flags -common-apps = [] # Before conventions were introduced for external nullifiers with `app_id` & `action`, raw field elements were used. # This feature flag adds support to operate with such external nullifiers. legacy-nullifiers = [] diff --git a/walletkit/Cargo.toml b/walletkit/Cargo.toml index 538b495eb..29ca9745c 100644 --- a/walletkit/Cargo.toml +++ b/walletkit/Cargo.toml @@ -20,11 +20,11 @@ crate-type = ["lib", "staticlib", "cdylib"] name = "walletkit" [dependencies] -walletkit-core = { workspace = true, features = ["legacy-nullifiers", "common-apps", "issuers"] } -uniffi = { workspace = true, features = ["build", "tokio"] } +walletkit-core = { workspace = true } +uniffi = { workspace = true } [features] -default = ["semaphore"] +default = ["issuers"] semaphore = ["walletkit-core/semaphore"] compress-zkeys = ["walletkit-core/compress-zkeys"] issuers = ["walletkit-core/issuers"] From ddddd013a96f310e1fe101ea4d7ae9cfdb164968 Mon Sep 17 00:00:00 2001 From: Jakub Trad Date: Mon, 16 Mar 2026 18:11:25 +0100 Subject: [PATCH 19/33] chore: refresh lockfile after uniffi feature cleanup --- Cargo.lock | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b68fc46ba..c7555c8e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6183,7 +6183,6 @@ dependencies = [ "cargo_metadata", "clap", "uniffi_bindgen", - "uniffi_build", "uniffi_core", "uniffi_macros", "uniffi_pipeline", @@ -6222,17 +6221,6 @@ dependencies = [ "uniffi_udl", ] -[[package]] -name = "uniffi_build" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b78fd9271a4c2e85bd2c266c5a9ede1fac676eb39fd77f636c27eaf67426fd5f" -dependencies = [ - "anyhow", - "camino", - "uniffi_bindgen", -] - [[package]] name = "uniffi_core" version = "0.31.0" From bfe54bb58c2acb26a340373eaed93c6edcc9a447 Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Tue, 17 Mar 2026 15:02:41 +0100 Subject: [PATCH 20/33] ensure destructor in wasm is transient --- walletkit-db/src/ffi.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/walletkit-db/src/ffi.rs b/walletkit-db/src/ffi.rs index 605a0b5be..286cd4437 100644 --- a/walletkit-db/src/ffi.rs +++ b/walletkit-db/src/ffi.rs @@ -567,8 +567,11 @@ mod raw { n: c_int, destructor: isize, ) -> c_int { - // WASM bindings use typed destructor callbacks; all callers pass SQLITE_TRANSIENT. - let _ = destructor; + // WASM bindings use typed destructor callbacks instead of SQLite's + // sentinel `isize` values. This shim only supports `SQLITE_TRANSIENT`, + // which matches all current callers and ensures SQLite copies the data + // immediately. + assert_eq!(destructor, super::SQLITE_TRANSIENT); wasm::sqlite3_bind_blob(stmt.cast(), index, value, n, wasm::SQLITE_TRANSIENT()) } pub unsafe fn sqlite3_bind_text( @@ -578,8 +581,11 @@ mod raw { n: c_int, destructor: isize, ) -> c_int { - // WASM bindings use typed destructor callbacks; all callers pass SQLITE_TRANSIENT. - let _ = destructor; + // WASM bindings use typed destructor callbacks instead of SQLite's + // sentinel `isize` values. This shim only supports `SQLITE_TRANSIENT`, + // which matches all current callers and ensures SQLite copies the text + // immediately. + assert_eq!(destructor, super::SQLITE_TRANSIENT); wasm::sqlite3_bind_text( stmt.cast(), index, From 8f52b30e34d8a530dd0660479b6fe28a10de074c Mon Sep 17 00:00:00 2001 From: Otto Date: Tue, 17 Mar 2026 14:23:09 +0000 Subject: [PATCH 21/33] feat: add embed-zkeys feature flag and fix WASM compilation - Introduce `embed-zkeys` Cargo feature in walletkit-core and walletkit that activates world-id-core/embed-zkeys and world-id-core/zstd-compress-zkeys; previously these were always enabled, preventing downstream consumers from opting out (e.g. to reduce binary size on WASM). - Feature-gate `Groth16Materials::from_embedded` behind `embed-zkeys`. `Groth16Materials::from_cache` (native filesystem) is unaffected. - Feature-gate `storage::groth16_cache` (and the exported `cache_embedded_groth16_material`) behind `all(not(wasm32), embed-zkeys)`. - Fix WASM compilation error: split the single `#[uniffi::export] impl Groth16Materials` block into two (one per feature/target gate) so the uniffi proc-macro no longer generates FFI shims that reference `from_cache`/`StoragePaths` on wasm32 targets. - Fix dead-code / unused-import warnings on wasm32: - logger.rs: gate `struct LogEvent`, `LOG_CHANNEL`, and the `mpsc`/`Mutex` imports behind `#[cfg(not(target_arch = "wasm32"))]`. - storage/lock.rs: gate `StorageError` import behind non-wasm. - Add `required-features = ["embed-zkeys"]` to the integration test targets that call `from_embedded` / `load_embedded_*` so cargo skips them when the feature is off. - Fix pre-existing missing-docs error in authenticator_integration.rs and credential_storage_integration.rs (clippy --all-targets -D warnings). - Update crate-level doc example to use the correct API and mark it `ignore` since it requires the `embed-zkeys` feature. Co-authored-by: otto@toolsforhumanity.com --- walletkit-core/Cargo.toml | 21 ++++++++++++----- walletkit-core/src/authenticator/mod.rs | 23 ++++++++++++++----- walletkit-core/src/lib.rs | 19 +++++++-------- walletkit-core/src/logger.rs | 9 +++++++- walletkit-core/src/storage/lock.rs | 4 +++- walletkit-core/src/storage/mod.rs | 4 ++-- .../tests/authenticator_integration.rs | 2 ++ .../tests/credential_storage_integration.rs | 2 ++ walletkit/Cargo.toml | 3 +++ 9 files changed, 60 insertions(+), 27 deletions(-) diff --git a/walletkit-core/Cargo.toml b/walletkit-core/Cargo.toml index 517b33efd..d1f88dca3 100644 --- a/walletkit-core/Cargo.toml +++ b/walletkit-core/Cargo.toml @@ -49,11 +49,7 @@ zeroize = "1" uuid = { version = "1.10", features = ["v4"] } uniffi = { workspace = true } taceo-oprf = { version = "0.7.1", default-features = false, features = ["client"] } -world-id-core = { workspace = true, features = [ - "authenticator", - "embed-zkeys", - "zstd-compress-zkeys", -] } +world-id-core = { workspace = true, features = ["authenticator"] } ciborium = "0.2.2" walletkit-db = { workspace = true } @@ -94,6 +90,11 @@ default = ["issuers"] compress-zkeys = ["world-id-core/compress-zkeys"] issuers = ["dep:base64"] +# Embeds compiled zkeys into the binary at compile time, enabling `Groth16Materials::from_embedded`. +# Also activates `cache_embedded_groth16_material` on native targets. +# Disable this feature for environments where binary size matters (e.g. WASM). +embed-zkeys = ["world-id-core/embed-zkeys", "world-id-core/zstd-compress-zkeys"] + # SECTION: V3 Feature Flags # Before conventions were introduced for external nullifiers with `app_id` & `action`, raw field elements were used. # This feature flag adds support to operate with such external nullifiers. @@ -101,9 +102,17 @@ legacy-nullifiers = [] semaphore = ["dep:semaphore-rs", "semaphore-rs/depth_30"] v3 = ["semaphore", "legacy-nullifiers", "ruint/ark-ff-04"] +[[test]] +name = "authenticator_integration" +required-features = ["embed-zkeys"] + +[[test]] +name = "proof_generation_integration" +required-features = ["embed-zkeys"] + [lints] workspace = true [package.metadata.docs.rs] no-default-features = true -features = ["issuers"] +features = ["issuers", "embed-zkeys"] diff --git a/walletkit-core/src/authenticator/mod.rs b/walletkit-core/src/authenticator/mod.rs index ff028abf7..7a9c2b6f2 100644 --- a/walletkit-core/src/authenticator/mod.rs +++ b/walletkit-core/src/authenticator/mod.rs @@ -30,7 +30,7 @@ mod with_storage; /// Pre-loaded Groth16 proving material (query circuit + nullifier circuit). /// -/// Construct via [`Groth16Materials::from_embedded`] (all platforms) or +/// Construct via [`Groth16Materials::from_embedded`] (requires the `embed-zkeys` feature) or /// [`Groth16Materials::from_cache`] (native only, loads from filesystem). #[derive(Clone, uniffi::Object)] pub struct Groth16Materials { @@ -44,12 +44,17 @@ impl std::fmt::Debug for Groth16Materials { } } +/// Constructors that require embedded zkeys compiled into the binary. +/// +/// Enable the `embed-zkeys` Cargo feature to activate these. +#[cfg(feature = "embed-zkeys")] #[uniffi::export] impl Groth16Materials { /// Loads Groth16 material from the embedded (compiled-in) zkeys and graphs. /// - /// This works on every platform including WASM. The material is baked into - /// the binary at compile time so no filesystem access is required. + /// Requires the `embed-zkeys` feature. The material is baked into the binary at + /// compile time so no filesystem access is required, and this works on every + /// platform including WASM. /// /// # Errors /// @@ -71,10 +76,17 @@ impl Groth16Materials { nullifier: Arc::new(nullifier), }) } +} +/// Constructors that load Groth16 material from the native filesystem. +/// +/// Not available on WASM targets (no filesystem access). +#[cfg(not(target_arch = "wasm32"))] +#[uniffi::export] +impl Groth16Materials { /// Loads Groth16 material from cached files on disk. /// - /// Use [`cache_embedded_groth16_material`](crate::storage::cache_embedded_groth16_material) + /// Use `storage::cache_embedded_groth16_material` (requires the `embed-zkeys` feature) /// to populate the cache before calling this. /// /// Not available on WASM (no filesystem). @@ -82,7 +94,6 @@ impl Groth16Materials { /// # Errors /// /// Returns an error if the cached files cannot be read or verified. - #[cfg(not(target_arch = "wasm32"))] #[uniffi::constructor] #[allow(clippy::needless_pass_by_value)] pub fn from_cache(paths: Arc) -> Result { @@ -494,7 +505,7 @@ impl InitializingAuthenticator { } } -#[cfg(test)] +#[cfg(all(test, feature = "embed-zkeys"))] mod tests { use super::*; use crate::storage::tests_utils::{ diff --git a/walletkit-core/src/lib.rs b/walletkit-core/src/lib.rs index 381090f2d..21f3e90b0 100644 --- a/walletkit-core/src/lib.rs +++ b/walletkit-core/src/lib.rs @@ -3,22 +3,19 @@ //! //! # Example //! -//! ```rust,no_run +//! ```rust,ignore +//! // Note: `Groth16Materials::from_embedded` requires the `embed-zkeys` Cargo feature. +//! // On native targets you can alternatively use `Groth16Materials::from_cache` after +//! // calling `storage::cache_embedded_groth16_material` to populate the on-disk cache. //! use std::sync::Arc; //! use walletkit_core::requests::ProofRequest; -//! use walletkit_core::storage::{ -//! cache_embedded_groth16_material, CredentialStore, StoragePaths, -//! }; -//! use walletkit_core::{Authenticator, Environment}; +//! use walletkit_core::storage::CredentialStore; +//! use walletkit_core::{Authenticator, Environment, Groth16Materials}; //! -//! /// Platform layer provides a [`CredentialStore`] backed by a -//! /// device-specific [`StorageProvider`](walletkit_core::storage::StorageProvider). //! async fn generate_world_id_proof( //! store: Arc, //! ) -> Result<(), Box> { -//! // Cache Groth16 proving material to disk (idempotent). -//! let paths = StoragePaths::from_root("/data/walletkit".into()); -//! cache_embedded_groth16_material(&paths)?; +//! let materials = Arc::new(Groth16Materials::from_embedded()?); //! //! // Initialize an authenticator for an already-registered World ID. //! let seed = b"my_secret_seed_at_length_32_bytes!"; @@ -27,7 +24,7 @@ //! None, // uses default RPC URL //! &Environment::Staging, //! None, // uses default region -//! &paths, +//! materials, //! store, //! ) //! .await?; diff --git a/walletkit-core/src/logger.rs b/walletkit-core/src/logger.rs index c0d929468..6e5dba657 100644 --- a/walletkit-core/src/logger.rs +++ b/walletkit-core/src/logger.rs @@ -1,7 +1,9 @@ use std::{ fmt, - sync::{mpsc, Arc, Mutex, OnceLock}, + sync::{Arc, OnceLock}, }; +#[cfg(not(target_arch = "wasm32"))] +use std::sync::{mpsc, Mutex}; #[cfg(not(target_arch = "wasm32"))] use std::thread; @@ -119,6 +121,10 @@ impl tracing::field::Visit for EventFieldVisitor { /// Forwards walletkit tracing events to the foreign logger. struct ForeignLoggerLayer; +// On native targets, log events flow through a channel to avoid making FFI +// calls from within a UniFFI future-poll context. On WASM the Logger is +// called directly because there is no background thread support. +#[cfg(not(target_arch = "wasm32"))] struct LogEvent { level: LogLevel, message: String, @@ -134,6 +140,7 @@ struct LogEvent { // the tracing layer never makes an FFI call — it only pushes to an in-process // queue — and the dedicated delivery thread calls `Logger::log` from a clean // stack with no active FFI frames. +#[cfg(not(target_arch = "wasm32"))] static LOG_CHANNEL: OnceLock>> = OnceLock::new(); #[cfg(target_arch = "wasm32")] static LOGGER_INSTANCE: OnceLock> = OnceLock::new(); diff --git a/walletkit-core/src/storage/lock.rs b/walletkit-core/src/storage/lock.rs index 8a36f1b15..ef9c4ec33 100644 --- a/walletkit-core/src/storage/lock.rs +++ b/walletkit-core/src/storage/lock.rs @@ -9,7 +9,9 @@ use std::path::Path; -use super::error::{StorageError, StorageResult}; +use super::error::StorageResult; +#[cfg(not(target_arch = "wasm32"))] +use super::error::StorageError; // WASM: no-op lock (single-threaded worker, SQLITE_THREADSAFE=0) diff --git a/walletkit-core/src/storage/mod.rs b/walletkit-core/src/storage/mod.rs index 67e42f0b2..16c705419 100644 --- a/walletkit-core/src/storage/mod.rs +++ b/walletkit-core/src/storage/mod.rs @@ -4,7 +4,7 @@ pub mod cache; pub mod credential_storage; pub mod envelope; pub mod error; -#[cfg(not(target_arch = "wasm32"))] +#[cfg(all(not(target_arch = "wasm32"), feature = "embed-zkeys"))] pub mod groth16_cache; pub mod keys; pub mod lock; @@ -16,7 +16,7 @@ pub mod vault; pub use cache::CacheDb; pub use credential_storage::CredentialStore; pub use error::{StorageError, StorageResult}; -#[cfg(not(target_arch = "wasm32"))] +#[cfg(all(not(target_arch = "wasm32"), feature = "embed-zkeys"))] pub use groth16_cache::cache_embedded_groth16_material; pub use keys::StorageKeys; pub use lock::{StorageLock, StorageLockGuard}; diff --git a/walletkit-core/tests/authenticator_integration.rs b/walletkit-core/tests/authenticator_integration.rs index d6c486a77..e5c4c0581 100644 --- a/walletkit-core/tests/authenticator_integration.rs +++ b/walletkit-core/tests/authenticator_integration.rs @@ -1,3 +1,5 @@ +#![allow(missing_docs, clippy::missing_docs_in_private_items)] + mod common; use alloy::node_bindings::AnvilInstance; diff --git a/walletkit-core/tests/credential_storage_integration.rs b/walletkit-core/tests/credential_storage_integration.rs index 5beb988fb..fd272a829 100644 --- a/walletkit-core/tests/credential_storage_integration.rs +++ b/walletkit-core/tests/credential_storage_integration.rs @@ -1,3 +1,5 @@ +#![allow(missing_docs, clippy::missing_docs_in_private_items)] + mod common; use rand::rngs::OsRng; diff --git a/walletkit/Cargo.toml b/walletkit/Cargo.toml index 29ca9745c..471516bfc 100644 --- a/walletkit/Cargo.toml +++ b/walletkit/Cargo.toml @@ -28,6 +28,9 @@ default = ["issuers"] semaphore = ["walletkit-core/semaphore"] compress-zkeys = ["walletkit-core/compress-zkeys"] issuers = ["walletkit-core/issuers"] +# Embeds zkeys into the binary, enabling `Groth16Materials::from_embedded`. +# See walletkit-core's `embed-zkeys` feature for details. +embed-zkeys = ["walletkit-core/embed-zkeys"] # v3 features v3 = ["walletkit-core/v3"] From cd7fc86c673c5eddf7a704a8002de7f1529b8379 Mon Sep 17 00:00:00 2001 From: Otto Date: Tue, 17 Mar 2026 16:17:53 +0000 Subject: [PATCH 22/33] chore: fix rustfmt import ordering in logger and storage/lock Co-authored-by: otto@toolsforhumanity.com --- walletkit-core/src/logger.rs | 4 ++-- walletkit-core/src/storage/lock.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/walletkit-core/src/logger.rs b/walletkit-core/src/logger.rs index 6e5dba657..62675106a 100644 --- a/walletkit-core/src/logger.rs +++ b/walletkit-core/src/logger.rs @@ -1,9 +1,9 @@ +#[cfg(not(target_arch = "wasm32"))] +use std::sync::{mpsc, Mutex}; use std::{ fmt, sync::{Arc, OnceLock}, }; -#[cfg(not(target_arch = "wasm32"))] -use std::sync::{mpsc, Mutex}; #[cfg(not(target_arch = "wasm32"))] use std::thread; diff --git a/walletkit-core/src/storage/lock.rs b/walletkit-core/src/storage/lock.rs index ef9c4ec33..b695ea101 100644 --- a/walletkit-core/src/storage/lock.rs +++ b/walletkit-core/src/storage/lock.rs @@ -9,9 +9,9 @@ use std::path::Path; -use super::error::StorageResult; #[cfg(not(target_arch = "wasm32"))] use super::error::StorageError; +use super::error::StorageResult; // WASM: no-op lock (single-threaded worker, SQLITE_THREADSAFE=0) From f9f9aead16e129f8ab78b4f1afe61ea1acff1d6d Mon Sep 17 00:00:00 2001 From: Otto Date: Tue, 17 Mar 2026 21:38:54 +0000 Subject: [PATCH 23/33] refactor: replace #[allow] with #[expect] + reason comment on from_cache UniFFI constructors require owned Arc arguments across the FFI boundary, so clippy::needless_pass_by_value cannot be acted on here. Document this with #[expect(..., reason = ...)] so the suppression is self-explanatory and will become a compile error if the lint ever stops firing. Co-authored-by: otto@toolsforhumanity.com --- walletkit-core/src/authenticator/mod.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/walletkit-core/src/authenticator/mod.rs b/walletkit-core/src/authenticator/mod.rs index 7a9c2b6f2..844e29270 100644 --- a/walletkit-core/src/authenticator/mod.rs +++ b/walletkit-core/src/authenticator/mod.rs @@ -95,7 +95,13 @@ impl Groth16Materials { /// /// Returns an error if the cached files cannot be read or verified. #[uniffi::constructor] - #[allow(clippy::needless_pass_by_value)] + // `Arc` must be taken by value: UniFFI constructors receive + // object arguments as owned `Arc`s across the FFI boundary, so passing by + // reference is not an option here. + #[expect( + clippy::needless_pass_by_value, + reason = "UniFFI constructors require owned Arc arguments" + )] pub fn from_cache(paths: Arc) -> Result { let query_zkey = paths.query_zkey_path(); let nullifier_zkey = paths.nullifier_zkey_path(); From f76dc47d9888c20b5822ba9143a805444e3c39ad Mon Sep 17 00:00:00 2001 From: Otto Date: Tue, 17 Mar 2026 22:15:20 +0000 Subject: [PATCH 24/33] fix(walletkit-db): serialize sqlite3mc codec init to fix flaky tests sqlite3mc registers its cipher implementations during the very first sqlite3_open_v2 call. When the test binary runs all 8 tests as parallel threads, two threads can race inside that one-time initialization window and one sees 'unknown cipher chacha20' even though chacha20 is compiled in (CODEC_TYPE_CHACHA20). Add init_sqlite() using std::sync::OnceLock so that exactly one thread performs the first open; all other threads block until codec initialization is complete before running their own test-specific code. Called as the first statement of every test in the file. Co-authored-by: otto@toolsforhumanity.com --- walletkit-db/src/tests.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/walletkit-db/src/tests.rs b/walletkit-db/src/tests.rs index a2177bf7a..7cd799e08 100644 --- a/walletkit-db/src/tests.rs +++ b/walletkit-db/src/tests.rs @@ -1,10 +1,32 @@ //! Unit tests for the safe `SQLite` db wrapper. +use std::sync::OnceLock; + use super::*; use zeroize::Zeroizing; +/// Ensures sqlite3mc's global codec registration is complete before any test +/// body runs. +/// +/// sqlite3mc registers its cipher implementations the first time +/// `sqlite3_open_v2` is called. When the test binary runs all tests in +/// parallel threads, two threads can race inside that one-time +/// initialization and one of them sees an "unknown cipher 'chacha20'" +/// error even though chacha20 is compiled in. +/// +/// Calling this at the start of every test ensures exactly one thread +/// performs the first open (all others block on the `OnceLock`) so that +/// by the time any test-specific code runs, sqlite3mc is fully initialized. +fn init_sqlite() { + static INIT: OnceLock<()> = OnceLock::new(); + INIT.get_or_init(|| { + drop(Connection::open_in_memory().expect("sqlite3mc pre-init")); + }); +} + #[test] fn test_open_in_memory() { + init_sqlite(); let conn = Connection::open_in_memory().expect("open in-memory db"); conn.execute_batch("CREATE TABLE t (id INTEGER PRIMARY KEY, val TEXT);") .expect("create table"); @@ -23,6 +45,7 @@ fn test_open_in_memory() { #[test] fn test_query_row_optional_none() { + init_sqlite(); let conn = Connection::open_in_memory().expect("open in-memory db"); conn.execute_batch("CREATE TABLE t (id INTEGER PRIMARY KEY);") .expect("create table"); @@ -36,6 +59,7 @@ fn test_query_row_optional_none() { #[test] fn test_transaction_commit() { + init_sqlite(); let conn = Connection::open_in_memory().expect("open in-memory db"); conn.execute_batch("CREATE TABLE t (id INTEGER PRIMARY KEY);") .expect("create table"); @@ -55,6 +79,7 @@ fn test_transaction_commit() { #[test] fn test_transaction_rollback_on_drop() { + init_sqlite(); let conn = Connection::open_in_memory().expect("open in-memory db"); conn.execute_batch("CREATE TABLE t (id INTEGER PRIMARY KEY);") .expect("create table"); @@ -74,6 +99,7 @@ fn test_transaction_rollback_on_drop() { #[test] fn test_blob_round_trip() { + init_sqlite(); let conn = Connection::open_in_memory().expect("open in-memory db"); conn.execute_batch("CREATE TABLE t (id INTEGER PRIMARY KEY, data BLOB);") .expect("create table"); @@ -93,6 +119,7 @@ fn test_blob_round_trip() { #[test] fn test_null_handling() { + init_sqlite(); let conn = Connection::open_in_memory().expect("open in-memory db"); conn.execute_batch("CREATE TABLE t (id INTEGER PRIMARY KEY, val TEXT);") .expect("create table"); @@ -111,6 +138,7 @@ fn test_null_handling() { #[test] fn test_cipher_encrypted_round_trip() { + init_sqlite(); let dir = tempfile::tempdir().expect("create temp dir"); let path = dir.path().join("cipher-test.sqlite"); let key = Zeroizing::new([0xABu8; 32]); @@ -148,6 +176,7 @@ fn test_cipher_encrypted_round_trip() { #[test] fn test_integrity_check() { + init_sqlite(); let conn = Connection::open_in_memory().expect("open in-memory db"); let ok = cipher::integrity_check(&conn).expect("check"); assert!(ok); From 496f4f51f57b3506e1231f6ddced8dce7258dac6 Mon Sep 17 00:00:00 2001 From: Otto Date: Tue, 17 Mar 2026 22:36:20 +0000 Subject: [PATCH 25/33] fix(docs.rs): remove embed-zkeys from docs.rs features docs.rs builds run without network access; world-id-core/embed-zkeys downloads circuit files (zkeys) during the build script, so including it in [package.metadata.docs.rs] features would cause every docs.rs build to fail with a network error. The crate-level example is already marked `ignore` precisely because it calls from_embedded() which requires embed-zkeys, so removing the feature from the docs.rs config is safe and complete. Co-authored-by: otto@toolsforhumanity.com --- walletkit-core/Cargo.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/walletkit-core/Cargo.toml b/walletkit-core/Cargo.toml index d1f88dca3..baba9e516 100644 --- a/walletkit-core/Cargo.toml +++ b/walletkit-core/Cargo.toml @@ -115,4 +115,7 @@ workspace = true [package.metadata.docs.rs] no-default-features = true -features = ["issuers", "embed-zkeys"] +# embed-zkeys is intentionally excluded: docs.rs builds have no network +# access, and world-id-core/embed-zkeys downloads circuit files at compile +# time. The crate-level doc example is marked `ignore` for this reason. +features = ["issuers"] From 9311b781d733afa5594d0549b8638a1184d5dd1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Tr=C4=85d?= Date: Tue, 17 Mar 2026 23:40:02 +0100 Subject: [PATCH 26/33] Apply suggestion from @Dzejkop --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5b4e5d9df..1eb2ef264 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,6 +61,10 @@ jobs: toolchain: 1.92.0 targets: wasm32-unknown-unknown + # clang-18 (LLVM 18) is the minimum version that supports the C23 + # [[noreturn]] attribute syntax used in sqlite-wasm-rs's wasm-shim.h. + # The system clang on Ubuntu (clang-14) predates C23 attribute support + # and fails to compile the shim, so we must install a newer toolchain explicitly. - name: Install LLVM toolchain for WASM C build shell: bash run: | From cf00408271d71326282592737c8b17fc1bbc3929 Mon Sep 17 00:00:00 2001 From: Otto Date: Wed, 18 Mar 2026 09:01:52 +0000 Subject: [PATCH 27/33] fix(docs): replace broken intra-doc link to from_embedded from_embedded is gated behind #[cfg(feature = "embed-zkeys")] and embed-zkeys is excluded from [package.metadata.docs.rs] features (docs.rs has no network access for the circuit download). rustdoc resolves intra-doc links against the features active at doc-build time, so the backtick link produced an unresolved-link error under RUSTDOCFLAGS=-Dwarnings. Replace with a plain code-span so the reference remains readable in the rendered docs without creating a dead link. Co-authored-by: otto@toolsforhumanity.com --- walletkit-core/src/authenticator/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/walletkit-core/src/authenticator/mod.rs b/walletkit-core/src/authenticator/mod.rs index 844e29270..19fe41833 100644 --- a/walletkit-core/src/authenticator/mod.rs +++ b/walletkit-core/src/authenticator/mod.rs @@ -30,7 +30,7 @@ mod with_storage; /// Pre-loaded Groth16 proving material (query circuit + nullifier circuit). /// -/// Construct via [`Groth16Materials::from_embedded`] (requires the `embed-zkeys` feature) or +/// Construct via `Groth16Materials::from_embedded` (requires the `embed-zkeys` feature) or /// [`Groth16Materials::from_cache`] (native only, loads from filesystem). #[derive(Clone, uniffi::Object)] pub struct Groth16Materials { From 5749d2955c89fe81b0dbbd979dc0354abde2004c Mon Sep 17 00:00:00 2001 From: Otto Date: Wed, 18 Mar 2026 15:43:58 +0000 Subject: [PATCH 28/33] refactor(logger): split init_logging into platform-specific helpers Replace the single init_logging function that contained scattered inline #[cfg] blocks with three self-contained functions: - init_logging_native (#[cfg(not(wasm32))]): mpsc channel + background delivery thread. Documents *why* the channel is needed: calling a UniFFI foreign callback synchronously from inside UniFFI's future-poll machinery (rust_call_with_out_status) causes EXC_BAD_ACCESS due to nested FFI frame corruption. - init_logging_wasm (#[cfg(wasm32)]): stores the logger in LOGGER_INSTANCE for direct synchronous dispatch. Safe on WASM because the single-threaded cooperative runtime cannot have a UniFFI poll frame on the stack when a tracing event fires. - init_logging (ungated, #[uniffi::export]): handles the LOGGING_INITIALIZED idempotency guard and the shared subscriber setup, then dispatches to the appropriate platform impl via a single #[cfg]-gated call site. Each platform's code path is now fully self-contained; the public dispatcher contains no inline cfg blocks at all. Co-authored-by: otto@toolsforhumanity.com --- walletkit-core/src/logger.rs | 58 +++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/walletkit-core/src/logger.rs b/walletkit-core/src/logger.rs index 62675106a..bfc45ec17 100644 --- a/walletkit-core/src/logger.rs +++ b/walletkit-core/src/logger.rs @@ -269,6 +269,44 @@ pub fn emit_log(level: LogLevel, message: String) { } } +/// Native platform initializer: wires the foreign logger to a dedicated +/// delivery thread via an mpsc channel. +/// +/// The channel decouples `ForeignLoggerLayer::on_event` (called from inside +/// `UniFFI`'s future-poll machinery) from the actual FFI call to `Logger::log`. +/// Invoking a `UniFFI` foreign callback synchronously while a `UniFFI` frame is +/// already on the stack causes an `EXC_BAD_ACCESS`; the background thread avoids +/// that by delivering events from a clean, FFI-free call stack. +/// +/// # Panics +/// +/// Panics if the background thread cannot be spawned. +#[cfg(not(target_arch = "wasm32"))] +fn init_logging_native(logger: Arc) { + let (tx, rx) = mpsc::channel::(); + let _ = LOG_CHANNEL.set(Mutex::new(tx)); + + thread::Builder::new() + .name("walletkit-logger".into()) + .spawn(move || { + for event in rx { + logger.log(event.level, event.message); + } + }) + .expect("failed to spawn walletkit logger thread"); +} + +/// WASM platform initializer: stores the logger directly so that +/// `ForeignLoggerLayer::on_event` can call it synchronously. +/// +/// On WASM there is no background-thread risk: the runtime is +/// single-threaded and cooperative, so no UniFFI future-poll frame can be +/// on the stack when a tracing event fires. +#[cfg(target_arch = "wasm32")] +fn init_logging_wasm(logger: Arc) { + let _ = LOGGER_INSTANCE.set(logger); +} + /// Initializes `WalletKit` tracing and registers a foreign logger sink. /// /// `level` controls the minimum severity for `WalletKit` and its direct @@ -280,7 +318,7 @@ pub fn emit_log(level: LogLevel, message: String) { /// /// # Panics /// -/// Panics if the dedicated logger delivery thread cannot be spawned. +/// Panics if the dedicated logger delivery thread cannot be spawned (native only). #[uniffi::export] pub fn init_logging(logger: Arc, level: Option) { if LOGGING_INITIALIZED.get().is_some() { @@ -288,24 +326,10 @@ pub fn init_logging(logger: Arc, level: Option) { } #[cfg(not(target_arch = "wasm32"))] - { - let (tx, rx) = mpsc::channel::(); - let _ = LOG_CHANNEL.set(Mutex::new(tx)); - - thread::Builder::new() - .name("walletkit-logger".into()) - .spawn(move || { - for event in rx { - logger.log(event.level, event.message); - } - }) - .expect("failed to spawn walletkit logger thread"); - } + init_logging_native(logger); #[cfg(target_arch = "wasm32")] - { - let _ = LOGGER_INSTANCE.set(logger); - } + init_logging_wasm(logger); let _ = tracing_log::LogTracer::init(); From 79ae99acf39db303d38029fa7b09bb7faa412887 Mon Sep 17 00:00:00 2001 From: Otto Date: Wed, 18 Mar 2026 18:45:03 +0000 Subject: [PATCH 29/33] fix(wasm): vendor world-id-{authenticator,proof} with default=[]; prevent circuit download MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both world-id-authenticator v0.5.2 and world-id-proof v0.5.2 ship with default = ["embed-zkeys"], which means any package that activates them without explicit default-features = false ends up triggering world-id-proof's build script to download ~100 MB of circuit files from raw.githubusercontent.com. The two paths that activated world-id-proof/embed-zkeys without our knowledge: 1. walletkit-core -> world-id-core/authenticator -> dep:world-id-authenticator (default-features = true) -> world-id-authenticator/embed-zkeys -> world-id-proof/embed-zkeys ← download 2. walletkit-core -> world-id-core/authenticator -> dep:world-id-proof (default-features = true) -> world-id-proof/default = ["embed-zkeys"] ← download Neither path is controllable from our Cargo.toml without patching upstream crates, since both are inside the published world-id-core v0.5.2. Fix: vendor both crates with a single change each (default = []) and add [patch.crates-io] entries pointing to the vendor copies. The embed-zkeys feature still activates correctly when our own feature is explicitly enabled (verified: world-id-proof resolves to [embed-zkeys, zstd-compress-zkeys] when walletkit-core/embed-zkeys is active). The vendor copies are verbatim source from crates.io v0.5.2 with only the [features] default line changed. They should be updated whenever either crate is bumped. Co-authored-by: otto@toolsforhumanity.com --- Cargo.lock | 4 - Cargo.toml | 27 + vendor/world-id-authenticator/.cargo-ok | 1 + .../.cargo_vcs_info.json | 6 + vendor/world-id-authenticator/Cargo.lock | 5594 +++++++++++++++++ vendor/world-id-authenticator/Cargo.toml | 182 + vendor/world-id-authenticator/Cargo.toml.orig | 68 + vendor/world-id-authenticator/README.md | 7 + .../abi/WorldIDRegistryAbi.json | 1901 ++++++ .../world-id-authenticator/src/api_types.rs | 1 + .../src/authenticator.rs | 1578 +++++ vendor/world-id-authenticator/src/lib.rs | 10 + vendor/world-id-authenticator/src/registry.rs | 204 + vendor/world-id-proof/.cargo-ok | 1 + vendor/world-id-proof/.cargo_vcs_info.json | 6 + vendor/world-id-proof/Cargo.lock | 5379 ++++++++++++++++ vendor/world-id-proof/Cargo.toml | 171 + vendor/world-id-proof/Cargo.toml.orig | 59 + vendor/world-id-proof/README.md | 24 + vendor/world-id-proof/build.rs | 240 + .../src/credential_blinding_factor.rs | 127 + vendor/world-id-proof/src/lib.rs | 44 + vendor/world-id-proof/src/nullifier.rs | 137 + vendor/world-id-proof/src/proof.rs | 435 ++ vendor/world-id-proof/src/proof/errors.rs | 847 +++ 25 files changed, 17049 insertions(+), 4 deletions(-) create mode 100644 vendor/world-id-authenticator/.cargo-ok create mode 100644 vendor/world-id-authenticator/.cargo_vcs_info.json create mode 100644 vendor/world-id-authenticator/Cargo.lock create mode 100644 vendor/world-id-authenticator/Cargo.toml create mode 100644 vendor/world-id-authenticator/Cargo.toml.orig create mode 100644 vendor/world-id-authenticator/README.md create mode 100644 vendor/world-id-authenticator/abi/WorldIDRegistryAbi.json create mode 100644 vendor/world-id-authenticator/src/api_types.rs create mode 100644 vendor/world-id-authenticator/src/authenticator.rs create mode 100644 vendor/world-id-authenticator/src/lib.rs create mode 100644 vendor/world-id-authenticator/src/registry.rs create mode 100644 vendor/world-id-proof/.cargo-ok create mode 100644 vendor/world-id-proof/.cargo_vcs_info.json create mode 100644 vendor/world-id-proof/Cargo.lock create mode 100644 vendor/world-id-proof/Cargo.toml create mode 100644 vendor/world-id-proof/Cargo.toml.orig create mode 100644 vendor/world-id-proof/README.md create mode 100644 vendor/world-id-proof/build.rs create mode 100644 vendor/world-id-proof/src/credential_blinding_factor.rs create mode 100644 vendor/world-id-proof/src/lib.rs create mode 100644 vendor/world-id-proof/src/nullifier.rs create mode 100644 vendor/world-id-proof/src/proof.rs create mode 100644 vendor/world-id-proof/src/proof/errors.rs diff --git a/Cargo.lock b/Cargo.lock index c7555c8e6..8e30cd1f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7060,8 +7060,6 @@ dependencies = [ [[package]] name = "world-id-authenticator" version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9f1532f0fd610cff4b6c8c92f049245a204d917715095d1300c7499c15fafdc" dependencies = [ "alloy", "anyhow", @@ -7138,8 +7136,6 @@ dependencies = [ [[package]] name = "world-id-proof" version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc3f2025b9a6475a838b07ad48381f00e4515d158d1fd10d2aebb3c10dfb81d" dependencies = [ "ark-bn254 0.5.0", "ark-ec 0.5.0", diff --git a/Cargo.toml b/Cargo.toml index 95625a32d..c24009c9b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,3 +42,30 @@ opt-level = 'z' # Optimize for size. lto = true # Enable Link Time Optimization. panic = "abort" debug = false + +# ── Vendored patches ───────────────────────────────────────────────────────── +# +# world-id-authenticator v0.5.2 ships with `default = ["embed-zkeys"]`, which +# propagates `world-id-proof/embed-zkeys` into the dependency graph even when +# that feature is not explicitly requested. `world-id-proof/embed-zkeys` +# triggers a build-script network download of circuit files (~100 MB from +# raw.githubusercontent.com), making the `cargo check --target +# wasm32-unknown-unknown` CI step unreliable whenever that host cannot reach +# GitHub's raw content CDN. +# +# This patch vendors the crate with `default = []` so that embed-zkeys is only +# activated when our own `embed-zkeys` feature is explicitly enabled (which +# goes through `world-id-core/embed-zkeys` → `world-id-proof/embed-zkeys` +# directly, bypassing world-id-authenticator's defaults entirely). +# +# The source is a verbatim copy of world-id-authenticator v0.5.2 with only the +# `[features] default` line changed. Update the vendor copy whenever +# world-id-authenticator is bumped. +[patch.crates-io] +world-id-authenticator = { path = "vendor/world-id-authenticator" } +# world-id-proof v0.5.2 ships with `default = ["embed-zkeys"]`, so any +# dependency that activates it with default-features (including world-id-core +# itself) triggers a build-script network download of circuit files. This +# patch sets `default = []` so the download only happens when embed-zkeys is +# explicitly requested via our own `embed-zkeys` feature flag. +world-id-proof = { path = "vendor/world-id-proof" } diff --git a/vendor/world-id-authenticator/.cargo-ok b/vendor/world-id-authenticator/.cargo-ok new file mode 100644 index 000000000..5f8b79583 --- /dev/null +++ b/vendor/world-id-authenticator/.cargo-ok @@ -0,0 +1 @@ +{"v":1} \ No newline at end of file diff --git a/vendor/world-id-authenticator/.cargo_vcs_info.json b/vendor/world-id-authenticator/.cargo_vcs_info.json new file mode 100644 index 000000000..96004a4dc --- /dev/null +++ b/vendor/world-id-authenticator/.cargo_vcs_info.json @@ -0,0 +1,6 @@ +{ + "git": { + "sha1": "a45e0df122c3b57081fd7babd4b2727577dbbbe1" + }, + "path_in_vcs": "crates/authenticator" +} \ No newline at end of file diff --git a/vendor/world-id-authenticator/Cargo.lock b/vendor/world-id-authenticator/Cargo.lock new file mode 100644 index 000000000..8fd89f01e --- /dev/null +++ b/vendor/world-id-authenticator/Cargo.lock @@ -0,0 +1,5594 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +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 = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4973038846323e4e69a433916522195dce2947770076c03078fc21c80ea0f1c4" +dependencies = [ + "alloy-consensus", + "alloy-contract", + "alloy-core", + "alloy-eips", + "alloy-network", + "alloy-provider", + "alloy-rpc-client", + "alloy-signer", + "alloy-signer-local", + "alloy-transport", + "alloy-transport-http", +] + +[[package]] +name = "alloy-chains" +version = "0.2.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f374d3c6d729268bbe2d0e0ff992bb97898b2df756691a62ee1d5f0506bc39" +dependencies = [ + "alloy-primitives", + "num_enum", + "strum", +] + +[[package]] +name = "alloy-consensus" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c0dc44157867da82c469c13186015b86abef209bf0e41625e4b68bac61d728" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "alloy-tx-macros", + "auto_impl", + "borsh", + "c-kzg", + "derive_more", + "either", + "k256", + "once_cell", + "rand 0.8.5", + "secp256k1", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-consensus-any" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba4cdb42df3871cd6b346d6a938ec2ba69a9a0f49d1f82714bc5c48349268434" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-contract" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca63b7125a981415898ffe2a2a696c83696c9c6bdb1671c8a912946bbd8e49e7" +dependencies = [ + "alloy-consensus", + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-provider", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", + "futures", + "futures-util", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-core" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e8604b0c092fabc80d075ede181c9b9e596249c70b99253082d7e689836529" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2db5c583aaef0255aa63a4fe827f826090142528bba48d1bf4119b62780cad" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "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.18", +] + +[[package]] +name = "alloy-eip2930" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9441120fa82df73e8959ae0e4ab8ade03de2aaae61be313fbf5746277847ce25" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "borsh", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "borsh", + "serde", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-eip7928" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3231de68d5d6e75332b7489cfcc7f4dfabeba94d990a10e4b923af0e6623540" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "borsh", + "serde", +] + +[[package]] +name = "alloy-eips" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f7ef09f21bd1e9cb8a686f168cb4a206646804567f0889eadb8dcc4c9288c8" +dependencies = [ + "alloy-eip2124", + "alloy-eip2930", + "alloy-eip7702", + "alloy-eip7928", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "auto_impl", + "borsh", + "c-kzg", + "derive_more", + "either", + "serde", + "serde_with", + "sha2", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-json-abi" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9dbe713da0c737d9e5e387b0ba790eb98b14dd207fe53eef50e19a5a8ec3dac" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff42cd777eea61f370c0b10f2648a1c81e0b783066cd7269228aa993afd487f7" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "http", + "serde", + "serde_json", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cbca04f9b410fdc51aaaf88433cbac761213905a65fe832058bcf6690585762" +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", + "derive_more", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-network-primitives" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d6d15e069a8b11f56bef2eccbad2a873c6dd4d4c81d04dda29710f5ea52f04" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3b431b4e72cd8bd0ec7a50b4be18e73dab74de0dba180eef171055e5d5926e" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "foldhash 0.2.0", + "hashbrown 0.16.1", + "indexmap 2.13.0", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.9.2", + "rapidhash", + "ruint", + "rustc-hash", + "serde", + "sha3", +] + +[[package]] +name = "alloy-provider" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d181c8cc7cf4805d7e589bf4074d56d55064fa1a979f005a45a62b047616d870" +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-signer", + "alloy-sol-types", + "alloy-transport", + "alloy-transport-http", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "either", + "futures", + "futures-utils-wasm", + "lru", + "parking_lot", + "pin-project", + "reqwest", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e93e50f64a77ad9c5470bf2ad0ca02f228da70c792a8f06634801e202579f35e" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8849c74c9ca0f5a03da1c865e3eb6f768df816e67dd3721a398a8a7e398011" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "alloy-rpc-client" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2792758a93ae32a32e9047c843d536e1448044f78422d71bf7d7c05149e103f" +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 = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd720b63f82b457610f2eaaf1f32edf44efffe03ae25d537632e7d23e7929e1a" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2dc411f13092f237d2bf6918caf80977fc2f51485f9b90cb2a2f956912c8c9" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.14.0", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-serde" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2ce1e0dbf7720eee747700e300c99aac01b1a95bb93f493a01e78ee28bb1a37" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2425c6f314522c78e8198979c8cbf6769362be4da381d4152ea8eefce383535d" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "either", + "elliptic-curve", + "k256", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-signer-local" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ecb71ee53d8d9c3fa7bac17542c8116ebc7a9726c91b1bf333ec3d04f5a789" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand 0.8.5", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-sol-macro" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab81bab693da9bb79f7a95b64b394718259fdd7e41dceeced4cad57cb71c4f6a" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "489f1620bb7e2483fb5819ed01ab6edc1d2f93939dce35a5695085a1afd1d699" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap 2.13.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "sha3", + "syn 2.0.116", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56cef806ad22d4392c5fc83cf8f2089f988eb99c7067b4e0c6f1971fc1cca318" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck", + "macro-string", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.116", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6df77fea9d6a2a75c0ef8d2acbdfd92286cc599983d3175ccdc170d3433d249" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64612d29379782a5dde6f4b6570d9c756d734d760c0c94c254d361e678a6591f" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa186e560d523d196580c48bf00f1bf62e63041f28ecf276acc22f8b27bb9f53" +dependencies = [ + "alloy-json-rpc", + "auto_impl", + "base64", + "derive_more", + "futures", + "futures-utils-wasm", + "parking_lot", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa501ad58dd20acddbfebc65b52e60f05ebf97c52fa40d1b35e91f5e2da0ad0e" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "itertools 0.14.0", + "reqwest", + "serde_json", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-trie" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d7fd448ab0a017de542de1dcca7a58e7019fe0e7a34ed3f9543ebddf6aceffa" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more", + "nybbles", + "serde", + "smallvec", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "alloy-tx-macros" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa0c53e8c1e1ef4d01066b01c737fb62fc9397ab52c6e7bb5669f97d281b9bc" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[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.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" + +[[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", + "rayon", + "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.116", +] + +[[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.5", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "rayon", + "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", + "rayon", + "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.116", +] + +[[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.116", +] + +[[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", + "rayon", +] + +[[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.5", + "rayon", +] + +[[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", + "rayon", +] + +[[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.116", +] + +[[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", + "rayon", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] + +[[package]] +name = "askama" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08e1676b346cadfec169374f949d7490fd80a24193d37d2afce0c047cf695e57" +dependencies = [ + "askama_macros", + "itoa", + "percent-encoding", + "serde", + "serde_json", +] + +[[package]] +name = "askama_derive" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7661ff56517787343f376f75db037426facd7c8d3049cef8911f1e75016f3a37" +dependencies = [ + "askama_parser", + "basic-toml", + "memchr", + "proc-macro2", + "quote", + "rustc-hash", + "serde", + "serde_derive", + "syn 2.0.116", +] + +[[package]] +name = "askama_macros" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713ee4dbfd1eb719c2dab859465b01fa1d21cb566684614a713a6b7a99a4e47b" +dependencies = [ + "askama_derive", +] + +[[package]] +name = "askama_parser" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d62d674238a526418b30c0def480d5beadb9d8964e7f38d635b03bf639c704c" +dependencies = [ + "rustc-hash", + "serde", + "serde_derive", + "unicode-ident", + "winnow", +] + +[[package]] +name = "assert-json-diff" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" +dependencies = [ + "serde", + "serde_json", +] + +[[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.116", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[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.116", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "aws-lc-rs" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94bffc006df10ac2a68c83692d734a465f8ee6c5b384d8545a636f81d858f4bf" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4321e568ed89bb5a7d291a7f37997c2c0df89809d7b6d12062c81ddb54aa782e" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "backon" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" +dependencies = [ + "fastrand", + "gloo-timers", + "tokio", +] + +[[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.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +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 = "bitcoin-io" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dee39a0ee5b4095224a0cfc6bf4cc1baf0f9624b96b367e53b66d974e51d953" + +[[package]] +name = "bitcoin_hashes" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26ec84b80c482df901772e931a9a681e26a1b9ee2302edeff23cb30328745c8b" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[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 = "blake3" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures", +] + +[[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.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "borsh" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[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.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] + +[[package]] +name = "c-kzg" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e00bf4b112b07b505472dbefd19e37e53307e2bfed5a79e0cc161d58ccd0e687" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "cc" +version = "1.2.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[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.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "circom-witness-rs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35778373aee12ef3d04966187eeae7a04f1451c9226058311f21488df6f28780" +dependencies = [ + "ark-bn254", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "byteorder", + "cxx-build", + "eyre", + "hex", + "num-bigint", + "num-traits", + "postcard", + "rand 0.8.5", + "ruint", + "serde", + "serde_json", +] + +[[package]] +name = "cmake" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +dependencies = [ + "cc", +] + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "colored" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "const-hex" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" +dependencies = [ + "cfg-if", + "cpufeatures", + "proptest", + "serde_core", +] + +[[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.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +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.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + +[[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 = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +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 = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[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 = "cxx-build" +version = "1.0.194" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0f4697d190a142477b16aef7da8a99bfdc41e7e8b1687583c0d23a79c7afc1e" +dependencies = [ + "cc", + "codespan-reporting", + "indexmap 2.13.0", + "proc-macro2", + "quote", + "scratch", + "syn 2.0.116", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "serde", + "strsim", + "syn 2.0.116", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.116", +] + +[[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.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[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.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[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.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.4.1", + "syn 2.0.116", + "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.116", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[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.116", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] + +[[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 = "enum-ordinalize" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[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.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[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 = "filetime" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" +dependencies = [ + "cfg-if", + "libc", + "libredox", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[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 = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[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.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gloo-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[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.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.13.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", + "serde", + "serde_core", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version 0.4.1", + "serde", + "spin", + "stable_deref_trait", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-conservative" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" +dependencies = [ + "arrayvec", +] + +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "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 = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "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", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.6", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +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.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +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.116", +] + +[[package]] +name = "indenter" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" + +[[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.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[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.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +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.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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +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", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b646a74e746cd25045aa0fd42f4f7f78aa6d119380182c7e63a5593c4ab8df6f" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.182" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +dependencies = [ + "bitflags", + "libc", + "redox_syscall 0.7.1", +] + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lru" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" +dependencies = [ + "hashbrown 0.16.1", +] + +[[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.116", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[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 = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "mockito" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90820618712cab19cfc46b274c6c22546a82affcb3c3bdf0f29e3db8e1bb92c0" +dependencies = [ + "assert-json-diff", + "bytes", + "colored", + "futures-core", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "log", + "pin-project-lite", + "rand 0.9.2", + "regex", + "serde_json", + "serde_urlencoded", + "similar", + "tokio", +] + +[[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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[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 = "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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "nybbles" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d49ff0c0d00d4a502b39df9af3a525e1efeb14b9dabb5bb83335284c1309210" +dependencies = [ + "alloy-rlp", + "cfg-if", + "proptest", + "ruint", + "serde", + "smallvec", +] + +[[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.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.116", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pest" +version = "2.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[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.116", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "serde", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +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.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.116", +] + +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +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.116", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566cb3fdacef14c0737f9546df7cfeadbfbc9fef10991038bf5015d0c80532" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags", + "num-traits", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2 0.5.10", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.5.10", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +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" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", + "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 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.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", + "serde", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.5", +] + +[[package]] +name = "rapidhash" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "111325c42c4bafae99e777cd77b40dea9a2b30c69e9d8c74b6eccd7fba4337de" +dependencies = [ + "rustversion", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" +dependencies = [ + "bitflags", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 1.0.6", +] + +[[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.17", + "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.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "ark-ff 0.5.0", + "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.2", + "rlp", + "ruint-macro", + "serde_core", + "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-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.27", +] + +[[package]] +name = "rustix" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "rusty-fork" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scratch" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" + +[[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 = "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 = "secrecy" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" +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.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[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.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[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.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b31139435f327c93c6038ed350ae4588e2c70a13d50599509fee6349967ba35a" +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 = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +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 = "socket2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[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.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[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.116" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53f425ae0b12e2f5ae65542e00898d500d4d318b4baf09f40fd0d410454e9947" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[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.116", +] + +[[package]] +name = "taceo-ark-babyjubjub" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55b5a2cc31c90e79778c4f6375e5d9828171d320db3f8c911a8ad47af4a70069" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "taceo-ark-serde-compat" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07528b4dd1a0c9e49ef352f96219c611af0aa2f7cbd97ddb7276dcf3c2cf8dd0" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "num-bigint", + "serde", + "taceo-ark-babyjubjub", +] + +[[package]] +name = "taceo-circom-types" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677eb3ed8275b2f179d4b1a93126a51c5b4f409c5ea9d7bc50398b13e517e30b" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-poly", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "byteorder", + "num-traits", + "rayon", + "serde", + "serde_json", + "taceo-ark-serde-compat", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "taceo-eddsa-babyjubjub" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75dbec63f7a89093b4116a7164e6a92d3cda33dec248da8c8a5922a80a06e7dd" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "blake3", + "eyre", + "num-bigint", + "rand 0.8.5", + "serde", + "taceo-ark-babyjubjub", + "taceo-ark-serde-compat", + "taceo-poseidon2", + "zeroize", +] + +[[package]] +name = "taceo-groth16" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4983857c95d20ca2dc0400a3a116e6931c012ecc4b78ccede8238cfb0c298e3" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-poly", + "ark-relations", + "eyre", + "num-traits", + "rayon", + "tracing", +] + +[[package]] +name = "taceo-groth16-material" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936b1e6b8a77f931796917501fe13a2ae93304e7eb384ed29d80ddc370b011bd" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-relations", + "ark-serialize 0.5.0", + "circom-witness-rs", + "eyre", + "hex", + "postcard", + "rand 0.8.5", + "ruint", + "sha2", + "taceo-circom-types", + "taceo-groth16", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "taceo-groth16-sol" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c6a7b90f2ecb6db1212557550890d9d9d114447688f6146d726024ec7a3410b" +dependencies = [ + "alloy-primitives", + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "askama", + "eyre", + "ruint", +] + +[[package]] +name = "taceo-oprf" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "412211d4d43aeb060c369a69213bd7ae941f769cc4361df83195d2a7936f22d5" +dependencies = [ + "taceo-oprf-client", + "taceo-oprf-core", + "taceo-oprf-types", +] + +[[package]] +name = "taceo-oprf-client" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de42daf867ed4d1ed661258a4541d5dcf1ebe3f43f923acc3ec7716b8824670d" +dependencies = [ + "ark-ec", + "ciborium", + "futures", + "getrandom 0.2.17", + "gloo-net", + "http", + "serde", + "taceo-ark-babyjubjub", + "taceo-oprf-core", + "taceo-oprf-types", + "taceo-poseidon2", + "thiserror 2.0.18", + "tokio", + "tokio-tungstenite", + "tracing", + "uuid", +] + +[[package]] +name = "taceo-oprf-core" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2baf9c72e6687fa8839c3e3368236b36237a905b8c7fcd445250a7a57ab063" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "blake3", + "itertools 0.14.0", + "num-bigint", + "rand 0.8.5", + "serde", + "subtle", + "taceo-ark-babyjubjub", + "taceo-ark-serde-compat", + "taceo-poseidon2", + "uuid", + "zeroize", +] + +[[package]] +name = "taceo-oprf-types" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447b96ee4bb69a16b05fa1e581501c426338698263cde39fc8fbfdbf5d24b616" +dependencies = [ + "alloy", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "async-trait", + "eyre", + "http", + "serde", + "taceo-ark-babyjubjub", + "taceo-ark-serde-compat", + "taceo-circom-types", + "taceo-groth16-sol", + "taceo-oprf-core", + "uuid", +] + +[[package]] +name = "taceo-poseidon2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac59d3df4c827b3496bff929aebd6440997a5c2e946f46ff4fdd76f318447581" +dependencies = [ + "ark-bn254", + "ark-ff 0.5.0", + "ark-std 0.5.0", + "num-bigint", + "num-traits", +] + +[[package]] +name = "tap" +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.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" +dependencies = [ + "fastrand", + "getrandom 0.4.1", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[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.116", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[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.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +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.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "socket2 0.6.2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.23.10+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.9+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +dependencies = [ + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags", + "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.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +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 = "tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.2", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.18", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[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.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[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 = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +dependencies = [ + "getrandom 0.4.1", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[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.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.116", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver 1.0.27", +] + +[[package]] +name = "wasmtimer" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "web-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +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.6", +] + +[[package]] +name = "webpki-roots" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +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.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap 2.13.0", + "prettyplease", + "syn 2.0.116", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.116", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver 1.0.27", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "world-id-authenticator" +version = "0.5.2" +dependencies = [ + "alloy", + "anyhow", + "ark-serialize 0.5.0", + "backon", + "eyre", + "mockito", + "rand 0.8.5", + "reqwest", + "ruint", + "rustls", + "secrecy", + "serde", + "serde_json", + "taceo-ark-babyjubjub", + "taceo-eddsa-babyjubjub", + "taceo-groth16-material", + "taceo-oprf", + "taceo-poseidon2", + "thiserror 2.0.18", + "tokio", + "webpki-roots 1.0.6", + "world-id-primitives", + "world-id-proof", +] + +[[package]] +name = "world-id-primitives" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb4aa561b0b99df193a638b9081da74e299e4d608d0c5d2c0f76ebfe537caba" +dependencies = [ + "alloy", + "alloy-primitives", + "ark-bn254", + "ark-ff 0.5.0", + "ark-groth16", + "arrayvec", + "eyre", + "getrandom 0.2.17", + "hex", + "k256", + "rand 0.8.5", + "ruint", + "secrecy", + "serde", + "serde_json", + "sha3", + "strum", + "taceo-ark-babyjubjub", + "taceo-ark-serde-compat", + "taceo-circom-types", + "taceo-eddsa-babyjubjub", + "taceo-groth16-material", + "taceo-groth16-sol", + "taceo-oprf", + "taceo-poseidon2", + "thiserror 2.0.18", + "url", + "uuid", +] + +[[package]] +name = "world-id-proof" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc3f2025b9a6475a838b07ad48381f00e4515d158d1fd10d2aebb3c10dfb81d" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-serialize 0.5.0", + "eyre", + "rand 0.8.5", + "rayon", + "reqwest", + "taceo-ark-babyjubjub", + "taceo-circom-types", + "taceo-eddsa-babyjubjub", + "taceo-groth16-material", + "taceo-oprf", + "taceo-poseidon2", + "tar", + "thiserror 2.0.18", + "tracing", + "world-id-primitives", + "zeroize", + "zstd", +] + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix", +] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[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.116", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[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.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/vendor/world-id-authenticator/Cargo.toml b/vendor/world-id-authenticator/Cargo.toml new file mode 100644 index 000000000..8a3a7561a --- /dev/null +++ b/vendor/world-id-authenticator/Cargo.toml @@ -0,0 +1,182 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies. +# +# If you are reading this file be aware that the original Cargo.toml +# will likely look very different (and much more reasonable). +# See Cargo.toml.orig for the original contents. + +[package] +edition = "2024" +rust-version = "1.87" +name = "world-id-authenticator" +version = "0.5.2" +authors = [ + "World Foundation", + "TACEO GmbH ", + "Tools for Humanity", +] +build = false +include = [ + "src/**/*", + "tests/**/*", + "abi/*", + "Cargo.toml", + "README.md", +] +publish = true +autolib = false +autobins = false +autoexamples = false +autotests = false +autobenches = false +description = "World ID Credential crate" +homepage = "https://docs.world.org/world-id" +readme = "README.md" +license = "MIT" +repository = "https://github.com/worldcoin/world-id-protocol" +resolver = "2" + +[features] +default = [] +embed-zkeys = ["world-id-proof/embed-zkeys"] + +[lib] +name = "world_id_authenticator" +path = "src/lib.rs" + +[dependencies.alloy] +version = "1.7.3" +features = [ + "sol-types", + "json", + "network", + "providers", + "contract", + "reqwest", +] +default-features = false + +[dependencies.anyhow] +version = "1" + +[dependencies.ark-babyjubjub] +version = "0.5" +package = "taceo-ark-babyjubjub" + +[dependencies.ark-serialize] +version = "0.5" + +[dependencies.backon] +version = "1" + +[dependencies.eddsa-babyjubjub] +version = "0.5.4" +package = "taceo-eddsa-babyjubjub" + +[dependencies.eyre] +version = "0.6" + +[dependencies.groth16-material] +version = "0.2.3" +default-features = false +package = "taceo-groth16-material" + +[dependencies.poseidon2] +version = "0.2" +package = "taceo-poseidon2" + +[dependencies.rand] +version = "0.8" + +[dependencies.reqwest] +version = "0.12" +features = [ + "json", + "rustls-tls", + "json", +] +default-features = false + +[dependencies.ruint] +version = "1.17" +features = ["ark-ff-05"] + +[dependencies.secrecy] +version = "0.10" + +[dependencies.serde] +version = "1" +features = [ + "derive", + "derive", +] + +[dependencies.serde_json] +version = "1" + +[dependencies.taceo-oprf] +version = "0.7.1" +features = ["client"] +default-features = false + +[dependencies.thiserror] +version = "2" + +[dependencies.tokio] +version = "1" +features = ["macros"] +default-features = false + +[dependencies.world-id-primitives] +version = "0.5.2" +default-features = false + +[dependencies.world-id-proof] +version = "0.5.2" +default-features = false + +[dev-dependencies.backon] +version = "1" + +[dev-dependencies.mockito] +version = "1" + +[dev-dependencies.rand] +version = "0.8" + +[dev-dependencies.ruint] +version = "1.17" +features = ["ark-ff-05"] + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies.alloy] +version = "1.7.3" +features = ["reqwest-rustls-tls"] +default-features = false + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies.reqwest] +version = "0.12" +features = [ + "json", + "rustls-tls", + "rustls-tls", +] +default-features = false + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies.rustls] +version = "0.23" +features = ["ring"] + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies.tokio] +version = "1" +features = [ + "rt-multi-thread", + "net", +] +default-features = false + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies.webpki-roots] +version = "1.0" diff --git a/vendor/world-id-authenticator/Cargo.toml.orig b/vendor/world-id-authenticator/Cargo.toml.orig new file mode 100644 index 000000000..deb2ea665 --- /dev/null +++ b/vendor/world-id-authenticator/Cargo.toml.orig @@ -0,0 +1,68 @@ +[package] +name = "world-id-authenticator" +description = "World ID Credential crate" +publish = true +edition.workspace = true +version.workspace = true +license.workspace = true +authors.workspace = true +homepage.workspace = true +rust-version.workspace = true +repository.workspace = true +include = [ + "src/**/*", + "tests/**/*", + "abi/*", + "Cargo.toml", + "README.md", +] + +[features] +default = ["embed-zkeys"] +embed-zkeys = ["world-id-proof/embed-zkeys"] + +[dependencies] +# Use WASM-safe base features only +alloy = { workspace = true, features = [ + "sol-types", + "json", + "network", + "providers", + "contract", + "reqwest", +] } +anyhow = { workspace = true } +ark-babyjubjub = { workspace = true } +ark-serialize = { workspace = true } +groth16-material = { workspace = true } +reqwest = { workspace = true, features = ["json"] } +poseidon2 = { workspace = true } +eddsa-babyjubjub = { workspace = true } +eyre = { workspace = true } +world-id-primitives = { workspace = true } +secrecy = { workspace = true } +taceo-oprf = { workspace = true, features = ["client"] } +thiserror = { workspace = true } +tokio = { workspace = true, features = ["macros"] } +rand = { workspace = true } +backon = { workspace = true } +ruint = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } + +# Internal +world-id-proof = { workspace = true } + +# Native-only dependencies (not available on wasm32) +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +alloy = { workspace = true, features = ["reqwest-rustls-tls"] } +reqwest = { workspace = true, features = ["rustls-tls"] } +tokio = { workspace = true, features = ["rt-multi-thread", "net"] } +rustls = { workspace = true } +webpki-roots = { workspace = true } + +[dev-dependencies] +backon = { workspace = true } +ruint = { workspace = true } +rand = { workspace = true } +mockito = { workspace = true } diff --git a/vendor/world-id-authenticator/README.md b/vendor/world-id-authenticator/README.md new file mode 100644 index 000000000..eb4dfe4c1 --- /dev/null +++ b/vendor/world-id-authenticator/README.md @@ -0,0 +1,7 @@ +# World ID Authenticator + +World ID is an anonymous proof of human for the age of AI. + +This crate provides the functionality for a World ID Authenticator. + +More information can be found in the [World ID Developer Documentation](https://docs.world.org/world-id). diff --git a/vendor/world-id-authenticator/abi/WorldIDRegistryAbi.json b/vendor/world-id-authenticator/abi/WorldIDRegistryAbi.json new file mode 100644 index 000000000..ccfbad4be --- /dev/null +++ b/vendor/world-id-authenticator/abi/WorldIDRegistryAbi.json @@ -0,0 +1,1901 @@ +[ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "CANCEL_RECOVERY_AGENT_UPDATE_TYPEHASH", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "EIP712_NAME", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "EIP712_VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "INITIATE_RECOVERY_AGENT_UPDATE_TYPEHASH", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "INSERT_AUTHENTICATOR_TYPEHASH", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MAX_AUTHENTICATORS_HARD_LIMIT", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "RECOVER_ACCOUNT_TYPEHASH", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "REMOVE_AUTHENTICATOR_TYPEHASH", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "UPDATE_AUTHENTICATOR_TYPEHASH", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "acceptOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "cancelRecoveryAgentUpdate", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "createAccount", + "inputs": [ + { + "name": "recoveryAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "authenticatorAddresses", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "authenticatorPubkeys", + "type": "uint256[]", + "internalType": "uint256[]" + }, + { + "name": "offchainSignerCommitment", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "createManyAccounts", + "inputs": [ + { + "name": "recoveryAddresses", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "authenticatorAddresses", + "type": "address[][]", + "internalType": "address[][]" + }, + { + "name": "authenticatorPubkeys", + "type": "uint256[][]", + "internalType": "uint256[][]" + }, + { + "name": "offchainSignerCommitments", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "currentRoot", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "domainSeparatorV4", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "eip712Domain", + "inputs": [], + "outputs": [ + { + "name": "fields", + "type": "bytes1", + "internalType": "bytes1" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "verifyingContract", + "type": "address", + "internalType": "address" + }, + { + "name": "salt", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "extensions", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "executeRecoveryAgentUpdate", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getFeeRecipient", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getFeeToken", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getLatestRoot", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMaxAuthenticators", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getNextLeafIndex", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPackedAccountData", + "inputs": [ + { + "name": "authenticatorAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPendingRecoveryAgentUpdate", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [ + { + "name": "newRecoveryAgent", + "type": "address", + "internalType": "address" + }, + { + "name": "executeAfter", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getProof", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRecoveryAgent", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRecoveryAgentUpdateCooldown", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRecoveryCounter", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRegistrationFee", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRootTimestamp", + "inputs": [ + { + "name": "root", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRootValidityWindow", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSignatureNonce", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getTreeDepth", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "initialTreeDepth", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "feeRecipient", + "type": "address", + "internalType": "address" + }, + { + "name": "feeToken", + "type": "address", + "internalType": "address" + }, + { + "name": "registrationFee", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "initiateRecoveryAgentUpdate", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "newRecoveryAgent", + "type": "address", + "internalType": "address" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "insertAuthenticator", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "newAuthenticatorAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "pubkeyId", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "newAuthenticatorPubkey", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "oldOffchainSignerCommitment", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "newOffchainSignerCommitment", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isValidRoot", + "inputs": [ + { + "name": "root", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pendingOwner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "proxiableUUID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "recoverAccount", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "newAuthenticatorAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "newAuthenticatorPubkey", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "oldOffchainSignerCommitment", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "newOffchainSignerCommitment", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeAuthenticator", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "authenticatorAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "pubkeyId", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "authenticatorPubkey", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "oldOffchainSignerCommitment", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "newOffchainSignerCommitment", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setFeeRecipient", + "inputs": [ + { + "name": "newFeeRecipient", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setFeeToken", + "inputs": [ + { + "name": "newFeeToken", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMaxAuthenticators", + "inputs": [ + { + "name": "newMaxAuthenticators", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setRecoveryAgentUpdateCooldown", + "inputs": [ + { + "name": "newCooldown", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setRegistrationFee", + "inputs": [ + { + "name": "newFee", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setRootValidityWindow", + "inputs": [ + { + "name": "newWindow", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateAuthenticator", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "oldAuthenticatorAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "newAuthenticatorAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "pubkeyId", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "newAuthenticatorPubkey", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "oldOffchainSignerCommitment", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "newOffchainSignerCommitment", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "upgradeToAndCall", + "inputs": [ + { + "name": "newImplementation", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "AccountCreated", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "indexed": true, + "internalType": "uint64" + }, + { + "name": "recoveryAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "authenticatorAddresses", + "type": "address[]", + "indexed": false, + "internalType": "address[]" + }, + { + "name": "authenticatorPubkeys", + "type": "uint256[]", + "indexed": false, + "internalType": "uint256[]" + }, + { + "name": "offchainSignerCommitment", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "AccountRecovered", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "indexed": true, + "internalType": "uint64" + }, + { + "name": "newAuthenticatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newAuthenticatorPubkey", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "oldOffchainSignerCommitment", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newOffchainSignerCommitment", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "AccountUpdated", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "indexed": true, + "internalType": "uint64" + }, + { + "name": "pubkeyId", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + }, + { + "name": "newAuthenticatorPubkey", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "oldAuthenticatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newAuthenticatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "oldOffchainSignerCommitment", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newOffchainSignerCommitment", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "AuthenticatorInserted", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "indexed": true, + "internalType": "uint64" + }, + { + "name": "pubkeyId", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + }, + { + "name": "authenticatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newAuthenticatorPubkey", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "oldOffchainSignerCommitment", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newOffchainSignerCommitment", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "AuthenticatorRemoved", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "indexed": true, + "internalType": "uint64" + }, + { + "name": "pubkeyId", + "type": "uint32", + "indexed": false, + "internalType": "uint32" + }, + { + "name": "authenticatorAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "authenticatorPubkey", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "oldOffchainSignerCommitment", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newOffchainSignerCommitment", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EIP712DomainChanged", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "FeeRecipientUpdated", + "inputs": [ + { + "name": "oldRecipient", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newRecipient", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "FeeTokenUpdated", + "inputs": [ + { + "name": "oldToken", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newToken", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MaxAuthenticatorsUpdated", + "inputs": [ + { + "name": "oldMax", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "newMax", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferStarted", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RecoveryAgentUpdateCancelled", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "indexed": true, + "internalType": "uint64" + }, + { + "name": "cancelledRecoveryAgent", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RecoveryAgentUpdateCooldownUpdated", + "inputs": [ + { + "name": "oldCooldown", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "newCooldown", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RecoveryAgentUpdateExecuted", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "indexed": true, + "internalType": "uint64" + }, + { + "name": "oldRecoveryAgent", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newRecoveryAgent", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RecoveryAgentUpdateInitiated", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "indexed": true, + "internalType": "uint64" + }, + { + "name": "oldRecoveryAgent", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newRecoveryAgent", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "executeAfter", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RegistrationFeeUpdated", + "inputs": [ + { + "name": "oldFee", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newFee", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RootRecorded", + "inputs": [ + { + "name": "root", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RootValidityWindowUpdated", + "inputs": [ + { + "name": "oldWindow", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newWindow", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Upgraded", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AccountDoesNotExist", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "AlreadyInitialized", + "inputs": [] + }, + { + "type": "error", + "name": "AuthenticatorAddressAlreadyInUse", + "inputs": [ + { + "name": "authenticatorAddress", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "AuthenticatorAlreadyExists", + "inputs": [ + { + "name": "authenticatorAddress", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "AuthenticatorDoesNotBelongToAccount", + "inputs": [ + { + "name": "expectedLeafIndex", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "actualLeafIndex", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "type": "error", + "name": "AuthenticatorDoesNotExist", + "inputs": [ + { + "name": "authenticatorAddress", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "BitmapOverflow", + "inputs": [] + }, + { + "type": "error", + "name": "DepthNotSupported", + "inputs": [] + }, + { + "type": "error", + "name": "ECDSAInvalidSignature", + "inputs": [] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "ECDSAInvalidSignatureS", + "inputs": [ + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "ERC1967InvalidImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967NonPayable", + "inputs": [] + }, + { + "type": "error", + "name": "EmptyAddressArray", + "inputs": [] + }, + { + "type": "error", + "name": "FailedCall", + "inputs": [] + }, + { + "type": "error", + "name": "ImplementationNotInitialized", + "inputs": [] + }, + { + "type": "error", + "name": "InsufficientFunds", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidInitialization", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidSignature", + "inputs": [] + }, + { + "type": "error", + "name": "LeafDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "LeafIndexOutOfRange", + "inputs": [] + }, + { + "type": "error", + "name": "MismatchedAuthenticatorSigner", + "inputs": [ + { + "name": "expectedAuthenticatorAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "actualAuthenticatorAddress", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "MismatchedLeafIndex", + "inputs": [ + { + "name": "expectedLeafIndex", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "actualLeafIndex", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "type": "error", + "name": "MismatchedPubkeyId", + "inputs": [ + { + "name": "expectedPubkeyId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "actualPubkeyId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "MismatchedRecoveryCounter", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "expectedRecoveryCounter", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "actualRecoveryCounter", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "MismatchedSignatureNonce", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "expectedNonce", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "actualNonce", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "MismatchingArrayLengths", + "inputs": [] + }, + { + "type": "error", + "name": "NewLeafCannotEqualOldLeaf", + "inputs": [] + }, + { + "type": "error", + "name": "NoPendingRecoveryAgentUpdate", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "type": "error", + "name": "NotInitializing", + "inputs": [] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnerMaxAuthenticatorsOutOfBounds", + "inputs": [] + }, + { + "type": "error", + "name": "PubkeyIdDoesNotExist", + "inputs": [] + }, + { + "type": "error", + "name": "PubkeyIdInUse", + "inputs": [] + }, + { + "type": "error", + "name": "PubkeyIdOutOfBounds", + "inputs": [] + }, + { + "type": "error", + "name": "PubkeyIdOverflow", + "inputs": [ + { + "name": "pubkeyId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "RecoveryAddressNotSet", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "type": "error", + "name": "RecoveryAgentUpdateStillInCooldown", + "inputs": [ + { + "name": "leafIndex", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "executeAfter", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "RecoveryCounterOverflow", + "inputs": [] + }, + { + "type": "error", + "name": "RecoveryNotEnabled", + "inputs": [] + }, + { + "type": "error", + "name": "ReusedAuthenticatorAddress", + "inputs": [] + }, + { + "type": "error", + "name": "SafeERC20FailedOperation", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "TreeIsFull", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnauthorizedCallContext", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnsupportedProxiableUUID", + "inputs": [ + { + "name": "slot", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "ValueGreaterThanSnarkScalarField", + "inputs": [] + }, + { + "type": "error", + "name": "WrongDefaultZeroIndex", + "inputs": [] + }, + { + "type": "error", + "name": "ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "ZeroRecoveredSignatureAddress", + "inputs": [] + } +] diff --git a/vendor/world-id-authenticator/src/api_types.rs b/vendor/world-id-authenticator/src/api_types.rs new file mode 100644 index 000000000..df81321c7 --- /dev/null +++ b/vendor/world-id-authenticator/src/api_types.rs @@ -0,0 +1 @@ +pub use world_id_primitives::api_types::*; diff --git a/vendor/world-id-authenticator/src/authenticator.rs b/vendor/world-id-authenticator/src/authenticator.rs new file mode 100644 index 000000000..67b6f7b85 --- /dev/null +++ b/vendor/world-id-authenticator/src/authenticator.rs @@ -0,0 +1,1578 @@ +//! This module contains all the base functionality to support Authenticators in World ID. +//! +//! An Authenticator is the application layer with which a user interacts with the Protocol. + +use std::sync::Arc; + +use crate::api_types::{ + AccountInclusionProof, CreateAccountRequest, GatewayRequestState, GatewayStatusResponse, + IndexerAuthenticatorPubkeysResponse, IndexerErrorCode, IndexerPackedAccountRequest, + IndexerPackedAccountResponse, IndexerQueryRequest, IndexerSignatureNonceResponse, + InsertAuthenticatorRequest, RemoveAuthenticatorRequest, ServiceApiError, + UpdateAuthenticatorRequest, +}; +use world_id_primitives::{ + Credential, FieldElement, ProofRequest, RequestItem, ResponseItem, SessionNullifier, Signer, +}; + +use crate::registry::{ + WorldIdRegistry::WorldIdRegistryInstance, domain, sign_insert_authenticator, + sign_remove_authenticator, sign_update_authenticator, +}; +use alloy::{ + primitives::{Address, U256}, + providers::DynProvider, + signers::{Signature, SignerSync}, + uint, +}; +use ark_serialize::CanonicalSerialize; +use eddsa_babyjubjub::{EdDSAPublicKey, EdDSASignature}; +use groth16_material::circom::CircomGroth16Material; +use reqwest::StatusCode; +use secrecy::ExposeSecret; +use taceo_oprf::client::Connector; +pub use world_id_primitives::{Config, TREE_DEPTH, authenticator::ProtocolSigner}; +use world_id_primitives::{ + PrimitiveError, ZeroKnowledgeProof, + authenticator::{ + AuthenticatorPublicKeySet, SparseAuthenticatorPubkeysError, + decode_sparse_authenticator_pubkeys, + }, + merkle::MerkleInclusionProof, +}; +use world_id_proof::{ + AuthenticatorProofInput, + credential_blinding_factor::OprfCredentialBlindingFactor, + nullifier::OprfNullifier, + proof::{ProofError, generate_nullifier_proof}, +}; + +static MASK_RECOVERY_COUNTER: U256 = + uint!(0xFFFFFFFF00000000000000000000000000000000000000000000000000000000_U256); +static MASK_PUBKEY_ID: U256 = + uint!(0x00000000FFFFFFFF000000000000000000000000000000000000000000000000_U256); +static MASK_LEAF_INDEX: U256 = + uint!(0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF_U256); + +/// An Authenticator is the base layer with which a user interacts with the Protocol. +pub struct Authenticator { + /// General configuration for the Authenticator. + pub config: Config, + /// The packed account data for the holder's World ID is a `uint256` defined in the `WorldIDRegistry` contract as: + /// `recovery_counter` (32 bits) | `pubkey_id` (commitment to all off-chain public keys) (32 bits) | `leaf_index` (192 bits) + pub packed_account_data: U256, + signer: Signer, + registry: Option>>, + http_client: reqwest::Client, + ws_connector: Connector, + query_material: Arc, + nullifier_material: Arc, +} + +#[expect(clippy::missing_fields_in_debug)] +impl std::fmt::Debug for Authenticator { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Authenticator") + .field("config", &self.config) + .field("packed_account_data", &self.packed_account_data) + .field("signer", &self.signer) + .finish() + } +} + +impl Authenticator { + async fn response_body_or_fallback(response: reqwest::Response) -> String { + response + .text() + .await + .unwrap_or_else(|e| format!("Unable to read response body: {e}")) + } + + /// Initialize an Authenticator from a seed and config. + /// + /// This method will error if the World ID account does not exist on the registry. + /// + /// # Errors + /// - Will error if the provided seed is invalid (not 32 bytes). + /// - Will error if the RPC URL is invalid. + /// - Will error if there are contract call failures. + /// - Will error if the account does not exist (`AccountDoesNotExist`). + pub async fn init( + seed: &[u8], + config: Config, + query_material: Arc, + nullifier_material: Arc, + ) -> Result { + let signer = Signer::from_seed_bytes(seed)?; + + let registry: Option>> = + config.rpc_url().map(|rpc_url| { + let provider = alloy::providers::ProviderBuilder::new() + .with_chain_id(config.chain_id()) + .connect_http(rpc_url.clone()); + Arc::new(crate::registry::WorldIdRegistry::new( + *config.registry_address(), + alloy::providers::Provider::erased(provider), + )) + }); + + let http_client = reqwest::Client::new(); + + let packed_account_data = Self::get_packed_account_data( + signer.onchain_signer_address(), + registry.as_deref(), + &config, + &http_client, + ) + .await?; + + #[cfg(not(target_arch = "wasm32"))] + let ws_connector = { + let mut root_store = rustls::RootCertStore::empty(); + root_store.extend(webpki_roots::TLS_SERVER_ROOTS.iter().cloned()); + let rustls_config = rustls::ClientConfig::builder() + .with_root_certificates(root_store) + .with_no_client_auth(); + Connector::Rustls(Arc::new(rustls_config)) + }; + + #[cfg(target_arch = "wasm32")] + let ws_connector = Connector; + + Ok(Self { + packed_account_data, + signer, + config, + registry, + http_client, + ws_connector, + query_material, + nullifier_material, + }) + } + + /// Registers a new World ID in the `WorldIDRegistry`. + /// + /// Given the registration process is asynchronous, this method will return a `InitializingAuthenticator` + /// object. + /// + /// # Errors + /// - See `init` for additional error details. + pub async fn register( + seed: &[u8], + config: Config, + recovery_address: Option
, + ) -> Result { + let http_client = reqwest::Client::new(); + InitializingAuthenticator::new(seed, config, recovery_address, http_client).await + } + + /// Initializes (if the World ID already exists in the registry) or registers a new World ID. + /// + /// The registration process is asynchronous and may take some time. This method will block + /// the thread until the registration is in a final state (success or terminal error). For better + /// user experience in end authenticator clients, it is recommended to implement custom polling logic. + /// + /// Explicit `init` or `register` calls are also recommended as the authenticator should know + /// if a new World ID should be truly created. For example, an authenticator may have been revoked + /// access to an existing World ID. + /// + /// # Errors + /// - See `init` for additional error details. + pub async fn init_or_register( + seed: &[u8], + config: Config, + query_material: Arc, + nullifier_material: Arc, + recovery_address: Option
, + ) -> Result { + match Self::init( + seed, + config.clone(), + query_material.clone(), + nullifier_material.clone(), + ) + .await + { + Ok(authenticator) => Ok(authenticator), + Err(AuthenticatorError::AccountDoesNotExist) => { + // Authenticator is not registered, create it. + let http_client = reqwest::Client::new(); + let initializing_authenticator = InitializingAuthenticator::new( + seed, + config.clone(), + recovery_address, + http_client, + ) + .await?; + + let backoff = backon::ExponentialBuilder::default() + .with_min_delay(std::time::Duration::from_millis(800)) + .with_factor(1.5) + .without_max_times() + .with_total_delay(Some(std::time::Duration::from_secs(120))); + + let poller = || async { + let poll_status = initializing_authenticator.poll_status().await; + let result = match poll_status { + Ok(GatewayRequestState::Finalized { .. }) => Ok(()), + Ok(GatewayRequestState::Failed { error_code, error }) => Err( + PollResult::TerminalError(AuthenticatorError::RegistrationError { + error_code: error_code.map(|v| v.to_string()).unwrap_or_default(), + error_message: error, + }), + ), + Err(AuthenticatorError::GatewayError { status, body }) => { + if status.is_client_error() { + Err(PollResult::TerminalError( + AuthenticatorError::GatewayError { status, body }, + )) + } else { + Err(PollResult::Retryable) + } + } + _ => Err(PollResult::Retryable), + }; + + match result { + Ok(()) => match Self::init( + seed, + config.clone(), + query_material.clone(), + nullifier_material.clone(), + ) + .await + { + Ok(auth) => Ok(auth), + Err(AuthenticatorError::AccountDoesNotExist) => { + Err(PollResult::Retryable) + } + Err(e) => Err(PollResult::TerminalError(e)), + }, + Err(e) => Err(e), + } + }; + + let result = backon::Retryable::retry(poller, backoff) + .when(|e| matches!(e, PollResult::Retryable)) + .await; + + match result { + Ok(authenticator) => Ok(authenticator), + Err(PollResult::TerminalError(e)) => Err(e), + Err(PollResult::Retryable) => Err(AuthenticatorError::Timeout), + } + } + Err(e) => Err(e), + } + } + + /// Returns the packed account data for the holder's World ID. + /// + /// The packed account data is a 256 bit integer which includes the World ID's leaf index, their recovery counter, + /// and their pubkey id/commitment. + /// + /// # Errors + /// Will error if the network call fails or if the account does not exist. + pub async fn get_packed_account_data( + onchain_signer_address: Address, + registry: Option<&WorldIdRegistryInstance>, + config: &Config, + http_client: &reqwest::Client, + ) -> Result { + // If the registry is available through direct RPC calls, use it. Otherwise fallback to the indexer. + let raw_index = if let Some(registry) = registry { + // TODO: Better error handling to expose the specific failure + registry + .getPackedAccountData(onchain_signer_address) + .call() + .await? + } else { + let url = format!("{}/packed-account", config.indexer_url()); + let req = IndexerPackedAccountRequest { + authenticator_address: onchain_signer_address, + }; + let resp = http_client.post(&url).json(&req).send().await?; + let status = resp.status(); + if !status.is_success() { + let body = Self::response_body_or_fallback(resp).await; + if let Ok(error_resp) = + serde_json::from_str::>(&body) + { + return match error_resp.code { + IndexerErrorCode::AccountDoesNotExist => { + Err(AuthenticatorError::AccountDoesNotExist) + } + _ => Err(AuthenticatorError::IndexerError { + status, + body: error_resp.message, + }), + }; + } + return Err(AuthenticatorError::IndexerError { status, body }); + } + + let response: IndexerPackedAccountResponse = resp.json().await?; + response.packed_account_data + }; + + if raw_index == U256::ZERO { + return Err(AuthenticatorError::AccountDoesNotExist); + } + + Ok(raw_index) + } + + /// Returns the k256 public key of the Authenticator signer which is used to verify on-chain operations, + /// chiefly with the `WorldIdRegistry` contract. + #[must_use] + pub const fn onchain_address(&self) -> Address { + self.signer.onchain_signer_address() + } + + /// Returns the `EdDSA` public key of the Authenticator signer which is used to verify off-chain operations. For example, + /// the Nullifier Oracle uses it to verify requests for nullifiers. + #[must_use] + pub fn offchain_pubkey(&self) -> EdDSAPublicKey { + self.signer.offchain_signer_pubkey() + } + + /// Returns the compressed `EdDSA` public key of the Authenticator signer which is used to verify off-chain operations. + /// For example, the Nullifier Oracle uses it to verify requests for nullifiers. + /// # Errors + /// Will error if the public key cannot be serialized. + pub fn offchain_pubkey_compressed(&self) -> Result { + let pk = self.signer.offchain_signer_pubkey().pk; + let mut compressed_bytes = Vec::new(); + pk.serialize_compressed(&mut compressed_bytes) + .map_err(|e| PrimitiveError::Serialization(e.to_string()))?; + Ok(U256::from_le_slice(&compressed_bytes)) + } + + /// Returns a reference to the `WorldIdRegistry` contract instance. + #[must_use] + pub fn registry(&self) -> Option>> { + self.registry.clone() + } + + /// Returns the index for the holder's World ID. + /// + /// # Definition + /// + /// The `leaf_index` is the main (internal) identifier of a World ID. It is registered in + /// the `WorldIDRegistry` and represents the index at the Merkle tree where the World ID + /// resides. + /// + /// # Notes + /// - The `leaf_index` is used as input in the nullifier generation, ensuring a nullifier + /// will always be the same for the same RP context and the same World ID (allowing for uniqueness). + /// - The `leaf_index` is generally not exposed outside Authenticators. It is not a secret because + /// it's not exposed to RPs outside ZK-circuits, but the only acceptable exposure outside an Authenticator + /// is to fetch Merkle inclusion proofs from an indexer or it may create a pseudonymous identifier. + /// - The `leaf_index` is stored as a `uint64` inside packed account data. + #[must_use] + pub fn leaf_index(&self) -> u64 { + (self.packed_account_data & MASK_LEAF_INDEX).to::() + } + + /// Returns the recovery counter for the holder's World ID. + /// + /// The recovery counter is used to efficiently invalidate all the old keys when an account is recovered. + #[must_use] + pub fn recovery_counter(&self) -> U256 { + let recovery_counter = self.packed_account_data & MASK_RECOVERY_COUNTER; + recovery_counter >> 224 + } + + /// Returns the pubkey id (or commitment) for the holder's World ID. + /// + /// This is a commitment to all the off-chain public keys that are authorized to act on behalf of the holder. + #[must_use] + pub fn pubkey_id(&self) -> U256 { + let pubkey_id = self.packed_account_data & MASK_PUBKEY_ID; + pubkey_id >> 192 + } + + /// Fetches a Merkle inclusion proof for the holder's World ID given their account index. + /// + /// # Errors + /// - Will error if the provided indexer URL is not valid or if there are HTTP call failures. + /// - Will error if the user is not registered on the `WorldIDRegistry`. + pub async fn fetch_inclusion_proof( + &self, + ) -> Result<(MerkleInclusionProof, AuthenticatorPublicKeySet), AuthenticatorError> + { + let url = format!("{}/inclusion-proof", self.config.indexer_url()); + let req = IndexerQueryRequest { + leaf_index: self.leaf_index(), + }; + let response = self.http_client.post(&url).json(&req).send().await?; + let status = response.status(); + if !status.is_success() { + return Err(AuthenticatorError::IndexerError { + status, + body: Self::response_body_or_fallback(response).await, + }); + } + let response = response.json::>().await?; + + Ok((response.inclusion_proof, response.authenticator_pubkeys)) + } + + /// Fetches the current authenticator public key set for the account. + /// + /// This is used by mutation operations to compute old/new offchain signer commitments + /// without requiring Merkle proof generation. + /// + /// # Errors + /// - Will error if the provided indexer URL is not valid or if there are HTTP call failures. + /// - Will error if the user is not registered on the `WorldIDRegistry`. + pub async fn fetch_authenticator_pubkeys( + &self, + ) -> Result { + let url = format!("{}/authenticator-pubkeys", self.config.indexer_url()); + let req = IndexerQueryRequest { + leaf_index: self.leaf_index(), + }; + let response = self.http_client.post(&url).json(&req).send().await?; + let status = response.status(); + if !status.is_success() { + return Err(AuthenticatorError::IndexerError { + status, + body: Self::response_body_or_fallback(response).await, + }); + } + let response = response + .json::() + .await?; + Self::decode_indexer_pubkeys(response.authenticator_pubkeys) + } + + /// Returns the signing nonce for the holder's World ID. + /// + /// # Errors + /// Will return an error if the registry contract call fails. + pub async fn signing_nonce(&self) -> Result { + let registry = self.registry(); + if let Some(registry) = registry { + let nonce = registry.getSignatureNonce(self.leaf_index()).call().await?; + Ok(nonce) + } else { + let url = format!("{}/signature-nonce", self.config.indexer_url()); + let req = IndexerQueryRequest { + leaf_index: self.leaf_index(), + }; + let resp = self.http_client.post(&url).json(&req).send().await?; + + let status = resp.status(); + if !status.is_success() { + return Err(AuthenticatorError::IndexerError { + status, + body: Self::response_body_or_fallback(resp).await, + }); + } + + let response: IndexerSignatureNonceResponse = resp.json().await?; + Ok(response.signature_nonce) + } + } + + /// Signs an arbitrary challenge with the authenticator's on-chain key following + /// [ERC-191](https://eips.ethereum.org/EIPS/eip-191). + /// + /// # Warning + /// This is considered a dangerous operation because it leaks the user's on-chain key, + /// hence its `leaf_index`. The only acceptable use is to prove the user's `leaf_index` + /// to a Recovery Agent. The Recovery Agent is the only party beyond the user who needs + /// to know the `leaf_index`. + /// + /// # Use + /// - This method is used to prove ownership over a leaf index **only for Recovery Agents**. + pub fn danger_sign_challenge( + &mut self, + challenge: &[u8], + ) -> Result { + self.signer + .onchain_signer() + .sign_message_sync(challenge) + .map_err(|e| AuthenticatorError::Generic(format!("signature error: {e}"))) + } + + /// Checks that the OPRF Nodes configuration is valid and returns the list of URLs and the threshold to use. + /// + /// # Errors + /// Will return an error if there are no OPRF Nodes configured or if the threshold is invalid. + fn check_oprf_config(&self) -> Result<(&[String], usize), AuthenticatorError> { + let services = self.config.nullifier_oracle_urls(); + if services.is_empty() { + return Err(AuthenticatorError::Generic( + "No nullifier oracle URLs configured".to_string(), + )); + } + let requested_threshold = self.config.nullifier_oracle_threshold(); + if requested_threshold == 0 { + return Err(AuthenticatorError::InvalidConfig { + attribute: "nullifier_oracle_threshold", + reason: "must be at least 1".to_string(), + }); + } + let threshold = requested_threshold.min(services.len()); + Ok((services, threshold)) + } + + fn decode_indexer_pubkeys( + pubkeys: Vec>, + ) -> Result { + decode_sparse_authenticator_pubkeys(pubkeys).map_err(|e| match e { + SparseAuthenticatorPubkeysError::SlotOutOfBounds { + slot_index, + max_supported_slot, + } => AuthenticatorError::InvalidIndexerPubkeySlot { + slot_index, + max_supported_slot, + }, + SparseAuthenticatorPubkeysError::InvalidCompressedPubkey { slot_index, reason } => { + PrimitiveError::Deserialization(format!( + "invalid authenticator public key returned by indexer at slot {slot_index}: {reason}" + )) + .into() + } + }) + } + + fn insert_or_reuse_authenticator_key( + key_set: &mut AuthenticatorPublicKeySet, + new_authenticator_pubkey: EdDSAPublicKey, + ) -> Result { + if let Some(index) = key_set.iter().position(Option::is_none) { + key_set.try_set_at_index(index, new_authenticator_pubkey)?; + Ok(index) + } else { + key_set.try_push(new_authenticator_pubkey)?; + Ok(key_set.len() - 1) + } + } + + /// Generates a nullifier for a World ID Proof (through OPRF Nodes). + /// + /// A nullifier is a unique, one-time use, anonymous identifier for a World ID + /// on a specific RP context. It is used to ensure that a single World ID can only + /// perform an action once. + /// + /// # Errors + /// + /// - Will raise a [`ProofError`] if there is any issue generating the nullifier. For example, + /// network issues, unexpected incorrect responses from OPRF Nodes. + /// - Raises an error if the OPRF Nodes configuration is not correctly set. + pub async fn generate_nullifier( + &self, + proof_request: &ProofRequest, + inclusion_proof: MerkleInclusionProof, + key_set: AuthenticatorPublicKeySet, + ) -> Result { + let (services, threshold) = self.check_oprf_config()?; + let key_index = key_set + .iter() + .position(|pk| { + pk.as_ref() + .is_some_and(|pk| pk.pk == self.offchain_pubkey().pk) + }) + .ok_or(AuthenticatorError::PublicKeyNotFound)? as u64; + + let authenticator_input = AuthenticatorProofInput::new( + key_set, + inclusion_proof, + self.signer + .offchain_signer_private_key() + .expose_secret() + .clone(), + key_index, + ); + + Ok(OprfNullifier::generate( + services, + threshold, + &self.query_material, + authenticator_input, + proof_request, + self.ws_connector.clone(), + ) + .await?) + } + + // TODO add more docs + /// Generates a blinding factor for a Credential sub (through OPRF Nodes). + /// + /// # Errors + /// + /// - Will raise a [`ProofError`] if there is any issue generating the blinding factor. + /// For example, network issues, unexpected incorrect responses from OPRF Nodes. + /// - Raises an error if the OPRF Nodes configuration is not correctly set. + pub async fn generate_credential_blinding_factor( + &self, + issuer_schema_id: u64, + ) -> Result { + let (services, threshold) = self.check_oprf_config()?; + + let (inclusion_proof, key_set) = self.fetch_inclusion_proof().await?; + let key_index = key_set + .iter() + .position(|pk| { + pk.as_ref() + .is_some_and(|pk| pk.pk == self.offchain_pubkey().pk) + }) + .ok_or(AuthenticatorError::PublicKeyNotFound)? as u64; + + let authenticator_input = AuthenticatorProofInput::new( + key_set, + inclusion_proof, + self.signer + .offchain_signer_private_key() + .expose_secret() + .clone(), + key_index, + ); + + let blinding_factor = OprfCredentialBlindingFactor::generate( + services, + threshold, + &self.query_material, + authenticator_input, + issuer_schema_id, + FieldElement::ZERO, // for now action is always zero, might change in future + self.ws_connector.clone(), + ) + .await?; + + Ok(blinding_factor.verifiable_oprf_output.output.into()) + } + + /// Generates a single World ID Proof from a provided `[ProofRequest]` and `[Credential]`. This + /// method generates the raw proof to be translated into a Uniqueness Proof or a Session Proof for the RP. + /// + /// This assumes the RP's `[ProofRequest]` has already been parsed to determine + /// which `[Credential]` is appropriate for the request. This method responds to a + /// specific `[RequestItem]` (a `[ProofRequest]` may contain multiple items). + /// + /// # Arguments + /// - `oprf_nullifier`: The `[OprfNullifier]` output generated from the `generate_nullifier` function. + /// - `request_item`: The specific `RequestItem` that is being resolved from the RP's `ProofRequest`. + /// - `credential`: The Credential to be used for the proof that fulfills the `RequestItem`. + /// - `credential_sub_blinding_factor`: The blinding factor for the Credential's sub. + /// - `session_id_r_seed`: The session ID random seed. Obtained from the RP's [`ProofRequest`]. + /// - `session_id`: The expected session ID provided by the RP. Only needed for Session Proofs. Obtained from the RP's [`ProofRequest`]. + /// - `request_timestamp`: The timestamp of the request. Obtained from the RP's [`ProofRequest`]. + /// + /// # Errors + /// - Will error if the any of the provided parameters are not valid. + /// - Will error if any of the required network requests fail. + /// - Will error if the user does not have a registered World ID. + #[allow(clippy::too_many_arguments)] + pub fn generate_single_proof( + &self, + oprf_nullifier: OprfNullifier, + request_item: &RequestItem, + credential: &Credential, + credential_sub_blinding_factor: FieldElement, + session_id_r_seed: FieldElement, + session_id: Option, + request_timestamp: u64, + ) -> Result { + let mut rng = rand::rngs::OsRng; + + let merkle_root: FieldElement = oprf_nullifier.query_proof_input.merkle_root.into(); + let action_from_query: FieldElement = oprf_nullifier.query_proof_input.action.into(); + + let expires_at_min = request_item.effective_expires_at_min(request_timestamp); + + let (proof, _public_inputs, nullifier) = generate_nullifier_proof( + &self.nullifier_material, + &mut rng, + credential, + credential_sub_blinding_factor, + oprf_nullifier, + request_item, + session_id, + session_id_r_seed, + expires_at_min, + )?; + + let proof = ZeroKnowledgeProof::from_groth16_proof(&proof, merkle_root); + + // Construct the appropriate response item based on proof type + let nullifier_fe: FieldElement = nullifier.into(); + let response_item = if session_id.is_some() { + let session_nullifier = SessionNullifier::new(nullifier_fe, action_from_query); + ResponseItem::new_session( + request_item.identifier.clone(), + request_item.issuer_schema_id, + proof, + session_nullifier, + expires_at_min, + ) + } else { + ResponseItem::new_uniqueness( + request_item.identifier.clone(), + request_item.issuer_schema_id, + proof, + nullifier_fe.into(), + expires_at_min, + ) + }; + + Ok(response_item) + } + + /// Inserts a new authenticator to the account. + /// + /// # Errors + /// Will error if the provided RPC URL is not valid or if there are HTTP call failures. + /// + /// # Note + /// TODO: After successfully inserting an authenticator, the `packed_account_data` should be + /// refreshed from the registry to reflect the new `pubkey_id` commitment. + pub async fn insert_authenticator( + &mut self, + new_authenticator_pubkey: EdDSAPublicKey, + new_authenticator_address: Address, + ) -> Result { + let leaf_index = self.leaf_index(); + let nonce = self.signing_nonce().await?; + let mut key_set = self.fetch_authenticator_pubkeys().await?; + let old_offchain_signer_commitment = key_set.leaf_hash(); + let encoded_offchain_pubkey = new_authenticator_pubkey.to_ethereum_representation()?; + let index = + Self::insert_or_reuse_authenticator_key(&mut key_set, new_authenticator_pubkey)?; + let new_offchain_signer_commitment = key_set.leaf_hash(); + + let eip712_domain = domain(self.config.chain_id(), *self.config.registry_address()); + + #[allow(clippy::cast_possible_truncation)] + // truncating is intentional, and index will always fit in 32 bits + let signature = sign_insert_authenticator( + &self.signer.onchain_signer(), + leaf_index, + new_authenticator_address, + index as u32, + encoded_offchain_pubkey, + new_offchain_signer_commitment.into(), + nonce, + &eip712_domain, + ) + .await + .map_err(|e| { + AuthenticatorError::Generic(format!("Failed to sign insert authenticator: {e}")) + })?; + + #[allow(clippy::cast_possible_truncation)] + // truncating is intentional, and index will always fit in 32 bits + let req = InsertAuthenticatorRequest { + leaf_index, + new_authenticator_address, + pubkey_id: index as u32, + new_authenticator_pubkey: encoded_offchain_pubkey, + old_offchain_signer_commitment: old_offchain_signer_commitment.into(), + new_offchain_signer_commitment: new_offchain_signer_commitment.into(), + signature: signature.as_bytes().to_vec(), + nonce, + }; + + let resp = self + .http_client + .post(format!( + "{}/insert-authenticator", + self.config.gateway_url() + )) + .json(&req) + .send() + .await?; + + let status = resp.status(); + if status.is_success() { + let body: GatewayStatusResponse = resp.json().await?; + Ok(body.request_id) + } else { + let body_text = Self::response_body_or_fallback(resp).await; + Err(AuthenticatorError::GatewayError { + status, + body: body_text, + }) + } + } + + /// Updates an existing authenticator slot with a new authenticator. + /// + /// # Errors + /// Returns an error if the gateway rejects the request or a network error occurs. + /// + /// # Note + /// TODO: After successfully updating an authenticator, the `packed_account_data` should be + /// refreshed from the registry to reflect the new `pubkey_id` commitment. + pub async fn update_authenticator( + &mut self, + old_authenticator_address: Address, + new_authenticator_address: Address, + new_authenticator_pubkey: EdDSAPublicKey, + index: u32, + ) -> Result { + let leaf_index = self.leaf_index(); + let nonce = self.signing_nonce().await?; + let mut key_set = self.fetch_authenticator_pubkeys().await?; + let old_commitment: U256 = key_set.leaf_hash().into(); + let encoded_offchain_pubkey = new_authenticator_pubkey.to_ethereum_representation()?; + key_set.try_set_at_index(index as usize, new_authenticator_pubkey)?; + let new_commitment: U256 = key_set.leaf_hash().into(); + + let eip712_domain = domain(self.config.chain_id(), *self.config.registry_address()); + + let signature = sign_update_authenticator( + &self.signer.onchain_signer(), + leaf_index, + old_authenticator_address, + new_authenticator_address, + index, + encoded_offchain_pubkey, + new_commitment, + nonce, + &eip712_domain, + ) + .await + .map_err(|e| { + AuthenticatorError::Generic(format!("Failed to sign update authenticator: {e}")) + })?; + + let req = UpdateAuthenticatorRequest { + leaf_index, + old_authenticator_address, + new_authenticator_address, + old_offchain_signer_commitment: old_commitment, + new_offchain_signer_commitment: new_commitment, + signature: signature.as_bytes().to_vec(), + nonce, + pubkey_id: index, + new_authenticator_pubkey: encoded_offchain_pubkey, + }; + + let resp = self + .http_client + .post(format!( + "{}/update-authenticator", + self.config.gateway_url() + )) + .json(&req) + .send() + .await?; + + let status = resp.status(); + if status.is_success() { + let gateway_resp: GatewayStatusResponse = resp.json().await?; + Ok(gateway_resp.request_id) + } else { + let body_text = Self::response_body_or_fallback(resp).await; + Err(AuthenticatorError::GatewayError { + status, + body: body_text, + }) + } + } + + /// Removes an authenticator from the account. + /// + /// # Errors + /// Returns an error if the gateway rejects the request or a network error occurs. + /// + /// # Note + /// TODO: After successfully removing an authenticator, the `packed_account_data` should be + /// refreshed from the registry to reflect the new `pubkey_id` commitment. + pub async fn remove_authenticator( + &mut self, + authenticator_address: Address, + index: u32, + ) -> Result { + let leaf_index = self.leaf_index(); + let nonce = self.signing_nonce().await?; + let mut key_set = self.fetch_authenticator_pubkeys().await?; + let old_commitment: U256 = key_set.leaf_hash().into(); + let existing_pubkey = key_set + .get(index as usize) + .ok_or(AuthenticatorError::PublicKeyNotFound)?; + + let encoded_old_offchain_pubkey = existing_pubkey.to_ethereum_representation()?; + + key_set.try_clear_at_index(index as usize)?; + let new_commitment: U256 = key_set.leaf_hash().into(); + + let eip712_domain = domain(self.config.chain_id(), *self.config.registry_address()); + + let signature = sign_remove_authenticator( + &self.signer.onchain_signer(), + leaf_index, + authenticator_address, + index, + encoded_old_offchain_pubkey, + new_commitment, + nonce, + &eip712_domain, + ) + .await + .map_err(|e| { + AuthenticatorError::Generic(format!("Failed to sign remove authenticator: {e}")) + })?; + + let req = RemoveAuthenticatorRequest { + leaf_index, + authenticator_address, + old_offchain_signer_commitment: old_commitment, + new_offchain_signer_commitment: new_commitment, + signature: signature.as_bytes().to_vec(), + nonce, + pubkey_id: Some(index), + authenticator_pubkey: Some(encoded_old_offchain_pubkey), + }; + + let resp = self + .http_client + .post(format!( + "{}/remove-authenticator", + self.config.gateway_url() + )) + .json(&req) + .send() + .await?; + + let status = resp.status(); + if status.is_success() { + let gateway_resp: GatewayStatusResponse = resp.json().await?; + Ok(gateway_resp.request_id) + } else { + let body_text = Self::response_body_or_fallback(resp).await; + Err(AuthenticatorError::GatewayError { + status, + body: body_text, + }) + } + } +} + +/// Represents an account in the process of being initialized, +/// i.e. it is not yet registered in the `WorldIDRegistry` contract. +pub struct InitializingAuthenticator { + request_id: String, + http_client: reqwest::Client, + config: Config, +} + +impl InitializingAuthenticator { + /// Returns the gateway request ID for this pending account creation. + #[must_use] + pub fn request_id(&self) -> &str { + &self.request_id + } + + /// Creates a new World ID account by adding it to the registry using the gateway. + /// + /// # Errors + /// - See `Signer::from_seed_bytes` for additional error details. + /// - Will error if the gateway rejects the request or a network error occurs. + async fn new( + seed: &[u8], + config: Config, + recovery_address: Option
, + http_client: reqwest::Client, + ) -> Result { + let signer = Signer::from_seed_bytes(seed)?; + + let mut key_set = AuthenticatorPublicKeySet::default(); + key_set.try_push(signer.offchain_signer_pubkey())?; + let leaf_hash = key_set.leaf_hash(); + + let offchain_pubkey_compressed = { + let pk = signer.offchain_signer_pubkey().pk; + let mut compressed_bytes = Vec::new(); + pk.serialize_compressed(&mut compressed_bytes) + .map_err(|e| PrimitiveError::Serialization(e.to_string()))?; + U256::from_le_slice(&compressed_bytes) + }; + + let req = CreateAccountRequest { + recovery_address, + authenticator_addresses: vec![signer.onchain_signer_address()], + authenticator_pubkeys: vec![offchain_pubkey_compressed], + offchain_signer_commitment: leaf_hash.into(), + }; + + let resp = http_client + .post(format!("{}/create-account", config.gateway_url())) + .json(&req) + .send() + .await?; + + let status = resp.status(); + if status.is_success() { + let body: GatewayStatusResponse = resp.json().await?; + Ok(Self { + request_id: body.request_id, + http_client, + config, + }) + } else { + let body_text = Authenticator::response_body_or_fallback(resp).await; + Err(AuthenticatorError::GatewayError { + status, + body: body_text, + }) + } + } + + /// Poll the status of the World ID creation request. + /// + /// # Errors + /// - Will error if the network request fails. + /// - Will error if the gateway returns an error response. + pub async fn poll_status(&self) -> Result { + let resp = self + .http_client + .get(format!( + "{}/status/{}", + self.config.gateway_url(), + self.request_id + )) + .send() + .await?; + + let status = resp.status(); + + if status.is_success() { + let body: GatewayStatusResponse = resp.json().await?; + Ok(body.status) + } else { + let body_text = Authenticator::response_body_or_fallback(resp).await; + Err(AuthenticatorError::GatewayError { + status, + body: body_text, + }) + } + } +} + +impl ProtocolSigner for Authenticator { + fn sign(&self, message: FieldElement) -> EdDSASignature { + self.signer + .offchain_signer_private_key() + .expose_secret() + .sign(*message) + } +} + +/// A trait for types that can be represented as a `U256` on-chain. +pub trait OnchainKeyRepresentable { + /// Converts an off-chain public key into a `U256` representation for on-chain use in the `WorldIDRegistry` contract. + /// + /// The `U256` representation is a 32-byte little-endian encoding of the **compressed** (single point) public key. + /// + /// # Errors + /// Will error if the public key unexpectedly fails to serialize. + fn to_ethereum_representation(&self) -> Result; +} + +impl OnchainKeyRepresentable for EdDSAPublicKey { + // REVIEW: updating to BE + fn to_ethereum_representation(&self) -> Result { + let mut compressed_bytes = Vec::new(); + self.pk + .serialize_compressed(&mut compressed_bytes) + .map_err(|e| PrimitiveError::Serialization(e.to_string()))?; + Ok(U256::from_le_slice(&compressed_bytes)) + } +} + +/// Errors that can occur when interacting with the Authenticator. +#[derive(Debug, thiserror::Error)] +pub enum AuthenticatorError { + /// Primitive error + #[error(transparent)] + PrimitiveError(#[from] PrimitiveError), + + /// This operation requires a registered account and an account is not registered + /// for this authenticator. Call `create_account` first to register it. + #[error("Account is not registered for this authenticator.")] + AccountDoesNotExist, + + /// The account already exists for this authenticator. Call `leaf_index` to get the leaf index. + #[error("Account already exists for this authenticator.")] + AccountAlreadyExists, + + /// An error occurred while interacting with the EVM contract. + #[error("Error interacting with EVM contract: {0}")] + ContractError(#[from] alloy::contract::Error), + + /// Network/HTTP request error. + #[error("Network error: {0}")] + NetworkError(#[from] reqwest::Error), + + /// Public key not found in the Authenticator public key set. Usually indicates the local state is out of sync with the registry. + #[error("Public key not found.")] + PublicKeyNotFound, + + /// Gateway returned an error response. + #[error("Gateway error (status {status}): {body}")] + GatewayError { + /// HTTP status code + status: StatusCode, + /// Response body + body: String, + }, + + /// Indexer returned an error response. + #[error("Indexer error (status {status}): {body}")] + IndexerError { + /// HTTP status code + status: StatusCode, + /// Response body + body: String, + }, + + /// Account creation timed out while polling for confirmation. + #[error("Account creation timed out")] + Timeout, + + /// Configuration is invalid or missing required values. + #[error("Invalid configuration for {attribute}: {reason}")] + InvalidConfig { + /// The config attribute that is invalid. + attribute: &'static str, + /// Description of why it is invalid. + reason: String, + }, + + /// The provided credential is not valid for the provided proof request. + #[error("The provided credential is not valid for the provided proof request")] + InvalidCredentialForProofRequest, + + /// Error during the World ID registration process. + /// + /// This usually occurs from an on-chain revert. + #[error("Registration error ({error_code}): {error_message}")] + RegistrationError { + /// Error code from the registration process. + error_code: String, + /// Detailed error message. + error_message: String, + }, + + /// Error on proof generation + #[error(transparent)] + ProofError(#[from] ProofError), + + /// Indexer returned an authenticator key slot that exceeds supported key capacity. + #[error( + "Invalid indexer authenticator pubkey slot {slot_index}; max supported slot is {max_supported_slot}" + )] + InvalidIndexerPubkeySlot { + /// Slot index returned by the indexer. + slot_index: usize, + /// Highest supported slot index. + max_supported_slot: usize, + }, + + /// Generic error for other unexpected issues. + #[error("{0}")] + Generic(String), +} + +#[derive(Debug)] +enum PollResult { + Retryable, + TerminalError(AuthenticatorError), +} + +#[cfg(all(test, feature = "embed-zkeys"))] +mod tests { + use super::*; + use alloy::primitives::{U256, address}; + use std::sync::OnceLock; + use world_id_primitives::authenticator::MAX_AUTHENTICATOR_KEYS; + + fn test_materials() -> (Arc, Arc) { + static QUERY: OnceLock> = OnceLock::new(); + static NULLIFIER: OnceLock> = OnceLock::new(); + + let query = QUERY.get_or_init(|| { + Arc::new(world_id_proof::proof::load_embedded_query_material().unwrap()) + }); + let nullifier = NULLIFIER.get_or_init(|| { + Arc::new(world_id_proof::proof::load_embedded_nullifier_material().unwrap()) + }); + + (Arc::clone(query), Arc::clone(nullifier)) + } + + fn test_pubkey(seed_byte: u8) -> EdDSAPublicKey { + Signer::from_seed_bytes(&[seed_byte; 32]) + .unwrap() + .offchain_signer_pubkey() + } + + fn encoded_test_pubkey(seed_byte: u8) -> U256 { + test_pubkey(seed_byte).to_ethereum_representation().unwrap() + } + + #[test] + fn test_insert_or_reuse_authenticator_key_reuses_empty_slot() { + let mut key_set = + AuthenticatorPublicKeySet::new(vec![test_pubkey(1), test_pubkey(2), test_pubkey(4)]) + .unwrap(); + key_set[1] = None; + let new_key = test_pubkey(3); + + let index = + Authenticator::insert_or_reuse_authenticator_key(&mut key_set, new_key).unwrap(); + + assert_eq!(index, 1); + assert_eq!(key_set.len(), 3); + assert_eq!(key_set[1].as_ref().unwrap().pk, test_pubkey(3).pk); + } + + #[test] + fn test_insert_or_reuse_authenticator_key_appends_when_no_empty_slot() { + let mut key_set = AuthenticatorPublicKeySet::new(vec![test_pubkey(1)]).unwrap(); + let new_key = test_pubkey(2); + + let index = + Authenticator::insert_or_reuse_authenticator_key(&mut key_set, new_key).unwrap(); + + assert_eq!(index, 1); + assert_eq!(key_set.len(), 2); + assert_eq!(key_set[1].as_ref().unwrap().pk, test_pubkey(2).pk); + } + + #[test] + fn test_decode_indexer_pubkeys_trims_trailing_empty_slots() { + let mut encoded_pubkeys = vec![Some(encoded_test_pubkey(1)), Some(encoded_test_pubkey(2))]; + encoded_pubkeys.extend(vec![None; MAX_AUTHENTICATOR_KEYS + 5]); + + let key_set = Authenticator::decode_indexer_pubkeys(encoded_pubkeys).unwrap(); + + assert_eq!(key_set.len(), 2); + assert_eq!(key_set[0].as_ref().unwrap().pk, test_pubkey(1).pk); + assert_eq!(key_set[1].as_ref().unwrap().pk, test_pubkey(2).pk); + } + + #[test] + fn test_decode_indexer_pubkeys_rejects_used_slot_beyond_max() { + let mut encoded_pubkeys = vec![None; MAX_AUTHENTICATOR_KEYS + 1]; + encoded_pubkeys[MAX_AUTHENTICATOR_KEYS] = Some(encoded_test_pubkey(1)); + + let error = Authenticator::decode_indexer_pubkeys(encoded_pubkeys).unwrap_err(); + assert!(matches!( + error, + AuthenticatorError::InvalidIndexerPubkeySlot { + slot_index, + max_supported_slot + } if slot_index == MAX_AUTHENTICATOR_KEYS && max_supported_slot == MAX_AUTHENTICATOR_KEYS - 1 + )); + } + + /// Tests that `get_packed_account_data` correctly fetches the packed account data from the indexer + /// when no RPC is configured. + #[tokio::test] + async fn test_get_packed_account_data_from_indexer() { + let mut server = mockito::Server::new_async().await; + let indexer_url = server.url(); + + let test_address = address!("0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0"); + let expected_packed_index = U256::from(42); + + let mock = server + .mock("POST", "/packed-account") + .match_header("content-type", "application/json") + .match_body(mockito::Matcher::JsonString( + serde_json::json!({ + "authenticator_address": test_address + }) + .to_string(), + )) + .with_status(200) + .with_header("content-type", "application/json") + .with_body( + serde_json::json!({ + "packed_account_data": format!("{:#x}", expected_packed_index) + }) + .to_string(), + ) + .create_async() + .await; + + let config = Config::new( + None, + 1, + address!("0x0000000000000000000000000000000000000001"), + indexer_url, + "http://gateway.example.com".to_string(), + Vec::new(), + 2, + ) + .unwrap(); + + let http_client = reqwest::Client::new(); + + let result = Authenticator::get_packed_account_data( + test_address, + None, // No registry, force indexer usage + &config, + &http_client, + ) + .await + .unwrap(); + + assert_eq!(result, expected_packed_index); + mock.assert_async().await; + drop(server); + } + + #[tokio::test] + async fn test_get_packed_account_data_from_indexer_error() { + let mut server = mockito::Server::new_async().await; + let indexer_url = server.url(); + + let test_address = address!("0x0000000000000000000000000000000000000099"); + + let mock = server + .mock("POST", "/packed-account") + .with_status(400) + .with_header("content-type", "application/json") + .with_body( + serde_json::json!({ + "code": "account_does_not_exist", + "message": "There is no account for this authenticator address" + }) + .to_string(), + ) + .create_async() + .await; + + let config = Config::new( + None, + 1, + address!("0x0000000000000000000000000000000000000001"), + indexer_url, + "http://gateway.example.com".to_string(), + Vec::new(), + 2, + ) + .unwrap(); + + let http_client = reqwest::Client::new(); + + let result = + Authenticator::get_packed_account_data(test_address, None, &config, &http_client).await; + + assert!(matches!( + result, + Err(AuthenticatorError::AccountDoesNotExist) + )); + mock.assert_async().await; + drop(server); + } + + #[tokio::test] + #[cfg(not(target_arch = "wasm32"))] + async fn test_signing_nonce_from_indexer() { + let mut server = mockito::Server::new_async().await; + let indexer_url = server.url(); + + let leaf_index = U256::from(1); + let expected_nonce = U256::from(5); + + let mock = server + .mock("POST", "/signature-nonce") + .match_header("content-type", "application/json") + .match_body(mockito::Matcher::JsonString( + serde_json::json!({ + "leaf_index": format!("{:#x}", leaf_index) + }) + .to_string(), + )) + .with_status(200) + .with_header("content-type", "application/json") + .with_body( + serde_json::json!({ + "signature_nonce": format!("{:#x}", expected_nonce) + }) + .to_string(), + ) + .create_async() + .await; + + let config = Config::new( + None, + 1, + address!("0x0000000000000000000000000000000000000001"), + indexer_url, + "http://gateway.example.com".to_string(), + Vec::new(), + 2, + ) + .unwrap(); + + let (query_material, nullifier_material) = test_materials(); + let authenticator = Authenticator { + config, + packed_account_data: leaf_index, // This sets leaf_index() to 1 + signer: Signer::from_seed_bytes(&[1u8; 32]).unwrap(), + registry: None, // No registry - forces indexer usage + http_client: reqwest::Client::new(), + ws_connector: Connector::Plain, + query_material, + nullifier_material, + }; + + let nonce = authenticator.signing_nonce().await.unwrap(); + + assert_eq!(nonce, expected_nonce); + mock.assert_async().await; + drop(server); + } + + #[test] + fn test_danger_sign_challenge_returns_valid_signature() { + let (query_material, nullifier_material) = test_materials(); + let mut authenticator = Authenticator { + config: Config::new( + None, + 1, + address!("0x0000000000000000000000000000000000000001"), + "http://indexer.example.com".to_string(), + "http://gateway.example.com".to_string(), + Vec::new(), + 2, + ) + .unwrap(), + packed_account_data: U256::from(1), + signer: Signer::from_seed_bytes(&[1u8; 32]).unwrap(), + registry: None, + http_client: reqwest::Client::new(), + ws_connector: Connector::Plain, + query_material, + nullifier_material, + }; + + let challenge = b"test challenge"; + let signature = authenticator.danger_sign_challenge(challenge).unwrap(); + + let recovered = signature + .recover_address_from_msg(challenge) + .expect("should recover address"); + assert_eq!(recovered, authenticator.onchain_address()); + } + + #[test] + fn test_danger_sign_challenge_different_challenges_different_signatures() { + let (query_material, nullifier_material) = test_materials(); + let mut authenticator = Authenticator { + config: Config::new( + None, + 1, + address!("0x0000000000000000000000000000000000000001"), + "http://indexer.example.com".to_string(), + "http://gateway.example.com".to_string(), + Vec::new(), + 2, + ) + .unwrap(), + packed_account_data: U256::from(1), + signer: Signer::from_seed_bytes(&[1u8; 32]).unwrap(), + registry: None, + http_client: reqwest::Client::new(), + ws_connector: Connector::Plain, + query_material, + nullifier_material, + }; + + let sig_a = authenticator.danger_sign_challenge(b"challenge A").unwrap(); + let sig_b = authenticator.danger_sign_challenge(b"challenge B").unwrap(); + assert_ne!(sig_a, sig_b); + } + + #[test] + fn test_danger_sign_challenge_deterministic() { + let (query_material, nullifier_material) = test_materials(); + let mut authenticator = Authenticator { + config: Config::new( + None, + 1, + address!("0x0000000000000000000000000000000000000001"), + "http://indexer.example.com".to_string(), + "http://gateway.example.com".to_string(), + Vec::new(), + 2, + ) + .unwrap(), + packed_account_data: U256::from(1), + signer: Signer::from_seed_bytes(&[1u8; 32]).unwrap(), + registry: None, + http_client: reqwest::Client::new(), + ws_connector: Connector::Plain, + query_material, + nullifier_material, + }; + + let challenge = b"deterministic test"; + let sig1 = authenticator.danger_sign_challenge(challenge).unwrap(); + let sig2 = authenticator.danger_sign_challenge(challenge).unwrap(); + assert_eq!(sig1, sig2); + } + + #[tokio::test] + #[cfg(not(target_arch = "wasm32"))] + async fn test_signing_nonce_from_indexer_error() { + let mut server = mockito::Server::new_async().await; + let indexer_url = server.url(); + + let mock = server + .mock("POST", "/signature-nonce") + .with_status(400) + .with_header("content-type", "application/json") + .with_body( + serde_json::json!({ + "code": "invalid_leaf_index", + "message": "Account index cannot be zero" + }) + .to_string(), + ) + .create_async() + .await; + + let config = Config::new( + None, + 1, + address!("0x0000000000000000000000000000000000000001"), + indexer_url, + "http://gateway.example.com".to_string(), + Vec::new(), + 2, + ) + .unwrap(); + + let (query_material, nullifier_material) = test_materials(); + let authenticator = Authenticator { + config, + packed_account_data: U256::ZERO, + signer: Signer::from_seed_bytes(&[1u8; 32]).unwrap(), + registry: None, + http_client: reqwest::Client::new(), + ws_connector: Connector::Plain, + query_material, + nullifier_material, + }; + + let result = authenticator.signing_nonce().await; + + assert!(matches!( + result, + Err(AuthenticatorError::IndexerError { .. }) + )); + mock.assert_async().await; + drop(server); + } +} diff --git a/vendor/world-id-authenticator/src/lib.rs b/vendor/world-id-authenticator/src/lib.rs new file mode 100644 index 000000000..99517213b --- /dev/null +++ b/vendor/world-id-authenticator/src/lib.rs @@ -0,0 +1,10 @@ +mod authenticator; +pub use authenticator::*; + +pub mod api_types; + +pub mod registry; +pub use registry::{ + WorldIdRegistry, domain, sign_insert_authenticator, sign_recover_account, + sign_remove_authenticator, sign_update_authenticator, +}; diff --git a/vendor/world-id-authenticator/src/registry.rs b/vendor/world-id-authenticator/src/registry.rs new file mode 100644 index 000000000..376927239 --- /dev/null +++ b/vendor/world-id-authenticator/src/registry.rs @@ -0,0 +1,204 @@ +//! Minimal World ID Registry contract bindings. +//! +//! This crate provides only the contract bindings and EIP-712 signing utilities. +//! It has no dependencies on other world-id crates to avoid circular dependencies. + +use alloy::{ + primitives::{Address, Signature, U256}, + signers::Signer, + sol, + sol_types::{Eip712Domain, SolStruct, eip712_domain}, +}; + +sol!( + /// The registry of World IDs. Each World ID is represented as a leaf in the Merkle tree. + #[allow(clippy::too_many_arguments)] + #[sol(rpc, ignore_unlinked)] + WorldIdRegistry, + "abi/WorldIDRegistryAbi.json" +); + +/// These structs are created in a private module to avoid confusion with their exports. +/// +/// They are only used to compute the EIP-712 typed data for signature. +mod sol_types { + use alloy::sol; + + sol! { + /// EIP-712 typed-data payload for `updateAuthenticator`. + /// + /// This is used only for signature hashing/recovery, not as the Solidity call signature. + struct UpdateAuthenticator { + uint64 leafIndex; + address oldAuthenticatorAddress; + address newAuthenticatorAddress; + uint32 pubkeyId; + uint256 newAuthenticatorPubkey; + uint256 newOffchainSignerCommitment; + uint256 nonce; + } + + /// EIP-712 typed-data payload for `insertAuthenticator`. + /// + /// This is used only for signature hashing/recovery, not as the Solidity call signature. + struct InsertAuthenticator { + uint64 leafIndex; + address newAuthenticatorAddress; + uint32 pubkeyId; + uint256 newAuthenticatorPubkey; + uint256 newOffchainSignerCommitment; + uint256 nonce; + } + + /// EIP-712 typed-data payload for `removeAuthenticator`. + /// + /// This is used only for signature hashing/recovery, not as the Solidity call signature. + struct RemoveAuthenticator { + uint64 leafIndex; + address authenticatorAddress; + uint32 pubkeyId; + uint256 authenticatorPubkey; + uint256 newOffchainSignerCommitment; + uint256 nonce; + } + + /// EIP-712 typed-data payload for `recoverAccount`. + /// + /// This is used only for signature hashing/recovery, not as the Solidity call signature. + struct RecoverAccount { + uint64 leafIndex; + address newAuthenticatorAddress; + uint256 newAuthenticatorPubkey; + uint256 newOffchainSignerCommitment; + uint256 nonce; + } + } +} + +/// EIP-712 typed-data signature payload for `updateAuthenticator`. +pub type UpdateAuthenticatorTypedData = sol_types::UpdateAuthenticator; +/// EIP-712 typed-data signature payload for `insertAuthenticator`. +pub type InsertAuthenticatorTypedData = sol_types::InsertAuthenticator; +/// EIP-712 typed-data signature payload for `removeAuthenticator`. +pub type RemoveAuthenticatorTypedData = sol_types::RemoveAuthenticator; +/// EIP-712 typed-data signature payload for `recoverAccount`. +pub type RecoverAccountTypedData = sol_types::RecoverAccount; + +/// Returns the EIP-712 domain used by the `[WorldIdRegistry]` contract +/// for a given `chain_id` and `verifying_contract` address. +#[must_use] +pub const fn domain(chain_id: u64, verifying_contract: Address) -> Eip712Domain { + eip712_domain!( + name: "WorldIDRegistry", + version: "1.0", + chain_id: chain_id, + verifying_contract: verifying_contract, + ) +} + +/// Signs the EIP-712 payload for an `updateAuthenticator` contract call. +/// +/// # Errors +/// Will error if the signer unexpectedly fails to sign the hash. +#[allow(clippy::too_many_arguments)] +pub async fn sign_update_authenticator( + signer: &S, + leaf_index: u64, + old_authenticator_address: Address, + new_authenticator_address: Address, + pubkey_id: u32, + new_authenticator_pubkey: U256, + new_offchain_signer_commitment: U256, + nonce: U256, + domain: &Eip712Domain, +) -> anyhow::Result { + let payload = UpdateAuthenticatorTypedData { + leafIndex: leaf_index, + oldAuthenticatorAddress: old_authenticator_address, + newAuthenticatorAddress: new_authenticator_address, + pubkeyId: pubkey_id, + newAuthenticatorPubkey: new_authenticator_pubkey, + newOffchainSignerCommitment: new_offchain_signer_commitment, + nonce, + }; + let digest = payload.eip712_signing_hash(domain); + Ok(signer.sign_hash(&digest).await?) +} + +/// Signs the EIP-712 payload for an `insertAuthenticator` contract call. +/// +/// # Errors +/// Will error if the signer unexpectedly fails to sign the hash. +#[allow(clippy::too_many_arguments)] +pub async fn sign_insert_authenticator( + signer: &S, + leaf_index: u64, + new_authenticator_address: Address, + pubkey_id: u32, + new_authenticator_pubkey: U256, + new_offchain_signer_commitment: U256, + nonce: U256, + domain: &Eip712Domain, +) -> anyhow::Result { + let payload = InsertAuthenticatorTypedData { + leafIndex: leaf_index, + newAuthenticatorAddress: new_authenticator_address, + pubkeyId: pubkey_id, + newAuthenticatorPubkey: new_authenticator_pubkey, + newOffchainSignerCommitment: new_offchain_signer_commitment, + nonce, + }; + let digest = payload.eip712_signing_hash(domain); + Ok(signer.sign_hash(&digest).await?) +} + +/// Signs the EIP-712 payload for a `removeAuthenticator` contract call. +/// +/// # Errors +/// Will error if the signer unexpectedly fails to sign the hash. +#[allow(clippy::too_many_arguments)] +pub async fn sign_remove_authenticator( + signer: &S, + leaf_index: u64, + authenticator_address: Address, + pubkey_id: u32, + authenticator_pubkey: U256, + new_offchain_signer_commitment: U256, + nonce: U256, + domain: &Eip712Domain, +) -> anyhow::Result { + let payload = RemoveAuthenticatorTypedData { + leafIndex: leaf_index, + authenticatorAddress: authenticator_address, + pubkeyId: pubkey_id, + authenticatorPubkey: authenticator_pubkey, + newOffchainSignerCommitment: new_offchain_signer_commitment, + nonce, + }; + let digest = payload.eip712_signing_hash(domain); + Ok(signer.sign_hash(&digest).await?) +} + +/// Signs the EIP-712 payload for a `recoverAccount` contract call. +/// +/// # Errors +/// Will error if the signer unexpectedly fails to sign the hash. +pub async fn sign_recover_account( + signer: &S, + leaf_index: u64, + new_authenticator_address: Address, + new_authenticator_pubkey: U256, + new_offchain_signer_commitment: U256, + nonce: U256, + domain: &Eip712Domain, +) -> anyhow::Result { + let payload = RecoverAccountTypedData { + leafIndex: leaf_index, + newAuthenticatorAddress: new_authenticator_address, + newAuthenticatorPubkey: new_authenticator_pubkey, + newOffchainSignerCommitment: new_offchain_signer_commitment, + nonce, + }; + let digest = payload.eip712_signing_hash(domain); + Ok(signer.sign_hash(&digest).await?) +} diff --git a/vendor/world-id-proof/.cargo-ok b/vendor/world-id-proof/.cargo-ok new file mode 100644 index 000000000..5f8b79583 --- /dev/null +++ b/vendor/world-id-proof/.cargo-ok @@ -0,0 +1 @@ +{"v":1} \ No newline at end of file diff --git a/vendor/world-id-proof/.cargo_vcs_info.json b/vendor/world-id-proof/.cargo_vcs_info.json new file mode 100644 index 000000000..2c79a708f --- /dev/null +++ b/vendor/world-id-proof/.cargo_vcs_info.json @@ -0,0 +1,6 @@ +{ + "git": { + "sha1": "a45e0df122c3b57081fd7babd4b2727577dbbbe1" + }, + "path_in_vcs": "crates/proof" +} \ No newline at end of file diff --git a/vendor/world-id-proof/Cargo.lock b/vendor/world-id-proof/Cargo.lock new file mode 100644 index 000000000..1ebcd40fe --- /dev/null +++ b/vendor/world-id-proof/Cargo.lock @@ -0,0 +1,5379 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[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 = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4973038846323e4e69a433916522195dce2947770076c03078fc21c80ea0f1c4" +dependencies = [ + "alloy-consensus", + "alloy-contract", + "alloy-core", + "alloy-eips", + "alloy-network", + "alloy-provider", + "alloy-rpc-client", + "alloy-signer", + "alloy-signer-local", + "alloy-transport", + "alloy-transport-http", +] + +[[package]] +name = "alloy-chains" +version = "0.2.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f374d3c6d729268bbe2d0e0ff992bb97898b2df756691a62ee1d5f0506bc39" +dependencies = [ + "alloy-primitives", + "num_enum", + "strum", +] + +[[package]] +name = "alloy-consensus" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c0dc44157867da82c469c13186015b86abef209bf0e41625e4b68bac61d728" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "alloy-tx-macros", + "auto_impl", + "borsh", + "c-kzg", + "derive_more", + "either", + "k256", + "once_cell", + "rand 0.8.5", + "secp256k1", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-consensus-any" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba4cdb42df3871cd6b346d6a938ec2ba69a9a0f49d1f82714bc5c48349268434" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-contract" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca63b7125a981415898ffe2a2a696c83696c9c6bdb1671c8a912946bbd8e49e7" +dependencies = [ + "alloy-consensus", + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-provider", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", + "futures", + "futures-util", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-core" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e8604b0c092fabc80d075ede181c9b9e596249c70b99253082d7e689836529" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2db5c583aaef0255aa63a4fe827f826090142528bba48d1bf4119b62780cad" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "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.18", +] + +[[package]] +name = "alloy-eip2930" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9441120fa82df73e8959ae0e4ab8ade03de2aaae61be313fbf5746277847ce25" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "borsh", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "borsh", + "serde", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-eip7928" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3231de68d5d6e75332b7489cfcc7f4dfabeba94d990a10e4b923af0e6623540" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "borsh", + "serde", +] + +[[package]] +name = "alloy-eips" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f7ef09f21bd1e9cb8a686f168cb4a206646804567f0889eadb8dcc4c9288c8" +dependencies = [ + "alloy-eip2124", + "alloy-eip2930", + "alloy-eip7702", + "alloy-eip7928", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "auto_impl", + "borsh", + "c-kzg", + "derive_more", + "either", + "serde", + "serde_with", + "sha2", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-json-abi" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9dbe713da0c737d9e5e387b0ba790eb98b14dd207fe53eef50e19a5a8ec3dac" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff42cd777eea61f370c0b10f2648a1c81e0b783066cd7269228aa993afd487f7" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "http", + "serde", + "serde_json", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cbca04f9b410fdc51aaaf88433cbac761213905a65fe832058bcf6690585762" +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", + "derive_more", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-network-primitives" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d6d15e069a8b11f56bef2eccbad2a873c6dd4d4c81d04dda29710f5ea52f04" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3b431b4e72cd8bd0ec7a50b4be18e73dab74de0dba180eef171055e5d5926e" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "foldhash 0.2.0", + "hashbrown 0.16.1", + "indexmap 2.13.0", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.9.2", + "rapidhash", + "ruint", + "rustc-hash", + "serde", + "sha3", +] + +[[package]] +name = "alloy-provider" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d181c8cc7cf4805d7e589bf4074d56d55064fa1a979f005a45a62b047616d870" +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-signer", + "alloy-sol-types", + "alloy-transport", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "either", + "futures", + "futures-utils-wasm", + "lru", + "parking_lot", + "pin-project", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "tracing", + "wasmtimer", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e93e50f64a77ad9c5470bf2ad0ca02f228da70c792a8f06634801e202579f35e" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8849c74c9ca0f5a03da1c865e3eb6f768df816e67dd3721a398a8a7e398011" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "alloy-rpc-client" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2792758a93ae32a32e9047c843d536e1448044f78422d71bf7d7c05149e103f" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "futures", + "pin-project", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd720b63f82b457610f2eaaf1f32edf44efffe03ae25d537632e7d23e7929e1a" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2dc411f13092f237d2bf6918caf80977fc2f51485f9b90cb2a2f956912c8c9" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.14.0", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-serde" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2ce1e0dbf7720eee747700e300c99aac01b1a95bb93f493a01e78ee28bb1a37" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2425c6f314522c78e8198979c8cbf6769362be4da381d4152ea8eefce383535d" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "either", + "elliptic-curve", + "k256", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-signer-local" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ecb71ee53d8d9c3fa7bac17542c8116ebc7a9726c91b1bf333ec3d04f5a789" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand 0.8.5", + "thiserror 2.0.18", +] + +[[package]] +name = "alloy-sol-macro" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab81bab693da9bb79f7a95b64b394718259fdd7e41dceeced4cad57cb71c4f6a" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "489f1620bb7e2483fb5819ed01ab6edc1d2f93939dce35a5695085a1afd1d699" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap 2.13.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "sha3", + "syn 2.0.116", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56cef806ad22d4392c5fc83cf8f2089f988eb99c7067b4e0c6f1971fc1cca318" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck", + "macro-string", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.116", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6df77fea9d6a2a75c0ef8d2acbdfd92286cc599983d3175ccdc170d3433d249" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64612d29379782a5dde6f4b6570d9c756d734d760c0c94c254d361e678a6591f" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa186e560d523d196580c48bf00f1bf62e63041f28ecf276acc22f8b27bb9f53" +dependencies = [ + "alloy-json-rpc", + "auto_impl", + "base64", + "derive_more", + "futures", + "futures-utils-wasm", + "parking_lot", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "tower", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa501ad58dd20acddbfebc65b52e60f05ebf97c52fa40d1b35e91f5e2da0ad0e" +dependencies = [ + "alloy-transport", + "itertools 0.14.0", + "url", +] + +[[package]] +name = "alloy-trie" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d7fd448ab0a017de542de1dcca7a58e7019fe0e7a34ed3f9543ebddf6aceffa" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more", + "nybbles", + "serde", + "smallvec", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "alloy-tx-macros" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa0c53e8c1e1ef4d01066b01c737fb62fc9397ab52c6e7bb5669f97d281b9bc" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[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.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" + +[[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", + "rayon", + "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.116", +] + +[[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.5", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "rayon", + "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", + "rayon", + "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.116", +] + +[[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.116", +] + +[[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", + "rayon", +] + +[[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.5", + "rayon", +] + +[[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", + "rayon", +] + +[[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.116", +] + +[[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", + "rayon", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] + +[[package]] +name = "askama" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08e1676b346cadfec169374f949d7490fd80a24193d37d2afce0c047cf695e57" +dependencies = [ + "askama_macros", + "itoa", + "percent-encoding", + "serde", + "serde_json", +] + +[[package]] +name = "askama_derive" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7661ff56517787343f376f75db037426facd7c8d3049cef8911f1e75016f3a37" +dependencies = [ + "askama_parser", + "basic-toml", + "memchr", + "proc-macro2", + "quote", + "rustc-hash", + "serde", + "serde_derive", + "syn 2.0.116", +] + +[[package]] +name = "askama_macros" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713ee4dbfd1eb719c2dab859465b01fa1d21cb566684614a713a6b7a99a4e47b" +dependencies = [ + "askama_derive", +] + +[[package]] +name = "askama_parser" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d62d674238a526418b30c0def480d5beadb9d8964e7f38d635b03bf639c704c" +dependencies = [ + "rustc-hash", + "serde", + "serde_derive", + "unicode-ident", + "winnow", +] + +[[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.116", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[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.116", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[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.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +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 = "bitcoin-io" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dee39a0ee5b4095224a0cfc6bf4cc1baf0f9624b96b367e53b66d974e51d953" + +[[package]] +name = "bitcoin_hashes" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26ec84b80c482df901772e931a9a681e26a1b9ee2302edeff23cb30328745c8b" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[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 = "blake3" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures", +] + +[[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.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "borsh" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[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.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] + +[[package]] +name = "c-kzg" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e00bf4b112b07b505472dbefd19e37e53307e2bfed5a79e0cc161d58ccd0e687" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "cc" +version = "1.2.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[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.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "circom-witness-rs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35778373aee12ef3d04966187eeae7a04f1451c9226058311f21488df6f28780" +dependencies = [ + "ark-bn254", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "byteorder", + "cxx-build", + "eyre", + "hex", + "num-bigint", + "num-traits", + "postcard", + "rand 0.8.5", + "ruint", + "serde", + "serde_json", +] + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "const-hex" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" +dependencies = [ + "cfg-if", + "cpufeatures", + "proptest", + "serde_core", +] + +[[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.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +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.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + +[[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 = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +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 = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[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 = "cxx-build" +version = "1.0.194" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0f4697d190a142477b16aef7da8a99bfdc41e7e8b1687583c0d23a79c7afc1e" +dependencies = [ + "cc", + "codespan-reporting", + "indexmap 2.13.0", + "proc-macro2", + "quote", + "scratch", + "syn 2.0.116", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "serde", + "strsim", + "syn 2.0.116", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.116", +] + +[[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.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[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.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[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.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.4.1", + "syn 2.0.116", + "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.116", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[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.116", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] + +[[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 = "enum-ordinalize" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[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.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[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 = "filetime" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" +dependencies = [ + "cfg-if", + "libc", + "libredox", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[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 = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +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.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gloo-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[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 = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", + "serde", + "serde_core", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version 0.4.1", + "serde", + "spin", + "stable_deref_trait", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-conservative" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" +dependencies = [ + "arrayvec", +] + +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "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.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "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", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.6", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +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.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +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.116", +] + +[[package]] +name = "indenter" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" + +[[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.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[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.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +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.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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +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", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b646a74e746cd25045aa0fd42f4f7f78aa6d119380182c7e63a5593c4ab8df6f" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.182" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +dependencies = [ + "bitflags", + "libc", + "redox_syscall 0.7.1", +] + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lru" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" +dependencies = [ + "hashbrown 0.16.1", +] + +[[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.116", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[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 = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[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 = "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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "nybbles" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d49ff0c0d00d4a502b39df9af3a525e1efeb14b9dabb5bb83335284c1309210" +dependencies = [ + "alloy-rlp", + "cfg-if", + "proptest", + "ruint", + "serde", + "smallvec", +] + +[[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.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.116", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pest" +version = "2.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[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.116", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "serde", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +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.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.116", +] + +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +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.116", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566cb3fdacef14c0737f9546df7cfeadbfbc9fef10991038bf5015d0c80532" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags", + "num-traits", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2 0.5.10", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.5.10", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +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" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", + "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 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.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", + "serde", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.5", +] + +[[package]] +name = "rapidhash" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "111325c42c4bafae99e777cd77b40dea9a2b30c69e9d8c74b6eccd7fba4337de" +dependencies = [ + "rustversion", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" +dependencies = [ + "bitflags", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "regex-syntax" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 1.0.6", +] + +[[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.17", + "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.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "ark-ff 0.5.0", + "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.2", + "rlp", + "ruint-macro", + "serde_core", + "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-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.27", +] + +[[package]] +name = "rustix" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "rusty-fork" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scratch" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" + +[[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 = "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 = "secrecy" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" +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.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[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.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[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.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b31139435f327c93c6038ed350ae4588e2c70a13d50599509fee6349967ba35a" +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.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +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 = "socket2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[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.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[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.116" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53f425ae0b12e2f5ae65542e00898d500d4d318b4baf09f40fd0d410454e9947" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[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.116", +] + +[[package]] +name = "taceo-ark-babyjubjub" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55b5a2cc31c90e79778c4f6375e5d9828171d320db3f8c911a8ad47af4a70069" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "taceo-ark-serde-compat" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07528b4dd1a0c9e49ef352f96219c611af0aa2f7cbd97ddb7276dcf3c2cf8dd0" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "num-bigint", + "serde", + "taceo-ark-babyjubjub", +] + +[[package]] +name = "taceo-circom-types" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677eb3ed8275b2f179d4b1a93126a51c5b4f409c5ea9d7bc50398b13e517e30b" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-poly", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "byteorder", + "num-traits", + "rayon", + "serde", + "serde_json", + "taceo-ark-serde-compat", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "taceo-eddsa-babyjubjub" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75dbec63f7a89093b4116a7164e6a92d3cda33dec248da8c8a5922a80a06e7dd" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "blake3", + "eyre", + "num-bigint", + "rand 0.8.5", + "serde", + "taceo-ark-babyjubjub", + "taceo-ark-serde-compat", + "taceo-poseidon2", + "zeroize", +] + +[[package]] +name = "taceo-groth16" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4983857c95d20ca2dc0400a3a116e6931c012ecc4b78ccede8238cfb0c298e3" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-poly", + "ark-relations", + "eyre", + "num-traits", + "rayon", + "tracing", +] + +[[package]] +name = "taceo-groth16-material" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936b1e6b8a77f931796917501fe13a2ae93304e7eb384ed29d80ddc370b011bd" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-relations", + "ark-serialize 0.5.0", + "circom-witness-rs", + "eyre", + "hex", + "postcard", + "rand 0.8.5", + "ruint", + "sha2", + "taceo-circom-types", + "taceo-groth16", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "taceo-groth16-sol" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c6a7b90f2ecb6db1212557550890d9d9d114447688f6146d726024ec7a3410b" +dependencies = [ + "alloy-primitives", + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "askama", + "eyre", + "ruint", +] + +[[package]] +name = "taceo-oprf" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "412211d4d43aeb060c369a69213bd7ae941f769cc4361df83195d2a7936f22d5" +dependencies = [ + "taceo-oprf-client", + "taceo-oprf-core", + "taceo-oprf-types", +] + +[[package]] +name = "taceo-oprf-client" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de42daf867ed4d1ed661258a4541d5dcf1ebe3f43f923acc3ec7716b8824670d" +dependencies = [ + "ark-ec", + "ciborium", + "futures", + "getrandom 0.2.17", + "gloo-net", + "http", + "serde", + "taceo-ark-babyjubjub", + "taceo-oprf-core", + "taceo-oprf-types", + "taceo-poseidon2", + "thiserror 2.0.18", + "tokio", + "tokio-tungstenite", + "tracing", + "uuid", +] + +[[package]] +name = "taceo-oprf-core" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2baf9c72e6687fa8839c3e3368236b36237a905b8c7fcd445250a7a57ab063" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "blake3", + "itertools 0.14.0", + "num-bigint", + "rand 0.8.5", + "serde", + "subtle", + "taceo-ark-babyjubjub", + "taceo-ark-serde-compat", + "taceo-poseidon2", + "uuid", + "zeroize", +] + +[[package]] +name = "taceo-oprf-types" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447b96ee4bb69a16b05fa1e581501c426338698263cde39fc8fbfdbf5d24b616" +dependencies = [ + "alloy", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "async-trait", + "eyre", + "http", + "serde", + "taceo-ark-babyjubjub", + "taceo-ark-serde-compat", + "taceo-circom-types", + "taceo-groth16-sol", + "taceo-oprf-core", + "uuid", +] + +[[package]] +name = "taceo-poseidon2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac59d3df4c827b3496bff929aebd6440997a5c2e946f46ff4fdd76f318447581" +dependencies = [ + "ark-bn254", + "ark-ff 0.5.0", + "ark-std 0.5.0", + "num-bigint", + "num-traits", +] + +[[package]] +name = "tap" +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.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" +dependencies = [ + "fastrand", + "getrandom 0.4.1", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[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.116", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[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.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +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.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2 0.6.2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.23.10+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.9+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +dependencies = [ + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags", + "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.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +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 = "tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.2", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.18", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[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.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[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 = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +dependencies = [ + "getrandom 0.4.1", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[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.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.116", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver 1.0.27", +] + +[[package]] +name = "wasmtimer" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "web-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +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.6", +] + +[[package]] +name = "webpki-roots" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +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.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap 2.13.0", + "prettyplease", + "syn 2.0.116", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.116", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver 1.0.27", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "world-id-primitives" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb4aa561b0b99df193a638b9081da74e299e4d608d0c5d2c0f76ebfe537caba" +dependencies = [ + "alloy", + "alloy-primitives", + "ark-bn254", + "ark-ff 0.5.0", + "ark-groth16", + "arrayvec", + "eyre", + "getrandom 0.2.17", + "hex", + "k256", + "rand 0.8.5", + "ruint", + "secrecy", + "serde", + "serde_json", + "sha3", + "strum", + "taceo-ark-babyjubjub", + "taceo-ark-serde-compat", + "taceo-circom-types", + "taceo-eddsa-babyjubjub", + "taceo-groth16-material", + "taceo-groth16-sol", + "taceo-oprf", + "taceo-poseidon2", + "thiserror 2.0.18", + "url", + "uuid", +] + +[[package]] +name = "world-id-proof" +version = "0.5.2" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-serialize 0.5.0", + "eyre", + "rand 0.8.5", + "rayon", + "reqwest", + "taceo-ark-babyjubjub", + "taceo-circom-types", + "taceo-eddsa-babyjubjub", + "taceo-groth16-material", + "taceo-oprf", + "taceo-poseidon2", + "tar", + "thiserror 2.0.18", + "tracing", + "world-id-primitives", + "zeroize", + "zstd", +] + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix", +] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[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.116", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[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.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/vendor/world-id-proof/Cargo.toml b/vendor/world-id-proof/Cargo.toml new file mode 100644 index 000000000..3e604f72e --- /dev/null +++ b/vendor/world-id-proof/Cargo.toml @@ -0,0 +1,171 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies. +# +# If you are reading this file be aware that the original Cargo.toml +# will likely look very different (and much more reasonable). +# See Cargo.toml.orig for the original contents. + +[package] +edition = "2024" +rust-version = "1.87" +name = "world-id-proof" +version = "0.5.2" +authors = [ + "World Foundation", + "TACEO GmbH ", + "Tools for Humanity", +] +build = "build.rs" +include = [ + "src/**/*", + "tests/**/*", + "build.rs", + "Cargo.toml", + "README.md", +] +publish = true +autolib = false +autobins = false +autoexamples = false +autotests = false +autobenches = false +description = "World ID Proof crate" +homepage = "https://docs.world.org/world-id" +readme = "README.md" +license = "MIT" +repository = "https://github.com/worldcoin/world-id-protocol" +resolver = "2" + +[features] +compress-zkeys = [ + "embed-zkeys", + "dep:ark-serialize", + "dep:circom-types", +] +default = [] +embed-zkeys = ["dep:tar"] +zstd-compress-zkeys = [ + "embed-zkeys", + "dep:zstd", +] + +[lib] +name = "world_id_proof" +path = "src/lib.rs" + +[dependencies.ark-babyjubjub] +version = "0.5" +package = "taceo-ark-babyjubjub" + +[dependencies.ark-bn254] +version = "0.5" + +[dependencies.ark-ec] +version = "0.5" + +[dependencies.ark-ff] +version = "0.5" + +[dependencies.ark-groth16] +version = "0.5" + +[dependencies.ark-serialize] +version = "0.5" +optional = true + +[dependencies.circom-types] +version = "0.2" +features = [ + "bn254", + "groth16", + "zkey", +] +optional = true +default-features = false +package = "taceo-circom-types" + +[dependencies.eddsa-babyjubjub] +version = "0.5.4" +package = "taceo-eddsa-babyjubjub" + +[dependencies.eyre] +version = "0.6" + +[dependencies.groth16-material] +version = "0.2.3" +default-features = false +package = "taceo-groth16-material" + +[dependencies.poseidon2] +version = "0.2" +package = "taceo-poseidon2" + +[dependencies.rand] +version = "0.8" + +[dependencies.taceo-oprf] +version = "0.7.1" +features = [ + "client", + "core", +] +default-features = false + +[dependencies.tar] +version = "0.4" +optional = true + +[dependencies.thiserror] +version = "2" + +[dependencies.tracing] +version = "0.1" + +[dependencies.world-id-primitives] +version = "0.5.2" +default-features = false + +[dependencies.zeroize] +version = "1" + +[dependencies.zstd] +version = "0.13" +optional = true + +[build-dependencies.ark-serialize] +version = "0.5" + +[build-dependencies.circom-types] +version = "0.2" +features = [ + "bn254", + "groth16", + "zkey", +] +default-features = false +package = "taceo-circom-types" + +[build-dependencies.eyre] +version = "0.6" + +[build-dependencies.rayon] +version = "1.11" + +[build-dependencies.reqwest] +version = "0.12" +features = [ + "json", + "rustls-tls", + "blocking", +] +default-features = false + +[build-dependencies.tar] +version = "0.4" + +[build-dependencies.zstd] +version = "0.13" diff --git a/vendor/world-id-proof/Cargo.toml.orig b/vendor/world-id-proof/Cargo.toml.orig new file mode 100644 index 000000000..0978f259e --- /dev/null +++ b/vendor/world-id-proof/Cargo.toml.orig @@ -0,0 +1,59 @@ +[package] +name = "world-id-proof" +description = "World ID Proof crate" +publish = true +edition.workspace = true +version.workspace = true +license.workspace = true +authors.workspace = true +homepage.workspace = true +rust-version.workspace = true +repository.workspace = true +include = [ + "src/**/*", + "tests/**/*", + "build.rs", + "Cargo.toml", + "README.md", +] + +[features] +default = ["embed-zkeys"] +# Embed zkeys into binary +embed-zkeys = ["dep:tar"] +# Compress the embedded zkeys to reduce binary size (ARK point compression) +compress-zkeys = ["embed-zkeys", "dep:ark-serialize", "dep:circom-types"] +# Compress the tar archive with zstd +zstd-compress-zkeys = ["embed-zkeys", "dep:zstd"] + +[dependencies] +ark-babyjubjub = { workspace = true } +ark-bn254 = { workspace = true } +ark-ff = { workspace = true } +ark-ec = { workspace = true } +ark-groth16 = { workspace = true } +ark-serialize = { workspace = true, optional = true } +circom-types = { workspace = true, features = ["bn254", "groth16", "zkey"], optional = true } +tar = { workspace = true, optional = true } +thiserror = { workspace = true } +tracing = { workspace = true } +zstd = { workspace = true, optional = true } +eddsa-babyjubjub = { workspace = true } +rand = { workspace = true } +groth16-material = { workspace = true } +poseidon2 = { workspace = true } +taceo-oprf = { workspace = true, features = ["client", "core"] } +eyre = { workspace = true } +zeroize = { workspace = true } + +# Internal +world-id-primitives = { workspace = true } + +[build-dependencies] +eyre = { workspace = true } +reqwest = { workspace = true, features = ["blocking"] } +ark-serialize = { workspace = true } +circom-types = { workspace = true, features = ["bn254", "groth16", "zkey"] } +rayon = { workspace = true } +tar = { workspace = true } +zstd = { workspace = true } diff --git a/vendor/world-id-proof/README.md b/vendor/world-id-proof/README.md new file mode 100644 index 000000000..96e676141 --- /dev/null +++ b/vendor/world-id-proof/README.md @@ -0,0 +1,24 @@ +# World ID Proof + +World ID is an anonymous proof of human for the age of AI. + +This crate provides the functionality for World ID Proofs. + +More information can be found in the [World ID Developer Documentation](https://docs.world.org/world-id). + +### Features + +##### `embed-zkeys` + +build.rs will download zkey files from github and include them into the binary. + +Download from github is done as a workaround to circumvent the max crates.io hosting limit. + +##### `compress-zkeys` (implies `embed-zkeys`) + +build.rs will download and compress zkey files from github and include them into the binary. +At runtime, zkeys are decompressed in memory during initialization. + +##### neither `compress-zkeys` or `embed-zkeys` + +zkey files are not included in the bin. diff --git a/vendor/world-id-proof/build.rs b/vendor/world-id-proof/build.rs new file mode 100644 index 000000000..89fc53d31 --- /dev/null +++ b/vendor/world-id-proof/build.rs @@ -0,0 +1,240 @@ +use eyre::OptionExt; +use std::{ + env, fs, + path::{Path, PathBuf}, +}; + +#[cfg(feature = "embed-zkeys")] +use std::{fs::File, io}; + +#[cfg(feature = "embed-zkeys")] +const GITHUB_REPO: &str = "worldcoin/world-id-protocol"; + +#[cfg(feature = "embed-zkeys")] +const CIRCUIT_COMMIT: &str = "aaf8f2650b003a8bb06feb26bed6277629d4c0bf"; // TODO: Figure out a better way for static commits + +const CIRCUIT_FILES: &[&str] = &[ + "circom/OPRFQueryGraph.bin", + "circom/OPRFNullifierGraph.bin", + "circom/OPRFQuery.arks.zkey", + "circom/OPRFNullifier.arks.zkey", +]; + +fn main() -> eyre::Result<()> { + println!("cargo:rerun-if-changed=build.rs"); + + if std::env::var_os("DOCS_RS").is_some() { + // Define a cfg only for THIS crate’s compilation. + println!("cargo:rustc-cfg=docsrs"); + println!("cargo:rustc-check-cfg=cfg(docsrs)"); + } + + // Skip for docs.rs as it doesn't have network access + if env::var("DOCS_RS").is_ok() { + println!("cargo:warning=Building for docs.rs, skipping circuit file downloads"); + return Ok(()); + } + + if env::var("CARGO_FEATURE_EMBED_ZKEYS").is_err() { + return Ok(()); + }; + + let out_dir = PathBuf::from(env::var("OUT_DIR")?); + + for path_str in CIRCUIT_FILES { + let path = Path::new(path_str); + + fetch_circuit_file(path, &out_dir)?; + } + + // ARK point compression (when compress-zkeys feature is active) + let use_ark = std::env::var("CARGO_FEATURE_COMPRESS_ZKEYS").is_ok(); + if use_ark { + ark_compress_zkeys(&out_dir)?; + } + + // Create tar archive of all circuit files + let use_zstd = std::env::var("CARGO_FEATURE_ZSTD_COMPRESS_ZKEYS").is_ok(); + let archive_name = if use_zstd { + "circuit_files.tar.zst" + } else { + "circuit_files.tar" + }; + let archive_path = out_dir.join(archive_name); + + // Collect files: use .compressed zkeys if ARK compression active, raw otherwise + let mut files_to_bundle: Vec<(&str, PathBuf)> = Vec::new(); + for path_str in CIRCUIT_FILES { + let file_name = Path::new(path_str).file_name().unwrap().to_str().unwrap(); + if is_arks_zkey(Path::new(file_name)) && use_ark { + files_to_bundle.push((file_name, out_dir.join(format!("{file_name}.compressed")))); + } else { + files_to_bundle.push((file_name, out_dir.join(file_name))); + } + } + + let needs_rebuild = files_to_bundle + .iter() + .any(|(_, src)| !is_up_to_date(src, &archive_path)); + + if needs_rebuild { + let file = fs::File::create(&archive_path)?; + if use_zstd { + let encoder = zstd::Encoder::new(file, 0)?; + let mut tar = tar::Builder::new(encoder); + for (name, path) in &files_to_bundle { + tar.append_path_with_name(path, name)?; + } + tar.into_inner()?.finish()?; + } else { + let mut tar = tar::Builder::new(file); + for (name, path) in &files_to_bundle { + tar.append_path_with_name(path, name)?; + } + tar.finish()?; + } + } + + Ok(()) +} + +#[cfg(feature = "embed-zkeys")] +fn download_file(url: &str, output_path: &Path) -> eyre::Result<()> { + let response = reqwest::blocking::get(url)?; + + if !response.status().is_success() { + eyre::bail!("HTTP error {}: {}", response.status(), url); + } + + let mut file = File::create(output_path)?; + let content = response.bytes()?; + io::copy(&mut content.as_ref(), &mut file)?; + + Ok(()) +} + +fn fetch_circuit_file(path: &Path, out_dir: &Path) -> eyre::Result<()> { + let output_path = out_dir.join(path.file_name().ok_or_eyre("invalid path")?); + + // Check for local file first (development) + if let Ok(manifest_dir) = env::var("CARGO_MANIFEST_DIR") { + let local_path = Path::new(&manifest_dir) + .parent() + .and_then(|p| p.parent()) + .map(|p| p.join(path)); + + if let Some(path) = local_path { + if path.exists() { + // Hard links fail across filesystem boundaries (e.g. in cross Docker containers), + // so fall back to copying the file. + if std::fs::hard_link(&path, &output_path).is_err() { + std::fs::copy(&path, &output_path)?; + } + println!("cargo:rerun-if-changed={}", path.display()); + return Ok(()); + } + } + } + + // Download from GitHub: we need to do this because crates.io enforce a hard limit on the + // size of a crate upload of ~10MB and the circuit files are heavier than that. + #[cfg(feature = "embed-zkeys")] + { + let url = format!( + "https://raw.githubusercontent.com/{}/{}/{}", + GITHUB_REPO, + CIRCUIT_COMMIT, + path.to_str().ok_or_eyre("invalid path")? + ); + + download_file(&url, &output_path)?; + Ok(()) + } + + #[cfg(not(feature = "embed-zkeys"))] + return Ok(()); +} + +fn is_arks_zkey(path: &Path) -> bool { + path.file_name() + .and_then(|name| name.to_str()) + .is_some_and(|name| name.ends_with(".arks.zkey")) +} + +fn is_up_to_date(input: &Path, output: &Path) -> bool { + let input_modified = match fs::metadata(input).and_then(|m| m.modified()) { + Ok(time) => time, + Err(_) => return false, + }; + + let output_modified = match fs::metadata(output).and_then(|m| m.modified()) { + Ok(time) => time, + Err(_) => return false, + }; + + output_modified >= input_modified +} + +fn ark_compress_zkeys(out_dir: &Path) -> eyre::Result<()> { + use rayon::prelude::*; + + let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR")?); + let workspace_root = manifest_dir + .parent() + .and_then(|p| p.parent()) + .ok_or_eyre("failed to resolve workspace root from CARGO_MANIFEST_DIR")?; + let circom_dir = workspace_root.join("circom"); + + if !circom_dir.is_dir() { + fs::create_dir_all(&circom_dir)?; + } + + // Watch the directory itself for new/removed files + println!("cargo:rerun-if-changed={}", circom_dir.display()); + + // Process directory entries in parallel while propagating any IO errors. + fs::read_dir(out_dir)? + .par_bridge() + .try_for_each(|entry| -> eyre::Result<()> { + let path = entry?.path(); + if !is_arks_zkey(&path) { + return Ok(()); + } + + let file_name = path + .file_name() + .ok_or_eyre("missing filename")? + .to_str() + .ok_or_eyre("non-utf8 filename")?; + let output_path = out_dir.join(format!("{file_name}.compressed")); + + // Skip if output exists and is newer than input + if is_up_to_date(&path, &output_path) { + return eyre::Ok(()); + } + + compress_zkey(&path, &output_path)?; + + Ok(()) + })?; + + Ok(()) +} + +fn compress_zkey(input: &Path, output: &Path) -> eyre::Result<()> { + use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Compress, Validate}; + use circom_types::{ark_bn254::Bn254, groth16::ArkZkey}; + + let input_bytes = fs::read(input)?; + let zkey = ArkZkey::::deserialize_with_mode( + input_bytes.as_slice(), + Compress::No, + Validate::Yes, + )?; + + let mut compressed = Vec::new(); + zkey.serialize_with_mode(&mut compressed, Compress::Yes)?; + fs::write(output, compressed)?; + + Ok(()) +} diff --git a/vendor/world-id-proof/src/credential_blinding_factor.rs b/vendor/world-id-proof/src/credential_blinding_factor.rs new file mode 100644 index 000000000..4e2512093 --- /dev/null +++ b/vendor/world-id-proof/src/credential_blinding_factor.rs @@ -0,0 +1,127 @@ +//! Logic to generate credential blinding factors using the OPRF Nodes. + +use ark_ff::PrimeField; +use eyre::Context as _; +use groth16_material::circom::CircomGroth16Material; + +use taceo_oprf::{ + client::{Connector, VerifiableOprfOutput}, + core::oprf::BlindingFactor, +}; + +use world_id_primitives::{ + FieldElement, TREE_DEPTH, + circuit_inputs::QueryProofCircuitInput, + oprf::{CredentialBlindingFactorOprfRequestAuthV1, OprfModule}, +}; + +use crate::{ + AuthenticatorProofInput, + proof::{OPRF_PROOF_DS, ProofError, errors}, +}; + +/// Credential blinding factor computed using OPRF Nodes. +pub struct OprfCredentialBlindingFactor { + /// The result of the distributed OPRF protocol, including the final blinding factor. + pub verifiable_oprf_output: VerifiableOprfOutput, +} + +impl OprfCredentialBlindingFactor { + /// Generates a blinding factor through the provided OPRF nodes. + /// + /// This method will handle the signature from the Authenticator authorizing the + /// request for the OPRF nodes. + /// + /// # Arguments + /// - `services`: The list of endpoints of all OPRF nodes. + /// - `threshold`: The minimum number of OPRF nodes responses required to compute a valid nullifier. The + /// source of truth for this value lives in the `OprfKeyRegistry` contract. + /// - `query_material`: The material for the query proof circuit. + /// - `authenticator_input`: See [`AuthenticatorProofInput`] for more details. + /// - `issuer_schema_id`: The schema ID of the credential issuer. + /// - `action`: The action for which the blinding factor is being requested. + /// - `oprf_key_id`: The OPRF key identifier. + /// + /// # Errors + /// + /// Returns [`ProofError`] in the following cases: + /// * `PublicKeyNotFound` - the public key for the given authenticator private key is not found in the `key_set`. + /// * `InvalidDLogProof` – the `DLog` equality proof could not be verified. + /// * Other errors may propagate from network requests, proof generation, or Groth16 verification. + pub async fn generate( + services: &[String], + threshold: usize, + query_material: &CircomGroth16Material, + authenticator_input: AuthenticatorProofInput, + issuer_schema_id: u64, + action: FieldElement, + connector: Connector, + ) -> Result { + let mut rng = rand::rngs::OsRng; + + // For schema issuer OPRF, the nonce is not needed. + let nonce = FieldElement::ZERO; + + let query_blinding_factor = BlindingFactor::rand(&mut rng); + + let siblings: [ark_babyjubjub::Fq; TREE_DEPTH] = + authenticator_input.inclusion_proof.siblings.map(|s| *s); + + let query_hash = world_id_primitives::authenticator::oprf_query_digest( + authenticator_input.inclusion_proof.leaf_index, + action, + issuer_schema_id.into(), + ); + let signature = authenticator_input.private_key.sign(*query_hash); + + let query_proof_input = QueryProofCircuitInput:: { + pk: authenticator_input.key_set.as_affine_array(), + pk_index: authenticator_input.key_index.into(), + s: signature.s, + r: signature.r, + merkle_root: *authenticator_input.inclusion_proof.root, + depth: ark_babyjubjub::Fq::from(TREE_DEPTH as u64), + mt_index: authenticator_input.inclusion_proof.leaf_index.into(), + siblings, + beta: query_blinding_factor.beta(), + rp_id: issuer_schema_id.into(), + action: *action, + nonce: *nonce, + }; + let _ = errors::check_query_input_validity(&query_proof_input)?; + + tracing::debug!("generating query proof"); + let (proof, public_inputs) = query_material.generate_proof(&query_proof_input, &mut rng)?; + query_material.verify_proof(&proof, &public_inputs)?; + tracing::debug!("generated query proof"); + + let auth = CredentialBlindingFactorOprfRequestAuthV1 { + proof: proof.into(), + action: *action, + nonce: *nonce, + merkle_root: *authenticator_input.inclusion_proof.root, + issuer_schema_id, + }; + + tracing::debug!("executing distributed OPRF"); + + let service_uris = + taceo_oprf::client::to_oprf_uri_many(services, OprfModule::CredentialBlindingFactor) + .context("while building service URI for credential blinding factor")?; + + let verifiable_oprf_output = taceo_oprf::client::distributed_oprf( + &service_uris, + threshold, + *query_hash, + query_blinding_factor, + ark_babyjubjub::Fq::from_be_bytes_mod_order(OPRF_PROOF_DS), + auth, + connector, + ) + .await?; + + Ok(Self { + verifiable_oprf_output, + }) + } +} diff --git a/vendor/world-id-proof/src/lib.rs b/vendor/world-id-proof/src/lib.rs new file mode 100644 index 000000000..ec9164741 --- /dev/null +++ b/vendor/world-id-proof/src/lib.rs @@ -0,0 +1,44 @@ +#![cfg_attr(not(test), warn(unused_crate_dependencies))] + +use eddsa_babyjubjub::EdDSAPrivateKey; +use world_id_primitives::{ + TREE_DEPTH, authenticator::AuthenticatorPublicKeySet, merkle::MerkleInclusionProof, +}; +use zeroize::{Zeroize, ZeroizeOnDrop}; + +pub mod credential_blinding_factor; +pub mod nullifier; +pub mod proof; + +/// Inputs from the Authenticator to generate a nullifier or blinding factor. +#[derive(Zeroize, ZeroizeOnDrop)] +pub struct AuthenticatorProofInput { + /// The set of all public keys for all the user's authenticators. + #[zeroize(skip)] + key_set: AuthenticatorPublicKeySet, + /// Inclusion proof in the World ID Registry. + #[zeroize(skip)] + inclusion_proof: MerkleInclusionProof, + /// The off-chain signer key for the Authenticator. + private_key: EdDSAPrivateKey, + /// The index at which the authenticator key is located in the `key_set`. + key_index: u64, +} + +impl AuthenticatorProofInput { + /// Creates a new authenticator proof input. + #[must_use] + pub const fn new( + key_set: AuthenticatorPublicKeySet, + inclusion_proof: MerkleInclusionProof, + private_key: EdDSAPrivateKey, + key_index: u64, + ) -> Self { + Self { + key_set, + inclusion_proof, + private_key, + key_index, + } + } +} diff --git a/vendor/world-id-proof/src/nullifier.rs b/vendor/world-id-proof/src/nullifier.rs new file mode 100644 index 000000000..c04faab19 --- /dev/null +++ b/vendor/world-id-proof/src/nullifier.rs @@ -0,0 +1,137 @@ +//! Logic to generate nullifiers using the OPRF Nodes. + +use ark_ff::PrimeField; +use eyre::Context; +use groth16_material::circom::CircomGroth16Material; + +use taceo_oprf::{ + client::{Connector, VerifiableOprfOutput}, + core::oprf::BlindingFactor, +}; + +use world_id_primitives::{ + FieldElement, ProofRequest, TREE_DEPTH, + circuit_inputs::QueryProofCircuitInput, + nullifier::Nullifier, + oprf::{NullifierOprfRequestAuthV1, OprfModule}, +}; + +use crate::{ + AuthenticatorProofInput, + proof::{OPRF_PROOF_DS, ProofError, errors}, +}; + +/// Nullifier computed using OPRF Nodes. +#[derive(Debug, Clone)] +pub struct OprfNullifier { + /// The raw inputs to the Query Proof circuit + pub query_proof_input: QueryProofCircuitInput, + /// The result of the distributed OPRF protocol. + pub verifiable_oprf_output: VerifiableOprfOutput, + /// The final nullifier value to be used in a Proof. + /// + /// This is equal to [`VerifiableOprfOutput::output`] and is already unblinded. + pub nullifier: Nullifier, +} + +impl OprfNullifier { + /// Generates a nullifier through the provided OPRF nodes for + /// a specific proof request. + /// + /// This method will handle the signature from the Authenticator authorizing the + /// request for the OPRF nodes. + /// + /// # Arguments + /// - `services`: The list of endpoints of all OPRF nodes. + /// - `threshold`: The minimum number of OPRF nodes responses required to compute a valid nullifier. The + /// source of truth for this value lives in the `OprfKeyRegistry` contract. + /// - `query_material`: The material for the query proof circuit. + /// - `authenticator_input`: See [`AuthenticatorProofInput`] for more details. + /// - `proof_request`: The proof request provided by the RP. + /// + /// # Errors + /// + /// Returns [`ProofError`] in the following cases: + /// * `PublicKeyNotFound` - the public key for the given authenticator private key is not found in the `key_set`. + /// * `InvalidDLogProof` – the `DLog` equality proof could not be verified. + /// * Other errors may propagate from network requests, proof generation, or Groth16 verification. + pub async fn generate( + services: &[String], + threshold: usize, + query_material: &CircomGroth16Material, + authenticator_input: AuthenticatorProofInput, + proof_request: &ProofRequest, + connector: Connector, + ) -> Result { + let mut rng = rand::rngs::OsRng; + + let query_blinding_factor = BlindingFactor::rand(&mut rng); + + let siblings: [ark_babyjubjub::Fq; TREE_DEPTH] = + authenticator_input.inclusion_proof.siblings.map(|s| *s); + + let action = *proof_request.computed_action(&mut rng); + let query_hash = world_id_primitives::authenticator::oprf_query_digest( + authenticator_input.inclusion_proof.leaf_index, + action.into(), + proof_request.rp_id.into(), + ); + let signature = authenticator_input.private_key.sign(*query_hash); + + let query_proof_input = QueryProofCircuitInput:: { + pk: authenticator_input.key_set.as_affine_array(), + pk_index: authenticator_input.key_index.into(), + s: signature.s, + r: signature.r, + merkle_root: *authenticator_input.inclusion_proof.root, + depth: ark_babyjubjub::Fq::from(TREE_DEPTH as u64), + mt_index: authenticator_input.inclusion_proof.leaf_index.into(), + siblings, + beta: query_blinding_factor.beta(), + rp_id: *FieldElement::from(proof_request.rp_id), + action, + nonce: *proof_request.nonce, + }; + let _ = errors::check_query_input_validity(&query_proof_input)?; + + tracing::debug!("generating query proof"); + let (proof, public_inputs) = query_material.generate_proof(&query_proof_input, &mut rng)?; + query_material.verify_proof(&proof, &public_inputs)?; + tracing::debug!("generated query proof"); + + let auth = NullifierOprfRequestAuthV1 { + proof: proof.into(), + action, + nonce: *proof_request.nonce, + merkle_root: *authenticator_input.inclusion_proof.root, + current_time_stamp: proof_request.created_at, + expiration_timestamp: proof_request.expires_at, + signature: proof_request.signature, + rp_id: proof_request.rp_id, + }; + + tracing::debug!("executing distributed OPRF"); + + let service_uris = taceo_oprf::client::to_oprf_uri_many(services, OprfModule::Nullifier) + .context("while building service URI for nullifier")?; + + let verifiable_oprf_output = taceo_oprf::client::distributed_oprf( + &service_uris, + threshold, + *query_hash, + query_blinding_factor, + ark_babyjubjub::Fq::from_be_bytes_mod_order(OPRF_PROOF_DS), + auth, + connector, + ) + .await?; + + let nullifier: Nullifier = FieldElement::from(verifiable_oprf_output.output).into(); + + Ok(Self { + query_proof_input, + verifiable_oprf_output, + nullifier, + }) + } +} diff --git a/vendor/world-id-proof/src/proof.rs b/vendor/world-id-proof/src/proof.rs new file mode 100644 index 000000000..208d4c46f --- /dev/null +++ b/vendor/world-id-proof/src/proof.rs @@ -0,0 +1,435 @@ +//! Internal proof generation for the World ID Protocol. +//! +//! Provides functionality for generating ZKPs (zero-knowledge proofs), including +//! Uniqueness Proofs (internally also called Nullifier Proofs `π2`) and Session Proofs. It +//! also contains internal proof computation such as Query Proofs `π1`. +//! +//! The proof generation workflow for Uniqueness Proofs consists of: +//! 1. Loading circuit proving material (zkeys and witness graphs) +//! 2. Signing OPRF queries and generating a Query Proof `π1` +//! 3. Interacting with OPRF services to obtain challenge responses +//! 4. Verifying `DLog` equality proofs from OPRF nodes +//! 5. Generating the final Uniqueness Proof `π2` + +use ark_bn254::Bn254; +use groth16_material::Groth16Error; +use rand::{CryptoRng, Rng}; +use std::{io::Read, path::Path}; +use world_id_primitives::{ + Credential, FieldElement, RequestItem, TREE_DEPTH, circuit_inputs::NullifierProofCircuitInput, + nullifier::Nullifier, +}; + +pub use groth16_material::circom::{ + CircomGroth16Material, CircomGroth16MaterialBuilder, ZkeyError, +}; + +use crate::nullifier::OprfNullifier; + +pub mod errors; + +pub(crate) const OPRF_PROOF_DS: &[u8] = b"World ID Proof"; + +/// The SHA-256 fingerprint of the `OPRFQuery` `ZKey`. +pub const QUERY_ZKEY_FINGERPRINT: &str = + "616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"; +/// The SHA-256 fingerprint of the `OPRFNullifier` `ZKey`. +pub const NULLIFIER_ZKEY_FINGERPRINT: &str = + "4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"; + +/// The SHA-256 fingerprint of the `OPRFQuery` witness graph. +pub const QUERY_GRAPH_FINGERPRINT: &str = + "6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"; +/// The SHA-256 fingerprint of the `OPRFNullifier` witness graph. +pub const NULLIFIER_GRAPH_FINGERPRINT: &str = + "c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"; + +#[cfg(all(feature = "embed-zkeys", not(docsrs)))] +const CIRCUIT_ARCHIVE: &[u8] = { + #[cfg(feature = "zstd-compress-zkeys")] + { + include_bytes!(concat!(env!("OUT_DIR"), "/circuit_files.tar.zst")) + } + #[cfg(not(feature = "zstd-compress-zkeys"))] + { + include_bytes!(concat!(env!("OUT_DIR"), "/circuit_files.tar")) + } +}; + +#[cfg(all(feature = "embed-zkeys", docsrs))] +const CIRCUIT_ARCHIVE: &[u8] = &[]; + +#[cfg(feature = "embed-zkeys")] +#[derive(Clone, Debug)] +pub struct EmbeddedCircuitFiles { + /// Embedded query witness graph bytes. + pub query_graph: Vec, + /// Embedded nullifier witness graph bytes. + pub nullifier_graph: Vec, + /// Embedded query zkey bytes (decompressed if `compress-zkeys` is enabled). + pub query_zkey: Vec, + /// Embedded nullifier zkey bytes (decompressed if `compress-zkeys` is enabled). + pub nullifier_zkey: Vec, +} + +#[cfg(feature = "embed-zkeys")] +static CIRCUIT_FILES: std::sync::OnceLock> = + std::sync::OnceLock::new(); + +/// Error type for OPRF operations and proof generation. +#[derive(Debug, thiserror::Error)] +pub enum ProofError { + /// Error originating from `oprf_client`. + #[error(transparent)] + OprfError(#[from] taceo_oprf::client::Error), + /// Errors originating from proof inputs + #[error(transparent)] + ProofInputError(#[from] errors::ProofInputError), + /// Errors originating from Groth16 proof generation or verification. + #[error(transparent)] + ZkError(#[from] Groth16Error), + /// Catch-all for other internal errors. + #[error(transparent)] + InternalError(#[from] eyre::Report), +} + +// ============================================================================ +// Circuit Material Loaders +// ============================================================================ + +/// Loads the [`CircomGroth16Material`] for the uniqueness proof (internally also nullifier proof) +/// from the embedded keys in the binary without caching. +/// +/// # Returns +/// The nullifier material. +/// +/// # Errors +/// Will return an error if the zkey file cannot be loaded. +#[cfg(feature = "embed-zkeys")] +pub fn load_embedded_nullifier_material() -> eyre::Result { + let files = load_embedded_circuit_files()?; + load_nullifier_material_from_reader( + files.nullifier_zkey.as_slice(), + files.nullifier_graph.as_slice(), + ) +} + +/// Loads the [`CircomGroth16Material`] for the uniqueness proof (internally also query proof) +/// from the optional zkey file or from embedded keys in the binary. +/// +/// # Returns +/// The query material +/// +/// # Errors +/// Will return an error if the zkey file cannot be loaded. +#[cfg(feature = "embed-zkeys")] +pub fn load_embedded_query_material() -> eyre::Result { + let files = load_embedded_circuit_files()?; + load_query_material_from_reader(files.query_zkey.as_slice(), files.query_graph.as_slice()) +} + +/// Loads the [`CircomGroth16Material`] for the nullifier proof from the provided reader. +/// +/// # Errors +/// Will return an error if the material cannot be loaded or verified. +pub fn load_nullifier_material_from_reader( + zkey: impl Read, + graph: impl Read, +) -> eyre::Result { + Ok(build_nullifier_builder().build_from_reader(zkey, graph)?) +} + +/// Loads the [`CircomGroth16Material`] for the query proof from the provided reader. +/// +/// # Errors +/// Will return an error if the material cannot be loaded or verified. +pub fn load_query_material_from_reader( + zkey: impl Read, + graph: impl Read, +) -> eyre::Result { + Ok(build_query_builder().build_from_reader(zkey, graph)?) +} + +/// Loads the [`CircomGroth16Material`] for the nullifier proof from the provided paths. +/// +/// # Panics +/// Will panic if the material cannot be loaded or verified. +pub fn load_nullifier_material_from_paths( + zkey: impl AsRef, + graph: impl AsRef, +) -> CircomGroth16Material { + build_nullifier_builder() + .build_from_paths(zkey, graph) + .expect("works when loading embedded groth16-material") +} + +/// Loads the [`CircomGroth16Material`] for the query proof from the provided paths. +/// +/// # Errors +/// Will return an error if the material cannot be loaded or verified. +pub fn load_query_material_from_paths( + zkey: impl AsRef, + graph: impl AsRef, +) -> eyre::Result { + Ok(build_query_builder().build_from_paths(zkey, graph)?) +} + +#[cfg(feature = "embed-zkeys")] +pub fn load_embedded_circuit_files() -> eyre::Result { + let files = get_circuit_files()?; + Ok(files.clone()) +} + +#[cfg(feature = "embed-zkeys")] +fn get_circuit_files() -> eyre::Result<&'static EmbeddedCircuitFiles> { + let files = CIRCUIT_FILES.get_or_init(|| init_circuit_files().map_err(|e| e.to_string())); + match files { + Ok(files) => Ok(files), + Err(err) => Err(eyre::eyre!(err.clone())), + } +} + +#[cfg(feature = "embed-zkeys")] +fn init_circuit_files() -> eyre::Result { + use std::io::Read as _; + + use eyre::ContextCompat; + + // Step 1: Decode archive bytes (optional zstd decompression) + let tar_bytes: Vec = { + #[cfg(feature = "zstd-compress-zkeys")] + { + zstd::stream::decode_all(CIRCUIT_ARCHIVE)? + } + #[cfg(not(feature = "zstd-compress-zkeys"))] + { + CIRCUIT_ARCHIVE.to_vec() + } + }; + + // Step 2: Untar — extract 4 entries by filename + let mut query_graph = None; + let mut nullifier_graph = None; + let mut query_zkey = None; + let mut nullifier_zkey = None; + + let mut archive = tar::Archive::new(tar_bytes.as_slice()); + for entry in archive.entries()? { + let mut entry = entry?; + let path = entry.path()?.to_path_buf(); + let name = path + .file_name() + .and_then(|n| n.to_str()) + .unwrap_or_default(); + + let mut buf = Vec::with_capacity(entry.size() as usize); + entry.read_to_end(&mut buf)?; + + match name { + "OPRFQueryGraph.bin" => query_graph = Some(buf), + "OPRFNullifierGraph.bin" => nullifier_graph = Some(buf), + "OPRFQuery.arks.zkey" => query_zkey = Some(buf), + "OPRFNullifier.arks.zkey" => nullifier_zkey = Some(buf), + _ => {} + } + } + + let query_graph = query_graph.context("OPRFQueryGraph.bin not found in archive")?; + let nullifier_graph = nullifier_graph.context("OPRFNullifierGraph.bin not found in archive")?; + #[allow(unused_mut)] + let mut query_zkey = query_zkey.context("OPRFQuery zkey not found in archive")?; + #[allow(unused_mut)] + let mut nullifier_zkey = nullifier_zkey.context("OPRFNullifier zkey not found in archive")?; + + // Step 3: ARK decompress zkeys if compress-zkeys is active + #[cfg(feature = "compress-zkeys")] + { + if let Ok(decompressed) = ark_decompress_zkey(&query_zkey) { + query_zkey = decompressed; + } + if let Ok(decompressed) = ark_decompress_zkey(&nullifier_zkey) { + nullifier_zkey = decompressed; + } + } + + Ok(EmbeddedCircuitFiles { + query_graph, + nullifier_graph, + query_zkey, + nullifier_zkey, + }) +} + +/// ARK-decompresses a zkey. +#[cfg(feature = "compress-zkeys")] +pub fn ark_decompress_zkey(compressed: &[u8]) -> eyre::Result> { + let zkey = as ark_serialize::CanonicalDeserialize>::deserialize_with_mode( + compressed, + ark_serialize::Compress::Yes, + ark_serialize::Validate::Yes, + )?; + + let mut uncompressed = Vec::new(); + ark_serialize::CanonicalSerialize::serialize_with_mode( + &zkey, + &mut uncompressed, + ark_serialize::Compress::No, + )?; + Ok(uncompressed) +} + +fn build_nullifier_builder() -> CircomGroth16MaterialBuilder { + CircomGroth16MaterialBuilder::new() + .fingerprint_zkey(NULLIFIER_ZKEY_FINGERPRINT.into()) + .fingerprint_graph(NULLIFIER_GRAPH_FINGERPRINT.into()) + .bbf_num_2_bits_helper() + .bbf_inv() + .bbf_legendre() + .bbf_sqrt_input() + .bbf_sqrt_unchecked() +} + +fn build_query_builder() -> CircomGroth16MaterialBuilder { + CircomGroth16MaterialBuilder::new() + .fingerprint_zkey(QUERY_ZKEY_FINGERPRINT.into()) + .fingerprint_graph(QUERY_GRAPH_FINGERPRINT.into()) + .bbf_num_2_bits_helper() + .bbf_inv() + .bbf_legendre() + .bbf_sqrt_input() + .bbf_sqrt_unchecked() +} + +// ============================================================================ +// Uniqueness Proof (internally also called nullifier proof) Generation +// ============================================================================ + +/// FIXME. Description. +/// Generates the Groth16 nullifier proof .... +/// +/// Internally can be a Session Proof or Uniqueness Proof +/// +/// # Errors +/// +/// Returns [`ProofError`] if proof generation or verification fails. +#[allow(clippy::too_many_arguments)] +pub fn generate_nullifier_proof( + nullifier_material: &CircomGroth16Material, + rng: &mut R, + credential: &Credential, + credential_sub_blinding_factor: FieldElement, + oprf_nullifier: OprfNullifier, + request_item: &RequestItem, + session_id: Option, + session_id_r_seed: FieldElement, + expires_at_min: u64, +) -> Result< + ( + ark_groth16::Proof, + Vec, + Nullifier, + ), + ProofError, +> { + let cred_signature = credential + .signature + .clone() + .ok_or_else(|| ProofError::InternalError(eyre::eyre!("Credential not signed")))?; + + let nullifier_input = NullifierProofCircuitInput:: { + query_input: oprf_nullifier.query_proof_input, + issuer_schema_id: credential.issuer_schema_id.into(), + cred_pk: credential.issuer.pk, + cred_hashes: [*credential.claims_hash()?, *credential.associated_data_hash], + cred_genesis_issued_at: credential.genesis_issued_at.into(), + cred_genesis_issued_at_min: request_item.genesis_issued_at_min.unwrap_or(0).into(), + cred_expires_at: credential.expires_at.into(), + cred_id: credential.id.into(), + cred_sub_blinding_factor: *credential_sub_blinding_factor, + cred_s: cred_signature.s, + cred_r: cred_signature.r, + id_commitment_r: *session_id_r_seed, + id_commitment: *session_id.unwrap_or(FieldElement::ZERO), + dlog_e: oprf_nullifier.verifiable_oprf_output.dlog_proof.e, + dlog_s: oprf_nullifier.verifiable_oprf_output.dlog_proof.s, + oprf_pk: oprf_nullifier + .verifiable_oprf_output + .oprf_public_key + .inner(), + oprf_response_blinded: oprf_nullifier.verifiable_oprf_output.blinded_response, + oprf_response: oprf_nullifier.verifiable_oprf_output.unblinded_response, + signal_hash: *request_item.signal_hash(), + // The `current_timestamp` constraint in the circuit is used to specify the minimum expiration time for the credential. + // The circuit verifies that `current_timestamp < cred_expires_at`. + current_timestamp: expires_at_min.into(), + }; + + let _ = errors::check_nullifier_input_validity(&nullifier_input)?; + + let (proof, public) = nullifier_material.generate_proof(&nullifier_input, rng)?; + nullifier_material.verify_proof(&proof, &public)?; + + let nullifier: Nullifier = FieldElement::from(public[0]).into(); + + // Verify that the computed nullifier matches the OPRF output. + if nullifier != oprf_nullifier.nullifier { + return Err(ProofError::InternalError(eyre::eyre!( + "Computed nullifier does not match OPRF output" + ))); + } + + Ok((proof, public, nullifier)) +} + +#[cfg(all(test, feature = "embed-zkeys"))] +mod tests { + use super::*; + + #[test] + fn loads_embedded_circuit_files() { + let files = load_embedded_circuit_files().unwrap(); + assert!(!files.query_graph.is_empty()); + assert!(!files.nullifier_graph.is_empty()); + assert!(!files.query_zkey.is_empty()); + assert!(!files.nullifier_zkey.is_empty()); + } + + #[test] + fn builds_materials_from_embedded_readers() { + let files = load_embedded_circuit_files().unwrap(); + load_query_material_from_reader(files.query_zkey.as_slice(), files.query_graph.as_slice()) + .unwrap(); + load_nullifier_material_from_reader( + files.nullifier_zkey.as_slice(), + files.nullifier_graph.as_slice(), + ) + .unwrap(); + } + + #[test] + fn convenience_embedded_material_loaders_work() { + load_embedded_query_material().unwrap(); + load_embedded_nullifier_material().unwrap(); + } + + #[cfg(feature = "compress-zkeys")] + #[test] + fn ark_decompress_zkey_roundtrip() { + use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Compress, Validate}; + use circom_types::{ark_bn254::Bn254, groth16::ArkZkey}; + + let files = load_embedded_circuit_files().unwrap(); + let zkey = ArkZkey::::deserialize_with_mode( + files.query_zkey.as_slice(), + Compress::No, + Validate::Yes, + ) + .unwrap(); + let mut compressed = Vec::new(); + zkey.serialize_with_mode(&mut compressed, Compress::Yes) + .unwrap(); + + let decompressed = ark_decompress_zkey(&compressed).unwrap(); + assert_eq!(decompressed, files.query_zkey); + } +} diff --git a/vendor/world-id-proof/src/proof/errors.rs b/vendor/world-id-proof/src/proof/errors.rs new file mode 100644 index 000000000..8343c4e94 --- /dev/null +++ b/vendor/world-id-proof/src/proof/errors.rs @@ -0,0 +1,847 @@ +//! This module contains error types and validation functions for World ID proof inputs. +//! +//! These are intended to assist in producing more helpful error messages for a given proof. +//! If the circuits change in any way, these checks may also need to be updated to match the new logic. +use ark_bn254::Fr; +use ark_ec::{AffineRepr, CurveGroup}; +use ark_ff::{PrimeField, Zero}; +use eddsa_babyjubjub::EdDSAPublicKey; +use taceo_oprf::core::{dlog_equality::DLogEqualityProof, oprf::BlindingFactor}; +use world_id_primitives::{ + FieldElement, + authenticator::{AuthenticatorPublicKeySet, MAX_AUTHENTICATOR_KEYS}, + circuit_inputs::{NullifierProofCircuitInput, QueryProofCircuitInput}, + merkle::MerkleInclusionProof, +}; + +type BaseField = ark_babyjubjub::Fq; +type Affine = ark_babyjubjub::EdwardsAffine; + +#[derive(Debug, thiserror::Error)] +/// Errors that can occur when validating the inputs for a single World ID proof. +pub enum ProofInputError { + /// The specified Merkle tree depth is invalid. + #[error("The specified Merkle tree depth is invalid (expected: {expected}, got: {is}).")] + InvalidMerkleTreeDepth { + /// Expected depth. + expected: usize, + /// Actual depth. + is: BaseField, + }, + /// The set of authenticator public keys is invalid. + #[error("The set of authenticator public keys is invalid.")] + InvalidAuthenticatorPublicKeySet, + /// The provided Merkle tree **inclusion proof** is invalid (the root may or may not be valid for the `WorldIDRegistry` tree) + #[error("The provided Merkle tree inclusion proof is invalid.")] + InvalidMerkleTreeInclusionProof, + /// The signature from the authenticator for the request is invalid. + #[error("The signature over the nonce and RP ID is invalid.")] + InvalidQuerySignature, + /// The provided blinding factor is invalid, or the sub is incorrect. + #[error("The provided blinding factor is invalid.")] + InvalidBlindingFactor, + /// The provided credential has expired. + #[error( + "The provided credential has expired (expires_at: {expires_at}, check_timestamp: {current_timestamp})." + )] + CredentialExpired { + /// Current timestamp. + current_timestamp: u64, + /// Expiration timestamp. + expires_at: u64, + }, + /// The provided credential genesis issue timestamp is expired. + #[error( + "The provided credential has a genesis issued at date that is too old (genesis_issued_at: {genesis_issued_at}, check_timestamp: {genesis_issued_at_min})." + )] + CredentialGenesisExpired { + /// Minimum Issue date. + genesis_issued_at_min: u64, + /// Genesis issue timestamp. + genesis_issued_at: u64, + }, + /// A value is out of bounds. + #[error("The value '{name}' is out of bounds (got: {is}, limit: {limit}).")] + ValueOutOfBounds { + /// Name of the value for error message. + name: &'static str, + /// Actual value. + is: BaseField, + /// Upper limit, not inclusive. + limit: BaseField, + }, + /// The credential signature is invalid. This signals the issued credential is invalid. + #[error("The credential signature is invalid for the given issuer public key.")] + InvalidCredentialSignature, + /// The provided point is not a valid point in the prime-order subgroup of the `BabyJubJub` curve. + #[error( + "The provided point '{name}' is not a valid point in the prime-order subgroup of the BabyJubJub curve." + )] + InvalidBabyJubJubPoint { + /// Name of the point for error message. + name: &'static str, + }, + /// The provided OPRF proof is invalid. + #[error("The provided OPRF DlogEquality proof is invalid.")] + InvalidOprfProof, + /// The provided unblinded OPRF response point is invalid. + #[error("The provided unblinded OPRF response point is invalid.")] + InvalidOprfResponse, + /// The provided session ID commitment is invalid. + #[error( + "The provided session ID commitment is invalid for the given id and session id randomness." + )] + InvalidSessionId, +} + +/// This method checks the validity of the input parameters by emulating the operations that are proved in ZK and raising Errors that would result in an invalid proof. +/// +/// Returns the blinded OPRF query point if everything is ok. +/// +/// # Errors +/// This function will return a [`ProofInputError`] if any of the checks fail. +/// The `Display` implementation of this error can be used to get a human-readable error message on which parts of the input were invalid. +pub fn check_query_input_validity( + inputs: &QueryProofCircuitInput, +) -> Result { + // 1. Check that the depth is within bounds. + if inputs.depth != BaseField::new((TREE_DEPTH as u64).into()) { + return Err(ProofInputError::InvalidMerkleTreeDepth { + expected: TREE_DEPTH, + is: inputs.depth, + }); + } + // 2. Check the merkle proof is valid + // Check the Merkle tree idx is valid. + let idx_u64 = u64::try_from(FieldElement::from(inputs.mt_index)).map_err(|_| { + ProofInputError::ValueOutOfBounds { + name: "Merkle tree index", + is: inputs.mt_index, + limit: BaseField::new((1u64 << TREE_DEPTH).into()), + } + })?; + if idx_u64 >= (1u64 << TREE_DEPTH) { + return Err(ProofInputError::ValueOutOfBounds { + name: "Merkle tree index", + is: inputs.mt_index, + limit: BaseField::new((1u64 << TREE_DEPTH).into()), + }); + } + + // Build the leaf from the PKs. + let pk_set = AuthenticatorPublicKeySet::new( + inputs + .pk + .iter() + .map(|&x| EdDSAPublicKey { pk: x }) + .collect(), + ) + .map_err(|_| ProofInputError::InvalidAuthenticatorPublicKeySet)?; + let pk_set_hash = pk_set.leaf_hash(); + let merkle_tree_inclusion_proof = MerkleInclusionProof::new( + FieldElement::from(inputs.merkle_root), + idx_u64, + inputs.siblings.map(FieldElement::from), + ); + if !merkle_tree_inclusion_proof.is_valid(FieldElement::from(pk_set_hash)) { + return Err(ProofInputError::InvalidMerkleTreeInclusionProof); + } + + // 3. Check that the signature is valid. + let pk_index_usize = usize::try_from(FieldElement::from(inputs.pk_index)).map_err(|_| { + ProofInputError::ValueOutOfBounds { + name: "Authenticator PubKey index", + is: inputs.pk_index, + limit: BaseField::new((MAX_AUTHENTICATOR_KEYS as u64).into()), + } + })?; + let pk = pk_set + .get(pk_index_usize) + .ok_or_else(|| ProofInputError::ValueOutOfBounds { + name: "Authenticator PubKey index", + is: inputs.pk_index, + limit: BaseField::new((MAX_AUTHENTICATOR_KEYS as u64).into()), + })?; + + if !inputs.r.is_on_curve() || !inputs.r.is_in_correct_subgroup_assuming_on_curve() { + return Err(ProofInputError::InvalidBabyJubJubPoint { + name: "Query Signature R", + }); + } + if !pk.pk.is_on_curve() || !pk.pk.is_in_correct_subgroup_assuming_on_curve() { + return Err(ProofInputError::InvalidBabyJubJubPoint { + name: "Authenticator Public Key", + }); + } + + let _rp_id_u64 = u64::try_from(FieldElement::from(inputs.rp_id)).map_err(|_| { + ProofInputError::ValueOutOfBounds { + name: "RP Id", + is: inputs.pk_index, + limit: BaseField::new((MAX_AUTHENTICATOR_KEYS as u64).into()), + } + })?; + let query = world_id_primitives::authenticator::oprf_query_digest( + idx_u64, + FieldElement::from(inputs.action), + FieldElement::from(inputs.rp_id), + ); + let signature = eddsa_babyjubjub::EdDSASignature { + r: inputs.r, + s: inputs.s, + }; + + if !pk.verify(*query, &signature) { + return Err(ProofInputError::InvalidQuerySignature); + } + + let blinding_factor = BlindingFactor::from_scalar(inputs.beta) + .map_err(|_| ProofInputError::InvalidBlindingFactor)?; + let query_point = taceo_oprf::core::oprf::client::blind_query(*query, blinding_factor); + + Ok(query_point.blinded_query()) +} + +/// This method checks the validity of the input parameters by emulating the operations that are proved in ZK and raising Errors that would result in an invalid proof. +/// +/// Returns the computed nullifier if everything is ok. +/// +/// # Errors +/// This function will return a [`ProofInputError`] if any of the checks fail. +/// The `Display` implementation of this error can be used to get a human-readable error message on which parts of the input were invalid. +#[expect( + clippy::too_many_lines, + reason = "necessary checks for input validity should be in one function" +)] +pub fn check_nullifier_input_validity( + inputs: &NullifierProofCircuitInput, +) -> Result { + // 1. Check the validity of the query input. + let blinded_query = check_query_input_validity(&inputs.query_input)?; + + // 2. Credential validity checks + // Check timestamps are within bounds. + let current_timestamp_u64 = u64::try_from(FieldElement::from(inputs.current_timestamp)) + .map_err(|_| ProofInputError::ValueOutOfBounds { + name: "current timestamp", + is: inputs.current_timestamp, + limit: BaseField::new(u64::MAX.into()), + })?; + let credential_expires_at_u64 = u64::try_from(FieldElement::from(inputs.cred_expires_at)) + .map_err(|_| ProofInputError::ValueOutOfBounds { + name: "credential expiry timestamp", + is: inputs.current_timestamp, + limit: BaseField::new(u64::MAX.into()), + })?; + // Check that the credential has not expired. + if credential_expires_at_u64 <= current_timestamp_u64 { + return Err(ProofInputError::CredentialExpired { + current_timestamp: current_timestamp_u64, + expires_at: credential_expires_at_u64, + }); + } + // Genesis checks + let genesis_issued_at_u64 = u64::try_from(FieldElement::from(inputs.cred_genesis_issued_at)) + .map_err(|_| ProofInputError::ValueOutOfBounds { + name: "credential genesis issued at", + is: inputs.cred_genesis_issued_at, + limit: BaseField::new(u64::MAX.into()), + })?; + let genesis_issued_at_min_u64 = + u64::try_from(FieldElement::from(inputs.cred_genesis_issued_at_min)).map_err(|_| { + ProofInputError::ValueOutOfBounds { + name: "credential genesis issued at minimum bound", + is: inputs.cred_genesis_issued_at_min, + limit: BaseField::new(u64::MAX.into()), + } + })?; + if genesis_issued_at_min_u64 > genesis_issued_at_u64 { + return Err(ProofInputError::CredentialGenesisExpired { + genesis_issued_at_min: genesis_issued_at_min_u64, + genesis_issued_at: genesis_issued_at_u64, + }); + } + + let blinded_subject = sub( + FieldElement::from(inputs.query_input.mt_index), + FieldElement::from(inputs.cred_sub_blinding_factor), + ); + + let cred_hash = hash_credential( + FieldElement::from(inputs.issuer_schema_id), + blinded_subject, + FieldElement::from(inputs.cred_genesis_issued_at), + FieldElement::from(inputs.cred_expires_at), + FieldElement::from(inputs.cred_hashes[0]), + FieldElement::from(inputs.cred_hashes[1]), + FieldElement::from(inputs.cred_id), + ); + let pk = EdDSAPublicKey { pk: inputs.cred_pk }; + + let signature = eddsa_babyjubjub::EdDSASignature { + r: inputs.cred_r, + s: inputs.cred_s, + }; + + if !inputs.cred_r.is_on_curve() || !inputs.cred_r.is_in_correct_subgroup_assuming_on_curve() { + return Err(ProofInputError::InvalidBabyJubJubPoint { + name: "Credential Signature R", + }); + } + if !pk.pk.is_on_curve() || !pk.pk.is_in_correct_subgroup_assuming_on_curve() { + return Err(ProofInputError::InvalidBabyJubJubPoint { + name: "Credential Public Key", + }); + } + + if !pk.verify(*cred_hash, &signature) { + return Err(ProofInputError::InvalidCredentialSignature); + } + + // 3. Dlog Equality proof checks + if !inputs.oprf_pk.is_on_curve() || !inputs.oprf_pk.is_in_correct_subgroup_assuming_on_curve() { + return Err(ProofInputError::InvalidBabyJubJubPoint { + name: "OPRF Public Key", + }); + } + if !inputs.oprf_response_blinded.is_on_curve() + || !inputs + .oprf_response_blinded + .is_in_correct_subgroup_assuming_on_curve() + { + return Err(ProofInputError::InvalidBabyJubJubPoint { + name: "OPRF Blinded Response", + }); + } + + // check dlog eq proof is valid + let dlog_proof = DLogEqualityProof { + e: inputs.dlog_e, + s: inputs.dlog_s, + }; + dlog_proof + .verify( + inputs.oprf_pk, + blinded_query, + inputs.oprf_response_blinded, + Affine::generator(), + ) + .map_err(|_| ProofInputError::InvalidOprfProof)?; + + // check that the unblinded response is correct + if !inputs.oprf_response.is_on_curve() + || !inputs + .oprf_response + .is_in_correct_subgroup_assuming_on_curve() + { + return Err(ProofInputError::InvalidBabyJubJubPoint { + name: "OPRF Unblinded Response", + }); + } + let expected_blinded_response = (inputs.oprf_response * inputs.query_input.beta).into_affine(); + if expected_blinded_response != inputs.oprf_response_blinded { + return Err(ProofInputError::InvalidOprfResponse); + } + + // check that session_id commitment is correct + if !inputs.id_commitment.is_zero() { + let expected_commitment = session_id_commitment( + FieldElement::from(inputs.query_input.mt_index), + FieldElement::from(inputs.id_commitment_r), + ); + if expected_commitment != FieldElement::from(inputs.id_commitment) { + return Err(ProofInputError::InvalidSessionId); + } + } + + // 4. Compute the nullifier + let nullfier = oprf_finalize_hash( + *world_id_primitives::authenticator::oprf_query_digest( + #[expect( + clippy::missing_panics_doc, + reason = "checked in check_query_input_validity" + )] + u64::try_from(FieldElement::from(inputs.query_input.mt_index)).unwrap(), + FieldElement::from(inputs.query_input.action), + FieldElement::from(inputs.query_input.rp_id), + ), + inputs.oprf_response, + ); + + Ok(nullfier) +} + +// Helper functions to recompute various hashes used in the circuit + +// Recompute the blinded subject, copied from credential +fn sub(leaf_index: FieldElement, blinding_factor: FieldElement) -> FieldElement { + let sub_ds = Fr::from_be_bytes_mod_order(b"H_CS(id, r)"); + let mut input = [sub_ds, *leaf_index, *blinding_factor]; + poseidon2::bn254::t3::permutation_in_place(&mut input); + input[1].into() +} +// Recompute the OPRF finalization hash +fn oprf_finalize_hash(query: BaseField, oprf_response: Affine) -> FieldElement { + let finalize_ds = Fr::from_be_bytes_mod_order(super::OPRF_PROOF_DS); + let mut input = [finalize_ds, query, oprf_response.x, oprf_response.y]; + poseidon2::bn254::t4::permutation_in_place(&mut input); + input[1].into() +} + +// Recompute the session_id_commitment +fn session_id_commitment(user_id: FieldElement, commitment_rand: FieldElement) -> FieldElement { + let sub_ds = Fr::from_be_bytes_mod_order(b"H(id, r)"); + let mut input = [sub_ds, *user_id, *commitment_rand]; + poseidon2::bn254::t3::permutation_in_place(&mut input); + input[1].into() +} + +// Recompute the credential hash, copied from credential +fn hash_credential( + issuer_schema_id: FieldElement, + sub: FieldElement, + genesis_issued_at: FieldElement, + expires_at: FieldElement, + claims_hash: FieldElement, + associated_data_hash: FieldElement, + id: FieldElement, +) -> FieldElement { + let cred_ds = Fr::from_be_bytes_mod_order(b"POSEIDON2+EDDSA-BJJ"); + let mut input = [ + cred_ds, + *issuer_schema_id, + *sub, + *genesis_issued_at, + *expires_at, + *claims_hash, + *associated_data_hash, + *id, + ]; + poseidon2::bn254::t8::permutation_in_place(&mut input); + input[1].into() +} + +#[cfg(test)] +mod tests { + use ark_ec::twisted_edwards::Affine; + use std::str::FromStr; + use world_id_primitives::circuit_inputs::{NullifierProofCircuitInput, QueryProofCircuitInput}; + + use crate::proof::errors::{check_nullifier_input_validity, check_query_input_validity}; + + // gotten these values by `dbg`-ing the struct in the e2e_authenticator_generate test + fn get_valid_query_proof_input() -> QueryProofCircuitInput<30> { + QueryProofCircuitInput { + pk: [Affine { + x: ark_babyjubjub::Fq::from_str( + "19037598474602150174935475944965340829216795940473064039209388058233204431288", + ).unwrap(), + y: ark_babyjubjub::Fq::from_str( + "3549932221586364715003722955756497910920276078443163728621283280434115857197", + ).unwrap(), + }, + Affine::zero(), + Affine::zero(), + Affine::zero(), + Affine::zero(), + Affine::zero(), + Affine::zero(), + ], + pk_index: ark_bn254::Fr::from(0u64), + s: ark_babyjubjub::Fr::from_str( + "2692248185200295468055279425612708965310378163906753799023551825366269352327", + ).unwrap(), + r: Affine { + x: ark_babyjubjub::Fq::from_str( + "14689596469778385278298478829656243946283084496217945909620117398922933730711", + ).unwrap(), + y: ark_babyjubjub::Fq::from_str( + "4424830738973486800075394160997493242162871494907432163152597205147606706197", + ).unwrap(), + }, + merkle_root: ark_bn254::Fr::from_str("4959814736111706042728533661656003495359474679272202023690954858781105690707").unwrap(), + depth: ark_babyjubjub::Fq::from(30u64), + mt_index: ark_bn254::Fr::from(1u64), + siblings: [ + ark_bn254::Fr::from_str("0").unwrap(), + ark_bn254::Fr::from_str("15621590199821056450610068202457788725601603091791048810523422053872049975191").unwrap(), + ark_bn254::Fr::from_str("15180302612178352054084191513289999058431498575847349863917170755410077436260").unwrap(), + ark_bn254::Fr::from_str("20846426933296943402289409165716903143674406371782261099735847433924593192150").unwrap(), + ark_bn254::Fr::from_str("19570709311100149041770094415303300085749902031216638721752284824736726831172").unwrap(), + ark_bn254::Fr::from_str("11737142173000203701607979434185548337265641794352013537668027209469132654026").unwrap(), + ark_bn254::Fr::from_str("11865865012735342650993929214218361747705569437250152833912362711743119784159").unwrap(), + ark_bn254::Fr::from_str("1493463551715988755902230605042557878234810673525086316376178495918903796315").unwrap(), + ark_bn254::Fr::from_str("18746103596419850001763894956142528089435746267438407061601783590659355049966").unwrap(), + ark_bn254::Fr::from_str("21234194473503024590374857258930930634542887619436018385581872843343250130100").unwrap(), + ark_bn254::Fr::from_str("14681119568252857310414189897145410009875739166689283501408363922419813627484").unwrap(), + ark_bn254::Fr::from_str("13243470632183094581890559006623686685113540193867211988709619438324105679244").unwrap(), + ark_bn254::Fr::from_str("19463898140191333844443019106944343282402694318119383727674782613189581590092").unwrap(), + ark_bn254::Fr::from_str("10565902370220049529800497209344287504121041033501189980624875736992201671117").unwrap(), + ark_bn254::Fr::from_str("5560307625408070902174028041423028597194394554482880015024167821933869023078").unwrap(), + ark_bn254::Fr::from_str("20576730574720116265513866548855226316241518026808984067485384181494744706390").unwrap(), + ark_bn254::Fr::from_str("11166760821615661136366651998133963805984915741187325490784169611245269155689").unwrap(), + ark_bn254::Fr::from_str("13692603500396323648417392244466291089928913430742736835590182936663435788822").unwrap(), + ark_bn254::Fr::from_str("11129674755567463025028188404867541558752927519269975708924528737249823830641").unwrap(), + ark_bn254::Fr::from_str("6673535049007525806710184801639542254440636510496168661971704157154828514023").unwrap(), + ark_bn254::Fr::from_str("7958154589163466663626421142270206662020519181323839780192984613274682930816").unwrap(), + ark_bn254::Fr::from_str("3739156991379607404516753076057250171966250101655747790592556040569841550790").unwrap(), + ark_bn254::Fr::from_str("1334107297020502384420211493664486465203492095766400031330900935069700302301").unwrap(), + ark_bn254::Fr::from_str("20357028769054354174264046872903423695314313082869184437966002491602414517674").unwrap(), + ark_bn254::Fr::from_str("19392290367394672558538719012722289280213395590510602524366987685302929990731").unwrap(), + ark_bn254::Fr::from_str("7360502715619830055199267117332475946442427205382059394111067387016428818088").unwrap(), + ark_bn254::Fr::from_str("9629177338475347225553791169746168712988898028547587350296027054067573957412").unwrap(), + ark_bn254::Fr::from_str("21877160135037839571797468541807904053886800340144060811298025652177410263004").unwrap(), + ark_bn254::Fr::from_str("7105691694342706282901391345307729036900705570482804586768449537652208350743").unwrap(), + ark_bn254::Fr::from_str("15888057581779748293164452094398990053773731478520540058125130669204703869637").unwrap(), + ], + beta: ark_babyjubjub::Fr::from_str("1277277022932719396321614946989807194659268059729440522321681213750340643042").unwrap(), + rp_id: ark_bn254::Fr::from_str("14631649082411674499").unwrap(), + action: ark_bn254::Fr::from_str("8982441576518976929447725179565370305223105654688049122733783421407497941726").unwrap(), + nonce: ark_bn254::Fr::from_str("8530676162050357218814694371816107906694725175836943927290214963954696613748").unwrap(), + } + } + + #[test] + fn test_valid_query_proof_input() { + let inputs = get_valid_query_proof_input(); + let _ = check_query_input_validity(&inputs).unwrap(); + } + + #[test] + fn test_invalid_query_proof_input() { + let inputs = get_valid_query_proof_input(); + { + let mut inputs = inputs.clone(); + inputs.depth = ark_babyjubjub::Fq::from(29u64); // invalid depth + assert!(matches!( + check_query_input_validity(&inputs).unwrap_err(), + super::ProofInputError::InvalidMerkleTreeDepth { .. } + )); + } + { + let mut inputs = inputs.clone(); + // 1 << 30 + inputs.mt_index = ark_bn254::Fr::from(1073741824u64); + assert!(matches!( + check_query_input_validity(&inputs).unwrap_err(), + super::ProofInputError::ValueOutOfBounds { + name: "Merkle tree index", + .. + } + )); + } + { + let mut inputs = inputs.clone(); + inputs.merkle_root = ark_bn254::Fr::from(12345u64); + assert!(matches!( + check_query_input_validity(&inputs).unwrap_err(), + super::ProofInputError::InvalidMerkleTreeInclusionProof + )); + } + { + let mut inputs = inputs.clone(); + inputs.pk_index = ark_bn254::Fr::from(7u64); // MAX_AUTHENTICATOR_KEYS is 7, so index 7 is out of bounds (0-6) + assert!(matches!( + check_query_input_validity(&inputs).unwrap_err(), + super::ProofInputError::ValueOutOfBounds { + name: "Authenticator PubKey index", + .. + } + )); + } + { + let mut inputs = inputs.clone(); + inputs.r = Affine { + x: ark_babyjubjub::Fq::from(1u64), + y: ark_babyjubjub::Fq::from(2u64), + }; + assert!(matches!( + check_query_input_validity(&inputs).unwrap_err(), + super::ProofInputError::InvalidBabyJubJubPoint { + name: "Query Signature R" + } + )); + } + { + let mut inputs = inputs.clone(); + inputs.pk[0] = Affine { + x: ark_babyjubjub::Fq::from(1u64), + y: ark_babyjubjub::Fq::from(2u64), + }; + + // Recompute the merkle root so the proof is valid + let pk_set = world_id_primitives::authenticator::AuthenticatorPublicKeySet::new( + inputs + .pk + .iter() + .map(|&x| eddsa_babyjubjub::EdDSAPublicKey { pk: x }) + .collect(), + ) + .unwrap(); + let mut current = pk_set.leaf_hash(); + let idx = + u64::try_from(world_id_primitives::FieldElement::from(inputs.mt_index)).unwrap(); + for (i, sibling) in inputs.siblings.iter().enumerate() { + let sibling_fr = *world_id_primitives::FieldElement::from(*sibling); + if (idx >> i) & 1 == 0 { + let mut state = poseidon2::bn254::t2::permutation(&[current, sibling_fr]); + state[0] += current; + current = state[0]; + } else { + let mut state = poseidon2::bn254::t2::permutation(&[sibling_fr, current]); + state[0] += sibling_fr; + current = state[0]; + } + } + inputs.merkle_root = current; + + assert!(matches!( + check_query_input_validity(&inputs).unwrap_err(), + super::ProofInputError::InvalidBabyJubJubPoint { + name: "Authenticator Public Key" + } + )); + } + { + let mut inputs = inputs.clone(); + inputs.action = ark_bn254::Fr::from(12345u64); + assert!(matches!( + check_query_input_validity(&inputs).unwrap_err(), + super::ProofInputError::InvalidQuerySignature + )); + } + } + + fn get_valid_nullifier_proof_input() -> NullifierProofCircuitInput<30> { + NullifierProofCircuitInput { + query_input: get_valid_query_proof_input(), + issuer_schema_id: ark_bn254::Fr::from(1u64), + cred_pk: Affine { + x: ark_babyjubjub::Fq::from_str( + "15406775215557320288232407896017344573719706795510112309920214099347968981892", + ) + .unwrap(), + y: ark_babyjubjub::Fq::from_str( + "486388649729314270871358770861421181497883381447163109744630700259216042819", + ) + .unwrap(), + }, + cred_hashes: [ + ark_bn254::Fr::from_str( + "14272087287699568472569351444185311392108883722570788958733484799744115401870", + ) + .unwrap(), + ark_bn254::Fr::from_str("0").unwrap(), + ], + cred_genesis_issued_at: ark_bn254::Fr::from(1770125923u64), + cred_expires_at: ark_bn254::Fr::from(1770125983u64), + cred_s: ark_babyjubjub::Fr::from_str( + "1213918488111680600555111454085490191981091366153388773926786471247948539005", + ) + .unwrap(), + cred_r: Affine { + x: ark_babyjubjub::Fq::from_str( + "15844586803954862856390946258558419582000810449135704981677693963391564067969", + ) + .unwrap(), + y: ark_babyjubjub::Fq::from_str( + "592710378120172403096018676235519447487818389124797234601458948988041235710", + ) + .unwrap(), + }, + current_timestamp: ark_bn254::Fr::from(1770125908u64), + cred_genesis_issued_at_min: ark_bn254::Fr::from(0u64), + cred_sub_blinding_factor: ark_bn254::Fr::from_str( + "12170146734368267085913078854954627576787934009906407554611507307540342380837", + ) + .unwrap(), + cred_id: ark_bn254::Fr::from(3198767490419873482u64), + id_commitment_r: ark_bn254::Fr::from_str( + "11722352184830287916674945948108962396487445899741105828127518108056503126019", + ) + .unwrap(), + id_commitment: ark_bn254::Fr::from(0u64), + dlog_e: ark_bn254::Fr::from_str( + "20738873297635092620048980552264360096607713029337408079647701591795211132447", + ) + .unwrap(), + dlog_s: ark_babyjubjub::Fr::from_str( + "409914485496464180245985942628922659137136006706846380135829705769429965654", + ) + .unwrap(), + oprf_pk: Affine { + x: ark_babyjubjub::Fq::from_str( + "2124016492737602714904869498047199181102594928943726277329982080254326092458", + ) + .unwrap(), + y: ark_babyjubjub::Fq::from_str( + "13296886400185574560491768605341786437896334271868835545571935419923854148448", + ) + .unwrap(), + }, + oprf_response_blinded: Affine { + x: ark_babyjubjub::Fq::from_str( + "186021305824089989598292966483056363224488147240980559441958002546059602483", + ) + .unwrap(), + y: ark_babyjubjub::Fq::from_str( + "16813058203546508924422863380215026034284821141284206571184467783067057954778", + ) + .unwrap(), + }, + oprf_response: Affine { + x: ark_babyjubjub::Fq::from_str( + "10209445202057032226639052993170591937356545068582397532992536070677055126187", + ) + .unwrap(), + y: ark_babyjubjub::Fq::from_str( + "21877375411477040679486668720099554257785799784699842830375906922948306109699", + ) + .unwrap(), + }, + signal_hash: ark_bn254::Fr::from_str( + "37938388892362834151584770384290207919364301626797345218722464515205243407", + ) + .unwrap(), + } + } + + #[test] + fn test_valid_nullifier_proof_input() { + let inputs = get_valid_nullifier_proof_input(); + let _ = check_nullifier_input_validity(&inputs).unwrap(); + } + + #[test] + fn test_invalid_nullifier_proof_input() { + let inputs = get_valid_nullifier_proof_input(); + { + let mut inputs = inputs.clone(); + inputs.current_timestamp = + ark_babyjubjub::Fq::from_str("123465723894591324701234982134000070").unwrap(); // invalid timestamp + assert!(matches!( + check_nullifier_input_validity(&inputs).unwrap_err(), + super::ProofInputError::ValueOutOfBounds { + name: "current timestamp", + .. + } + )); + } + { + let mut inputs = inputs.clone(); + inputs.current_timestamp = inputs.cred_expires_at; + assert!(matches!( + check_nullifier_input_validity(&inputs).unwrap_err(), + super::ProofInputError::CredentialExpired { .. } + )); + } + { + let mut inputs = inputs.clone(); + // genesis issued at 1770125923 + inputs.cred_genesis_issued_at_min = ark_bn254::Fr::from(1770125924u64); + assert!(matches!( + check_nullifier_input_validity(&inputs).unwrap_err(), + super::ProofInputError::CredentialGenesisExpired { .. } + )); + } + { + let mut inputs = inputs.clone(); + inputs.cred_r = Affine { + x: ark_babyjubjub::Fq::from(1u64), + y: ark_babyjubjub::Fq::from(2u64), + }; + assert!(matches!( + check_nullifier_input_validity(&inputs).unwrap_err(), + super::ProofInputError::InvalidBabyJubJubPoint { + name: "Credential Signature R" + } + )); + } + { + let mut inputs = inputs.clone(); + inputs.cred_pk = Affine { + x: ark_babyjubjub::Fq::from(1u64), + y: ark_babyjubjub::Fq::from(2u64), + }; + assert!(matches!( + check_nullifier_input_validity(&inputs).unwrap_err(), + super::ProofInputError::InvalidBabyJubJubPoint { + name: "Credential Public Key" + } + )); + } + { + let mut inputs = inputs.clone(); + inputs.cred_s = ark_babyjubjub::Fr::from(12345u64); + assert!(matches!( + check_nullifier_input_validity(&inputs).unwrap_err(), + super::ProofInputError::InvalidCredentialSignature + )); + } + { + let mut inputs = inputs.clone(); + inputs.oprf_pk = Affine { + x: ark_babyjubjub::Fq::from(1u64), + y: ark_babyjubjub::Fq::from(2u64), + }; + assert!(matches!( + check_nullifier_input_validity(&inputs).unwrap_err(), + super::ProofInputError::InvalidBabyJubJubPoint { + name: "OPRF Public Key" + } + )); + } + { + let mut inputs = inputs.clone(); + inputs.oprf_response_blinded = Affine { + x: ark_babyjubjub::Fq::from(1u64), + y: ark_babyjubjub::Fq::from(2u64), + }; + assert!(matches!( + check_nullifier_input_validity(&inputs).unwrap_err(), + super::ProofInputError::InvalidBabyJubJubPoint { + name: "OPRF Blinded Response" + } + )); + } + { + let mut inputs = inputs.clone(); + inputs.dlog_s = ark_babyjubjub::Fr::from(12345u64); + assert!(matches!( + check_nullifier_input_validity(&inputs).unwrap_err(), + super::ProofInputError::InvalidOprfProof + )); + } + { + let mut inputs = inputs.clone(); + inputs.oprf_response = Affine { + x: ark_babyjubjub::Fq::from(1u64), + y: ark_babyjubjub::Fq::from(2u64), + }; + assert!(matches!( + check_nullifier_input_validity(&inputs).unwrap_err(), + super::ProofInputError::InvalidBabyJubJubPoint { + name: "OPRF Unblinded Response" + } + )); + } + { + let mut inputs = inputs.clone(); + // Valid point but incorrect for the blinded response + use ark_ec::AffineRepr; + inputs.oprf_response = ark_babyjubjub::EdwardsAffine::generator(); + assert!(matches!( + check_nullifier_input_validity(&inputs).unwrap_err(), + super::ProofInputError::InvalidOprfResponse + )); + } + { + let mut inputs = inputs.clone(); + inputs.id_commitment = ark_bn254::Fr::from(12345u64); + assert!(matches!( + check_nullifier_input_validity(&inputs).unwrap_err(), + super::ProofInputError::InvalidSessionId + )); + } + } +} From 076cba6489ada25cf98e8db6260be77ceff53205 Mon Sep 17 00:00:00 2001 From: Otto Date: Mon, 23 Mar 2026 14:32:46 +0000 Subject: [PATCH 30/33] chore: remove vendored world-id-{authenticator,proof} patches Remove the [patch.crates-io] overrides for world-id-authenticator and world-id-proof that set default=[] to prevent circuit downloads. The upstream crates on crates.io are used directly now. Also fix duplicate uniffi workspace dependency in walletkit-core/Cargo.toml introduced during rebase conflict resolution. --- Cargo.lock | 1422 ++--- Cargo.toml | 26 - vendor/world-id-authenticator/.cargo-ok | 1 - .../.cargo_vcs_info.json | 6 - vendor/world-id-authenticator/Cargo.lock | 5594 ----------------- vendor/world-id-authenticator/Cargo.toml | 182 - vendor/world-id-authenticator/Cargo.toml.orig | 68 - vendor/world-id-authenticator/README.md | 7 - .../abi/WorldIDRegistryAbi.json | 1901 ------ .../world-id-authenticator/src/api_types.rs | 1 - .../src/authenticator.rs | 1578 ----- vendor/world-id-authenticator/src/lib.rs | 10 - vendor/world-id-authenticator/src/registry.rs | 204 - vendor/world-id-proof/.cargo-ok | 1 - vendor/world-id-proof/.cargo_vcs_info.json | 6 - vendor/world-id-proof/Cargo.lock | 5379 ---------------- vendor/world-id-proof/Cargo.toml | 171 - vendor/world-id-proof/Cargo.toml.orig | 59 - vendor/world-id-proof/README.md | 24 - vendor/world-id-proof/build.rs | 240 - .../src/credential_blinding_factor.rs | 127 - vendor/world-id-proof/src/lib.rs | 44 - vendor/world-id-proof/src/nullifier.rs | 137 - vendor/world-id-proof/src/proof.rs | 435 -- vendor/world-id-proof/src/proof/errors.rs | 847 --- walletkit-core/Cargo.toml | 1 - walletkit-core/src/authenticator/mod.rs | 26 +- 27 files changed, 608 insertions(+), 17889 deletions(-) delete mode 100644 vendor/world-id-authenticator/.cargo-ok delete mode 100644 vendor/world-id-authenticator/.cargo_vcs_info.json delete mode 100644 vendor/world-id-authenticator/Cargo.lock delete mode 100644 vendor/world-id-authenticator/Cargo.toml delete mode 100644 vendor/world-id-authenticator/Cargo.toml.orig delete mode 100644 vendor/world-id-authenticator/README.md delete mode 100644 vendor/world-id-authenticator/abi/WorldIDRegistryAbi.json delete mode 100644 vendor/world-id-authenticator/src/api_types.rs delete mode 100644 vendor/world-id-authenticator/src/authenticator.rs delete mode 100644 vendor/world-id-authenticator/src/lib.rs delete mode 100644 vendor/world-id-authenticator/src/registry.rs delete mode 100644 vendor/world-id-proof/.cargo-ok delete mode 100644 vendor/world-id-proof/.cargo_vcs_info.json delete mode 100644 vendor/world-id-proof/Cargo.lock delete mode 100644 vendor/world-id-proof/Cargo.toml delete mode 100644 vendor/world-id-proof/Cargo.toml.orig delete mode 100644 vendor/world-id-proof/README.md delete mode 100644 vendor/world-id-proof/build.rs delete mode 100644 vendor/world-id-proof/src/credential_blinding_factor.rs delete mode 100644 vendor/world-id-proof/src/lib.rs delete mode 100644 vendor/world-id-proof/src/nullifier.rs delete mode 100644 vendor/world-id-proof/src/proof.rs delete mode 100644 vendor/world-id-proof/src/proof/errors.rs diff --git a/Cargo.lock b/Cargo.lock index 8e30cd1f5..6d1c0c151 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -91,9 +91,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.2.30" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f374d3c6d729268bbe2d0e0ff992bb97898b2df756691a62ee1d5f0506bc39" +checksum = "9247f0a399ef71aeb68f497b2b8fb348014f742b50d3b83b1e00dfe1b7d64b3d" dependencies = [ "alloy-primitives", "num_enum", @@ -189,7 +189,7 @@ dependencies = [ "itoa", "serde", "serde_json", - "winnow", + "winnow 0.7.15", ] [[package]] @@ -232,9 +232,9 @@ dependencies = [ [[package]] name = "alloy-eip7928" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3231de68d5d6e75332b7489cfcc7f4dfabeba94d990a10e4b923af0e6623540" +checksum = "f8222b1d88f9a6d03be84b0f5e76bb60cd83991b43ad8ab6477f0e4a7809b98d" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -312,7 +312,7 @@ checksum = "ff42cd777eea61f370c0b10f2648a1c81e0b783066cd7269228aa993afd487f7" dependencies = [ "alloy-primitives", "alloy-sol-types", - "http 1.4.0", + "http", "serde", "serde_json", "thiserror 2.0.18", @@ -392,7 +392,7 @@ dependencies = [ "const-hex", "derive_more", "foldhash 0.2.0", - "getrandom 0.4.1", + "getrandom 0.4.2", "hashbrown 0.16.1", "indexmap 2.13.0", "itoa", @@ -439,7 +439,7 @@ dependencies = [ "lru", "parking_lot", "pin-project", - "reqwest 0.12.28", + "reqwest", "serde", "serde_json", "thiserror 2.0.18", @@ -468,7 +468,7 @@ checksum = "ce8849c74c9ca0f5a03da1c865e3eb6f768df816e67dd3721a398a8a7e398011" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -483,7 +483,7 @@ dependencies = [ "alloy-transport-http", "futures", "pin-project", - "reqwest 0.12.28", + "reqwest", "serde", "serde_json", "tokio", @@ -591,7 +591,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -609,7 +609,7 @@ dependencies = [ "proc-macro2", "quote", "sha3", - "syn 2.0.114", + "syn 2.0.117", "syn-solidity", ] @@ -627,7 +627,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.114", + "syn 2.0.117", "syn-solidity", ] @@ -638,7 +638,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6df77fea9d6a2a75c0ef8d2acbdfd92286cc599983d3175ccdc170d3433d249" dependencies = [ "serde", - "winnow", + "winnow 0.7.15", ] [[package]] @@ -685,7 +685,7 @@ dependencies = [ "alloy-json-rpc", "alloy-transport", "itertools 0.14.0", - "reqwest 0.12.28", + "reqwest", "serde_json", "tower", "tracing", @@ -694,13 +694,12 @@ dependencies = [ [[package]] name = "alloy-trie" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d7fd448ab0a017de542de1dcca7a58e7019fe0e7a34ed3f9543ebddf6aceffa" +checksum = "3f14b5d9b2c2173980202c6ff470d96e7c5e202c65a9f67884ad565226df7fbb" dependencies = [ "alloy-primitives", "alloy-rlp", - "arrayvec", "derive_more", "nybbles", "serde", @@ -715,10 +714,10 @@ version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fa0c53e8c1e1ef4d01066b01c737fb62fc9397ab52c6e7bb5669f97d281b9bc" dependencies = [ - "darling", + "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -732,15 +731,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anyhow" -version = "1.0.101" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arbitrary" @@ -751,48 +750,18 @@ dependencies = [ "derive_arbitrary", ] -[[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-ec", "ark-ff 0.5.0", "ark-r1cs-std", "ark-std 0.5.0", ] -[[package]] -name = "ark-crypto-primitives" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3a13b34da09176a8baba701233fdffbaa7c1b1192ce031a3da4e55ce1f1a56" -dependencies = [ - "ark-ec 0.4.2", - "ark-ff 0.4.2", - "ark-relations 0.4.0", - "ark-serialize 0.4.2", - "ark-snark 0.4.0", - "ark-std 0.4.0", - "blake2", - "derivative", - "digest 0.10.7", - "rayon", - "sha2", -] - [[package]] name = "ark-crypto-primitives" version = "0.5.0" @@ -801,11 +770,11 @@ checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" dependencies = [ "ahash", "ark-crypto-primitives-macros", - "ark-ec 0.5.0", + "ark-ec", "ark-ff 0.5.0", - "ark-relations 0.5.1", + "ark-relations", "ark-serialize 0.5.0", - "ark-snark 0.5.1", + "ark-snark", "ark-std 0.5.0", "blake2", "derivative", @@ -824,25 +793,7 @@ checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", -] - -[[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", - "rayon", - "zeroize", + "syn 2.0.117", ] [[package]] @@ -853,7 +804,7 @@ checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" dependencies = [ "ahash", "ark-ff 0.5.0", - "ark-poly 0.5.0", + "ark-poly", "ark-serialize 0.5.0", "ark-std 0.5.0", "educe", @@ -901,7 +852,6 @@ dependencies = [ "num-bigint", "num-traits", "paste", - "rayon", "rustc_version 0.4.1", "zeroize", ] @@ -954,7 +904,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -992,23 +942,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.114", -] - -[[package]] -name = "ark-groth16" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20ceafa83848c3e390f1cbf124bc3193b3e639b3f02009e0e290809a501b95fc" -dependencies = [ - "ark-crypto-primitives 0.4.0", - "ark-ec 0.4.2", - "ark-ff 0.4.2", - "ark-poly 0.4.2", - "ark-relations 0.4.0", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "rayon", + "syn 2.0.117", ] [[package]] @@ -1017,30 +951,16 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" dependencies = [ - "ark-crypto-primitives 0.5.0", - "ark-ec 0.5.0", + "ark-crypto-primitives", + "ark-ec", "ark-ff 0.5.0", - "ark-poly 0.5.0", - "ark-relations 0.5.1", + "ark-poly", + "ark-relations", "ark-serialize 0.5.0", "ark-std 0.5.0", "rayon", ] -[[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", - "rayon", -] - [[package]] name = "ark-poly" version = "0.5.0" @@ -1063,9 +983,9 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" dependencies = [ - "ark-ec 0.5.0", + "ark-ec", "ark-ff 0.5.0", - "ark-relations 0.5.1", + "ark-relations", "ark-std 0.5.0", "educe", "num-bigint", @@ -1074,18 +994,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "ark-relations" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00796b6efc05a3f48225e59cb6a2cda78881e7c390872d5786aaf112f31fb4f0" -dependencies = [ - "ark-ff 0.4.2", - "ark-std 0.4.0", - "tracing", - "tracing-subscriber 0.2.25", -] - [[package]] name = "ark-relations" version = "0.5.1" @@ -1114,7 +1022,6 @@ 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", @@ -1126,7 +1033,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" dependencies = [ - "ark-serialize-derive 0.5.0", + "ark-serialize-derive", "ark-std 0.5.0", "arrayvec", "digest 0.10.7", @@ -1134,17 +1041,6 @@ dependencies = [ "rayon", ] -[[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" @@ -1153,19 +1049,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", -] - -[[package]] -name = "ark-snark" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84d3cc6833a335bb8a600241889ead68ee89a3cf8448081fb7694c0fe503da63" -dependencies = [ - "ark-ff 0.4.2", - "ark-relations 0.4.0", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "syn 2.0.117", ] [[package]] @@ -1175,7 +1059,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" dependencies = [ "ark-ff 0.5.0", - "ark-relations 0.5.1", + "ark-relations", "ark-serialize 0.5.0", "ark-std 0.5.0", ] @@ -1198,7 +1082,6 @@ checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", "rand 0.8.5", - "rayon", ] [[package]] @@ -1242,9 +1125,9 @@ dependencies = [ [[package]] name = "askama" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08e1676b346cadfec169374f949d7490fd80a24193d37d2afce0c047cf695e57" +checksum = "33b7e89247085c4bb89576c3116140bac3999c81d74db52afe11b36c7e11a97d" dependencies = [ "askama_macros", "itoa", @@ -1267,16 +1150,16 @@ dependencies = [ "rustc-hash", "serde", "serde_derive", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "askama_derive" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7661ff56517787343f376f75db037426facd7c8d3049cef8911f1e75016f3a37" +checksum = "adf18857bd6189696f6e44ab992acbb731cc12bc1661959cd9f1d56342708cee" dependencies = [ - "askama_parser 0.15.4", + "askama_parser 0.15.5", "basic-toml", "memchr", "proc-macro2", @@ -1284,16 +1167,16 @@ dependencies = [ "rustc-hash", "serde", "serde_derive", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "askama_macros" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713ee4dbfd1eb719c2dab859465b01fa1d21cb566684614a713a6b7a99a4e47b" +checksum = "78a8dcefb2a4763c7957ad5b1a16df6d81cff6227aae161b95af322d52c02005" dependencies = [ - "askama_derive 0.15.4", + "askama_derive 0.15.5", ] [[package]] @@ -1305,20 +1188,20 @@ dependencies = [ "memchr", "serde", "serde_derive", - "winnow", + "winnow 0.7.15", ] [[package]] name = "askama_parser" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d62d674238a526418b30c0def480d5beadb9d8964e7f38d635b03bf639c704c" +checksum = "e7ef9905e0280528d0c2271ff66cab68ec4a550e745e3a365ded353f6e30faac" dependencies = [ "rustc-hash", "serde", "serde_derive", "unicode-ident", - "winnow", + "winnow 0.7.15", ] [[package]] @@ -1346,9 +1229,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.39" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68650b7df54f0293fd061972a0fb05aaf4fc0879d3b3d21a638a182c5c543b9f" +checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" dependencies = [ "compression-codecs", "compression-core", @@ -1375,7 +1258,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1386,7 +1269,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1412,7 +1295,7 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1423,9 +1306,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.15.4" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b7b6141e96a8c160799cc2d5adecd5cbbe5054cb8c7c4af53da0f83bb7ad256" +checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" dependencies = [ "aws-lc-sys", "zeroize", @@ -1433,9 +1316,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.37.1" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b092fe214090261288111db7a2b2c2118e5a7f30dc2569f1732c4069a6840549" +checksum = "1fa7e52a4c5c547c741610a2c6f123f3881e409b714cd27e6798ef020c514f0a" dependencies = [ "cc", "cmake", @@ -1477,9 +1360,9 @@ checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" -version = "0.21.7" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" @@ -1550,9 +1433,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] name = "bitvec" @@ -1612,25 +1495,26 @@ dependencies = [ [[package]] name = "borsh" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" dependencies = [ "borsh-derive", + "bytes", "cfg_aliases", ] [[package]] name = "borsh-derive" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" +checksum = "bfcfdc083699101d5a7965e49925975f2f55060f94f9a05e7187be95d530ca59" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1656,9 +1540,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.1" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "byte-slice-cast" @@ -1689,9 +1573,9 @@ dependencies = [ [[package]] name = "c-kzg" -version = "2.1.5" +version = "2.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e00bf4b112b07b505472dbefd19e37e53307e2bfed5a79e0cc161d58ccd0e687" +checksum = "6648ed1e4ea8e8a1a4a2c78e1cda29a3fd500bc622899c340d8525ea9a76b24a" dependencies = [ "blst", "cc", @@ -1736,9 +1620,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.55" +version = "1.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" +checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" dependencies = [ "find-msvc-tools", "jobserver", @@ -1840,7 +1724,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35778373aee12ef3d04966187eeae7a04f1451c9226058311f21488df6f28780" dependencies = [ - "ark-bn254 0.5.0", + "ark-bn254", "ark-ff 0.5.0", "ark-serialize 0.5.0", "byteorder", @@ -1858,9 +1742,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.59" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5caf74d17c3aec5495110c34cc3f78644bfa89af6c8993ed4de2790e49b6499" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" dependencies = [ "clap_builder", "clap_derive", @@ -1868,9 +1752,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.59" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370daa45065b80218950227371916a1633217ae42b2715b2287b606dcd618e24" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstyle", "clap_lex", @@ -1879,21 +1763,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.55" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "clap_lex" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "cmake" @@ -1972,9 +1856,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.36" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00828ba6fd27b45a448e57dbfe84f1029d4c9f26b368157e9a448a5f49a2ec2a" +checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" dependencies = [ "brotli", "compression-core", @@ -1988,9 +1872,9 @@ checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" [[package]] name = "const-hex" -version = "1.17.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" +checksum = "531185e432bb31db1ecda541e9e7ab21468d4d844ad7505e0546a49b4945d49b" dependencies = [ "cfg-if", "cpufeatures", @@ -2039,16 +1923,6 @@ dependencies = [ "unicode-segmentation", ] -[[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" @@ -2155,7 +2029,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2170,7 +2044,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2179,8 +2053,18 @@ version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", ] [[package]] @@ -2195,7 +2079,20 @@ dependencies = [ "quote", "serde", "strsim", - "syn 2.0.114", + "syn 2.0.117", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", ] [[package]] @@ -2204,9 +2101,20 @@ version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ - "darling_core", + "darling_core 0.21.3", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2241,9 +2149,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.6" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", "serde_core", @@ -2262,13 +2170,13 @@ dependencies = [ [[package]] name = "derive-where" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" +checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2279,7 +2187,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2301,7 +2209,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.114", + "syn 2.0.117", "unicode-xid", ] @@ -2334,7 +2242,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2379,7 +2287,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2411,6 +2319,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "embed-doc-image" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af36f591236d9d822425cb6896595658fa558fcebf5ee8accac1d4b92c47166e" +dependencies = [ + "base64 0.13.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "embedded-io" version = "0.4.0" @@ -2423,15 +2343,6 @@ 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-as-inner" version = "0.6.1" @@ -2441,7 +2352,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2461,7 +2372,7 @@ checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2617,9 +2528,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -2632,9 +2543,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -2642,15 +2553,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -2659,38 +2570,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -2700,7 +2611,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -2743,20 +2653,20 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 6.0.0", "wasip2", "wasip3", ] @@ -2783,7 +2693,7 @@ dependencies = [ "futures-core", "futures-sink", "gloo-utils", - "http 1.4.0", + "http", "js-sys", "pin-project", "thiserror 1.0.69", @@ -2837,25 +2747,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "h2" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.13.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "h2" version = "0.4.13" @@ -2867,7 +2758,7 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.4.0", + "http", "indexmap 2.13.0", "slab", "tokio", @@ -2901,15 +2792,6 @@ 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" @@ -3004,17 +2886,6 @@ 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.4.0" @@ -3025,17 +2896,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" @@ -3043,7 +2903,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.4.0", + "http", ] [[package]] @@ -3054,8 +2914,8 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http 1.4.0", - "http-body 1.0.1", + "http", + "http-body", "pin-project-lite", ] @@ -3071,30 +2931,6 @@ 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.27", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.8.1" @@ -3105,9 +2941,9 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "h2 0.4.13", - "http 1.4.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "httparse", "httpdate", "itoa", @@ -3118,33 +2954,19 @@ 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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "http 1.4.0", - "hyper 1.8.1", + "http", + "hyper", "hyper-util", - "rustls 0.23.37", + "rustls", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tower-service", "webpki-roots 1.0.6", ] @@ -3159,14 +2981,14 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.4.0", - "http-body 1.0.1", - "hyper 1.8.1", + "http", + "http-body", + "hyper", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.2", + "socket2", "tokio", "tower-service", "tracing", @@ -3327,7 +3149,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3370,15 +3192,15 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +checksum = "d8e7418f59cc01c88316161279a7f665217ae316b388e58a0d10e29f54f1e5eb" dependencies = [ "memchr", "serde", @@ -3413,9 +3235,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jobserver" @@ -3429,9 +3251,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.85" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ "once_cell", "wasm-bindgen", @@ -3485,9 +3307,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.181" +version = "0.2.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459427e2af2b9c839b132acb702a1c654d95e10f8c326bfc2ad11310e458b1c5" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" [[package]] name = "libm" @@ -3497,20 +3319,21 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "libc", - "redox_syscall 0.7.1", + "plain", + "redox_syscall 0.7.3", ] [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" @@ -3565,7 +3388,7 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3585,9 +3408,9 @@ checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memmap2" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" dependencies = [ "libc", ] @@ -3613,12 +3436,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - [[package]] name = "minimal-lexical" version = "0.2.1" @@ -3673,10 +3490,10 @@ dependencies = [ "bytes", "colored", "futures-core", - "http 1.4.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", - "hyper 1.8.1", + "hyper", "hyper-util", "log", "pin-project-lite", @@ -3768,9 +3585,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" dependencies = [ "num_enum_derive", "rustversion", @@ -3778,13 +3595,13 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3812,9 +3629,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "opaque-debug" @@ -3824,9 +3641,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "owo-colors" -version = "4.2.3" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" +checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" [[package]] name = "parity-scale-codec" @@ -3853,7 +3670,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3903,29 +3720,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -4010,7 +3827,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -4026,9 +3843,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ "toml_edit", ] @@ -4052,7 +3869,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -4072,7 +3889,7 @@ checksum = "37566cb3fdacef14c0737f9546df7cfeadbfbc9fef10991038bf5015d0c80532" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.10.0", + "bitflags 2.11.0", "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", @@ -4101,8 +3918,8 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.37", - "socket2 0.6.2", + "rustls", + "socket2", "thiserror 2.0.18", "tokio", "tracing", @@ -4121,7 +3938,7 @@ dependencies = [ "rand 0.9.2", "ring", "rustc-hash", - "rustls 0.23.37", + "rustls", "rustls-pki-types", "slab", "thiserror 2.0.18", @@ -4139,16 +3956,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.2", + "socket2", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.44" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -4160,7 +3977,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] -name = "radium" +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "radium" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" @@ -4238,9 +4061,9 @@ dependencies = [ [[package]] name = "rapidhash" -version = "4.3.0" +version = "4.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84816e4c99c467e92cf984ee6328caa976dfecd33a673544489d79ca2caaefe5" +checksum = "b5e48930979c155e2f33aa36ab3119b5ee81332beb6482199a8ecd6029b80b59" dependencies = [ "rustversion", ] @@ -4271,16 +4094,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] name = "redox_syscall" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" +checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] @@ -4300,7 +4123,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -4328,50 +4151,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" - -[[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.27", - "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", - "tokio", - "tokio-rustls 0.24.1", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 0.25.4", - "winreg", -] +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "reqwest" @@ -4384,25 +4166,25 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "http 1.4.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", - "hyper 1.8.1", - "hyper-rustls 0.27.7", + "hyper", + "hyper-rustls", "hyper-util", "js-sys", "log", "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.37", + "rustls", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tower", "tower-http", "tower-service", @@ -4540,29 +4322,17 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys", "windows-sys 0.61.2", ] -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - [[package]] name = "rustls" version = "0.23.37" @@ -4574,20 +4344,11 @@ dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.9", + "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.14.0" @@ -4600,19 +4361,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.9" +version = "0.103.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" dependencies = [ "aws-lc-rs", "ring", @@ -4706,17 +4457,7 @@ checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", -] - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", + "syn 2.0.117", ] [[package]] @@ -4766,16 +4507,16 @@ dependencies = [ [[package]] name = "semaphore-rs" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d5b9ca8358e07c51d7fa2daaf125fe00464b05724cd284192e5d8f2ba91b26" +checksum = "1e4dcafeb7c18ace731a44780a765e00a50de79c5b12f85d5afb14b2d96cd519" dependencies = [ - "ark-bn254 0.4.0", - "ark-ec 0.4.2", - "ark-ff 0.4.2", - "ark-groth16 0.4.0", - "ark-relations 0.4.0", - "ark-std 0.4.0", + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-relations", + "ark-std 0.5.0", "bincode", "bytemuck", "color-eyre", @@ -4787,7 +4528,7 @@ dependencies = [ "once_cell", "rand 0.8.5", "rayon", - "reqwest 0.11.27", + "reqwest", "ruint", "semaphore-rs-ark-circom", "semaphore-rs-ark-zkey", @@ -4810,18 +4551,18 @@ dependencies = [ [[package]] name = "semaphore-rs-ark-circom" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4079c8ec080fc77ca429b8a832b18300fa918a453d4ee39f480b166246810fec" +checksum = "f4104c2d18f5dd1780ca1de7294b02e69e24452df4c6ddfa300e225c9e22fa2f" dependencies = [ - "ark-bn254 0.4.0", - "ark-crypto-primitives 0.4.0", - "ark-ff 0.4.2", - "ark-groth16 0.4.0", - "ark-poly 0.4.2", - "ark-relations 0.4.0", - "ark-serialize 0.4.2", - "ark-std 0.4.0", + "ark-bn254", + "ark-crypto-primitives", + "ark-ff 0.5.0", + "ark-groth16", + "ark-poly", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", "byteorder", "num-bigint", "num-traits", @@ -4832,16 +4573,16 @@ dependencies = [ [[package]] name = "semaphore-rs-ark-zkey" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fec03531d0e3fbb2d360eecc15c34f50ac70ab10b914a06c19256444f4cf4f" +checksum = "6f37286d3d240684b472d838458ce795cc71ecb99521fc168dfbce57c53f81eb" dependencies = [ - "ark-bn254 0.4.0", - "ark-ec 0.4.2", - "ark-ff 0.4.2", - "ark-groth16 0.4.0", - "ark-relations 0.4.0", - "ark-serialize 0.4.2", + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-relations", + "ark-serialize 0.5.0", "color-eyre", "memmap2", "semaphore-rs-ark-circom", @@ -4849,37 +4590,37 @@ dependencies = [ [[package]] name = "semaphore-rs-depth-config" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd542c7b04389072e4723f3282ec5587ffad30ee3f05da32f9d117926d36a94" +checksum = "bd6cb6aaf2165d2aabfe9fac793ece97c766259aef275b214b52b0126d3f9af6" [[package]] name = "semaphore-rs-depth-macros" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e398cc3b3d6469e9a4ce114a2602b5b7a459e74a8020ff52944474bfc7f7c7b3" +checksum = "5ea0f60977350f28f5fec580649ed723bae7dc6e70ac36018c552cb68e437f56" dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", "semaphore-rs-depth-config", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "semaphore-rs-hasher" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447cdf2b8cc673d0a9ee734194272552235882d69feed7c316291b11bfadfb3b" +checksum = "18e049c2f066c7769f228ed054cbbca95133587a89fb9fa6fea5c7c0be199aa9" dependencies = [ "bytemuck", ] [[package]] name = "semaphore-rs-keccak" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c7a0670f962c7bcf24adbf2ae9f7c8693a33b24990880c2e6736291673d4c8" +checksum = "5cbc9827d528c035e3d7eeb1b6762568b308e055871d4fd4b75851d4c9b63aba" dependencies = [ "semaphore-rs-hasher", "tiny-keccak", @@ -4887,12 +4628,12 @@ dependencies = [ [[package]] name = "semaphore-rs-poseidon" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0ddf96cdb88c33b5cf3c9aa4589b130dffc314ba1de86384cfc1d986dc4fd67" +checksum = "11f8b1e143951cfa604298f71ef97982530fb06df578cdcb31fb4b6296b5e8f6" dependencies = [ - "ark-bn254 0.4.0", - "ark-ff 0.4.2", + "ark-bn254", + "ark-ff 0.5.0", "once_cell", "ruint", "semaphore-rs-hasher", @@ -4900,14 +4641,14 @@ dependencies = [ [[package]] name = "semaphore-rs-proof" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798c75f87f59e586b311904e2924d0514fc361b7f5bb27fe54b45926323e991b" +checksum = "88ef5301da85d40fdb9434d8987b21cbb56fb4af36fa11411682e83e771b45e7" dependencies = [ "alloy-core", - "ark-bn254 0.4.0", - "ark-ec 0.4.2", - "ark-groth16 0.4.0", + "ark-bn254", + "ark-ec", + "ark-groth16", "getrandom 0.2.17", "hex", "lazy_static", @@ -4920,9 +4661,9 @@ dependencies = [ [[package]] name = "semaphore-rs-storage" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b869701f2fbd28470faf672224b61dda005c6049ac61b78209b6c5597225e868" +checksum = "1359917938ff075c00f3dcf4b81b90bc7673f1f7d09161b62ec2c27103a0df4c" dependencies = [ "bytemuck", "color-eyre", @@ -4932,16 +4673,16 @@ dependencies = [ [[package]] name = "semaphore-rs-trees" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38a199ba771d9da62ea548d82ac93172ad8669ec79175c54470ea9c7973898a4" +checksum = "c3d62c52e5f57db7cfdb20f755ee05c6e9678d18e230da33f429ae420f88ce74" dependencies = [ - "ark-bn254 0.4.0", - "ark-ec 0.4.2", - "ark-ff 0.4.2", - "ark-groth16 0.4.0", - "ark-relations 0.4.0", - "ark-std 0.4.0", + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-relations", + "ark-std 0.5.0", "bytemuck", "color-eyre", "derive-where", @@ -4963,9 +4704,9 @@ dependencies = [ [[package]] name = "semaphore-rs-utils" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516abca0dadcac9c5213b0ed54611f01f23da5ea3c4955abf493ef7496a1601f" +checksum = "b0f9e801b84373a9659aea27ada2938aec8abd832e01be4efee795a64dfd2304" dependencies = [ "hex", "serde", @@ -4974,13 +4715,13 @@ dependencies = [ [[package]] name = "semaphore-rs-witness" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c68ab7115ac00c88a69dadd737742af139da4554d8ea893e5a8051f315ea51e" +checksum = "1bf2173db3d44dd27857393f8ff72ff296b91ab70167f8d86be4c560f22df1c5" dependencies = [ - "ark-bn254 0.4.0", - "ark-ff 0.4.2", - "ark-serialize 0.4.2", + "ark-bn254", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", "byteorder", "color-eyre", "cxx-build", @@ -5047,7 +4788,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -5086,9 +4827,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.16.1" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" dependencies = [ "base64 0.22.1", "chrono", @@ -5105,14 +4846,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.16.1" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" dependencies = [ - "darling", + "darling 0.23.0", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -5233,22 +4974,12 @@ checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[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 = "socket2" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -5318,7 +5049,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -5340,9 +5071,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.114" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -5358,15 +5089,9 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] -[[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" @@ -5384,7 +5109,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -5393,7 +5118,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "byteorder", "enum-as-inner", "libc", @@ -5401,47 +5126,26 @@ dependencies = [ "walkdir", ] -[[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 = "taceo-ark-babyjubjub" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55b5a2cc31c90e79778c4f6375e5d9828171d320db3f8c911a8ad47af4a70069" dependencies = [ - "ark-bn254 0.5.0", - "ark-ec 0.5.0", + "ark-bn254", + "ark-ec", "ark-ff 0.5.0", "ark-std 0.5.0", ] [[package]] name = "taceo-ark-serde-compat" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07528b4dd1a0c9e49ef352f96219c611af0aa2f7cbd97ddb7276dcf3c2cf8dd0" +checksum = "0a9a63a8ccb028bc47205f82ef207be4950c3f8afc39a6515d4c2b530bf41e3e" dependencies = [ - "ark-bn254 0.5.0", - "ark-ec 0.5.0", + "ark-bn254", + "ark-ec", "ark-ff 0.5.0", "ark-serialize 0.5.0", "num-bigint", @@ -5451,16 +5155,16 @@ dependencies = [ [[package]] name = "taceo-circom-types" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677eb3ed8275b2f179d4b1a93126a51c5b4f409c5ea9d7bc50398b13e517e30b" +checksum = "0ad03e9d126fb248cc8f8bfecd5f1220195e0a6694b4d605f051cc3ac78f36ad" dependencies = [ - "ark-bn254 0.5.0", - "ark-ec 0.5.0", + "ark-bn254", + "ark-ec", "ark-ff 0.5.0", - "ark-groth16 0.5.0", - "ark-poly 0.5.0", - "ark-relations 0.5.1", + "ark-groth16", + "ark-poly", + "ark-relations", "ark-serialize 0.5.0", "ark-std 0.5.0", "byteorder", @@ -5479,7 +5183,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75dbec63f7a89093b4116a7164e6a92d3cda33dec248da8c8a5922a80a06e7dd" dependencies = [ - "ark-ec 0.5.0", + "ark-ec", "ark-ff 0.5.0", "ark-serialize 0.5.0", "blake3", @@ -5499,11 +5203,11 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4983857c95d20ca2dc0400a3a116e6931c012ecc4b78ccede8238cfb0c298e3" dependencies = [ - "ark-ec 0.5.0", + "ark-ec", "ark-ff 0.5.0", - "ark-groth16 0.5.0", - "ark-poly 0.5.0", - "ark-relations 0.5.1", + "ark-groth16", + "ark-poly", + "ark-relations", "eyre", "num-traits", "rayon", @@ -5512,15 +5216,15 @@ dependencies = [ [[package]] name = "taceo-groth16-material" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936b1e6b8a77f931796917501fe13a2ae93304e7eb384ed29d80ddc370b011bd" +checksum = "124a8757ed58c5772a0b8e06ad431e7f1a2af1cbfe1f92c7428c2e1e8925ce8c" dependencies = [ - "ark-bn254 0.5.0", - "ark-ec 0.5.0", + "ark-bn254", + "ark-ec", "ark-ff 0.5.0", - "ark-groth16 0.5.0", - "ark-relations 0.5.1", + "ark-groth16", + "ark-relations", "ark-serialize 0.5.0", "circom-witness-rs", "eyre", @@ -5537,16 +5241,16 @@ dependencies = [ [[package]] name = "taceo-groth16-sol" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c6a7b90f2ecb6db1212557550890d9d9d114447688f6146d726024ec7a3410b" +checksum = "1f2c005a2303bfcd0cf47dc0e2320c80418d685c00d84c322194e7f47320eae8" dependencies = [ "alloy-primitives", - "ark-bn254 0.5.0", - "ark-ec 0.5.0", + "ark-bn254", + "ark-ec", "ark-ff 0.5.0", - "ark-groth16 0.5.0", - "askama 0.15.4", + "ark-groth16", + "askama 0.15.5", "eyre", "ruint", ] @@ -5557,9 +5261,18 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "412211d4d43aeb060c369a69213bd7ae941f769cc4361df83195d2a7936f22d5" dependencies = [ - "taceo-oprf-client", - "taceo-oprf-core", - "taceo-oprf-types", + "taceo-oprf-client 0.8.1", +] + +[[package]] +name = "taceo-oprf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be862ba49094098f945f1375f704a2c47b4e267a6e564462a43ad142b4b1469e" +dependencies = [ + "taceo-oprf-client 0.9.0", + "taceo-oprf-core 0.5.0", + "taceo-oprf-types 0.10.1", ] [[package]] @@ -5568,16 +5281,40 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de42daf867ed4d1ed661258a4541d5dcf1ebe3f43f923acc3ec7716b8824670d" dependencies = [ - "ark-ec 0.5.0", + "ark-ec", "ciborium", "futures", "getrandom 0.2.17", "gloo-net", - "http 1.4.0", + "http", "serde", "taceo-ark-babyjubjub", - "taceo-oprf-core", - "taceo-oprf-types", + "taceo-oprf-core 0.4.3", + "taceo-oprf-types 0.9.2", + "taceo-poseidon2", + "thiserror 2.0.18", + "tokio", + "tokio-tungstenite", + "tracing", + "uuid", +] + +[[package]] +name = "taceo-oprf-client" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "696c4b03e8b570d1d0486f7bc2273b85951b316d7f720fc2f95e79f2b053f649" +dependencies = [ + "ark-ec", + "ciborium", + "futures", + "getrandom 0.2.17", + "gloo-net", + "http", + "serde", + "taceo-ark-babyjubjub", + "taceo-oprf-core 0.5.0", + "taceo-oprf-types 0.10.1", "taceo-poseidon2", "thiserror 2.0.18", "tokio", @@ -5592,7 +5329,29 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d2baf9c72e6687fa8839c3e3368236b36237a905b8c7fcd445250a7a57ab063" dependencies = [ - "ark-ec 0.5.0", + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "blake3", + "itertools 0.14.0", + "num-bigint", + "rand 0.8.5", + "serde", + "subtle", + "taceo-ark-babyjubjub", + "taceo-ark-serde-compat", + "taceo-poseidon2", + "uuid", + "zeroize", +] + +[[package]] +name = "taceo-oprf-core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e55cbbe8357f837939f9cec171f44a217db4d897bea679521d555a24296ee39b" +dependencies = [ + "ark-ec", "ark-ff 0.5.0", "ark-serialize 0.5.0", "blake3", @@ -5619,13 +5378,34 @@ dependencies = [ "ark-serialize 0.5.0", "async-trait", "eyre", - "http 1.4.0", + "http", + "serde", + "taceo-ark-babyjubjub", + "taceo-ark-serde-compat", + "taceo-circom-types", + "taceo-groth16-sol", + "taceo-oprf-core 0.4.3", + "uuid", +] + +[[package]] +name = "taceo-oprf-types" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "540ce620b9d45c2c3d417c8f4b0c82e112f2621f2419e1c9fd207b8d5a3310d4" +dependencies = [ + "alloy", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "async-trait", + "eyre", + "http", "serde", "taceo-ark-babyjubjub", "taceo-ark-serde-compat", "taceo-circom-types", "taceo-groth16-sol", - "taceo-oprf-core", + "taceo-oprf-core 0.5.0", "uuid", ] @@ -5635,7 +5415,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac59d3df4c827b3496bff929aebd6440997a5c2e946f46ff4fdd76f318447581" dependencies = [ - "ark-bn254 0.5.0", + "ark-bn254", "ark-ff 0.5.0", "ark-std 0.5.0", "num-bigint", @@ -5650,9 +5430,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +checksum = "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973" dependencies = [ "filetime", "libc", @@ -5661,12 +5441,12 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.25.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.1", + "getrandom 0.4.2", "once_cell", "rustix", "windows-sys 0.61.2", @@ -5716,7 +5496,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -5727,7 +5507,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -5800,9 +5580,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -5815,39 +5595,29 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.49.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ "bytes", "libc", "mio", "parking_lot", "pin-project-lite", - "socket2 0.6.2", + "socket2", "tokio-macros", "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", -] - -[[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", + "syn 2.0.117", ] [[package]] @@ -5856,7 +5626,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.37", + "rustls", "tokio", ] @@ -5891,10 +5661,10 @@ checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" dependencies = [ "futures-util", "log", - "rustls 0.23.37", + "rustls", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tungstenite", "webpki-roots 0.26.11", ] @@ -5921,10 +5691,10 @@ dependencies = [ "indexmap 2.13.0", "serde_core", "serde_spanned", - "toml_datetime", + "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", - "winnow", + "winnow 0.7.15", ] [[package]] @@ -5936,32 +5706,41 @@ dependencies = [ "serde_core", ] +[[package]] +name = "toml_datetime" +version = "1.0.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" -version = "0.23.10+spec-1.0.0" +version = "0.25.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +checksum = "8ca1a40644a28bce036923f6a431df0b34236949d111cc07cb6dca830c9ef2e1" dependencies = [ "indexmap 2.13.0", - "toml_datetime", + "toml_datetime 1.0.1+spec-1.1.0", "toml_parser", - "winnow", + "winnow 1.0.0", ] [[package]] name = "toml_parser" -version = "1.0.7+spec-1.1.0" +version = "1.0.10+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "247eaa3197818b831697600aadf81514e577e0cba5eab10f7e064e78ae154df1" +checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" dependencies = [ - "winnow", + "winnow 1.0.0", ] [[package]] name = "toml_writer" -version = "1.0.6+spec-1.1.0" +version = "1.0.7+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" +checksum = "f17aaa1c6e3dc22b1da4b6bba97d066e354c7945cac2f7852d4e4e7ca7a6b56d" [[package]] name = "tower" @@ -5972,7 +5751,7 @@ dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -5985,12 +5764,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ "async-compression", - "bitflags 2.10.0", + "bitflags 2.11.0", "bytes", "futures-core", "futures-util", - "http 1.4.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "iri-string", "pin-project-lite", @@ -6032,7 +5811,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -6052,7 +5831,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" dependencies = [ "tracing", - "tracing-subscriber 0.3.22", + "tracing-subscriber 0.3.23", ] [[package]] @@ -6077,9 +5856,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", @@ -6107,11 +5886,11 @@ checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" dependencies = [ "bytes", "data-encoding", - "http 1.4.0", + "http", "httparse", "log", "rand 0.9.2", - "rustls 0.23.37", + "rustls", "rustls-pki-types", "sha1", "thiserror 2.0.18", @@ -6150,9 +5929,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" @@ -6190,7 +5969,7 @@ dependencies = [ [[package]] name = "uniffi-bindgen" -version = "0.10.0" +version = "0.11.0" dependencies = [ "uniffi", ] @@ -6244,7 +6023,7 @@ dependencies = [ "indexmap 2.13.0", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -6259,7 +6038,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.114", + "syn 2.0.117", "toml", "uniffi_meta", ] @@ -6344,11 +6123,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.21.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" dependencies = [ - "getrandom 0.4.1", + "getrandom 0.4.2", "js-sys", "serde_core", "wasm-bindgen", @@ -6387,7 +6166,7 @@ dependencies = [ [[package]] name = "walletkit" -version = "0.10.0" +version = "0.11.0" dependencies = [ "uniffi", "walletkit-core", @@ -6395,7 +6174,7 @@ dependencies = [ [[package]] name = "walletkit-core" -version = "0.10.0" +version = "0.11.0" dependencies = [ "alloy", "alloy-core", @@ -6414,10 +6193,10 @@ dependencies = [ "mockito", "rand 0.8.5", "regex", - "reqwest 0.12.28", + "reqwest", "ruint", "ruint-uniffi", - "rustls 0.23.37", + "rustls", "secrecy", "semaphore-rs", "serde", @@ -6425,13 +6204,14 @@ dependencies = [ "sha2", "strum", "subtle", - "taceo-oprf", + "taceo-oprf 0.7.1", + "taceo-oprf 0.8.0", "thiserror 2.0.18", "tokio", "tokio-test", "tracing", "tracing-log", - "tracing-subscriber 0.3.22", + "tracing-subscriber 0.3.23", "uniffi", "uuid", "walletkit-db", @@ -6441,7 +6221,7 @@ dependencies = [ [[package]] name = "walletkit-db" -version = "0.10.0" +version = "0.11.0" dependencies = [ "cc", "hex", @@ -6487,9 +6267,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ "cfg-if", "once_cell", @@ -6500,9 +6280,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.58" +version = "0.4.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" dependencies = [ "cfg-if", "futures-util", @@ -6514,9 +6294,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6524,22 +6304,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] @@ -6572,7 +6352,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "hashbrown 0.15.5", "indexmap 2.13.0", "semver 1.0.27", @@ -6594,9 +6374,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.85" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" dependencies = [ "js-sys", "wasm-bindgen", @@ -6612,12 +6392,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 = "webpki-roots" version = "0.26.11" @@ -6690,7 +6464,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -6701,7 +6475,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -6728,15 +6502,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" @@ -6952,21 +6717,20 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.14" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" dependencies = [ "memchr", ] [[package]] -name = "winreg" -version = "0.50.0" +name = "winnow" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" dependencies = [ - "cfg-if", - "windows-sys 0.48.0", + "memchr", ] [[package]] @@ -6999,7 +6763,7 @@ dependencies = [ "heck", "indexmap 2.13.0", "prettyplease", - "syn 2.0.114", + "syn 2.0.117", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -7015,7 +6779,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -7027,7 +6791,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.10.0", + "bitflags 2.11.0", "indexmap 2.13.0", "log", "serde", @@ -7059,7 +6823,9 @@ dependencies = [ [[package]] name = "world-id-authenticator" -version = "0.5.2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07d061f3e1150294b0eaab3c3a8311343c144995097c6f08cd7babbe8610faca" dependencies = [ "alloy", "anyhow", @@ -7067,16 +6833,16 @@ dependencies = [ "backon", "eyre", "rand 0.8.5", - "reqwest 0.12.28", + "reqwest", "ruint", - "rustls 0.23.37", + "rustls", "secrecy", "serde", "serde_json", "taceo-ark-babyjubjub", "taceo-eddsa-babyjubjub", "taceo-groth16-material", - "taceo-oprf", + "taceo-oprf 0.8.0", "taceo-poseidon2", "thiserror 2.0.18", "tokio", @@ -7087,9 +6853,9 @@ dependencies = [ [[package]] name = "world-id-core" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe1aeed0d47a8932f23938814f942465aaab3b5c71ddf6c5f44f53ca506a8468" +checksum = "a88fbe3660167654a014924faeeec87d7aebb9ff13a43dbb51958045f0aa3ed6" dependencies = [ "taceo-eddsa-babyjubjub", "world-id-authenticator", @@ -7099,16 +6865,17 @@ dependencies = [ [[package]] name = "world-id-primitives" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb4aa561b0b99df193a638b9081da74e299e4d608d0c5d2c0f76ebfe537caba" +checksum = "022157c68f1c49bb3d7256b9199174d6de6cc9d4b07c5ea757f2f6b35597b4a2" dependencies = [ "alloy", "alloy-primitives", - "ark-bn254 0.5.0", + "ark-bn254", "ark-ff 0.5.0", - "ark-groth16 0.5.0", + "ark-groth16", "arrayvec", + "embed-doc-image", "eyre", "getrandom 0.2.17", "hex", @@ -7126,7 +6893,7 @@ dependencies = [ "taceo-eddsa-babyjubjub", "taceo-groth16-material", "taceo-groth16-sol", - "taceo-oprf", + "taceo-oprf 0.8.0", "taceo-poseidon2", "thiserror 2.0.18", "url", @@ -7135,22 +6902,25 @@ dependencies = [ [[package]] name = "world-id-proof" -version = "0.5.2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "091e4902d84a827900db7f030fc6bb3f9705e0abe6d20aca943148727bb625b8" dependencies = [ - "ark-bn254 0.5.0", - "ark-ec 0.5.0", + "ark-bn254", + "ark-ec", "ark-ff 0.5.0", - "ark-groth16 0.5.0", + "ark-groth16", "ark-serialize 0.5.0", "eyre", "rand 0.8.5", "rayon", - "reqwest 0.12.28", + "reqwest", + "serde", "taceo-ark-babyjubjub", "taceo-circom-types", "taceo-eddsa-babyjubjub", "taceo-groth16-material", - "taceo-oprf", + "taceo-oprf 0.8.0", "taceo-poseidon2", "tar", "thiserror 2.0.18", @@ -7204,28 +6974,28 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.39" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.39" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -7245,7 +7015,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "synstructure", ] @@ -7266,7 +7036,7 @@ checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -7299,7 +7069,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -7321,9 +7091,9 @@ dependencies = [ [[package]] name = "zmij" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de98dfa5d5b7fef4ee834d0073d560c9ca7b6c46a71d058c48db7960f8cfaf7" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "zopfli" diff --git a/Cargo.toml b/Cargo.toml index c24009c9b..5db7c3b00 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,29 +43,3 @@ lto = true # Enable Link Time Optimization. panic = "abort" debug = false -# ── Vendored patches ───────────────────────────────────────────────────────── -# -# world-id-authenticator v0.5.2 ships with `default = ["embed-zkeys"]`, which -# propagates `world-id-proof/embed-zkeys` into the dependency graph even when -# that feature is not explicitly requested. `world-id-proof/embed-zkeys` -# triggers a build-script network download of circuit files (~100 MB from -# raw.githubusercontent.com), making the `cargo check --target -# wasm32-unknown-unknown` CI step unreliable whenever that host cannot reach -# GitHub's raw content CDN. -# -# This patch vendors the crate with `default = []` so that embed-zkeys is only -# activated when our own `embed-zkeys` feature is explicitly enabled (which -# goes through `world-id-core/embed-zkeys` → `world-id-proof/embed-zkeys` -# directly, bypassing world-id-authenticator's defaults entirely). -# -# The source is a verbatim copy of world-id-authenticator v0.5.2 with only the -# `[features] default` line changed. Update the vendor copy whenever -# world-id-authenticator is bumped. -[patch.crates-io] -world-id-authenticator = { path = "vendor/world-id-authenticator" } -# world-id-proof v0.5.2 ships with `default = ["embed-zkeys"]`, so any -# dependency that activates it with default-features (including world-id-core -# itself) triggers a build-script network download of circuit files. This -# patch sets `default = []` so the download only happens when embed-zkeys is -# explicitly requested via our own `embed-zkeys` feature flag. -world-id-proof = { path = "vendor/world-id-proof" } diff --git a/vendor/world-id-authenticator/.cargo-ok b/vendor/world-id-authenticator/.cargo-ok deleted file mode 100644 index 5f8b79583..000000000 --- a/vendor/world-id-authenticator/.cargo-ok +++ /dev/null @@ -1 +0,0 @@ -{"v":1} \ No newline at end of file diff --git a/vendor/world-id-authenticator/.cargo_vcs_info.json b/vendor/world-id-authenticator/.cargo_vcs_info.json deleted file mode 100644 index 96004a4dc..000000000 --- a/vendor/world-id-authenticator/.cargo_vcs_info.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "git": { - "sha1": "a45e0df122c3b57081fd7babd4b2727577dbbbe1" - }, - "path_in_vcs": "crates/authenticator" -} \ No newline at end of file diff --git a/vendor/world-id-authenticator/Cargo.lock b/vendor/world-id-authenticator/Cargo.lock deleted file mode 100644 index 8fd89f01e..000000000 --- a/vendor/world-id-authenticator/Cargo.lock +++ /dev/null @@ -1,5594 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -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 = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4973038846323e4e69a433916522195dce2947770076c03078fc21c80ea0f1c4" -dependencies = [ - "alloy-consensus", - "alloy-contract", - "alloy-core", - "alloy-eips", - "alloy-network", - "alloy-provider", - "alloy-rpc-client", - "alloy-signer", - "alloy-signer-local", - "alloy-transport", - "alloy-transport-http", -] - -[[package]] -name = "alloy-chains" -version = "0.2.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f374d3c6d729268bbe2d0e0ff992bb97898b2df756691a62ee1d5f0506bc39" -dependencies = [ - "alloy-primitives", - "num_enum", - "strum", -] - -[[package]] -name = "alloy-consensus" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c0dc44157867da82c469c13186015b86abef209bf0e41625e4b68bac61d728" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-trie", - "alloy-tx-macros", - "auto_impl", - "borsh", - "c-kzg", - "derive_more", - "either", - "k256", - "once_cell", - "rand 0.8.5", - "secp256k1", - "serde", - "serde_json", - "serde_with", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-consensus-any" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4cdb42df3871cd6b346d6a938ec2ba69a9a0f49d1f82714bc5c48349268434" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-contract" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca63b7125a981415898ffe2a2a696c83696c9c6bdb1671c8a912946bbd8e49e7" -dependencies = [ - "alloy-consensus", - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives", - "alloy-provider", - "alloy-rpc-types-eth", - "alloy-sol-types", - "alloy-transport", - "futures", - "futures-util", - "serde_json", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-core" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e8604b0c092fabc80d075ede181c9b9e596249c70b99253082d7e689836529" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives", - "alloy-rlp", - "alloy-sol-types", -] - -[[package]] -name = "alloy-dyn-abi" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2db5c583aaef0255aa63a4fe827f826090142528bba48d1bf4119b62780cad" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-type-parser", - "alloy-sol-types", - "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.18", -] - -[[package]] -name = "alloy-eip2930" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9441120fa82df73e8959ae0e4ab8ade03de2aaae61be313fbf5746277847ce25" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "borsh", - "serde", -] - -[[package]] -name = "alloy-eip7702" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "borsh", - "serde", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-eip7928" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3231de68d5d6e75332b7489cfcc7f4dfabeba94d990a10e4b923af0e6623540" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "borsh", - "serde", -] - -[[package]] -name = "alloy-eips" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f7ef09f21bd1e9cb8a686f168cb4a206646804567f0889eadb8dcc4c9288c8" -dependencies = [ - "alloy-eip2124", - "alloy-eip2930", - "alloy-eip7702", - "alloy-eip7928", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "auto_impl", - "borsh", - "c-kzg", - "derive_more", - "either", - "serde", - "serde_with", - "sha2", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-json-abi" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dbe713da0c737d9e5e387b0ba790eb98b14dd207fe53eef50e19a5a8ec3dac" -dependencies = [ - "alloy-primitives", - "alloy-sol-type-parser", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-json-rpc" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff42cd777eea61f370c0b10f2648a1c81e0b783066cd7269228aa993afd487f7" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "http", - "serde", - "serde_json", - "thiserror 2.0.18", - "tracing", -] - -[[package]] -name = "alloy-network" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cbca04f9b410fdc51aaaf88433cbac761213905a65fe832058bcf6690585762" -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", - "derive_more", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-network-primitives" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d6d15e069a8b11f56bef2eccbad2a873c6dd4d4c81d04dda29710f5ea52f04" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-primitives" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3b431b4e72cd8bd0ec7a50b4be18e73dab74de0dba180eef171055e5d5926e" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "foldhash 0.2.0", - "hashbrown 0.16.1", - "indexmap 2.13.0", - "itoa", - "k256", - "keccak-asm", - "paste", - "proptest", - "rand 0.9.2", - "rapidhash", - "ruint", - "rustc-hash", - "serde", - "sha3", -] - -[[package]] -name = "alloy-provider" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d181c8cc7cf4805d7e589bf4074d56d55064fa1a979f005a45a62b047616d870" -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-signer", - "alloy-sol-types", - "alloy-transport", - "alloy-transport-http", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "either", - "futures", - "futures-utils-wasm", - "lru", - "parking_lot", - "pin-project", - "reqwest", - "serde", - "serde_json", - "thiserror 2.0.18", - "tokio", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93e50f64a77ad9c5470bf2ad0ca02f228da70c792a8f06634801e202579f35e" -dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce8849c74c9ca0f5a03da1c865e3eb6f768df816e67dd3721a398a8a7e398011" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "alloy-rpc-client" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2792758a93ae32a32e9047c843d536e1448044f78422d71bf7d7c05149e103f" -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 = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd720b63f82b457610f2eaaf1f32edf44efffe03ae25d537632e7d23e7929e1a" -dependencies = [ - "alloy-consensus-any", - "alloy-rpc-types-eth", - "alloy-serde", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2dc411f13092f237d2bf6918caf80977fc2f51485f9b90cb2a2f956912c8c9" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "itertools 0.14.0", - "serde", - "serde_json", - "serde_with", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-serde" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2ce1e0dbf7720eee747700e300c99aac01b1a95bb93f493a01e78ee28bb1a37" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-signer" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2425c6f314522c78e8198979c8cbf6769362be4da381d4152ea8eefce383535d" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "either", - "elliptic-curve", - "k256", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-signer-local" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ecb71ee53d8d9c3fa7bac17542c8116ebc7a9726c91b1bf333ec3d04f5a789" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives", - "alloy-signer", - "async-trait", - "k256", - "rand 0.8.5", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-sol-macro" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab81bab693da9bb79f7a95b64b394718259fdd7e41dceeced4cad57cb71c4f6a" -dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489f1620bb7e2483fb5819ed01ab6edc1d2f93939dce35a5695085a1afd1d699" -dependencies = [ - "alloy-json-abi", - "alloy-sol-macro-input", - "const-hex", - "heck", - "indexmap 2.13.0", - "proc-macro-error2", - "proc-macro2", - "quote", - "sha3", - "syn 2.0.116", - "syn-solidity", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56cef806ad22d4392c5fc83cf8f2089f988eb99c7067b4e0c6f1971fc1cca318" -dependencies = [ - "alloy-json-abi", - "const-hex", - "dunce", - "heck", - "macro-string", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.116", - "syn-solidity", -] - -[[package]] -name = "alloy-sol-type-parser" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6df77fea9d6a2a75c0ef8d2acbdfd92286cc599983d3175ccdc170d3433d249" -dependencies = [ - "serde", - "winnow", -] - -[[package]] -name = "alloy-sol-types" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64612d29379782a5dde6f4b6570d9c756d734d760c0c94c254d361e678a6591f" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-macro", - "serde", -] - -[[package]] -name = "alloy-transport" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa186e560d523d196580c48bf00f1bf62e63041f28ecf276acc22f8b27bb9f53" -dependencies = [ - "alloy-json-rpc", - "auto_impl", - "base64", - "derive_more", - "futures", - "futures-utils-wasm", - "parking_lot", - "serde", - "serde_json", - "thiserror 2.0.18", - "tokio", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-transport-http" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa501ad58dd20acddbfebc65b52e60f05ebf97c52fa40d1b35e91f5e2da0ad0e" -dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "itertools 0.14.0", - "reqwest", - "serde_json", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-trie" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d7fd448ab0a017de542de1dcca7a58e7019fe0e7a34ed3f9543ebddf6aceffa" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "arrayvec", - "derive_more", - "nybbles", - "serde", - "smallvec", - "thiserror 2.0.18", - "tracing", -] - -[[package]] -name = "alloy-tx-macros" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa0c53e8c1e1ef4d01066b01c737fb62fc9397ab52c6e7bb5669f97d281b9bc" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[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.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" - -[[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", - "rayon", - "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.116", -] - -[[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.5", - "itertools 0.13.0", - "num-bigint", - "num-integer", - "num-traits", - "rayon", - "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", - "rayon", - "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.116", -] - -[[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.116", -] - -[[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", - "rayon", -] - -[[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.5", - "rayon", -] - -[[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", - "rayon", -] - -[[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.116", -] - -[[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", - "rayon", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -dependencies = [ - "serde", -] - -[[package]] -name = "askama" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08e1676b346cadfec169374f949d7490fd80a24193d37d2afce0c047cf695e57" -dependencies = [ - "askama_macros", - "itoa", - "percent-encoding", - "serde", - "serde_json", -] - -[[package]] -name = "askama_derive" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7661ff56517787343f376f75db037426facd7c8d3049cef8911f1e75016f3a37" -dependencies = [ - "askama_parser", - "basic-toml", - "memchr", - "proc-macro2", - "quote", - "rustc-hash", - "serde", - "serde_derive", - "syn 2.0.116", -] - -[[package]] -name = "askama_macros" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713ee4dbfd1eb719c2dab859465b01fa1d21cb566684614a713a6b7a99a4e47b" -dependencies = [ - "askama_derive", -] - -[[package]] -name = "askama_parser" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d62d674238a526418b30c0def480d5beadb9d8964e7f38d635b03bf639c704c" -dependencies = [ - "rustc-hash", - "serde", - "serde_derive", - "unicode-ident", - "winnow", -] - -[[package]] -name = "assert-json-diff" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" -dependencies = [ - "serde", - "serde_json", -] - -[[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.116", -] - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "atomic-polyfill" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" -dependencies = [ - "critical-section", -] - -[[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.116", -] - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "aws-lc-rs" -version = "1.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bffc006df10ac2a68c83692d734a465f8ee6c5b384d8545a636f81d858f4bf" -dependencies = [ - "aws-lc-sys", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4321e568ed89bb5a7d291a7f37997c2c0df89809d7b6d12062c81ddb54aa782e" -dependencies = [ - "cc", - "cmake", - "dunce", - "fs_extra", -] - -[[package]] -name = "backon" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" -dependencies = [ - "fastrand", - "gloo-timers", - "tokio", -] - -[[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.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" - -[[package]] -name = "basic-toml" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" -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 = "bitcoin-io" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dee39a0ee5b4095224a0cfc6bf4cc1baf0f9624b96b367e53b66d974e51d953" - -[[package]] -name = "bitcoin_hashes" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26ec84b80c482df901772e931a9a681e26a1b9ee2302edeff23cb30328745c8b" -dependencies = [ - "bitcoin-io", - "hex-conservative", -] - -[[package]] -name = "bitflags" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" - -[[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 = "blake3" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", - "cpufeatures", -] - -[[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.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "borsh" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" -dependencies = [ - "borsh-derive", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" -dependencies = [ - "once_cell", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "bumpalo" -version = "3.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" - -[[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.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" -dependencies = [ - "serde", -] - -[[package]] -name = "c-kzg" -version = "2.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e00bf4b112b07b505472dbefd19e37e53307e2bfed5a79e0cc161d58ccd0e687" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "once_cell", - "serde", -] - -[[package]] -name = "cc" -version = "1.2.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[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.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" -dependencies = [ - "iana-time-zone", - "num-traits", - "serde", - "windows-link", -] - -[[package]] -name = "ciborium" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" - -[[package]] -name = "ciborium-ll" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" -dependencies = [ - "ciborium-io", - "half", -] - -[[package]] -name = "circom-witness-rs" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35778373aee12ef3d04966187eeae7a04f1451c9226058311f21488df6f28780" -dependencies = [ - "ark-bn254", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "byteorder", - "cxx-build", - "eyre", - "hex", - "num-bigint", - "num-traits", - "postcard", - "rand 0.8.5", - "ruint", - "serde", - "serde_json", -] - -[[package]] -name = "cmake" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" -dependencies = [ - "cc", -] - -[[package]] -name = "cobs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" -dependencies = [ - "thiserror 2.0.18", -] - -[[package]] -name = "codespan-reporting" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" -dependencies = [ - "serde", - "termcolor", - "unicode-width", -] - -[[package]] -name = "colored" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "const-hex" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" -dependencies = [ - "cfg-if", - "cpufeatures", - "proptest", - "serde_core", -] - -[[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.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" -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.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" - -[[package]] -name = "convert_case" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" -dependencies = [ - "unicode-segmentation", -] - -[[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 = "crc" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" -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 = "critical-section" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" - -[[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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[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 = "cxx-build" -version = "1.0.194" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0f4697d190a142477b16aef7da8a99bfdc41e7e8b1687583c0d23a79c7afc1e" -dependencies = [ - "cc", - "codespan-reporting", - "indexmap 2.13.0", - "proc-macro2", - "quote", - "scratch", - "syn 2.0.116", -] - -[[package]] -name = "darling" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "serde", - "strsim", - "syn 2.0.116", -] - -[[package]] -name = "darling_macro" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.116", -] - -[[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.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" - -[[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.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" -dependencies = [ - "powerfmt", - "serde_core", -] - -[[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.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version 0.4.1", - "syn 2.0.116", - "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.116", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[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.116", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -dependencies = [ - "serde", -] - -[[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 = "enum-ordinalize" -version = "4.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" -dependencies = [ - "enum-ordinalize-derive", -] - -[[package]] -name = "enum-ordinalize-derive" -version = "4.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[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.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[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 = "filetime" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" -dependencies = [ - "cfg-if", - "libc", - "libredox", -] - -[[package]] -name = "find-msvc-tools" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" - -[[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 = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[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.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" - -[[package]] -name = "futures-executor" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" - -[[package]] -name = "futures-macro" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "futures-sink" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" - -[[package]] -name = "futures-task" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" - -[[package]] -name = "futures-util" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi", - "wasip2", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasip2", - "wasip3", -] - -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[package]] -name = "gloo-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" -dependencies = [ - "futures-channel", - "futures-core", - "futures-sink", - "gloo-utils", - "http", - "js-sys", - "pin-project", - "thiserror 1.0.69", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "gloo-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" -dependencies = [ - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[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.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap 2.13.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "cfg-if", - "crunchy", - "zerocopy", -] - -[[package]] -name = "hash32" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" -dependencies = [ - "byteorder", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "allocator-api2", - "foldhash 0.1.5", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.2.0", - "serde", - "serde_core", -] - -[[package]] -name = "heapless" -version = "0.7.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" -dependencies = [ - "atomic-polyfill", - "hash32", - "rustc_version 0.4.1", - "serde", - "spin", - "stable_deref_trait", -] - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hex-conservative" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" -dependencies = [ - "arrayvec", -] - -[[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.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" -dependencies = [ - "bytes", - "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 = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "pin-utils", - "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", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots 1.0.6", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "base64", - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" -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.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - -[[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.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -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.116", -] - -[[package]] -name = "indenter" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" - -[[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.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", - "serde", - "serde_core", -] - -[[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.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" -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.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.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" -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", - "signature", -] - -[[package]] -name = "keccak" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-asm" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b646a74e746cd25045aa0fd42f4f7f78aa6d119380182c7e63a5593c4ab8df6f" -dependencies = [ - "digest 0.10.7", - "sha3-asm", -] - -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - -[[package]] -name = "libc" -version = "0.2.182" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "libredox" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" -dependencies = [ - "bitflags", - "libc", - "redox_syscall 0.7.1", -] - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" - -[[package]] -name = "lru" -version = "0.16.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" -dependencies = [ - "hashbrown 0.16.1", -] - -[[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.116", -] - -[[package]] -name = "memchr" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" - -[[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 = "mio" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "mockito" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90820618712cab19cfc46b274c6c22546a82affcb3c3bdf0f29e3db8e1bb92c0" -dependencies = [ - "assert-json-diff", - "bytes", - "colored", - "futures-core", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "log", - "pin-project-lite", - "rand 0.9.2", - "regex", - "serde_json", - "serde_urlencoded", - "similar", - "tokio", -] - -[[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.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" - -[[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 = "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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "nybbles" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d49ff0c0d00d4a502b39df9af3a525e1efeb14b9dabb5bb83335284c1309210" -dependencies = [ - "alloy-rlp", - "cfg-if", - "proptest", - "ruint", - "serde", - "smallvec", -] - -[[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.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.116", -] - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.18", - "smallvec", - "windows-link", -] - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "pest" -version = "2.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" -dependencies = [ - "memchr", - "ucd-trie", -] - -[[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.116", -] - -[[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.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" -dependencies = [ - "cobs", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "heapless", - "serde", -] - -[[package]] -name = "potential_utf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -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.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.116", -] - -[[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.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" -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.116", -] - -[[package]] -name = "proc-macro2" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566cb3fdacef14c0737f9546df7cfeadbfbc9fef10991038bf5015d0c80532" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags", - "num-traits", - "rand 0.9.2", - "rand_chacha 0.9.0", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2 0.5.10", - "thiserror 2.0.18", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" -dependencies = [ - "bytes", - "getrandom 0.3.4", - "lru-slab", - "rand 0.9.2", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.18", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2 0.5.10", - "tracing", - "windows-sys 0.60.2", -] - -[[package]] -name = "quote" -version = "1.0.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" -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" -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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", - "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 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.5", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", - "serde", -] - -[[package]] -name = "rand_xorshift" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" -dependencies = [ - "rand_core 0.9.5", -] - -[[package]] -name = "rapidhash" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111325c42c4bafae99e777cd77b40dea9a2b30c69e9d8c74b6eccd7fba4337de" -dependencies = [ - "rustversion", -] - -[[package]] -name = "rayon" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_syscall" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" -dependencies = [ - "bitflags", -] - -[[package]] -name = "ref-cast" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "regex" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" - -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 1.0.6", -] - -[[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.17", - "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.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "ark-ff 0.5.0", - "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.2", - "rlp", - "ruint-macro", - "serde_core", - "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-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.27", -] - -[[package]] -name = "rustix" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" -dependencies = [ - "aws-lc-rs", - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "rusty-fork" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "schemars" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "scratch" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" - -[[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 = "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 = "secrecy" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" -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.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" - -[[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.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "serde_json" -version = "1.0.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[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.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" -dependencies = [ - "base64", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.13.0", - "schemars 0.9.0", - "schemars 1.2.1", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b31139435f327c93c6038ed350ae4588e2c70a13d50599509fee6349967ba35a" -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 = "similar" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -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 = "socket2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[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.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[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.116" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-solidity" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53f425ae0b12e2f5ae65542e00898d500d4d318b4baf09f40fd0d410454e9947" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[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.116", -] - -[[package]] -name = "taceo-ark-babyjubjub" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55b5a2cc31c90e79778c4f6375e5d9828171d320db3f8c911a8ad47af4a70069" -dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-std 0.5.0", -] - -[[package]] -name = "taceo-ark-serde-compat" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07528b4dd1a0c9e49ef352f96219c611af0aa2f7cbd97ddb7276dcf3c2cf8dd0" -dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "num-bigint", - "serde", - "taceo-ark-babyjubjub", -] - -[[package]] -name = "taceo-circom-types" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677eb3ed8275b2f179d4b1a93126a51c5b4f409c5ea9d7bc50398b13e517e30b" -dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-groth16", - "ark-poly", - "ark-relations", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "byteorder", - "num-traits", - "rayon", - "serde", - "serde_json", - "taceo-ark-serde-compat", - "thiserror 2.0.18", - "tracing", -] - -[[package]] -name = "taceo-eddsa-babyjubjub" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75dbec63f7a89093b4116a7164e6a92d3cda33dec248da8c8a5922a80a06e7dd" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "blake3", - "eyre", - "num-bigint", - "rand 0.8.5", - "serde", - "taceo-ark-babyjubjub", - "taceo-ark-serde-compat", - "taceo-poseidon2", - "zeroize", -] - -[[package]] -name = "taceo-groth16" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4983857c95d20ca2dc0400a3a116e6931c012ecc4b78ccede8238cfb0c298e3" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-groth16", - "ark-poly", - "ark-relations", - "eyre", - "num-traits", - "rayon", - "tracing", -] - -[[package]] -name = "taceo-groth16-material" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936b1e6b8a77f931796917501fe13a2ae93304e7eb384ed29d80ddc370b011bd" -dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-groth16", - "ark-relations", - "ark-serialize 0.5.0", - "circom-witness-rs", - "eyre", - "hex", - "postcard", - "rand 0.8.5", - "ruint", - "sha2", - "taceo-circom-types", - "taceo-groth16", - "thiserror 2.0.18", - "tracing", -] - -[[package]] -name = "taceo-groth16-sol" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c6a7b90f2ecb6db1212557550890d9d9d114447688f6146d726024ec7a3410b" -dependencies = [ - "alloy-primitives", - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-groth16", - "askama", - "eyre", - "ruint", -] - -[[package]] -name = "taceo-oprf" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "412211d4d43aeb060c369a69213bd7ae941f769cc4361df83195d2a7936f22d5" -dependencies = [ - "taceo-oprf-client", - "taceo-oprf-core", - "taceo-oprf-types", -] - -[[package]] -name = "taceo-oprf-client" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de42daf867ed4d1ed661258a4541d5dcf1ebe3f43f923acc3ec7716b8824670d" -dependencies = [ - "ark-ec", - "ciborium", - "futures", - "getrandom 0.2.17", - "gloo-net", - "http", - "serde", - "taceo-ark-babyjubjub", - "taceo-oprf-core", - "taceo-oprf-types", - "taceo-poseidon2", - "thiserror 2.0.18", - "tokio", - "tokio-tungstenite", - "tracing", - "uuid", -] - -[[package]] -name = "taceo-oprf-core" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2baf9c72e6687fa8839c3e3368236b36237a905b8c7fcd445250a7a57ab063" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "blake3", - "itertools 0.14.0", - "num-bigint", - "rand 0.8.5", - "serde", - "subtle", - "taceo-ark-babyjubjub", - "taceo-ark-serde-compat", - "taceo-poseidon2", - "uuid", - "zeroize", -] - -[[package]] -name = "taceo-oprf-types" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447b96ee4bb69a16b05fa1e581501c426338698263cde39fc8fbfdbf5d24b616" -dependencies = [ - "alloy", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "async-trait", - "eyre", - "http", - "serde", - "taceo-ark-babyjubjub", - "taceo-ark-serde-compat", - "taceo-circom-types", - "taceo-groth16-sol", - "taceo-oprf-core", - "uuid", -] - -[[package]] -name = "taceo-poseidon2" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac59d3df4c827b3496bff929aebd6440997a5c2e946f46ff4fdd76f318447581" -dependencies = [ - "ark-bn254", - "ark-ff 0.5.0", - "ark-std 0.5.0", - "num-bigint", - "num-traits", -] - -[[package]] -name = "tap" -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.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" -dependencies = [ - "fastrand", - "getrandom 0.4.1", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[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.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl 2.0.18", -] - -[[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.116", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[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.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" - -[[package]] -name = "time-macros" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" -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.49.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" -dependencies = [ - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "socket2 0.6.2", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" -dependencies = [ - "futures-util", - "log", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots 0.26.11", -] - -[[package]] -name = "tokio-util" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml_datetime" -version = "0.7.5+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.23.10+spec-1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" -dependencies = [ - "indexmap 2.13.0", - "toml_datetime", - "toml_parser", - "winnow", -] - -[[package]] -name = "toml_parser" -version = "1.0.9+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" -dependencies = [ - "winnow", -] - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" -dependencies = [ - "bitflags", - "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.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -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 = "tungstenite" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" -dependencies = [ - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand 0.9.2", - "rustls", - "rustls-pki-types", - "sha1", - "thiserror 2.0.18", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" - -[[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.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", - "serde_derive", -] - -[[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 = "1.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" -dependencies = [ - "getrandom 0.4.1", - "js-sys", - "serde_core", - "wasm-bindgen", -] - -[[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.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.2+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" -dependencies = [ - "cfg-if", - "futures-util", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.116", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap 2.13.0", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags", - "hashbrown 0.15.5", - "indexmap 2.13.0", - "semver 1.0.27", -] - -[[package]] -name = "wasmtimer" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" -dependencies = [ - "futures", - "js-sys", - "parking_lot", - "pin-utils", - "slab", - "wasm-bindgen", -] - -[[package]] -name = "web-sys" -version = "0.3.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" -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.6", -] - -[[package]] -name = "webpki-roots" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -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.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap 2.13.0", - "prettyplease", - "syn 2.0.116", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.116", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags", - "indexmap 2.13.0", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap 2.13.0", - "log", - "semver 1.0.27", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] - -[[package]] -name = "world-id-authenticator" -version = "0.5.2" -dependencies = [ - "alloy", - "anyhow", - "ark-serialize 0.5.0", - "backon", - "eyre", - "mockito", - "rand 0.8.5", - "reqwest", - "ruint", - "rustls", - "secrecy", - "serde", - "serde_json", - "taceo-ark-babyjubjub", - "taceo-eddsa-babyjubjub", - "taceo-groth16-material", - "taceo-oprf", - "taceo-poseidon2", - "thiserror 2.0.18", - "tokio", - "webpki-roots 1.0.6", - "world-id-primitives", - "world-id-proof", -] - -[[package]] -name = "world-id-primitives" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb4aa561b0b99df193a638b9081da74e299e4d608d0c5d2c0f76ebfe537caba" -dependencies = [ - "alloy", - "alloy-primitives", - "ark-bn254", - "ark-ff 0.5.0", - "ark-groth16", - "arrayvec", - "eyre", - "getrandom 0.2.17", - "hex", - "k256", - "rand 0.8.5", - "ruint", - "secrecy", - "serde", - "serde_json", - "sha3", - "strum", - "taceo-ark-babyjubjub", - "taceo-ark-serde-compat", - "taceo-circom-types", - "taceo-eddsa-babyjubjub", - "taceo-groth16-material", - "taceo-groth16-sol", - "taceo-oprf", - "taceo-poseidon2", - "thiserror 2.0.18", - "url", - "uuid", -] - -[[package]] -name = "world-id-proof" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc3f2025b9a6475a838b07ad48381f00e4515d158d1fd10d2aebb3c10dfb81d" -dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-groth16", - "ark-serialize 0.5.0", - "eyre", - "rand 0.8.5", - "rayon", - "reqwest", - "taceo-ark-babyjubjub", - "taceo-circom-types", - "taceo-eddsa-babyjubjub", - "taceo-groth16-material", - "taceo-oprf", - "taceo-poseidon2", - "tar", - "thiserror 2.0.18", - "tracing", - "world-id-primitives", - "zeroize", - "zstd", -] - -[[package]] -name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "xattr" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" -dependencies = [ - "libc", - "rustix", -] - -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[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.116", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "zmij" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" - -[[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.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/vendor/world-id-authenticator/Cargo.toml b/vendor/world-id-authenticator/Cargo.toml deleted file mode 100644 index 8a3a7561a..000000000 --- a/vendor/world-id-authenticator/Cargo.toml +++ /dev/null @@ -1,182 +0,0 @@ -# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -# -# When uploading crates to the registry Cargo will automatically -# "normalize" Cargo.toml files for maximal compatibility -# with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g., crates.io) dependencies. -# -# If you are reading this file be aware that the original Cargo.toml -# will likely look very different (and much more reasonable). -# See Cargo.toml.orig for the original contents. - -[package] -edition = "2024" -rust-version = "1.87" -name = "world-id-authenticator" -version = "0.5.2" -authors = [ - "World Foundation", - "TACEO GmbH ", - "Tools for Humanity", -] -build = false -include = [ - "src/**/*", - "tests/**/*", - "abi/*", - "Cargo.toml", - "README.md", -] -publish = true -autolib = false -autobins = false -autoexamples = false -autotests = false -autobenches = false -description = "World ID Credential crate" -homepage = "https://docs.world.org/world-id" -readme = "README.md" -license = "MIT" -repository = "https://github.com/worldcoin/world-id-protocol" -resolver = "2" - -[features] -default = [] -embed-zkeys = ["world-id-proof/embed-zkeys"] - -[lib] -name = "world_id_authenticator" -path = "src/lib.rs" - -[dependencies.alloy] -version = "1.7.3" -features = [ - "sol-types", - "json", - "network", - "providers", - "contract", - "reqwest", -] -default-features = false - -[dependencies.anyhow] -version = "1" - -[dependencies.ark-babyjubjub] -version = "0.5" -package = "taceo-ark-babyjubjub" - -[dependencies.ark-serialize] -version = "0.5" - -[dependencies.backon] -version = "1" - -[dependencies.eddsa-babyjubjub] -version = "0.5.4" -package = "taceo-eddsa-babyjubjub" - -[dependencies.eyre] -version = "0.6" - -[dependencies.groth16-material] -version = "0.2.3" -default-features = false -package = "taceo-groth16-material" - -[dependencies.poseidon2] -version = "0.2" -package = "taceo-poseidon2" - -[dependencies.rand] -version = "0.8" - -[dependencies.reqwest] -version = "0.12" -features = [ - "json", - "rustls-tls", - "json", -] -default-features = false - -[dependencies.ruint] -version = "1.17" -features = ["ark-ff-05"] - -[dependencies.secrecy] -version = "0.10" - -[dependencies.serde] -version = "1" -features = [ - "derive", - "derive", -] - -[dependencies.serde_json] -version = "1" - -[dependencies.taceo-oprf] -version = "0.7.1" -features = ["client"] -default-features = false - -[dependencies.thiserror] -version = "2" - -[dependencies.tokio] -version = "1" -features = ["macros"] -default-features = false - -[dependencies.world-id-primitives] -version = "0.5.2" -default-features = false - -[dependencies.world-id-proof] -version = "0.5.2" -default-features = false - -[dev-dependencies.backon] -version = "1" - -[dev-dependencies.mockito] -version = "1" - -[dev-dependencies.rand] -version = "0.8" - -[dev-dependencies.ruint] -version = "1.17" -features = ["ark-ff-05"] - -[target.'cfg(not(target_arch = "wasm32"))'.dependencies.alloy] -version = "1.7.3" -features = ["reqwest-rustls-tls"] -default-features = false - -[target.'cfg(not(target_arch = "wasm32"))'.dependencies.reqwest] -version = "0.12" -features = [ - "json", - "rustls-tls", - "rustls-tls", -] -default-features = false - -[target.'cfg(not(target_arch = "wasm32"))'.dependencies.rustls] -version = "0.23" -features = ["ring"] - -[target.'cfg(not(target_arch = "wasm32"))'.dependencies.tokio] -version = "1" -features = [ - "rt-multi-thread", - "net", -] -default-features = false - -[target.'cfg(not(target_arch = "wasm32"))'.dependencies.webpki-roots] -version = "1.0" diff --git a/vendor/world-id-authenticator/Cargo.toml.orig b/vendor/world-id-authenticator/Cargo.toml.orig deleted file mode 100644 index deb2ea665..000000000 --- a/vendor/world-id-authenticator/Cargo.toml.orig +++ /dev/null @@ -1,68 +0,0 @@ -[package] -name = "world-id-authenticator" -description = "World ID Credential crate" -publish = true -edition.workspace = true -version.workspace = true -license.workspace = true -authors.workspace = true -homepage.workspace = true -rust-version.workspace = true -repository.workspace = true -include = [ - "src/**/*", - "tests/**/*", - "abi/*", - "Cargo.toml", - "README.md", -] - -[features] -default = ["embed-zkeys"] -embed-zkeys = ["world-id-proof/embed-zkeys"] - -[dependencies] -# Use WASM-safe base features only -alloy = { workspace = true, features = [ - "sol-types", - "json", - "network", - "providers", - "contract", - "reqwest", -] } -anyhow = { workspace = true } -ark-babyjubjub = { workspace = true } -ark-serialize = { workspace = true } -groth16-material = { workspace = true } -reqwest = { workspace = true, features = ["json"] } -poseidon2 = { workspace = true } -eddsa-babyjubjub = { workspace = true } -eyre = { workspace = true } -world-id-primitives = { workspace = true } -secrecy = { workspace = true } -taceo-oprf = { workspace = true, features = ["client"] } -thiserror = { workspace = true } -tokio = { workspace = true, features = ["macros"] } -rand = { workspace = true } -backon = { workspace = true } -ruint = { workspace = true } -serde = { workspace = true, features = ["derive"] } -serde_json = { workspace = true } - -# Internal -world-id-proof = { workspace = true } - -# Native-only dependencies (not available on wasm32) -[target.'cfg(not(target_arch = "wasm32"))'.dependencies] -alloy = { workspace = true, features = ["reqwest-rustls-tls"] } -reqwest = { workspace = true, features = ["rustls-tls"] } -tokio = { workspace = true, features = ["rt-multi-thread", "net"] } -rustls = { workspace = true } -webpki-roots = { workspace = true } - -[dev-dependencies] -backon = { workspace = true } -ruint = { workspace = true } -rand = { workspace = true } -mockito = { workspace = true } diff --git a/vendor/world-id-authenticator/README.md b/vendor/world-id-authenticator/README.md deleted file mode 100644 index eb4dfe4c1..000000000 --- a/vendor/world-id-authenticator/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# World ID Authenticator - -World ID is an anonymous proof of human for the age of AI. - -This crate provides the functionality for a World ID Authenticator. - -More information can be found in the [World ID Developer Documentation](https://docs.world.org/world-id). diff --git a/vendor/world-id-authenticator/abi/WorldIDRegistryAbi.json b/vendor/world-id-authenticator/abi/WorldIDRegistryAbi.json deleted file mode 100644 index ccfbad4be..000000000 --- a/vendor/world-id-authenticator/abi/WorldIDRegistryAbi.json +++ /dev/null @@ -1,1901 +0,0 @@ -[ - { - "type": "constructor", - "inputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "CANCEL_RECOVERY_AGENT_UPDATE_TYPEHASH", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "EIP712_NAME", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "EIP712_VERSION", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "INITIATE_RECOVERY_AGENT_UPDATE_TYPEHASH", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "INSERT_AUTHENTICATOR_TYPEHASH", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "MAX_AUTHENTICATORS_HARD_LIMIT", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "RECOVER_ACCOUNT_TYPEHASH", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "REMOVE_AUTHENTICATOR_TYPEHASH", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "UPDATE_AUTHENTICATOR_TYPEHASH", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "UPGRADE_INTERFACE_VERSION", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "cancelRecoveryAgentUpdate", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "signature", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "nonce", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "createAccount", - "inputs": [ - { - "name": "recoveryAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "authenticatorAddresses", - "type": "address[]", - "internalType": "address[]" - }, - { - "name": "authenticatorPubkeys", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "offchainSignerCommitment", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "createManyAccounts", - "inputs": [ - { - "name": "recoveryAddresses", - "type": "address[]", - "internalType": "address[]" - }, - { - "name": "authenticatorAddresses", - "type": "address[][]", - "internalType": "address[][]" - }, - { - "name": "authenticatorPubkeys", - "type": "uint256[][]", - "internalType": "uint256[][]" - }, - { - "name": "offchainSignerCommitments", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "currentRoot", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "domainSeparatorV4", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "eip712Domain", - "inputs": [], - "outputs": [ - { - "name": "fields", - "type": "bytes1", - "internalType": "bytes1" - }, - { - "name": "name", - "type": "string", - "internalType": "string" - }, - { - "name": "version", - "type": "string", - "internalType": "string" - }, - { - "name": "chainId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "verifyingContract", - "type": "address", - "internalType": "address" - }, - { - "name": "salt", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "extensions", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "executeRecoveryAgentUpdate", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "getFeeRecipient", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getFeeToken", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getLatestRoot", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getMaxAuthenticators", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getNextLeafIndex", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getPackedAccountData", - "inputs": [ - { - "name": "authenticatorAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getPendingRecoveryAgentUpdate", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "newRecoveryAgent", - "type": "address", - "internalType": "address" - }, - { - "name": "executeAfter", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getProof", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRecoveryAgent", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRecoveryAgentUpdateCooldown", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRecoveryCounter", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRegistrationFee", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRootTimestamp", - "inputs": [ - { - "name": "root", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRootValidityWindow", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getSignatureNonce", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getTreeDepth", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "initialize", - "inputs": [ - { - "name": "initialTreeDepth", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "feeRecipient", - "type": "address", - "internalType": "address" - }, - { - "name": "feeToken", - "type": "address", - "internalType": "address" - }, - { - "name": "registrationFee", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "initiateRecoveryAgentUpdate", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "newRecoveryAgent", - "type": "address", - "internalType": "address" - }, - { - "name": "signature", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "nonce", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "insertAuthenticator", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "newAuthenticatorAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "pubkeyId", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "newAuthenticatorPubkey", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "oldOffchainSignerCommitment", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "newOffchainSignerCommitment", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "signature", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "nonce", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "isValidRoot", - "inputs": [ - { - "name": "root", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "recoverAccount", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "newAuthenticatorAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "newAuthenticatorPubkey", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "oldOffchainSignerCommitment", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "newOffchainSignerCommitment", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "signature", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "nonce", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "removeAuthenticator", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "authenticatorAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "pubkeyId", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "authenticatorPubkey", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "oldOffchainSignerCommitment", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "newOffchainSignerCommitment", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "signature", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "nonce", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setFeeRecipient", - "inputs": [ - { - "name": "newFeeRecipient", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setFeeToken", - "inputs": [ - { - "name": "newFeeToken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setMaxAuthenticators", - "inputs": [ - { - "name": "newMaxAuthenticators", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setRecoveryAgentUpdateCooldown", - "inputs": [ - { - "name": "newCooldown", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setRegistrationFee", - "inputs": [ - { - "name": "newFee", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setRootValidityWindow", - "inputs": [ - { - "name": "newWindow", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateAuthenticator", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "oldAuthenticatorAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "newAuthenticatorAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "pubkeyId", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "newAuthenticatorPubkey", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "oldOffchainSignerCommitment", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "newOffchainSignerCommitment", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "signature", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "nonce", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "event", - "name": "AccountCreated", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "recoveryAddress", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "authenticatorAddresses", - "type": "address[]", - "indexed": false, - "internalType": "address[]" - }, - { - "name": "authenticatorPubkeys", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - }, - { - "name": "offchainSignerCommitment", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "AccountRecovered", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "newAuthenticatorAddress", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newAuthenticatorPubkey", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "oldOffchainSignerCommitment", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newOffchainSignerCommitment", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "AccountUpdated", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "pubkeyId", - "type": "uint32", - "indexed": false, - "internalType": "uint32" - }, - { - "name": "newAuthenticatorPubkey", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "oldAuthenticatorAddress", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newAuthenticatorAddress", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "oldOffchainSignerCommitment", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newOffchainSignerCommitment", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "AuthenticatorInserted", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "pubkeyId", - "type": "uint32", - "indexed": false, - "internalType": "uint32" - }, - { - "name": "authenticatorAddress", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newAuthenticatorPubkey", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "oldOffchainSignerCommitment", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newOffchainSignerCommitment", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "AuthenticatorRemoved", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "pubkeyId", - "type": "uint32", - "indexed": false, - "internalType": "uint32" - }, - { - "name": "authenticatorAddress", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "authenticatorPubkey", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "oldOffchainSignerCommitment", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newOffchainSignerCommitment", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "EIP712DomainChanged", - "inputs": [], - "anonymous": false - }, - { - "type": "event", - "name": "FeeRecipientUpdated", - "inputs": [ - { - "name": "oldRecipient", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newRecipient", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "FeeTokenUpdated", - "inputs": [ - { - "name": "oldToken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newToken", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "MaxAuthenticatorsUpdated", - "inputs": [ - { - "name": "oldMax", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "newMax", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RecoveryAgentUpdateCancelled", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "cancelledRecoveryAgent", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RecoveryAgentUpdateCooldownUpdated", - "inputs": [ - { - "name": "oldCooldown", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "newCooldown", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RecoveryAgentUpdateExecuted", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "oldRecoveryAgent", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newRecoveryAgent", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RecoveryAgentUpdateInitiated", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "oldRecoveryAgent", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newRecoveryAgent", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "executeAfter", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RegistrationFeeUpdated", - "inputs": [ - { - "name": "oldFee", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newFee", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RootRecorded", - "inputs": [ - { - "name": "root", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "timestamp", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RootValidityWindowUpdated", - "inputs": [ - { - "name": "oldWindow", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newWindow", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "AccountDoesNotExist", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "type": "error", - "name": "AddressEmptyCode", - "inputs": [ - { - "name": "target", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "AlreadyInitialized", - "inputs": [] - }, - { - "type": "error", - "name": "AuthenticatorAddressAlreadyInUse", - "inputs": [ - { - "name": "authenticatorAddress", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "AuthenticatorAlreadyExists", - "inputs": [ - { - "name": "authenticatorAddress", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "AuthenticatorDoesNotBelongToAccount", - "inputs": [ - { - "name": "expectedLeafIndex", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "actualLeafIndex", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "type": "error", - "name": "AuthenticatorDoesNotExist", - "inputs": [ - { - "name": "authenticatorAddress", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "BitmapOverflow", - "inputs": [] - }, - { - "type": "error", - "name": "DepthNotSupported", - "inputs": [] - }, - { - "type": "error", - "name": "ECDSAInvalidSignature", - "inputs": [] - }, - { - "type": "error", - "name": "ECDSAInvalidSignatureLength", - "inputs": [ - { - "name": "length", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "ECDSAInvalidSignatureS", - "inputs": [ - { - "name": "s", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "ERC1967InvalidImplementation", - "inputs": [ - { - "name": "implementation", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "ERC1967NonPayable", - "inputs": [] - }, - { - "type": "error", - "name": "EmptyAddressArray", - "inputs": [] - }, - { - "type": "error", - "name": "FailedCall", - "inputs": [] - }, - { - "type": "error", - "name": "ImplementationNotInitialized", - "inputs": [] - }, - { - "type": "error", - "name": "InsufficientFunds", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidInitialization", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidSignature", - "inputs": [] - }, - { - "type": "error", - "name": "LeafDoesNotExist", - "inputs": [] - }, - { - "type": "error", - "name": "LeafIndexOutOfRange", - "inputs": [] - }, - { - "type": "error", - "name": "MismatchedAuthenticatorSigner", - "inputs": [ - { - "name": "expectedAuthenticatorAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "actualAuthenticatorAddress", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "MismatchedLeafIndex", - "inputs": [ - { - "name": "expectedLeafIndex", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "actualLeafIndex", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "type": "error", - "name": "MismatchedPubkeyId", - "inputs": [ - { - "name": "expectedPubkeyId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "actualPubkeyId", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "MismatchedRecoveryCounter", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "expectedRecoveryCounter", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "actualRecoveryCounter", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "MismatchedSignatureNonce", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "expectedNonce", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "actualNonce", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "MismatchingArrayLengths", - "inputs": [] - }, - { - "type": "error", - "name": "NewLeafCannotEqualOldLeaf", - "inputs": [] - }, - { - "type": "error", - "name": "NoPendingRecoveryAgentUpdate", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "type": "error", - "name": "NotInitializing", - "inputs": [] - }, - { - "type": "error", - "name": "OwnableInvalidOwner", - "inputs": [ - { - "name": "owner", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "OwnableUnauthorizedAccount", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "OwnerMaxAuthenticatorsOutOfBounds", - "inputs": [] - }, - { - "type": "error", - "name": "PubkeyIdDoesNotExist", - "inputs": [] - }, - { - "type": "error", - "name": "PubkeyIdInUse", - "inputs": [] - }, - { - "type": "error", - "name": "PubkeyIdOutOfBounds", - "inputs": [] - }, - { - "type": "error", - "name": "PubkeyIdOverflow", - "inputs": [ - { - "name": "pubkeyId", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "RecoveryAddressNotSet", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "type": "error", - "name": "RecoveryAgentUpdateStillInCooldown", - "inputs": [ - { - "name": "leafIndex", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "executeAfter", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "RecoveryCounterOverflow", - "inputs": [] - }, - { - "type": "error", - "name": "RecoveryNotEnabled", - "inputs": [] - }, - { - "type": "error", - "name": "ReusedAuthenticatorAddress", - "inputs": [] - }, - { - "type": "error", - "name": "SafeERC20FailedOperation", - "inputs": [ - { - "name": "token", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "TreeIsFull", - "inputs": [] - }, - { - "type": "error", - "name": "UUPSUnauthorizedCallContext", - "inputs": [] - }, - { - "type": "error", - "name": "UUPSUnsupportedProxiableUUID", - "inputs": [ - { - "name": "slot", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "ValueGreaterThanSnarkScalarField", - "inputs": [] - }, - { - "type": "error", - "name": "WrongDefaultZeroIndex", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroAddress", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroRecoveredSignatureAddress", - "inputs": [] - } -] diff --git a/vendor/world-id-authenticator/src/api_types.rs b/vendor/world-id-authenticator/src/api_types.rs deleted file mode 100644 index df81321c7..000000000 --- a/vendor/world-id-authenticator/src/api_types.rs +++ /dev/null @@ -1 +0,0 @@ -pub use world_id_primitives::api_types::*; diff --git a/vendor/world-id-authenticator/src/authenticator.rs b/vendor/world-id-authenticator/src/authenticator.rs deleted file mode 100644 index 67b6f7b85..000000000 --- a/vendor/world-id-authenticator/src/authenticator.rs +++ /dev/null @@ -1,1578 +0,0 @@ -//! This module contains all the base functionality to support Authenticators in World ID. -//! -//! An Authenticator is the application layer with which a user interacts with the Protocol. - -use std::sync::Arc; - -use crate::api_types::{ - AccountInclusionProof, CreateAccountRequest, GatewayRequestState, GatewayStatusResponse, - IndexerAuthenticatorPubkeysResponse, IndexerErrorCode, IndexerPackedAccountRequest, - IndexerPackedAccountResponse, IndexerQueryRequest, IndexerSignatureNonceResponse, - InsertAuthenticatorRequest, RemoveAuthenticatorRequest, ServiceApiError, - UpdateAuthenticatorRequest, -}; -use world_id_primitives::{ - Credential, FieldElement, ProofRequest, RequestItem, ResponseItem, SessionNullifier, Signer, -}; - -use crate::registry::{ - WorldIdRegistry::WorldIdRegistryInstance, domain, sign_insert_authenticator, - sign_remove_authenticator, sign_update_authenticator, -}; -use alloy::{ - primitives::{Address, U256}, - providers::DynProvider, - signers::{Signature, SignerSync}, - uint, -}; -use ark_serialize::CanonicalSerialize; -use eddsa_babyjubjub::{EdDSAPublicKey, EdDSASignature}; -use groth16_material::circom::CircomGroth16Material; -use reqwest::StatusCode; -use secrecy::ExposeSecret; -use taceo_oprf::client::Connector; -pub use world_id_primitives::{Config, TREE_DEPTH, authenticator::ProtocolSigner}; -use world_id_primitives::{ - PrimitiveError, ZeroKnowledgeProof, - authenticator::{ - AuthenticatorPublicKeySet, SparseAuthenticatorPubkeysError, - decode_sparse_authenticator_pubkeys, - }, - merkle::MerkleInclusionProof, -}; -use world_id_proof::{ - AuthenticatorProofInput, - credential_blinding_factor::OprfCredentialBlindingFactor, - nullifier::OprfNullifier, - proof::{ProofError, generate_nullifier_proof}, -}; - -static MASK_RECOVERY_COUNTER: U256 = - uint!(0xFFFFFFFF00000000000000000000000000000000000000000000000000000000_U256); -static MASK_PUBKEY_ID: U256 = - uint!(0x00000000FFFFFFFF000000000000000000000000000000000000000000000000_U256); -static MASK_LEAF_INDEX: U256 = - uint!(0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF_U256); - -/// An Authenticator is the base layer with which a user interacts with the Protocol. -pub struct Authenticator { - /// General configuration for the Authenticator. - pub config: Config, - /// The packed account data for the holder's World ID is a `uint256` defined in the `WorldIDRegistry` contract as: - /// `recovery_counter` (32 bits) | `pubkey_id` (commitment to all off-chain public keys) (32 bits) | `leaf_index` (192 bits) - pub packed_account_data: U256, - signer: Signer, - registry: Option>>, - http_client: reqwest::Client, - ws_connector: Connector, - query_material: Arc, - nullifier_material: Arc, -} - -#[expect(clippy::missing_fields_in_debug)] -impl std::fmt::Debug for Authenticator { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("Authenticator") - .field("config", &self.config) - .field("packed_account_data", &self.packed_account_data) - .field("signer", &self.signer) - .finish() - } -} - -impl Authenticator { - async fn response_body_or_fallback(response: reqwest::Response) -> String { - response - .text() - .await - .unwrap_or_else(|e| format!("Unable to read response body: {e}")) - } - - /// Initialize an Authenticator from a seed and config. - /// - /// This method will error if the World ID account does not exist on the registry. - /// - /// # Errors - /// - Will error if the provided seed is invalid (not 32 bytes). - /// - Will error if the RPC URL is invalid. - /// - Will error if there are contract call failures. - /// - Will error if the account does not exist (`AccountDoesNotExist`). - pub async fn init( - seed: &[u8], - config: Config, - query_material: Arc, - nullifier_material: Arc, - ) -> Result { - let signer = Signer::from_seed_bytes(seed)?; - - let registry: Option>> = - config.rpc_url().map(|rpc_url| { - let provider = alloy::providers::ProviderBuilder::new() - .with_chain_id(config.chain_id()) - .connect_http(rpc_url.clone()); - Arc::new(crate::registry::WorldIdRegistry::new( - *config.registry_address(), - alloy::providers::Provider::erased(provider), - )) - }); - - let http_client = reqwest::Client::new(); - - let packed_account_data = Self::get_packed_account_data( - signer.onchain_signer_address(), - registry.as_deref(), - &config, - &http_client, - ) - .await?; - - #[cfg(not(target_arch = "wasm32"))] - let ws_connector = { - let mut root_store = rustls::RootCertStore::empty(); - root_store.extend(webpki_roots::TLS_SERVER_ROOTS.iter().cloned()); - let rustls_config = rustls::ClientConfig::builder() - .with_root_certificates(root_store) - .with_no_client_auth(); - Connector::Rustls(Arc::new(rustls_config)) - }; - - #[cfg(target_arch = "wasm32")] - let ws_connector = Connector; - - Ok(Self { - packed_account_data, - signer, - config, - registry, - http_client, - ws_connector, - query_material, - nullifier_material, - }) - } - - /// Registers a new World ID in the `WorldIDRegistry`. - /// - /// Given the registration process is asynchronous, this method will return a `InitializingAuthenticator` - /// object. - /// - /// # Errors - /// - See `init` for additional error details. - pub async fn register( - seed: &[u8], - config: Config, - recovery_address: Option
, - ) -> Result { - let http_client = reqwest::Client::new(); - InitializingAuthenticator::new(seed, config, recovery_address, http_client).await - } - - /// Initializes (if the World ID already exists in the registry) or registers a new World ID. - /// - /// The registration process is asynchronous and may take some time. This method will block - /// the thread until the registration is in a final state (success or terminal error). For better - /// user experience in end authenticator clients, it is recommended to implement custom polling logic. - /// - /// Explicit `init` or `register` calls are also recommended as the authenticator should know - /// if a new World ID should be truly created. For example, an authenticator may have been revoked - /// access to an existing World ID. - /// - /// # Errors - /// - See `init` for additional error details. - pub async fn init_or_register( - seed: &[u8], - config: Config, - query_material: Arc, - nullifier_material: Arc, - recovery_address: Option
, - ) -> Result { - match Self::init( - seed, - config.clone(), - query_material.clone(), - nullifier_material.clone(), - ) - .await - { - Ok(authenticator) => Ok(authenticator), - Err(AuthenticatorError::AccountDoesNotExist) => { - // Authenticator is not registered, create it. - let http_client = reqwest::Client::new(); - let initializing_authenticator = InitializingAuthenticator::new( - seed, - config.clone(), - recovery_address, - http_client, - ) - .await?; - - let backoff = backon::ExponentialBuilder::default() - .with_min_delay(std::time::Duration::from_millis(800)) - .with_factor(1.5) - .without_max_times() - .with_total_delay(Some(std::time::Duration::from_secs(120))); - - let poller = || async { - let poll_status = initializing_authenticator.poll_status().await; - let result = match poll_status { - Ok(GatewayRequestState::Finalized { .. }) => Ok(()), - Ok(GatewayRequestState::Failed { error_code, error }) => Err( - PollResult::TerminalError(AuthenticatorError::RegistrationError { - error_code: error_code.map(|v| v.to_string()).unwrap_or_default(), - error_message: error, - }), - ), - Err(AuthenticatorError::GatewayError { status, body }) => { - if status.is_client_error() { - Err(PollResult::TerminalError( - AuthenticatorError::GatewayError { status, body }, - )) - } else { - Err(PollResult::Retryable) - } - } - _ => Err(PollResult::Retryable), - }; - - match result { - Ok(()) => match Self::init( - seed, - config.clone(), - query_material.clone(), - nullifier_material.clone(), - ) - .await - { - Ok(auth) => Ok(auth), - Err(AuthenticatorError::AccountDoesNotExist) => { - Err(PollResult::Retryable) - } - Err(e) => Err(PollResult::TerminalError(e)), - }, - Err(e) => Err(e), - } - }; - - let result = backon::Retryable::retry(poller, backoff) - .when(|e| matches!(e, PollResult::Retryable)) - .await; - - match result { - Ok(authenticator) => Ok(authenticator), - Err(PollResult::TerminalError(e)) => Err(e), - Err(PollResult::Retryable) => Err(AuthenticatorError::Timeout), - } - } - Err(e) => Err(e), - } - } - - /// Returns the packed account data for the holder's World ID. - /// - /// The packed account data is a 256 bit integer which includes the World ID's leaf index, their recovery counter, - /// and their pubkey id/commitment. - /// - /// # Errors - /// Will error if the network call fails or if the account does not exist. - pub async fn get_packed_account_data( - onchain_signer_address: Address, - registry: Option<&WorldIdRegistryInstance>, - config: &Config, - http_client: &reqwest::Client, - ) -> Result { - // If the registry is available through direct RPC calls, use it. Otherwise fallback to the indexer. - let raw_index = if let Some(registry) = registry { - // TODO: Better error handling to expose the specific failure - registry - .getPackedAccountData(onchain_signer_address) - .call() - .await? - } else { - let url = format!("{}/packed-account", config.indexer_url()); - let req = IndexerPackedAccountRequest { - authenticator_address: onchain_signer_address, - }; - let resp = http_client.post(&url).json(&req).send().await?; - let status = resp.status(); - if !status.is_success() { - let body = Self::response_body_or_fallback(resp).await; - if let Ok(error_resp) = - serde_json::from_str::>(&body) - { - return match error_resp.code { - IndexerErrorCode::AccountDoesNotExist => { - Err(AuthenticatorError::AccountDoesNotExist) - } - _ => Err(AuthenticatorError::IndexerError { - status, - body: error_resp.message, - }), - }; - } - return Err(AuthenticatorError::IndexerError { status, body }); - } - - let response: IndexerPackedAccountResponse = resp.json().await?; - response.packed_account_data - }; - - if raw_index == U256::ZERO { - return Err(AuthenticatorError::AccountDoesNotExist); - } - - Ok(raw_index) - } - - /// Returns the k256 public key of the Authenticator signer which is used to verify on-chain operations, - /// chiefly with the `WorldIdRegistry` contract. - #[must_use] - pub const fn onchain_address(&self) -> Address { - self.signer.onchain_signer_address() - } - - /// Returns the `EdDSA` public key of the Authenticator signer which is used to verify off-chain operations. For example, - /// the Nullifier Oracle uses it to verify requests for nullifiers. - #[must_use] - pub fn offchain_pubkey(&self) -> EdDSAPublicKey { - self.signer.offchain_signer_pubkey() - } - - /// Returns the compressed `EdDSA` public key of the Authenticator signer which is used to verify off-chain operations. - /// For example, the Nullifier Oracle uses it to verify requests for nullifiers. - /// # Errors - /// Will error if the public key cannot be serialized. - pub fn offchain_pubkey_compressed(&self) -> Result { - let pk = self.signer.offchain_signer_pubkey().pk; - let mut compressed_bytes = Vec::new(); - pk.serialize_compressed(&mut compressed_bytes) - .map_err(|e| PrimitiveError::Serialization(e.to_string()))?; - Ok(U256::from_le_slice(&compressed_bytes)) - } - - /// Returns a reference to the `WorldIdRegistry` contract instance. - #[must_use] - pub fn registry(&self) -> Option>> { - self.registry.clone() - } - - /// Returns the index for the holder's World ID. - /// - /// # Definition - /// - /// The `leaf_index` is the main (internal) identifier of a World ID. It is registered in - /// the `WorldIDRegistry` and represents the index at the Merkle tree where the World ID - /// resides. - /// - /// # Notes - /// - The `leaf_index` is used as input in the nullifier generation, ensuring a nullifier - /// will always be the same for the same RP context and the same World ID (allowing for uniqueness). - /// - The `leaf_index` is generally not exposed outside Authenticators. It is not a secret because - /// it's not exposed to RPs outside ZK-circuits, but the only acceptable exposure outside an Authenticator - /// is to fetch Merkle inclusion proofs from an indexer or it may create a pseudonymous identifier. - /// - The `leaf_index` is stored as a `uint64` inside packed account data. - #[must_use] - pub fn leaf_index(&self) -> u64 { - (self.packed_account_data & MASK_LEAF_INDEX).to::() - } - - /// Returns the recovery counter for the holder's World ID. - /// - /// The recovery counter is used to efficiently invalidate all the old keys when an account is recovered. - #[must_use] - pub fn recovery_counter(&self) -> U256 { - let recovery_counter = self.packed_account_data & MASK_RECOVERY_COUNTER; - recovery_counter >> 224 - } - - /// Returns the pubkey id (or commitment) for the holder's World ID. - /// - /// This is a commitment to all the off-chain public keys that are authorized to act on behalf of the holder. - #[must_use] - pub fn pubkey_id(&self) -> U256 { - let pubkey_id = self.packed_account_data & MASK_PUBKEY_ID; - pubkey_id >> 192 - } - - /// Fetches a Merkle inclusion proof for the holder's World ID given their account index. - /// - /// # Errors - /// - Will error if the provided indexer URL is not valid or if there are HTTP call failures. - /// - Will error if the user is not registered on the `WorldIDRegistry`. - pub async fn fetch_inclusion_proof( - &self, - ) -> Result<(MerkleInclusionProof, AuthenticatorPublicKeySet), AuthenticatorError> - { - let url = format!("{}/inclusion-proof", self.config.indexer_url()); - let req = IndexerQueryRequest { - leaf_index: self.leaf_index(), - }; - let response = self.http_client.post(&url).json(&req).send().await?; - let status = response.status(); - if !status.is_success() { - return Err(AuthenticatorError::IndexerError { - status, - body: Self::response_body_or_fallback(response).await, - }); - } - let response = response.json::>().await?; - - Ok((response.inclusion_proof, response.authenticator_pubkeys)) - } - - /// Fetches the current authenticator public key set for the account. - /// - /// This is used by mutation operations to compute old/new offchain signer commitments - /// without requiring Merkle proof generation. - /// - /// # Errors - /// - Will error if the provided indexer URL is not valid or if there are HTTP call failures. - /// - Will error if the user is not registered on the `WorldIDRegistry`. - pub async fn fetch_authenticator_pubkeys( - &self, - ) -> Result { - let url = format!("{}/authenticator-pubkeys", self.config.indexer_url()); - let req = IndexerQueryRequest { - leaf_index: self.leaf_index(), - }; - let response = self.http_client.post(&url).json(&req).send().await?; - let status = response.status(); - if !status.is_success() { - return Err(AuthenticatorError::IndexerError { - status, - body: Self::response_body_or_fallback(response).await, - }); - } - let response = response - .json::() - .await?; - Self::decode_indexer_pubkeys(response.authenticator_pubkeys) - } - - /// Returns the signing nonce for the holder's World ID. - /// - /// # Errors - /// Will return an error if the registry contract call fails. - pub async fn signing_nonce(&self) -> Result { - let registry = self.registry(); - if let Some(registry) = registry { - let nonce = registry.getSignatureNonce(self.leaf_index()).call().await?; - Ok(nonce) - } else { - let url = format!("{}/signature-nonce", self.config.indexer_url()); - let req = IndexerQueryRequest { - leaf_index: self.leaf_index(), - }; - let resp = self.http_client.post(&url).json(&req).send().await?; - - let status = resp.status(); - if !status.is_success() { - return Err(AuthenticatorError::IndexerError { - status, - body: Self::response_body_or_fallback(resp).await, - }); - } - - let response: IndexerSignatureNonceResponse = resp.json().await?; - Ok(response.signature_nonce) - } - } - - /// Signs an arbitrary challenge with the authenticator's on-chain key following - /// [ERC-191](https://eips.ethereum.org/EIPS/eip-191). - /// - /// # Warning - /// This is considered a dangerous operation because it leaks the user's on-chain key, - /// hence its `leaf_index`. The only acceptable use is to prove the user's `leaf_index` - /// to a Recovery Agent. The Recovery Agent is the only party beyond the user who needs - /// to know the `leaf_index`. - /// - /// # Use - /// - This method is used to prove ownership over a leaf index **only for Recovery Agents**. - pub fn danger_sign_challenge( - &mut self, - challenge: &[u8], - ) -> Result { - self.signer - .onchain_signer() - .sign_message_sync(challenge) - .map_err(|e| AuthenticatorError::Generic(format!("signature error: {e}"))) - } - - /// Checks that the OPRF Nodes configuration is valid and returns the list of URLs and the threshold to use. - /// - /// # Errors - /// Will return an error if there are no OPRF Nodes configured or if the threshold is invalid. - fn check_oprf_config(&self) -> Result<(&[String], usize), AuthenticatorError> { - let services = self.config.nullifier_oracle_urls(); - if services.is_empty() { - return Err(AuthenticatorError::Generic( - "No nullifier oracle URLs configured".to_string(), - )); - } - let requested_threshold = self.config.nullifier_oracle_threshold(); - if requested_threshold == 0 { - return Err(AuthenticatorError::InvalidConfig { - attribute: "nullifier_oracle_threshold", - reason: "must be at least 1".to_string(), - }); - } - let threshold = requested_threshold.min(services.len()); - Ok((services, threshold)) - } - - fn decode_indexer_pubkeys( - pubkeys: Vec>, - ) -> Result { - decode_sparse_authenticator_pubkeys(pubkeys).map_err(|e| match e { - SparseAuthenticatorPubkeysError::SlotOutOfBounds { - slot_index, - max_supported_slot, - } => AuthenticatorError::InvalidIndexerPubkeySlot { - slot_index, - max_supported_slot, - }, - SparseAuthenticatorPubkeysError::InvalidCompressedPubkey { slot_index, reason } => { - PrimitiveError::Deserialization(format!( - "invalid authenticator public key returned by indexer at slot {slot_index}: {reason}" - )) - .into() - } - }) - } - - fn insert_or_reuse_authenticator_key( - key_set: &mut AuthenticatorPublicKeySet, - new_authenticator_pubkey: EdDSAPublicKey, - ) -> Result { - if let Some(index) = key_set.iter().position(Option::is_none) { - key_set.try_set_at_index(index, new_authenticator_pubkey)?; - Ok(index) - } else { - key_set.try_push(new_authenticator_pubkey)?; - Ok(key_set.len() - 1) - } - } - - /// Generates a nullifier for a World ID Proof (through OPRF Nodes). - /// - /// A nullifier is a unique, one-time use, anonymous identifier for a World ID - /// on a specific RP context. It is used to ensure that a single World ID can only - /// perform an action once. - /// - /// # Errors - /// - /// - Will raise a [`ProofError`] if there is any issue generating the nullifier. For example, - /// network issues, unexpected incorrect responses from OPRF Nodes. - /// - Raises an error if the OPRF Nodes configuration is not correctly set. - pub async fn generate_nullifier( - &self, - proof_request: &ProofRequest, - inclusion_proof: MerkleInclusionProof, - key_set: AuthenticatorPublicKeySet, - ) -> Result { - let (services, threshold) = self.check_oprf_config()?; - let key_index = key_set - .iter() - .position(|pk| { - pk.as_ref() - .is_some_and(|pk| pk.pk == self.offchain_pubkey().pk) - }) - .ok_or(AuthenticatorError::PublicKeyNotFound)? as u64; - - let authenticator_input = AuthenticatorProofInput::new( - key_set, - inclusion_proof, - self.signer - .offchain_signer_private_key() - .expose_secret() - .clone(), - key_index, - ); - - Ok(OprfNullifier::generate( - services, - threshold, - &self.query_material, - authenticator_input, - proof_request, - self.ws_connector.clone(), - ) - .await?) - } - - // TODO add more docs - /// Generates a blinding factor for a Credential sub (through OPRF Nodes). - /// - /// # Errors - /// - /// - Will raise a [`ProofError`] if there is any issue generating the blinding factor. - /// For example, network issues, unexpected incorrect responses from OPRF Nodes. - /// - Raises an error if the OPRF Nodes configuration is not correctly set. - pub async fn generate_credential_blinding_factor( - &self, - issuer_schema_id: u64, - ) -> Result { - let (services, threshold) = self.check_oprf_config()?; - - let (inclusion_proof, key_set) = self.fetch_inclusion_proof().await?; - let key_index = key_set - .iter() - .position(|pk| { - pk.as_ref() - .is_some_and(|pk| pk.pk == self.offchain_pubkey().pk) - }) - .ok_or(AuthenticatorError::PublicKeyNotFound)? as u64; - - let authenticator_input = AuthenticatorProofInput::new( - key_set, - inclusion_proof, - self.signer - .offchain_signer_private_key() - .expose_secret() - .clone(), - key_index, - ); - - let blinding_factor = OprfCredentialBlindingFactor::generate( - services, - threshold, - &self.query_material, - authenticator_input, - issuer_schema_id, - FieldElement::ZERO, // for now action is always zero, might change in future - self.ws_connector.clone(), - ) - .await?; - - Ok(blinding_factor.verifiable_oprf_output.output.into()) - } - - /// Generates a single World ID Proof from a provided `[ProofRequest]` and `[Credential]`. This - /// method generates the raw proof to be translated into a Uniqueness Proof or a Session Proof for the RP. - /// - /// This assumes the RP's `[ProofRequest]` has already been parsed to determine - /// which `[Credential]` is appropriate for the request. This method responds to a - /// specific `[RequestItem]` (a `[ProofRequest]` may contain multiple items). - /// - /// # Arguments - /// - `oprf_nullifier`: The `[OprfNullifier]` output generated from the `generate_nullifier` function. - /// - `request_item`: The specific `RequestItem` that is being resolved from the RP's `ProofRequest`. - /// - `credential`: The Credential to be used for the proof that fulfills the `RequestItem`. - /// - `credential_sub_blinding_factor`: The blinding factor for the Credential's sub. - /// - `session_id_r_seed`: The session ID random seed. Obtained from the RP's [`ProofRequest`]. - /// - `session_id`: The expected session ID provided by the RP. Only needed for Session Proofs. Obtained from the RP's [`ProofRequest`]. - /// - `request_timestamp`: The timestamp of the request. Obtained from the RP's [`ProofRequest`]. - /// - /// # Errors - /// - Will error if the any of the provided parameters are not valid. - /// - Will error if any of the required network requests fail. - /// - Will error if the user does not have a registered World ID. - #[allow(clippy::too_many_arguments)] - pub fn generate_single_proof( - &self, - oprf_nullifier: OprfNullifier, - request_item: &RequestItem, - credential: &Credential, - credential_sub_blinding_factor: FieldElement, - session_id_r_seed: FieldElement, - session_id: Option, - request_timestamp: u64, - ) -> Result { - let mut rng = rand::rngs::OsRng; - - let merkle_root: FieldElement = oprf_nullifier.query_proof_input.merkle_root.into(); - let action_from_query: FieldElement = oprf_nullifier.query_proof_input.action.into(); - - let expires_at_min = request_item.effective_expires_at_min(request_timestamp); - - let (proof, _public_inputs, nullifier) = generate_nullifier_proof( - &self.nullifier_material, - &mut rng, - credential, - credential_sub_blinding_factor, - oprf_nullifier, - request_item, - session_id, - session_id_r_seed, - expires_at_min, - )?; - - let proof = ZeroKnowledgeProof::from_groth16_proof(&proof, merkle_root); - - // Construct the appropriate response item based on proof type - let nullifier_fe: FieldElement = nullifier.into(); - let response_item = if session_id.is_some() { - let session_nullifier = SessionNullifier::new(nullifier_fe, action_from_query); - ResponseItem::new_session( - request_item.identifier.clone(), - request_item.issuer_schema_id, - proof, - session_nullifier, - expires_at_min, - ) - } else { - ResponseItem::new_uniqueness( - request_item.identifier.clone(), - request_item.issuer_schema_id, - proof, - nullifier_fe.into(), - expires_at_min, - ) - }; - - Ok(response_item) - } - - /// Inserts a new authenticator to the account. - /// - /// # Errors - /// Will error if the provided RPC URL is not valid or if there are HTTP call failures. - /// - /// # Note - /// TODO: After successfully inserting an authenticator, the `packed_account_data` should be - /// refreshed from the registry to reflect the new `pubkey_id` commitment. - pub async fn insert_authenticator( - &mut self, - new_authenticator_pubkey: EdDSAPublicKey, - new_authenticator_address: Address, - ) -> Result { - let leaf_index = self.leaf_index(); - let nonce = self.signing_nonce().await?; - let mut key_set = self.fetch_authenticator_pubkeys().await?; - let old_offchain_signer_commitment = key_set.leaf_hash(); - let encoded_offchain_pubkey = new_authenticator_pubkey.to_ethereum_representation()?; - let index = - Self::insert_or_reuse_authenticator_key(&mut key_set, new_authenticator_pubkey)?; - let new_offchain_signer_commitment = key_set.leaf_hash(); - - let eip712_domain = domain(self.config.chain_id(), *self.config.registry_address()); - - #[allow(clippy::cast_possible_truncation)] - // truncating is intentional, and index will always fit in 32 bits - let signature = sign_insert_authenticator( - &self.signer.onchain_signer(), - leaf_index, - new_authenticator_address, - index as u32, - encoded_offchain_pubkey, - new_offchain_signer_commitment.into(), - nonce, - &eip712_domain, - ) - .await - .map_err(|e| { - AuthenticatorError::Generic(format!("Failed to sign insert authenticator: {e}")) - })?; - - #[allow(clippy::cast_possible_truncation)] - // truncating is intentional, and index will always fit in 32 bits - let req = InsertAuthenticatorRequest { - leaf_index, - new_authenticator_address, - pubkey_id: index as u32, - new_authenticator_pubkey: encoded_offchain_pubkey, - old_offchain_signer_commitment: old_offchain_signer_commitment.into(), - new_offchain_signer_commitment: new_offchain_signer_commitment.into(), - signature: signature.as_bytes().to_vec(), - nonce, - }; - - let resp = self - .http_client - .post(format!( - "{}/insert-authenticator", - self.config.gateway_url() - )) - .json(&req) - .send() - .await?; - - let status = resp.status(); - if status.is_success() { - let body: GatewayStatusResponse = resp.json().await?; - Ok(body.request_id) - } else { - let body_text = Self::response_body_or_fallback(resp).await; - Err(AuthenticatorError::GatewayError { - status, - body: body_text, - }) - } - } - - /// Updates an existing authenticator slot with a new authenticator. - /// - /// # Errors - /// Returns an error if the gateway rejects the request or a network error occurs. - /// - /// # Note - /// TODO: After successfully updating an authenticator, the `packed_account_data` should be - /// refreshed from the registry to reflect the new `pubkey_id` commitment. - pub async fn update_authenticator( - &mut self, - old_authenticator_address: Address, - new_authenticator_address: Address, - new_authenticator_pubkey: EdDSAPublicKey, - index: u32, - ) -> Result { - let leaf_index = self.leaf_index(); - let nonce = self.signing_nonce().await?; - let mut key_set = self.fetch_authenticator_pubkeys().await?; - let old_commitment: U256 = key_set.leaf_hash().into(); - let encoded_offchain_pubkey = new_authenticator_pubkey.to_ethereum_representation()?; - key_set.try_set_at_index(index as usize, new_authenticator_pubkey)?; - let new_commitment: U256 = key_set.leaf_hash().into(); - - let eip712_domain = domain(self.config.chain_id(), *self.config.registry_address()); - - let signature = sign_update_authenticator( - &self.signer.onchain_signer(), - leaf_index, - old_authenticator_address, - new_authenticator_address, - index, - encoded_offchain_pubkey, - new_commitment, - nonce, - &eip712_domain, - ) - .await - .map_err(|e| { - AuthenticatorError::Generic(format!("Failed to sign update authenticator: {e}")) - })?; - - let req = UpdateAuthenticatorRequest { - leaf_index, - old_authenticator_address, - new_authenticator_address, - old_offchain_signer_commitment: old_commitment, - new_offchain_signer_commitment: new_commitment, - signature: signature.as_bytes().to_vec(), - nonce, - pubkey_id: index, - new_authenticator_pubkey: encoded_offchain_pubkey, - }; - - let resp = self - .http_client - .post(format!( - "{}/update-authenticator", - self.config.gateway_url() - )) - .json(&req) - .send() - .await?; - - let status = resp.status(); - if status.is_success() { - let gateway_resp: GatewayStatusResponse = resp.json().await?; - Ok(gateway_resp.request_id) - } else { - let body_text = Self::response_body_or_fallback(resp).await; - Err(AuthenticatorError::GatewayError { - status, - body: body_text, - }) - } - } - - /// Removes an authenticator from the account. - /// - /// # Errors - /// Returns an error if the gateway rejects the request or a network error occurs. - /// - /// # Note - /// TODO: After successfully removing an authenticator, the `packed_account_data` should be - /// refreshed from the registry to reflect the new `pubkey_id` commitment. - pub async fn remove_authenticator( - &mut self, - authenticator_address: Address, - index: u32, - ) -> Result { - let leaf_index = self.leaf_index(); - let nonce = self.signing_nonce().await?; - let mut key_set = self.fetch_authenticator_pubkeys().await?; - let old_commitment: U256 = key_set.leaf_hash().into(); - let existing_pubkey = key_set - .get(index as usize) - .ok_or(AuthenticatorError::PublicKeyNotFound)?; - - let encoded_old_offchain_pubkey = existing_pubkey.to_ethereum_representation()?; - - key_set.try_clear_at_index(index as usize)?; - let new_commitment: U256 = key_set.leaf_hash().into(); - - let eip712_domain = domain(self.config.chain_id(), *self.config.registry_address()); - - let signature = sign_remove_authenticator( - &self.signer.onchain_signer(), - leaf_index, - authenticator_address, - index, - encoded_old_offchain_pubkey, - new_commitment, - nonce, - &eip712_domain, - ) - .await - .map_err(|e| { - AuthenticatorError::Generic(format!("Failed to sign remove authenticator: {e}")) - })?; - - let req = RemoveAuthenticatorRequest { - leaf_index, - authenticator_address, - old_offchain_signer_commitment: old_commitment, - new_offchain_signer_commitment: new_commitment, - signature: signature.as_bytes().to_vec(), - nonce, - pubkey_id: Some(index), - authenticator_pubkey: Some(encoded_old_offchain_pubkey), - }; - - let resp = self - .http_client - .post(format!( - "{}/remove-authenticator", - self.config.gateway_url() - )) - .json(&req) - .send() - .await?; - - let status = resp.status(); - if status.is_success() { - let gateway_resp: GatewayStatusResponse = resp.json().await?; - Ok(gateway_resp.request_id) - } else { - let body_text = Self::response_body_or_fallback(resp).await; - Err(AuthenticatorError::GatewayError { - status, - body: body_text, - }) - } - } -} - -/// Represents an account in the process of being initialized, -/// i.e. it is not yet registered in the `WorldIDRegistry` contract. -pub struct InitializingAuthenticator { - request_id: String, - http_client: reqwest::Client, - config: Config, -} - -impl InitializingAuthenticator { - /// Returns the gateway request ID for this pending account creation. - #[must_use] - pub fn request_id(&self) -> &str { - &self.request_id - } - - /// Creates a new World ID account by adding it to the registry using the gateway. - /// - /// # Errors - /// - See `Signer::from_seed_bytes` for additional error details. - /// - Will error if the gateway rejects the request or a network error occurs. - async fn new( - seed: &[u8], - config: Config, - recovery_address: Option
, - http_client: reqwest::Client, - ) -> Result { - let signer = Signer::from_seed_bytes(seed)?; - - let mut key_set = AuthenticatorPublicKeySet::default(); - key_set.try_push(signer.offchain_signer_pubkey())?; - let leaf_hash = key_set.leaf_hash(); - - let offchain_pubkey_compressed = { - let pk = signer.offchain_signer_pubkey().pk; - let mut compressed_bytes = Vec::new(); - pk.serialize_compressed(&mut compressed_bytes) - .map_err(|e| PrimitiveError::Serialization(e.to_string()))?; - U256::from_le_slice(&compressed_bytes) - }; - - let req = CreateAccountRequest { - recovery_address, - authenticator_addresses: vec![signer.onchain_signer_address()], - authenticator_pubkeys: vec![offchain_pubkey_compressed], - offchain_signer_commitment: leaf_hash.into(), - }; - - let resp = http_client - .post(format!("{}/create-account", config.gateway_url())) - .json(&req) - .send() - .await?; - - let status = resp.status(); - if status.is_success() { - let body: GatewayStatusResponse = resp.json().await?; - Ok(Self { - request_id: body.request_id, - http_client, - config, - }) - } else { - let body_text = Authenticator::response_body_or_fallback(resp).await; - Err(AuthenticatorError::GatewayError { - status, - body: body_text, - }) - } - } - - /// Poll the status of the World ID creation request. - /// - /// # Errors - /// - Will error if the network request fails. - /// - Will error if the gateway returns an error response. - pub async fn poll_status(&self) -> Result { - let resp = self - .http_client - .get(format!( - "{}/status/{}", - self.config.gateway_url(), - self.request_id - )) - .send() - .await?; - - let status = resp.status(); - - if status.is_success() { - let body: GatewayStatusResponse = resp.json().await?; - Ok(body.status) - } else { - let body_text = Authenticator::response_body_or_fallback(resp).await; - Err(AuthenticatorError::GatewayError { - status, - body: body_text, - }) - } - } -} - -impl ProtocolSigner for Authenticator { - fn sign(&self, message: FieldElement) -> EdDSASignature { - self.signer - .offchain_signer_private_key() - .expose_secret() - .sign(*message) - } -} - -/// A trait for types that can be represented as a `U256` on-chain. -pub trait OnchainKeyRepresentable { - /// Converts an off-chain public key into a `U256` representation for on-chain use in the `WorldIDRegistry` contract. - /// - /// The `U256` representation is a 32-byte little-endian encoding of the **compressed** (single point) public key. - /// - /// # Errors - /// Will error if the public key unexpectedly fails to serialize. - fn to_ethereum_representation(&self) -> Result; -} - -impl OnchainKeyRepresentable for EdDSAPublicKey { - // REVIEW: updating to BE - fn to_ethereum_representation(&self) -> Result { - let mut compressed_bytes = Vec::new(); - self.pk - .serialize_compressed(&mut compressed_bytes) - .map_err(|e| PrimitiveError::Serialization(e.to_string()))?; - Ok(U256::from_le_slice(&compressed_bytes)) - } -} - -/// Errors that can occur when interacting with the Authenticator. -#[derive(Debug, thiserror::Error)] -pub enum AuthenticatorError { - /// Primitive error - #[error(transparent)] - PrimitiveError(#[from] PrimitiveError), - - /// This operation requires a registered account and an account is not registered - /// for this authenticator. Call `create_account` first to register it. - #[error("Account is not registered for this authenticator.")] - AccountDoesNotExist, - - /// The account already exists for this authenticator. Call `leaf_index` to get the leaf index. - #[error("Account already exists for this authenticator.")] - AccountAlreadyExists, - - /// An error occurred while interacting with the EVM contract. - #[error("Error interacting with EVM contract: {0}")] - ContractError(#[from] alloy::contract::Error), - - /// Network/HTTP request error. - #[error("Network error: {0}")] - NetworkError(#[from] reqwest::Error), - - /// Public key not found in the Authenticator public key set. Usually indicates the local state is out of sync with the registry. - #[error("Public key not found.")] - PublicKeyNotFound, - - /// Gateway returned an error response. - #[error("Gateway error (status {status}): {body}")] - GatewayError { - /// HTTP status code - status: StatusCode, - /// Response body - body: String, - }, - - /// Indexer returned an error response. - #[error("Indexer error (status {status}): {body}")] - IndexerError { - /// HTTP status code - status: StatusCode, - /// Response body - body: String, - }, - - /// Account creation timed out while polling for confirmation. - #[error("Account creation timed out")] - Timeout, - - /// Configuration is invalid or missing required values. - #[error("Invalid configuration for {attribute}: {reason}")] - InvalidConfig { - /// The config attribute that is invalid. - attribute: &'static str, - /// Description of why it is invalid. - reason: String, - }, - - /// The provided credential is not valid for the provided proof request. - #[error("The provided credential is not valid for the provided proof request")] - InvalidCredentialForProofRequest, - - /// Error during the World ID registration process. - /// - /// This usually occurs from an on-chain revert. - #[error("Registration error ({error_code}): {error_message}")] - RegistrationError { - /// Error code from the registration process. - error_code: String, - /// Detailed error message. - error_message: String, - }, - - /// Error on proof generation - #[error(transparent)] - ProofError(#[from] ProofError), - - /// Indexer returned an authenticator key slot that exceeds supported key capacity. - #[error( - "Invalid indexer authenticator pubkey slot {slot_index}; max supported slot is {max_supported_slot}" - )] - InvalidIndexerPubkeySlot { - /// Slot index returned by the indexer. - slot_index: usize, - /// Highest supported slot index. - max_supported_slot: usize, - }, - - /// Generic error for other unexpected issues. - #[error("{0}")] - Generic(String), -} - -#[derive(Debug)] -enum PollResult { - Retryable, - TerminalError(AuthenticatorError), -} - -#[cfg(all(test, feature = "embed-zkeys"))] -mod tests { - use super::*; - use alloy::primitives::{U256, address}; - use std::sync::OnceLock; - use world_id_primitives::authenticator::MAX_AUTHENTICATOR_KEYS; - - fn test_materials() -> (Arc, Arc) { - static QUERY: OnceLock> = OnceLock::new(); - static NULLIFIER: OnceLock> = OnceLock::new(); - - let query = QUERY.get_or_init(|| { - Arc::new(world_id_proof::proof::load_embedded_query_material().unwrap()) - }); - let nullifier = NULLIFIER.get_or_init(|| { - Arc::new(world_id_proof::proof::load_embedded_nullifier_material().unwrap()) - }); - - (Arc::clone(query), Arc::clone(nullifier)) - } - - fn test_pubkey(seed_byte: u8) -> EdDSAPublicKey { - Signer::from_seed_bytes(&[seed_byte; 32]) - .unwrap() - .offchain_signer_pubkey() - } - - fn encoded_test_pubkey(seed_byte: u8) -> U256 { - test_pubkey(seed_byte).to_ethereum_representation().unwrap() - } - - #[test] - fn test_insert_or_reuse_authenticator_key_reuses_empty_slot() { - let mut key_set = - AuthenticatorPublicKeySet::new(vec![test_pubkey(1), test_pubkey(2), test_pubkey(4)]) - .unwrap(); - key_set[1] = None; - let new_key = test_pubkey(3); - - let index = - Authenticator::insert_or_reuse_authenticator_key(&mut key_set, new_key).unwrap(); - - assert_eq!(index, 1); - assert_eq!(key_set.len(), 3); - assert_eq!(key_set[1].as_ref().unwrap().pk, test_pubkey(3).pk); - } - - #[test] - fn test_insert_or_reuse_authenticator_key_appends_when_no_empty_slot() { - let mut key_set = AuthenticatorPublicKeySet::new(vec![test_pubkey(1)]).unwrap(); - let new_key = test_pubkey(2); - - let index = - Authenticator::insert_or_reuse_authenticator_key(&mut key_set, new_key).unwrap(); - - assert_eq!(index, 1); - assert_eq!(key_set.len(), 2); - assert_eq!(key_set[1].as_ref().unwrap().pk, test_pubkey(2).pk); - } - - #[test] - fn test_decode_indexer_pubkeys_trims_trailing_empty_slots() { - let mut encoded_pubkeys = vec![Some(encoded_test_pubkey(1)), Some(encoded_test_pubkey(2))]; - encoded_pubkeys.extend(vec![None; MAX_AUTHENTICATOR_KEYS + 5]); - - let key_set = Authenticator::decode_indexer_pubkeys(encoded_pubkeys).unwrap(); - - assert_eq!(key_set.len(), 2); - assert_eq!(key_set[0].as_ref().unwrap().pk, test_pubkey(1).pk); - assert_eq!(key_set[1].as_ref().unwrap().pk, test_pubkey(2).pk); - } - - #[test] - fn test_decode_indexer_pubkeys_rejects_used_slot_beyond_max() { - let mut encoded_pubkeys = vec![None; MAX_AUTHENTICATOR_KEYS + 1]; - encoded_pubkeys[MAX_AUTHENTICATOR_KEYS] = Some(encoded_test_pubkey(1)); - - let error = Authenticator::decode_indexer_pubkeys(encoded_pubkeys).unwrap_err(); - assert!(matches!( - error, - AuthenticatorError::InvalidIndexerPubkeySlot { - slot_index, - max_supported_slot - } if slot_index == MAX_AUTHENTICATOR_KEYS && max_supported_slot == MAX_AUTHENTICATOR_KEYS - 1 - )); - } - - /// Tests that `get_packed_account_data` correctly fetches the packed account data from the indexer - /// when no RPC is configured. - #[tokio::test] - async fn test_get_packed_account_data_from_indexer() { - let mut server = mockito::Server::new_async().await; - let indexer_url = server.url(); - - let test_address = address!("0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0"); - let expected_packed_index = U256::from(42); - - let mock = server - .mock("POST", "/packed-account") - .match_header("content-type", "application/json") - .match_body(mockito::Matcher::JsonString( - serde_json::json!({ - "authenticator_address": test_address - }) - .to_string(), - )) - .with_status(200) - .with_header("content-type", "application/json") - .with_body( - serde_json::json!({ - "packed_account_data": format!("{:#x}", expected_packed_index) - }) - .to_string(), - ) - .create_async() - .await; - - let config = Config::new( - None, - 1, - address!("0x0000000000000000000000000000000000000001"), - indexer_url, - "http://gateway.example.com".to_string(), - Vec::new(), - 2, - ) - .unwrap(); - - let http_client = reqwest::Client::new(); - - let result = Authenticator::get_packed_account_data( - test_address, - None, // No registry, force indexer usage - &config, - &http_client, - ) - .await - .unwrap(); - - assert_eq!(result, expected_packed_index); - mock.assert_async().await; - drop(server); - } - - #[tokio::test] - async fn test_get_packed_account_data_from_indexer_error() { - let mut server = mockito::Server::new_async().await; - let indexer_url = server.url(); - - let test_address = address!("0x0000000000000000000000000000000000000099"); - - let mock = server - .mock("POST", "/packed-account") - .with_status(400) - .with_header("content-type", "application/json") - .with_body( - serde_json::json!({ - "code": "account_does_not_exist", - "message": "There is no account for this authenticator address" - }) - .to_string(), - ) - .create_async() - .await; - - let config = Config::new( - None, - 1, - address!("0x0000000000000000000000000000000000000001"), - indexer_url, - "http://gateway.example.com".to_string(), - Vec::new(), - 2, - ) - .unwrap(); - - let http_client = reqwest::Client::new(); - - let result = - Authenticator::get_packed_account_data(test_address, None, &config, &http_client).await; - - assert!(matches!( - result, - Err(AuthenticatorError::AccountDoesNotExist) - )); - mock.assert_async().await; - drop(server); - } - - #[tokio::test] - #[cfg(not(target_arch = "wasm32"))] - async fn test_signing_nonce_from_indexer() { - let mut server = mockito::Server::new_async().await; - let indexer_url = server.url(); - - let leaf_index = U256::from(1); - let expected_nonce = U256::from(5); - - let mock = server - .mock("POST", "/signature-nonce") - .match_header("content-type", "application/json") - .match_body(mockito::Matcher::JsonString( - serde_json::json!({ - "leaf_index": format!("{:#x}", leaf_index) - }) - .to_string(), - )) - .with_status(200) - .with_header("content-type", "application/json") - .with_body( - serde_json::json!({ - "signature_nonce": format!("{:#x}", expected_nonce) - }) - .to_string(), - ) - .create_async() - .await; - - let config = Config::new( - None, - 1, - address!("0x0000000000000000000000000000000000000001"), - indexer_url, - "http://gateway.example.com".to_string(), - Vec::new(), - 2, - ) - .unwrap(); - - let (query_material, nullifier_material) = test_materials(); - let authenticator = Authenticator { - config, - packed_account_data: leaf_index, // This sets leaf_index() to 1 - signer: Signer::from_seed_bytes(&[1u8; 32]).unwrap(), - registry: None, // No registry - forces indexer usage - http_client: reqwest::Client::new(), - ws_connector: Connector::Plain, - query_material, - nullifier_material, - }; - - let nonce = authenticator.signing_nonce().await.unwrap(); - - assert_eq!(nonce, expected_nonce); - mock.assert_async().await; - drop(server); - } - - #[test] - fn test_danger_sign_challenge_returns_valid_signature() { - let (query_material, nullifier_material) = test_materials(); - let mut authenticator = Authenticator { - config: Config::new( - None, - 1, - address!("0x0000000000000000000000000000000000000001"), - "http://indexer.example.com".to_string(), - "http://gateway.example.com".to_string(), - Vec::new(), - 2, - ) - .unwrap(), - packed_account_data: U256::from(1), - signer: Signer::from_seed_bytes(&[1u8; 32]).unwrap(), - registry: None, - http_client: reqwest::Client::new(), - ws_connector: Connector::Plain, - query_material, - nullifier_material, - }; - - let challenge = b"test challenge"; - let signature = authenticator.danger_sign_challenge(challenge).unwrap(); - - let recovered = signature - .recover_address_from_msg(challenge) - .expect("should recover address"); - assert_eq!(recovered, authenticator.onchain_address()); - } - - #[test] - fn test_danger_sign_challenge_different_challenges_different_signatures() { - let (query_material, nullifier_material) = test_materials(); - let mut authenticator = Authenticator { - config: Config::new( - None, - 1, - address!("0x0000000000000000000000000000000000000001"), - "http://indexer.example.com".to_string(), - "http://gateway.example.com".to_string(), - Vec::new(), - 2, - ) - .unwrap(), - packed_account_data: U256::from(1), - signer: Signer::from_seed_bytes(&[1u8; 32]).unwrap(), - registry: None, - http_client: reqwest::Client::new(), - ws_connector: Connector::Plain, - query_material, - nullifier_material, - }; - - let sig_a = authenticator.danger_sign_challenge(b"challenge A").unwrap(); - let sig_b = authenticator.danger_sign_challenge(b"challenge B").unwrap(); - assert_ne!(sig_a, sig_b); - } - - #[test] - fn test_danger_sign_challenge_deterministic() { - let (query_material, nullifier_material) = test_materials(); - let mut authenticator = Authenticator { - config: Config::new( - None, - 1, - address!("0x0000000000000000000000000000000000000001"), - "http://indexer.example.com".to_string(), - "http://gateway.example.com".to_string(), - Vec::new(), - 2, - ) - .unwrap(), - packed_account_data: U256::from(1), - signer: Signer::from_seed_bytes(&[1u8; 32]).unwrap(), - registry: None, - http_client: reqwest::Client::new(), - ws_connector: Connector::Plain, - query_material, - nullifier_material, - }; - - let challenge = b"deterministic test"; - let sig1 = authenticator.danger_sign_challenge(challenge).unwrap(); - let sig2 = authenticator.danger_sign_challenge(challenge).unwrap(); - assert_eq!(sig1, sig2); - } - - #[tokio::test] - #[cfg(not(target_arch = "wasm32"))] - async fn test_signing_nonce_from_indexer_error() { - let mut server = mockito::Server::new_async().await; - let indexer_url = server.url(); - - let mock = server - .mock("POST", "/signature-nonce") - .with_status(400) - .with_header("content-type", "application/json") - .with_body( - serde_json::json!({ - "code": "invalid_leaf_index", - "message": "Account index cannot be zero" - }) - .to_string(), - ) - .create_async() - .await; - - let config = Config::new( - None, - 1, - address!("0x0000000000000000000000000000000000000001"), - indexer_url, - "http://gateway.example.com".to_string(), - Vec::new(), - 2, - ) - .unwrap(); - - let (query_material, nullifier_material) = test_materials(); - let authenticator = Authenticator { - config, - packed_account_data: U256::ZERO, - signer: Signer::from_seed_bytes(&[1u8; 32]).unwrap(), - registry: None, - http_client: reqwest::Client::new(), - ws_connector: Connector::Plain, - query_material, - nullifier_material, - }; - - let result = authenticator.signing_nonce().await; - - assert!(matches!( - result, - Err(AuthenticatorError::IndexerError { .. }) - )); - mock.assert_async().await; - drop(server); - } -} diff --git a/vendor/world-id-authenticator/src/lib.rs b/vendor/world-id-authenticator/src/lib.rs deleted file mode 100644 index 99517213b..000000000 --- a/vendor/world-id-authenticator/src/lib.rs +++ /dev/null @@ -1,10 +0,0 @@ -mod authenticator; -pub use authenticator::*; - -pub mod api_types; - -pub mod registry; -pub use registry::{ - WorldIdRegistry, domain, sign_insert_authenticator, sign_recover_account, - sign_remove_authenticator, sign_update_authenticator, -}; diff --git a/vendor/world-id-authenticator/src/registry.rs b/vendor/world-id-authenticator/src/registry.rs deleted file mode 100644 index 376927239..000000000 --- a/vendor/world-id-authenticator/src/registry.rs +++ /dev/null @@ -1,204 +0,0 @@ -//! Minimal World ID Registry contract bindings. -//! -//! This crate provides only the contract bindings and EIP-712 signing utilities. -//! It has no dependencies on other world-id crates to avoid circular dependencies. - -use alloy::{ - primitives::{Address, Signature, U256}, - signers::Signer, - sol, - sol_types::{Eip712Domain, SolStruct, eip712_domain}, -}; - -sol!( - /// The registry of World IDs. Each World ID is represented as a leaf in the Merkle tree. - #[allow(clippy::too_many_arguments)] - #[sol(rpc, ignore_unlinked)] - WorldIdRegistry, - "abi/WorldIDRegistryAbi.json" -); - -/// These structs are created in a private module to avoid confusion with their exports. -/// -/// They are only used to compute the EIP-712 typed data for signature. -mod sol_types { - use alloy::sol; - - sol! { - /// EIP-712 typed-data payload for `updateAuthenticator`. - /// - /// This is used only for signature hashing/recovery, not as the Solidity call signature. - struct UpdateAuthenticator { - uint64 leafIndex; - address oldAuthenticatorAddress; - address newAuthenticatorAddress; - uint32 pubkeyId; - uint256 newAuthenticatorPubkey; - uint256 newOffchainSignerCommitment; - uint256 nonce; - } - - /// EIP-712 typed-data payload for `insertAuthenticator`. - /// - /// This is used only for signature hashing/recovery, not as the Solidity call signature. - struct InsertAuthenticator { - uint64 leafIndex; - address newAuthenticatorAddress; - uint32 pubkeyId; - uint256 newAuthenticatorPubkey; - uint256 newOffchainSignerCommitment; - uint256 nonce; - } - - /// EIP-712 typed-data payload for `removeAuthenticator`. - /// - /// This is used only for signature hashing/recovery, not as the Solidity call signature. - struct RemoveAuthenticator { - uint64 leafIndex; - address authenticatorAddress; - uint32 pubkeyId; - uint256 authenticatorPubkey; - uint256 newOffchainSignerCommitment; - uint256 nonce; - } - - /// EIP-712 typed-data payload for `recoverAccount`. - /// - /// This is used only for signature hashing/recovery, not as the Solidity call signature. - struct RecoverAccount { - uint64 leafIndex; - address newAuthenticatorAddress; - uint256 newAuthenticatorPubkey; - uint256 newOffchainSignerCommitment; - uint256 nonce; - } - } -} - -/// EIP-712 typed-data signature payload for `updateAuthenticator`. -pub type UpdateAuthenticatorTypedData = sol_types::UpdateAuthenticator; -/// EIP-712 typed-data signature payload for `insertAuthenticator`. -pub type InsertAuthenticatorTypedData = sol_types::InsertAuthenticator; -/// EIP-712 typed-data signature payload for `removeAuthenticator`. -pub type RemoveAuthenticatorTypedData = sol_types::RemoveAuthenticator; -/// EIP-712 typed-data signature payload for `recoverAccount`. -pub type RecoverAccountTypedData = sol_types::RecoverAccount; - -/// Returns the EIP-712 domain used by the `[WorldIdRegistry]` contract -/// for a given `chain_id` and `verifying_contract` address. -#[must_use] -pub const fn domain(chain_id: u64, verifying_contract: Address) -> Eip712Domain { - eip712_domain!( - name: "WorldIDRegistry", - version: "1.0", - chain_id: chain_id, - verifying_contract: verifying_contract, - ) -} - -/// Signs the EIP-712 payload for an `updateAuthenticator` contract call. -/// -/// # Errors -/// Will error if the signer unexpectedly fails to sign the hash. -#[allow(clippy::too_many_arguments)] -pub async fn sign_update_authenticator( - signer: &S, - leaf_index: u64, - old_authenticator_address: Address, - new_authenticator_address: Address, - pubkey_id: u32, - new_authenticator_pubkey: U256, - new_offchain_signer_commitment: U256, - nonce: U256, - domain: &Eip712Domain, -) -> anyhow::Result { - let payload = UpdateAuthenticatorTypedData { - leafIndex: leaf_index, - oldAuthenticatorAddress: old_authenticator_address, - newAuthenticatorAddress: new_authenticator_address, - pubkeyId: pubkey_id, - newAuthenticatorPubkey: new_authenticator_pubkey, - newOffchainSignerCommitment: new_offchain_signer_commitment, - nonce, - }; - let digest = payload.eip712_signing_hash(domain); - Ok(signer.sign_hash(&digest).await?) -} - -/// Signs the EIP-712 payload for an `insertAuthenticator` contract call. -/// -/// # Errors -/// Will error if the signer unexpectedly fails to sign the hash. -#[allow(clippy::too_many_arguments)] -pub async fn sign_insert_authenticator( - signer: &S, - leaf_index: u64, - new_authenticator_address: Address, - pubkey_id: u32, - new_authenticator_pubkey: U256, - new_offchain_signer_commitment: U256, - nonce: U256, - domain: &Eip712Domain, -) -> anyhow::Result { - let payload = InsertAuthenticatorTypedData { - leafIndex: leaf_index, - newAuthenticatorAddress: new_authenticator_address, - pubkeyId: pubkey_id, - newAuthenticatorPubkey: new_authenticator_pubkey, - newOffchainSignerCommitment: new_offchain_signer_commitment, - nonce, - }; - let digest = payload.eip712_signing_hash(domain); - Ok(signer.sign_hash(&digest).await?) -} - -/// Signs the EIP-712 payload for a `removeAuthenticator` contract call. -/// -/// # Errors -/// Will error if the signer unexpectedly fails to sign the hash. -#[allow(clippy::too_many_arguments)] -pub async fn sign_remove_authenticator( - signer: &S, - leaf_index: u64, - authenticator_address: Address, - pubkey_id: u32, - authenticator_pubkey: U256, - new_offchain_signer_commitment: U256, - nonce: U256, - domain: &Eip712Domain, -) -> anyhow::Result { - let payload = RemoveAuthenticatorTypedData { - leafIndex: leaf_index, - authenticatorAddress: authenticator_address, - pubkeyId: pubkey_id, - authenticatorPubkey: authenticator_pubkey, - newOffchainSignerCommitment: new_offchain_signer_commitment, - nonce, - }; - let digest = payload.eip712_signing_hash(domain); - Ok(signer.sign_hash(&digest).await?) -} - -/// Signs the EIP-712 payload for a `recoverAccount` contract call. -/// -/// # Errors -/// Will error if the signer unexpectedly fails to sign the hash. -pub async fn sign_recover_account( - signer: &S, - leaf_index: u64, - new_authenticator_address: Address, - new_authenticator_pubkey: U256, - new_offchain_signer_commitment: U256, - nonce: U256, - domain: &Eip712Domain, -) -> anyhow::Result { - let payload = RecoverAccountTypedData { - leafIndex: leaf_index, - newAuthenticatorAddress: new_authenticator_address, - newAuthenticatorPubkey: new_authenticator_pubkey, - newOffchainSignerCommitment: new_offchain_signer_commitment, - nonce, - }; - let digest = payload.eip712_signing_hash(domain); - Ok(signer.sign_hash(&digest).await?) -} diff --git a/vendor/world-id-proof/.cargo-ok b/vendor/world-id-proof/.cargo-ok deleted file mode 100644 index 5f8b79583..000000000 --- a/vendor/world-id-proof/.cargo-ok +++ /dev/null @@ -1 +0,0 @@ -{"v":1} \ No newline at end of file diff --git a/vendor/world-id-proof/.cargo_vcs_info.json b/vendor/world-id-proof/.cargo_vcs_info.json deleted file mode 100644 index 2c79a708f..000000000 --- a/vendor/world-id-proof/.cargo_vcs_info.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "git": { - "sha1": "a45e0df122c3b57081fd7babd4b2727577dbbbe1" - }, - "path_in_vcs": "crates/proof" -} \ No newline at end of file diff --git a/vendor/world-id-proof/Cargo.lock b/vendor/world-id-proof/Cargo.lock deleted file mode 100644 index 1ebcd40fe..000000000 --- a/vendor/world-id-proof/Cargo.lock +++ /dev/null @@ -1,5379 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[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 = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "alloy" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4973038846323e4e69a433916522195dce2947770076c03078fc21c80ea0f1c4" -dependencies = [ - "alloy-consensus", - "alloy-contract", - "alloy-core", - "alloy-eips", - "alloy-network", - "alloy-provider", - "alloy-rpc-client", - "alloy-signer", - "alloy-signer-local", - "alloy-transport", - "alloy-transport-http", -] - -[[package]] -name = "alloy-chains" -version = "0.2.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f374d3c6d729268bbe2d0e0ff992bb97898b2df756691a62ee1d5f0506bc39" -dependencies = [ - "alloy-primitives", - "num_enum", - "strum", -] - -[[package]] -name = "alloy-consensus" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c0dc44157867da82c469c13186015b86abef209bf0e41625e4b68bac61d728" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-trie", - "alloy-tx-macros", - "auto_impl", - "borsh", - "c-kzg", - "derive_more", - "either", - "k256", - "once_cell", - "rand 0.8.5", - "secp256k1", - "serde", - "serde_json", - "serde_with", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-consensus-any" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4cdb42df3871cd6b346d6a938ec2ba69a9a0f49d1f82714bc5c48349268434" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-contract" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca63b7125a981415898ffe2a2a696c83696c9c6bdb1671c8a912946bbd8e49e7" -dependencies = [ - "alloy-consensus", - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives", - "alloy-provider", - "alloy-rpc-types-eth", - "alloy-sol-types", - "alloy-transport", - "futures", - "futures-util", - "serde_json", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-core" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e8604b0c092fabc80d075ede181c9b9e596249c70b99253082d7e689836529" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives", - "alloy-rlp", - "alloy-sol-types", -] - -[[package]] -name = "alloy-dyn-abi" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2db5c583aaef0255aa63a4fe827f826090142528bba48d1bf4119b62780cad" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-type-parser", - "alloy-sol-types", - "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.18", -] - -[[package]] -name = "alloy-eip2930" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9441120fa82df73e8959ae0e4ab8ade03de2aaae61be313fbf5746277847ce25" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "borsh", - "serde", -] - -[[package]] -name = "alloy-eip7702" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "borsh", - "serde", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-eip7928" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3231de68d5d6e75332b7489cfcc7f4dfabeba94d990a10e4b923af0e6623540" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "borsh", - "serde", -] - -[[package]] -name = "alloy-eips" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f7ef09f21bd1e9cb8a686f168cb4a206646804567f0889eadb8dcc4c9288c8" -dependencies = [ - "alloy-eip2124", - "alloy-eip2930", - "alloy-eip7702", - "alloy-eip7928", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "auto_impl", - "borsh", - "c-kzg", - "derive_more", - "either", - "serde", - "serde_with", - "sha2", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-json-abi" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dbe713da0c737d9e5e387b0ba790eb98b14dd207fe53eef50e19a5a8ec3dac" -dependencies = [ - "alloy-primitives", - "alloy-sol-type-parser", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-json-rpc" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff42cd777eea61f370c0b10f2648a1c81e0b783066cd7269228aa993afd487f7" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "http", - "serde", - "serde_json", - "thiserror 2.0.18", - "tracing", -] - -[[package]] -name = "alloy-network" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cbca04f9b410fdc51aaaf88433cbac761213905a65fe832058bcf6690585762" -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", - "derive_more", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-network-primitives" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d6d15e069a8b11f56bef2eccbad2a873c6dd4d4c81d04dda29710f5ea52f04" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-primitives" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3b431b4e72cd8bd0ec7a50b4be18e73dab74de0dba180eef171055e5d5926e" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "foldhash 0.2.0", - "hashbrown 0.16.1", - "indexmap 2.13.0", - "itoa", - "k256", - "keccak-asm", - "paste", - "proptest", - "rand 0.9.2", - "rapidhash", - "ruint", - "rustc-hash", - "serde", - "sha3", -] - -[[package]] -name = "alloy-provider" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d181c8cc7cf4805d7e589bf4074d56d55064fa1a979f005a45a62b047616d870" -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-signer", - "alloy-sol-types", - "alloy-transport", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "either", - "futures", - "futures-utils-wasm", - "lru", - "parking_lot", - "pin-project", - "serde", - "serde_json", - "thiserror 2.0.18", - "tokio", - "tracing", - "wasmtimer", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93e50f64a77ad9c5470bf2ad0ca02f228da70c792a8f06634801e202579f35e" -dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce8849c74c9ca0f5a03da1c865e3eb6f768df816e67dd3721a398a8a7e398011" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "alloy-rpc-client" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2792758a93ae32a32e9047c843d536e1448044f78422d71bf7d7c05149e103f" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-transport", - "futures", - "pin-project", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "wasmtimer", -] - -[[package]] -name = "alloy-rpc-types-any" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd720b63f82b457610f2eaaf1f32edf44efffe03ae25d537632e7d23e7929e1a" -dependencies = [ - "alloy-consensus-any", - "alloy-rpc-types-eth", - "alloy-serde", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2dc411f13092f237d2bf6918caf80977fc2f51485f9b90cb2a2f956912c8c9" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "itertools 0.14.0", - "serde", - "serde_json", - "serde_with", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-serde" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2ce1e0dbf7720eee747700e300c99aac01b1a95bb93f493a01e78ee28bb1a37" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-signer" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2425c6f314522c78e8198979c8cbf6769362be4da381d4152ea8eefce383535d" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "either", - "elliptic-curve", - "k256", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-signer-local" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ecb71ee53d8d9c3fa7bac17542c8116ebc7a9726c91b1bf333ec3d04f5a789" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives", - "alloy-signer", - "async-trait", - "k256", - "rand 0.8.5", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-sol-macro" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab81bab693da9bb79f7a95b64b394718259fdd7e41dceeced4cad57cb71c4f6a" -dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489f1620bb7e2483fb5819ed01ab6edc1d2f93939dce35a5695085a1afd1d699" -dependencies = [ - "alloy-json-abi", - "alloy-sol-macro-input", - "const-hex", - "heck", - "indexmap 2.13.0", - "proc-macro-error2", - "proc-macro2", - "quote", - "sha3", - "syn 2.0.116", - "syn-solidity", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56cef806ad22d4392c5fc83cf8f2089f988eb99c7067b4e0c6f1971fc1cca318" -dependencies = [ - "alloy-json-abi", - "const-hex", - "dunce", - "heck", - "macro-string", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.116", - "syn-solidity", -] - -[[package]] -name = "alloy-sol-type-parser" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6df77fea9d6a2a75c0ef8d2acbdfd92286cc599983d3175ccdc170d3433d249" -dependencies = [ - "serde", - "winnow", -] - -[[package]] -name = "alloy-sol-types" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64612d29379782a5dde6f4b6570d9c756d734d760c0c94c254d361e678a6591f" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-macro", - "serde", -] - -[[package]] -name = "alloy-transport" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa186e560d523d196580c48bf00f1bf62e63041f28ecf276acc22f8b27bb9f53" -dependencies = [ - "alloy-json-rpc", - "auto_impl", - "base64", - "derive_more", - "futures", - "futures-utils-wasm", - "parking_lot", - "serde", - "serde_json", - "thiserror 2.0.18", - "tokio", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-transport-http" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa501ad58dd20acddbfebc65b52e60f05ebf97c52fa40d1b35e91f5e2da0ad0e" -dependencies = [ - "alloy-transport", - "itertools 0.14.0", - "url", -] - -[[package]] -name = "alloy-trie" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d7fd448ab0a017de542de1dcca7a58e7019fe0e7a34ed3f9543ebddf6aceffa" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "arrayvec", - "derive_more", - "nybbles", - "serde", - "smallvec", - "thiserror 2.0.18", - "tracing", -] - -[[package]] -name = "alloy-tx-macros" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa0c53e8c1e1ef4d01066b01c737fb62fc9397ab52c6e7bb5669f97d281b9bc" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[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.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" - -[[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", - "rayon", - "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.116", -] - -[[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.5", - "itertools 0.13.0", - "num-bigint", - "num-integer", - "num-traits", - "rayon", - "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", - "rayon", - "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.116", -] - -[[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.116", -] - -[[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", - "rayon", -] - -[[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.5", - "rayon", -] - -[[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", - "rayon", -] - -[[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.116", -] - -[[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", - "rayon", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -dependencies = [ - "serde", -] - -[[package]] -name = "askama" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08e1676b346cadfec169374f949d7490fd80a24193d37d2afce0c047cf695e57" -dependencies = [ - "askama_macros", - "itoa", - "percent-encoding", - "serde", - "serde_json", -] - -[[package]] -name = "askama_derive" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7661ff56517787343f376f75db037426facd7c8d3049cef8911f1e75016f3a37" -dependencies = [ - "askama_parser", - "basic-toml", - "memchr", - "proc-macro2", - "quote", - "rustc-hash", - "serde", - "serde_derive", - "syn 2.0.116", -] - -[[package]] -name = "askama_macros" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713ee4dbfd1eb719c2dab859465b01fa1d21cb566684614a713a6b7a99a4e47b" -dependencies = [ - "askama_derive", -] - -[[package]] -name = "askama_parser" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d62d674238a526418b30c0def480d5beadb9d8964e7f38d635b03bf639c704c" -dependencies = [ - "rustc-hash", - "serde", - "serde_derive", - "unicode-ident", - "winnow", -] - -[[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.116", -] - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "atomic-polyfill" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" -dependencies = [ - "critical-section", -] - -[[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.116", -] - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[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.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" - -[[package]] -name = "basic-toml" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" -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 = "bitcoin-io" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dee39a0ee5b4095224a0cfc6bf4cc1baf0f9624b96b367e53b66d974e51d953" - -[[package]] -name = "bitcoin_hashes" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26ec84b80c482df901772e931a9a681e26a1b9ee2302edeff23cb30328745c8b" -dependencies = [ - "bitcoin-io", - "hex-conservative", -] - -[[package]] -name = "bitflags" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" - -[[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 = "blake3" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", - "cpufeatures", -] - -[[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.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "borsh" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" -dependencies = [ - "borsh-derive", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" -dependencies = [ - "once_cell", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "bumpalo" -version = "3.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" - -[[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.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" -dependencies = [ - "serde", -] - -[[package]] -name = "c-kzg" -version = "2.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e00bf4b112b07b505472dbefd19e37e53307e2bfed5a79e0cc161d58ccd0e687" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "once_cell", - "serde", -] - -[[package]] -name = "cc" -version = "1.2.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[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.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" -dependencies = [ - "iana-time-zone", - "num-traits", - "serde", - "windows-link", -] - -[[package]] -name = "ciborium" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" - -[[package]] -name = "ciborium-ll" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" -dependencies = [ - "ciborium-io", - "half", -] - -[[package]] -name = "circom-witness-rs" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35778373aee12ef3d04966187eeae7a04f1451c9226058311f21488df6f28780" -dependencies = [ - "ark-bn254", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "byteorder", - "cxx-build", - "eyre", - "hex", - "num-bigint", - "num-traits", - "postcard", - "rand 0.8.5", - "ruint", - "serde", - "serde_json", -] - -[[package]] -name = "cobs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" -dependencies = [ - "thiserror 2.0.18", -] - -[[package]] -name = "codespan-reporting" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" -dependencies = [ - "serde", - "termcolor", - "unicode-width", -] - -[[package]] -name = "const-hex" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" -dependencies = [ - "cfg-if", - "cpufeatures", - "proptest", - "serde_core", -] - -[[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.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" -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.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" - -[[package]] -name = "convert_case" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" -dependencies = [ - "unicode-segmentation", -] - -[[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 = "crc" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" -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 = "critical-section" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" - -[[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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[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 = "cxx-build" -version = "1.0.194" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0f4697d190a142477b16aef7da8a99bfdc41e7e8b1687583c0d23a79c7afc1e" -dependencies = [ - "cc", - "codespan-reporting", - "indexmap 2.13.0", - "proc-macro2", - "quote", - "scratch", - "syn 2.0.116", -] - -[[package]] -name = "darling" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "serde", - "strsim", - "syn 2.0.116", -] - -[[package]] -name = "darling_macro" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.116", -] - -[[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.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" - -[[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.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" -dependencies = [ - "powerfmt", - "serde_core", -] - -[[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.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version 0.4.1", - "syn 2.0.116", - "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.116", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[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.116", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -dependencies = [ - "serde", -] - -[[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 = "enum-ordinalize" -version = "4.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" -dependencies = [ - "enum-ordinalize-derive", -] - -[[package]] -name = "enum-ordinalize-derive" -version = "4.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[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.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[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 = "filetime" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" -dependencies = [ - "cfg-if", - "libc", - "libredox", -] - -[[package]] -name = "find-msvc-tools" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" - -[[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 = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -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.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" - -[[package]] -name = "futures-executor" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" - -[[package]] -name = "futures-macro" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "futures-sink" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" - -[[package]] -name = "futures-task" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" - -[[package]] -name = "futures-util" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi", - "wasip2", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasip2", - "wasip3", -] - -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[package]] -name = "gloo-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" -dependencies = [ - "futures-channel", - "futures-core", - "futures-sink", - "gloo-utils", - "http", - "js-sys", - "pin-project", - "thiserror 1.0.69", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "gloo-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" -dependencies = [ - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[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 = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "cfg-if", - "crunchy", - "zerocopy", -] - -[[package]] -name = "hash32" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" -dependencies = [ - "byteorder", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "allocator-api2", - "foldhash 0.1.5", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.2.0", - "serde", - "serde_core", -] - -[[package]] -name = "heapless" -version = "0.7.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" -dependencies = [ - "atomic-polyfill", - "hash32", - "rustc_version 0.4.1", - "serde", - "spin", - "stable_deref_trait", -] - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hex-conservative" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" -dependencies = [ - "arrayvec", -] - -[[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.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" -dependencies = [ - "bytes", - "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.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "pin-utils", - "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", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots 1.0.6", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "base64", - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" -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.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - -[[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.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -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.116", -] - -[[package]] -name = "indenter" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" - -[[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.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", - "serde", - "serde_core", -] - -[[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.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" -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.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.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" -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", - "signature", -] - -[[package]] -name = "keccak" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-asm" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b646a74e746cd25045aa0fd42f4f7f78aa6d119380182c7e63a5593c4ab8df6f" -dependencies = [ - "digest 0.10.7", - "sha3-asm", -] - -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - -[[package]] -name = "libc" -version = "0.2.182" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "libredox" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" -dependencies = [ - "bitflags", - "libc", - "redox_syscall 0.7.1", -] - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" - -[[package]] -name = "lru" -version = "0.16.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" -dependencies = [ - "hashbrown 0.16.1", -] - -[[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.116", -] - -[[package]] -name = "memchr" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" - -[[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 = "mio" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", -] - -[[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.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" - -[[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 = "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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "nybbles" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d49ff0c0d00d4a502b39df9af3a525e1efeb14b9dabb5bb83335284c1309210" -dependencies = [ - "alloy-rlp", - "cfg-if", - "proptest", - "ruint", - "serde", - "smallvec", -] - -[[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.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.116", -] - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.18", - "smallvec", - "windows-link", -] - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "pest" -version = "2.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" -dependencies = [ - "memchr", - "ucd-trie", -] - -[[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.116", -] - -[[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.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" -dependencies = [ - "cobs", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "heapless", - "serde", -] - -[[package]] -name = "potential_utf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -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.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.116", -] - -[[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.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" -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.116", -] - -[[package]] -name = "proc-macro2" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566cb3fdacef14c0737f9546df7cfeadbfbc9fef10991038bf5015d0c80532" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags", - "num-traits", - "rand 0.9.2", - "rand_chacha 0.9.0", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2 0.5.10", - "thiserror 2.0.18", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" -dependencies = [ - "bytes", - "getrandom 0.3.4", - "lru-slab", - "rand 0.9.2", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.18", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2 0.5.10", - "tracing", - "windows-sys 0.60.2", -] - -[[package]] -name = "quote" -version = "1.0.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" -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" -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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", - "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 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.5", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", - "serde", -] - -[[package]] -name = "rand_xorshift" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" -dependencies = [ - "rand_core 0.9.5", -] - -[[package]] -name = "rapidhash" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111325c42c4bafae99e777cd77b40dea9a2b30c69e9d8c74b6eccd7fba4337de" -dependencies = [ - "rustversion", -] - -[[package]] -name = "rayon" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_syscall" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" -dependencies = [ - "bitflags", -] - -[[package]] -name = "ref-cast" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "regex-syntax" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" - -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 1.0.6", -] - -[[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.17", - "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.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "ark-ff 0.5.0", - "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.2", - "rlp", - "ruint-macro", - "serde_core", - "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-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.27", -] - -[[package]] -name = "rustix" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "rusty-fork" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "schemars" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "scratch" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" - -[[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 = "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 = "secrecy" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" -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.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" - -[[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.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "serde_json" -version = "1.0.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[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.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" -dependencies = [ - "base64", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.13.0", - "schemars 0.9.0", - "schemars 1.2.1", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b31139435f327c93c6038ed350ae4588e2c70a13d50599509fee6349967ba35a" -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.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -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 = "socket2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[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.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[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.116" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-solidity" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53f425ae0b12e2f5ae65542e00898d500d4d318b4baf09f40fd0d410454e9947" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[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.116", -] - -[[package]] -name = "taceo-ark-babyjubjub" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55b5a2cc31c90e79778c4f6375e5d9828171d320db3f8c911a8ad47af4a70069" -dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-std 0.5.0", -] - -[[package]] -name = "taceo-ark-serde-compat" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07528b4dd1a0c9e49ef352f96219c611af0aa2f7cbd97ddb7276dcf3c2cf8dd0" -dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "num-bigint", - "serde", - "taceo-ark-babyjubjub", -] - -[[package]] -name = "taceo-circom-types" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677eb3ed8275b2f179d4b1a93126a51c5b4f409c5ea9d7bc50398b13e517e30b" -dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-groth16", - "ark-poly", - "ark-relations", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "byteorder", - "num-traits", - "rayon", - "serde", - "serde_json", - "taceo-ark-serde-compat", - "thiserror 2.0.18", - "tracing", -] - -[[package]] -name = "taceo-eddsa-babyjubjub" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75dbec63f7a89093b4116a7164e6a92d3cda33dec248da8c8a5922a80a06e7dd" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "blake3", - "eyre", - "num-bigint", - "rand 0.8.5", - "serde", - "taceo-ark-babyjubjub", - "taceo-ark-serde-compat", - "taceo-poseidon2", - "zeroize", -] - -[[package]] -name = "taceo-groth16" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4983857c95d20ca2dc0400a3a116e6931c012ecc4b78ccede8238cfb0c298e3" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-groth16", - "ark-poly", - "ark-relations", - "eyre", - "num-traits", - "rayon", - "tracing", -] - -[[package]] -name = "taceo-groth16-material" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936b1e6b8a77f931796917501fe13a2ae93304e7eb384ed29d80ddc370b011bd" -dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-groth16", - "ark-relations", - "ark-serialize 0.5.0", - "circom-witness-rs", - "eyre", - "hex", - "postcard", - "rand 0.8.5", - "ruint", - "sha2", - "taceo-circom-types", - "taceo-groth16", - "thiserror 2.0.18", - "tracing", -] - -[[package]] -name = "taceo-groth16-sol" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c6a7b90f2ecb6db1212557550890d9d9d114447688f6146d726024ec7a3410b" -dependencies = [ - "alloy-primitives", - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-groth16", - "askama", - "eyre", - "ruint", -] - -[[package]] -name = "taceo-oprf" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "412211d4d43aeb060c369a69213bd7ae941f769cc4361df83195d2a7936f22d5" -dependencies = [ - "taceo-oprf-client", - "taceo-oprf-core", - "taceo-oprf-types", -] - -[[package]] -name = "taceo-oprf-client" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de42daf867ed4d1ed661258a4541d5dcf1ebe3f43f923acc3ec7716b8824670d" -dependencies = [ - "ark-ec", - "ciborium", - "futures", - "getrandom 0.2.17", - "gloo-net", - "http", - "serde", - "taceo-ark-babyjubjub", - "taceo-oprf-core", - "taceo-oprf-types", - "taceo-poseidon2", - "thiserror 2.0.18", - "tokio", - "tokio-tungstenite", - "tracing", - "uuid", -] - -[[package]] -name = "taceo-oprf-core" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2baf9c72e6687fa8839c3e3368236b36237a905b8c7fcd445250a7a57ab063" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "blake3", - "itertools 0.14.0", - "num-bigint", - "rand 0.8.5", - "serde", - "subtle", - "taceo-ark-babyjubjub", - "taceo-ark-serde-compat", - "taceo-poseidon2", - "uuid", - "zeroize", -] - -[[package]] -name = "taceo-oprf-types" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447b96ee4bb69a16b05fa1e581501c426338698263cde39fc8fbfdbf5d24b616" -dependencies = [ - "alloy", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "async-trait", - "eyre", - "http", - "serde", - "taceo-ark-babyjubjub", - "taceo-ark-serde-compat", - "taceo-circom-types", - "taceo-groth16-sol", - "taceo-oprf-core", - "uuid", -] - -[[package]] -name = "taceo-poseidon2" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac59d3df4c827b3496bff929aebd6440997a5c2e946f46ff4fdd76f318447581" -dependencies = [ - "ark-bn254", - "ark-ff 0.5.0", - "ark-std 0.5.0", - "num-bigint", - "num-traits", -] - -[[package]] -name = "tap" -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.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" -dependencies = [ - "fastrand", - "getrandom 0.4.1", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[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.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl 2.0.18", -] - -[[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.116", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[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.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" - -[[package]] -name = "time-macros" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" -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.49.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" -dependencies = [ - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2 0.6.2", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" -dependencies = [ - "futures-util", - "log", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots 0.26.11", -] - -[[package]] -name = "tokio-util" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml_datetime" -version = "0.7.5+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.23.10+spec-1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" -dependencies = [ - "indexmap 2.13.0", - "toml_datetime", - "toml_parser", - "winnow", -] - -[[package]] -name = "toml_parser" -version = "1.0.9+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" -dependencies = [ - "winnow", -] - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" -dependencies = [ - "bitflags", - "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.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -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 = "tungstenite" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" -dependencies = [ - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand 0.9.2", - "rustls", - "rustls-pki-types", - "sha1", - "thiserror 2.0.18", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" - -[[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.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", - "serde_derive", -] - -[[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 = "1.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" -dependencies = [ - "getrandom 0.4.1", - "js-sys", - "serde_core", - "wasm-bindgen", -] - -[[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.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.2+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" -dependencies = [ - "cfg-if", - "futures-util", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.116", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap 2.13.0", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags", - "hashbrown 0.15.5", - "indexmap 2.13.0", - "semver 1.0.27", -] - -[[package]] -name = "wasmtimer" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" -dependencies = [ - "futures", - "js-sys", - "parking_lot", - "pin-utils", - "slab", - "wasm-bindgen", -] - -[[package]] -name = "web-sys" -version = "0.3.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" -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.6", -] - -[[package]] -name = "webpki-roots" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -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.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap 2.13.0", - "prettyplease", - "syn 2.0.116", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.116", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags", - "indexmap 2.13.0", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap 2.13.0", - "log", - "semver 1.0.27", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] - -[[package]] -name = "world-id-primitives" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb4aa561b0b99df193a638b9081da74e299e4d608d0c5d2c0f76ebfe537caba" -dependencies = [ - "alloy", - "alloy-primitives", - "ark-bn254", - "ark-ff 0.5.0", - "ark-groth16", - "arrayvec", - "eyre", - "getrandom 0.2.17", - "hex", - "k256", - "rand 0.8.5", - "ruint", - "secrecy", - "serde", - "serde_json", - "sha3", - "strum", - "taceo-ark-babyjubjub", - "taceo-ark-serde-compat", - "taceo-circom-types", - "taceo-eddsa-babyjubjub", - "taceo-groth16-material", - "taceo-groth16-sol", - "taceo-oprf", - "taceo-poseidon2", - "thiserror 2.0.18", - "url", - "uuid", -] - -[[package]] -name = "world-id-proof" -version = "0.5.2" -dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-groth16", - "ark-serialize 0.5.0", - "eyre", - "rand 0.8.5", - "rayon", - "reqwest", - "taceo-ark-babyjubjub", - "taceo-circom-types", - "taceo-eddsa-babyjubjub", - "taceo-groth16-material", - "taceo-oprf", - "taceo-poseidon2", - "tar", - "thiserror 2.0.18", - "tracing", - "world-id-primitives", - "zeroize", - "zstd", -] - -[[package]] -name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "xattr" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" -dependencies = [ - "libc", - "rustix", -] - -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[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.116", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "zmij" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" - -[[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.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/vendor/world-id-proof/Cargo.toml b/vendor/world-id-proof/Cargo.toml deleted file mode 100644 index 3e604f72e..000000000 --- a/vendor/world-id-proof/Cargo.toml +++ /dev/null @@ -1,171 +0,0 @@ -# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -# -# When uploading crates to the registry Cargo will automatically -# "normalize" Cargo.toml files for maximal compatibility -# with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g., crates.io) dependencies. -# -# If you are reading this file be aware that the original Cargo.toml -# will likely look very different (and much more reasonable). -# See Cargo.toml.orig for the original contents. - -[package] -edition = "2024" -rust-version = "1.87" -name = "world-id-proof" -version = "0.5.2" -authors = [ - "World Foundation", - "TACEO GmbH ", - "Tools for Humanity", -] -build = "build.rs" -include = [ - "src/**/*", - "tests/**/*", - "build.rs", - "Cargo.toml", - "README.md", -] -publish = true -autolib = false -autobins = false -autoexamples = false -autotests = false -autobenches = false -description = "World ID Proof crate" -homepage = "https://docs.world.org/world-id" -readme = "README.md" -license = "MIT" -repository = "https://github.com/worldcoin/world-id-protocol" -resolver = "2" - -[features] -compress-zkeys = [ - "embed-zkeys", - "dep:ark-serialize", - "dep:circom-types", -] -default = [] -embed-zkeys = ["dep:tar"] -zstd-compress-zkeys = [ - "embed-zkeys", - "dep:zstd", -] - -[lib] -name = "world_id_proof" -path = "src/lib.rs" - -[dependencies.ark-babyjubjub] -version = "0.5" -package = "taceo-ark-babyjubjub" - -[dependencies.ark-bn254] -version = "0.5" - -[dependencies.ark-ec] -version = "0.5" - -[dependencies.ark-ff] -version = "0.5" - -[dependencies.ark-groth16] -version = "0.5" - -[dependencies.ark-serialize] -version = "0.5" -optional = true - -[dependencies.circom-types] -version = "0.2" -features = [ - "bn254", - "groth16", - "zkey", -] -optional = true -default-features = false -package = "taceo-circom-types" - -[dependencies.eddsa-babyjubjub] -version = "0.5.4" -package = "taceo-eddsa-babyjubjub" - -[dependencies.eyre] -version = "0.6" - -[dependencies.groth16-material] -version = "0.2.3" -default-features = false -package = "taceo-groth16-material" - -[dependencies.poseidon2] -version = "0.2" -package = "taceo-poseidon2" - -[dependencies.rand] -version = "0.8" - -[dependencies.taceo-oprf] -version = "0.7.1" -features = [ - "client", - "core", -] -default-features = false - -[dependencies.tar] -version = "0.4" -optional = true - -[dependencies.thiserror] -version = "2" - -[dependencies.tracing] -version = "0.1" - -[dependencies.world-id-primitives] -version = "0.5.2" -default-features = false - -[dependencies.zeroize] -version = "1" - -[dependencies.zstd] -version = "0.13" -optional = true - -[build-dependencies.ark-serialize] -version = "0.5" - -[build-dependencies.circom-types] -version = "0.2" -features = [ - "bn254", - "groth16", - "zkey", -] -default-features = false -package = "taceo-circom-types" - -[build-dependencies.eyre] -version = "0.6" - -[build-dependencies.rayon] -version = "1.11" - -[build-dependencies.reqwest] -version = "0.12" -features = [ - "json", - "rustls-tls", - "blocking", -] -default-features = false - -[build-dependencies.tar] -version = "0.4" - -[build-dependencies.zstd] -version = "0.13" diff --git a/vendor/world-id-proof/Cargo.toml.orig b/vendor/world-id-proof/Cargo.toml.orig deleted file mode 100644 index 0978f259e..000000000 --- a/vendor/world-id-proof/Cargo.toml.orig +++ /dev/null @@ -1,59 +0,0 @@ -[package] -name = "world-id-proof" -description = "World ID Proof crate" -publish = true -edition.workspace = true -version.workspace = true -license.workspace = true -authors.workspace = true -homepage.workspace = true -rust-version.workspace = true -repository.workspace = true -include = [ - "src/**/*", - "tests/**/*", - "build.rs", - "Cargo.toml", - "README.md", -] - -[features] -default = ["embed-zkeys"] -# Embed zkeys into binary -embed-zkeys = ["dep:tar"] -# Compress the embedded zkeys to reduce binary size (ARK point compression) -compress-zkeys = ["embed-zkeys", "dep:ark-serialize", "dep:circom-types"] -# Compress the tar archive with zstd -zstd-compress-zkeys = ["embed-zkeys", "dep:zstd"] - -[dependencies] -ark-babyjubjub = { workspace = true } -ark-bn254 = { workspace = true } -ark-ff = { workspace = true } -ark-ec = { workspace = true } -ark-groth16 = { workspace = true } -ark-serialize = { workspace = true, optional = true } -circom-types = { workspace = true, features = ["bn254", "groth16", "zkey"], optional = true } -tar = { workspace = true, optional = true } -thiserror = { workspace = true } -tracing = { workspace = true } -zstd = { workspace = true, optional = true } -eddsa-babyjubjub = { workspace = true } -rand = { workspace = true } -groth16-material = { workspace = true } -poseidon2 = { workspace = true } -taceo-oprf = { workspace = true, features = ["client", "core"] } -eyre = { workspace = true } -zeroize = { workspace = true } - -# Internal -world-id-primitives = { workspace = true } - -[build-dependencies] -eyre = { workspace = true } -reqwest = { workspace = true, features = ["blocking"] } -ark-serialize = { workspace = true } -circom-types = { workspace = true, features = ["bn254", "groth16", "zkey"] } -rayon = { workspace = true } -tar = { workspace = true } -zstd = { workspace = true } diff --git a/vendor/world-id-proof/README.md b/vendor/world-id-proof/README.md deleted file mode 100644 index 96e676141..000000000 --- a/vendor/world-id-proof/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# World ID Proof - -World ID is an anonymous proof of human for the age of AI. - -This crate provides the functionality for World ID Proofs. - -More information can be found in the [World ID Developer Documentation](https://docs.world.org/world-id). - -### Features - -##### `embed-zkeys` - -build.rs will download zkey files from github and include them into the binary. - -Download from github is done as a workaround to circumvent the max crates.io hosting limit. - -##### `compress-zkeys` (implies `embed-zkeys`) - -build.rs will download and compress zkey files from github and include them into the binary. -At runtime, zkeys are decompressed in memory during initialization. - -##### neither `compress-zkeys` or `embed-zkeys` - -zkey files are not included in the bin. diff --git a/vendor/world-id-proof/build.rs b/vendor/world-id-proof/build.rs deleted file mode 100644 index 89fc53d31..000000000 --- a/vendor/world-id-proof/build.rs +++ /dev/null @@ -1,240 +0,0 @@ -use eyre::OptionExt; -use std::{ - env, fs, - path::{Path, PathBuf}, -}; - -#[cfg(feature = "embed-zkeys")] -use std::{fs::File, io}; - -#[cfg(feature = "embed-zkeys")] -const GITHUB_REPO: &str = "worldcoin/world-id-protocol"; - -#[cfg(feature = "embed-zkeys")] -const CIRCUIT_COMMIT: &str = "aaf8f2650b003a8bb06feb26bed6277629d4c0bf"; // TODO: Figure out a better way for static commits - -const CIRCUIT_FILES: &[&str] = &[ - "circom/OPRFQueryGraph.bin", - "circom/OPRFNullifierGraph.bin", - "circom/OPRFQuery.arks.zkey", - "circom/OPRFNullifier.arks.zkey", -]; - -fn main() -> eyre::Result<()> { - println!("cargo:rerun-if-changed=build.rs"); - - if std::env::var_os("DOCS_RS").is_some() { - // Define a cfg only for THIS crate’s compilation. - println!("cargo:rustc-cfg=docsrs"); - println!("cargo:rustc-check-cfg=cfg(docsrs)"); - } - - // Skip for docs.rs as it doesn't have network access - if env::var("DOCS_RS").is_ok() { - println!("cargo:warning=Building for docs.rs, skipping circuit file downloads"); - return Ok(()); - } - - if env::var("CARGO_FEATURE_EMBED_ZKEYS").is_err() { - return Ok(()); - }; - - let out_dir = PathBuf::from(env::var("OUT_DIR")?); - - for path_str in CIRCUIT_FILES { - let path = Path::new(path_str); - - fetch_circuit_file(path, &out_dir)?; - } - - // ARK point compression (when compress-zkeys feature is active) - let use_ark = std::env::var("CARGO_FEATURE_COMPRESS_ZKEYS").is_ok(); - if use_ark { - ark_compress_zkeys(&out_dir)?; - } - - // Create tar archive of all circuit files - let use_zstd = std::env::var("CARGO_FEATURE_ZSTD_COMPRESS_ZKEYS").is_ok(); - let archive_name = if use_zstd { - "circuit_files.tar.zst" - } else { - "circuit_files.tar" - }; - let archive_path = out_dir.join(archive_name); - - // Collect files: use .compressed zkeys if ARK compression active, raw otherwise - let mut files_to_bundle: Vec<(&str, PathBuf)> = Vec::new(); - for path_str in CIRCUIT_FILES { - let file_name = Path::new(path_str).file_name().unwrap().to_str().unwrap(); - if is_arks_zkey(Path::new(file_name)) && use_ark { - files_to_bundle.push((file_name, out_dir.join(format!("{file_name}.compressed")))); - } else { - files_to_bundle.push((file_name, out_dir.join(file_name))); - } - } - - let needs_rebuild = files_to_bundle - .iter() - .any(|(_, src)| !is_up_to_date(src, &archive_path)); - - if needs_rebuild { - let file = fs::File::create(&archive_path)?; - if use_zstd { - let encoder = zstd::Encoder::new(file, 0)?; - let mut tar = tar::Builder::new(encoder); - for (name, path) in &files_to_bundle { - tar.append_path_with_name(path, name)?; - } - tar.into_inner()?.finish()?; - } else { - let mut tar = tar::Builder::new(file); - for (name, path) in &files_to_bundle { - tar.append_path_with_name(path, name)?; - } - tar.finish()?; - } - } - - Ok(()) -} - -#[cfg(feature = "embed-zkeys")] -fn download_file(url: &str, output_path: &Path) -> eyre::Result<()> { - let response = reqwest::blocking::get(url)?; - - if !response.status().is_success() { - eyre::bail!("HTTP error {}: {}", response.status(), url); - } - - let mut file = File::create(output_path)?; - let content = response.bytes()?; - io::copy(&mut content.as_ref(), &mut file)?; - - Ok(()) -} - -fn fetch_circuit_file(path: &Path, out_dir: &Path) -> eyre::Result<()> { - let output_path = out_dir.join(path.file_name().ok_or_eyre("invalid path")?); - - // Check for local file first (development) - if let Ok(manifest_dir) = env::var("CARGO_MANIFEST_DIR") { - let local_path = Path::new(&manifest_dir) - .parent() - .and_then(|p| p.parent()) - .map(|p| p.join(path)); - - if let Some(path) = local_path { - if path.exists() { - // Hard links fail across filesystem boundaries (e.g. in cross Docker containers), - // so fall back to copying the file. - if std::fs::hard_link(&path, &output_path).is_err() { - std::fs::copy(&path, &output_path)?; - } - println!("cargo:rerun-if-changed={}", path.display()); - return Ok(()); - } - } - } - - // Download from GitHub: we need to do this because crates.io enforce a hard limit on the - // size of a crate upload of ~10MB and the circuit files are heavier than that. - #[cfg(feature = "embed-zkeys")] - { - let url = format!( - "https://raw.githubusercontent.com/{}/{}/{}", - GITHUB_REPO, - CIRCUIT_COMMIT, - path.to_str().ok_or_eyre("invalid path")? - ); - - download_file(&url, &output_path)?; - Ok(()) - } - - #[cfg(not(feature = "embed-zkeys"))] - return Ok(()); -} - -fn is_arks_zkey(path: &Path) -> bool { - path.file_name() - .and_then(|name| name.to_str()) - .is_some_and(|name| name.ends_with(".arks.zkey")) -} - -fn is_up_to_date(input: &Path, output: &Path) -> bool { - let input_modified = match fs::metadata(input).and_then(|m| m.modified()) { - Ok(time) => time, - Err(_) => return false, - }; - - let output_modified = match fs::metadata(output).and_then(|m| m.modified()) { - Ok(time) => time, - Err(_) => return false, - }; - - output_modified >= input_modified -} - -fn ark_compress_zkeys(out_dir: &Path) -> eyre::Result<()> { - use rayon::prelude::*; - - let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR")?); - let workspace_root = manifest_dir - .parent() - .and_then(|p| p.parent()) - .ok_or_eyre("failed to resolve workspace root from CARGO_MANIFEST_DIR")?; - let circom_dir = workspace_root.join("circom"); - - if !circom_dir.is_dir() { - fs::create_dir_all(&circom_dir)?; - } - - // Watch the directory itself for new/removed files - println!("cargo:rerun-if-changed={}", circom_dir.display()); - - // Process directory entries in parallel while propagating any IO errors. - fs::read_dir(out_dir)? - .par_bridge() - .try_for_each(|entry| -> eyre::Result<()> { - let path = entry?.path(); - if !is_arks_zkey(&path) { - return Ok(()); - } - - let file_name = path - .file_name() - .ok_or_eyre("missing filename")? - .to_str() - .ok_or_eyre("non-utf8 filename")?; - let output_path = out_dir.join(format!("{file_name}.compressed")); - - // Skip if output exists and is newer than input - if is_up_to_date(&path, &output_path) { - return eyre::Ok(()); - } - - compress_zkey(&path, &output_path)?; - - Ok(()) - })?; - - Ok(()) -} - -fn compress_zkey(input: &Path, output: &Path) -> eyre::Result<()> { - use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Compress, Validate}; - use circom_types::{ark_bn254::Bn254, groth16::ArkZkey}; - - let input_bytes = fs::read(input)?; - let zkey = ArkZkey::::deserialize_with_mode( - input_bytes.as_slice(), - Compress::No, - Validate::Yes, - )?; - - let mut compressed = Vec::new(); - zkey.serialize_with_mode(&mut compressed, Compress::Yes)?; - fs::write(output, compressed)?; - - Ok(()) -} diff --git a/vendor/world-id-proof/src/credential_blinding_factor.rs b/vendor/world-id-proof/src/credential_blinding_factor.rs deleted file mode 100644 index 4e2512093..000000000 --- a/vendor/world-id-proof/src/credential_blinding_factor.rs +++ /dev/null @@ -1,127 +0,0 @@ -//! Logic to generate credential blinding factors using the OPRF Nodes. - -use ark_ff::PrimeField; -use eyre::Context as _; -use groth16_material::circom::CircomGroth16Material; - -use taceo_oprf::{ - client::{Connector, VerifiableOprfOutput}, - core::oprf::BlindingFactor, -}; - -use world_id_primitives::{ - FieldElement, TREE_DEPTH, - circuit_inputs::QueryProofCircuitInput, - oprf::{CredentialBlindingFactorOprfRequestAuthV1, OprfModule}, -}; - -use crate::{ - AuthenticatorProofInput, - proof::{OPRF_PROOF_DS, ProofError, errors}, -}; - -/// Credential blinding factor computed using OPRF Nodes. -pub struct OprfCredentialBlindingFactor { - /// The result of the distributed OPRF protocol, including the final blinding factor. - pub verifiable_oprf_output: VerifiableOprfOutput, -} - -impl OprfCredentialBlindingFactor { - /// Generates a blinding factor through the provided OPRF nodes. - /// - /// This method will handle the signature from the Authenticator authorizing the - /// request for the OPRF nodes. - /// - /// # Arguments - /// - `services`: The list of endpoints of all OPRF nodes. - /// - `threshold`: The minimum number of OPRF nodes responses required to compute a valid nullifier. The - /// source of truth for this value lives in the `OprfKeyRegistry` contract. - /// - `query_material`: The material for the query proof circuit. - /// - `authenticator_input`: See [`AuthenticatorProofInput`] for more details. - /// - `issuer_schema_id`: The schema ID of the credential issuer. - /// - `action`: The action for which the blinding factor is being requested. - /// - `oprf_key_id`: The OPRF key identifier. - /// - /// # Errors - /// - /// Returns [`ProofError`] in the following cases: - /// * `PublicKeyNotFound` - the public key for the given authenticator private key is not found in the `key_set`. - /// * `InvalidDLogProof` – the `DLog` equality proof could not be verified. - /// * Other errors may propagate from network requests, proof generation, or Groth16 verification. - pub async fn generate( - services: &[String], - threshold: usize, - query_material: &CircomGroth16Material, - authenticator_input: AuthenticatorProofInput, - issuer_schema_id: u64, - action: FieldElement, - connector: Connector, - ) -> Result { - let mut rng = rand::rngs::OsRng; - - // For schema issuer OPRF, the nonce is not needed. - let nonce = FieldElement::ZERO; - - let query_blinding_factor = BlindingFactor::rand(&mut rng); - - let siblings: [ark_babyjubjub::Fq; TREE_DEPTH] = - authenticator_input.inclusion_proof.siblings.map(|s| *s); - - let query_hash = world_id_primitives::authenticator::oprf_query_digest( - authenticator_input.inclusion_proof.leaf_index, - action, - issuer_schema_id.into(), - ); - let signature = authenticator_input.private_key.sign(*query_hash); - - let query_proof_input = QueryProofCircuitInput:: { - pk: authenticator_input.key_set.as_affine_array(), - pk_index: authenticator_input.key_index.into(), - s: signature.s, - r: signature.r, - merkle_root: *authenticator_input.inclusion_proof.root, - depth: ark_babyjubjub::Fq::from(TREE_DEPTH as u64), - mt_index: authenticator_input.inclusion_proof.leaf_index.into(), - siblings, - beta: query_blinding_factor.beta(), - rp_id: issuer_schema_id.into(), - action: *action, - nonce: *nonce, - }; - let _ = errors::check_query_input_validity(&query_proof_input)?; - - tracing::debug!("generating query proof"); - let (proof, public_inputs) = query_material.generate_proof(&query_proof_input, &mut rng)?; - query_material.verify_proof(&proof, &public_inputs)?; - tracing::debug!("generated query proof"); - - let auth = CredentialBlindingFactorOprfRequestAuthV1 { - proof: proof.into(), - action: *action, - nonce: *nonce, - merkle_root: *authenticator_input.inclusion_proof.root, - issuer_schema_id, - }; - - tracing::debug!("executing distributed OPRF"); - - let service_uris = - taceo_oprf::client::to_oprf_uri_many(services, OprfModule::CredentialBlindingFactor) - .context("while building service URI for credential blinding factor")?; - - let verifiable_oprf_output = taceo_oprf::client::distributed_oprf( - &service_uris, - threshold, - *query_hash, - query_blinding_factor, - ark_babyjubjub::Fq::from_be_bytes_mod_order(OPRF_PROOF_DS), - auth, - connector, - ) - .await?; - - Ok(Self { - verifiable_oprf_output, - }) - } -} diff --git a/vendor/world-id-proof/src/lib.rs b/vendor/world-id-proof/src/lib.rs deleted file mode 100644 index ec9164741..000000000 --- a/vendor/world-id-proof/src/lib.rs +++ /dev/null @@ -1,44 +0,0 @@ -#![cfg_attr(not(test), warn(unused_crate_dependencies))] - -use eddsa_babyjubjub::EdDSAPrivateKey; -use world_id_primitives::{ - TREE_DEPTH, authenticator::AuthenticatorPublicKeySet, merkle::MerkleInclusionProof, -}; -use zeroize::{Zeroize, ZeroizeOnDrop}; - -pub mod credential_blinding_factor; -pub mod nullifier; -pub mod proof; - -/// Inputs from the Authenticator to generate a nullifier or blinding factor. -#[derive(Zeroize, ZeroizeOnDrop)] -pub struct AuthenticatorProofInput { - /// The set of all public keys for all the user's authenticators. - #[zeroize(skip)] - key_set: AuthenticatorPublicKeySet, - /// Inclusion proof in the World ID Registry. - #[zeroize(skip)] - inclusion_proof: MerkleInclusionProof, - /// The off-chain signer key for the Authenticator. - private_key: EdDSAPrivateKey, - /// The index at which the authenticator key is located in the `key_set`. - key_index: u64, -} - -impl AuthenticatorProofInput { - /// Creates a new authenticator proof input. - #[must_use] - pub const fn new( - key_set: AuthenticatorPublicKeySet, - inclusion_proof: MerkleInclusionProof, - private_key: EdDSAPrivateKey, - key_index: u64, - ) -> Self { - Self { - key_set, - inclusion_proof, - private_key, - key_index, - } - } -} diff --git a/vendor/world-id-proof/src/nullifier.rs b/vendor/world-id-proof/src/nullifier.rs deleted file mode 100644 index c04faab19..000000000 --- a/vendor/world-id-proof/src/nullifier.rs +++ /dev/null @@ -1,137 +0,0 @@ -//! Logic to generate nullifiers using the OPRF Nodes. - -use ark_ff::PrimeField; -use eyre::Context; -use groth16_material::circom::CircomGroth16Material; - -use taceo_oprf::{ - client::{Connector, VerifiableOprfOutput}, - core::oprf::BlindingFactor, -}; - -use world_id_primitives::{ - FieldElement, ProofRequest, TREE_DEPTH, - circuit_inputs::QueryProofCircuitInput, - nullifier::Nullifier, - oprf::{NullifierOprfRequestAuthV1, OprfModule}, -}; - -use crate::{ - AuthenticatorProofInput, - proof::{OPRF_PROOF_DS, ProofError, errors}, -}; - -/// Nullifier computed using OPRF Nodes. -#[derive(Debug, Clone)] -pub struct OprfNullifier { - /// The raw inputs to the Query Proof circuit - pub query_proof_input: QueryProofCircuitInput, - /// The result of the distributed OPRF protocol. - pub verifiable_oprf_output: VerifiableOprfOutput, - /// The final nullifier value to be used in a Proof. - /// - /// This is equal to [`VerifiableOprfOutput::output`] and is already unblinded. - pub nullifier: Nullifier, -} - -impl OprfNullifier { - /// Generates a nullifier through the provided OPRF nodes for - /// a specific proof request. - /// - /// This method will handle the signature from the Authenticator authorizing the - /// request for the OPRF nodes. - /// - /// # Arguments - /// - `services`: The list of endpoints of all OPRF nodes. - /// - `threshold`: The minimum number of OPRF nodes responses required to compute a valid nullifier. The - /// source of truth for this value lives in the `OprfKeyRegistry` contract. - /// - `query_material`: The material for the query proof circuit. - /// - `authenticator_input`: See [`AuthenticatorProofInput`] for more details. - /// - `proof_request`: The proof request provided by the RP. - /// - /// # Errors - /// - /// Returns [`ProofError`] in the following cases: - /// * `PublicKeyNotFound` - the public key for the given authenticator private key is not found in the `key_set`. - /// * `InvalidDLogProof` – the `DLog` equality proof could not be verified. - /// * Other errors may propagate from network requests, proof generation, or Groth16 verification. - pub async fn generate( - services: &[String], - threshold: usize, - query_material: &CircomGroth16Material, - authenticator_input: AuthenticatorProofInput, - proof_request: &ProofRequest, - connector: Connector, - ) -> Result { - let mut rng = rand::rngs::OsRng; - - let query_blinding_factor = BlindingFactor::rand(&mut rng); - - let siblings: [ark_babyjubjub::Fq; TREE_DEPTH] = - authenticator_input.inclusion_proof.siblings.map(|s| *s); - - let action = *proof_request.computed_action(&mut rng); - let query_hash = world_id_primitives::authenticator::oprf_query_digest( - authenticator_input.inclusion_proof.leaf_index, - action.into(), - proof_request.rp_id.into(), - ); - let signature = authenticator_input.private_key.sign(*query_hash); - - let query_proof_input = QueryProofCircuitInput:: { - pk: authenticator_input.key_set.as_affine_array(), - pk_index: authenticator_input.key_index.into(), - s: signature.s, - r: signature.r, - merkle_root: *authenticator_input.inclusion_proof.root, - depth: ark_babyjubjub::Fq::from(TREE_DEPTH as u64), - mt_index: authenticator_input.inclusion_proof.leaf_index.into(), - siblings, - beta: query_blinding_factor.beta(), - rp_id: *FieldElement::from(proof_request.rp_id), - action, - nonce: *proof_request.nonce, - }; - let _ = errors::check_query_input_validity(&query_proof_input)?; - - tracing::debug!("generating query proof"); - let (proof, public_inputs) = query_material.generate_proof(&query_proof_input, &mut rng)?; - query_material.verify_proof(&proof, &public_inputs)?; - tracing::debug!("generated query proof"); - - let auth = NullifierOprfRequestAuthV1 { - proof: proof.into(), - action, - nonce: *proof_request.nonce, - merkle_root: *authenticator_input.inclusion_proof.root, - current_time_stamp: proof_request.created_at, - expiration_timestamp: proof_request.expires_at, - signature: proof_request.signature, - rp_id: proof_request.rp_id, - }; - - tracing::debug!("executing distributed OPRF"); - - let service_uris = taceo_oprf::client::to_oprf_uri_many(services, OprfModule::Nullifier) - .context("while building service URI for nullifier")?; - - let verifiable_oprf_output = taceo_oprf::client::distributed_oprf( - &service_uris, - threshold, - *query_hash, - query_blinding_factor, - ark_babyjubjub::Fq::from_be_bytes_mod_order(OPRF_PROOF_DS), - auth, - connector, - ) - .await?; - - let nullifier: Nullifier = FieldElement::from(verifiable_oprf_output.output).into(); - - Ok(Self { - query_proof_input, - verifiable_oprf_output, - nullifier, - }) - } -} diff --git a/vendor/world-id-proof/src/proof.rs b/vendor/world-id-proof/src/proof.rs deleted file mode 100644 index 208d4c46f..000000000 --- a/vendor/world-id-proof/src/proof.rs +++ /dev/null @@ -1,435 +0,0 @@ -//! Internal proof generation for the World ID Protocol. -//! -//! Provides functionality for generating ZKPs (zero-knowledge proofs), including -//! Uniqueness Proofs (internally also called Nullifier Proofs `π2`) and Session Proofs. It -//! also contains internal proof computation such as Query Proofs `π1`. -//! -//! The proof generation workflow for Uniqueness Proofs consists of: -//! 1. Loading circuit proving material (zkeys and witness graphs) -//! 2. Signing OPRF queries and generating a Query Proof `π1` -//! 3. Interacting with OPRF services to obtain challenge responses -//! 4. Verifying `DLog` equality proofs from OPRF nodes -//! 5. Generating the final Uniqueness Proof `π2` - -use ark_bn254::Bn254; -use groth16_material::Groth16Error; -use rand::{CryptoRng, Rng}; -use std::{io::Read, path::Path}; -use world_id_primitives::{ - Credential, FieldElement, RequestItem, TREE_DEPTH, circuit_inputs::NullifierProofCircuitInput, - nullifier::Nullifier, -}; - -pub use groth16_material::circom::{ - CircomGroth16Material, CircomGroth16MaterialBuilder, ZkeyError, -}; - -use crate::nullifier::OprfNullifier; - -pub mod errors; - -pub(crate) const OPRF_PROOF_DS: &[u8] = b"World ID Proof"; - -/// The SHA-256 fingerprint of the `OPRFQuery` `ZKey`. -pub const QUERY_ZKEY_FINGERPRINT: &str = - "616c98c6ba024b5a4015d3ebfd20f6cab12e1e33486080c5167a4bcfac111798"; -/// The SHA-256 fingerprint of the `OPRFNullifier` `ZKey`. -pub const NULLIFIER_ZKEY_FINGERPRINT: &str = - "4247e6bfe1af211e72d3657346802e1af00e6071fb32429a200f9fc0a25a36f9"; - -/// The SHA-256 fingerprint of the `OPRFQuery` witness graph. -pub const QUERY_GRAPH_FINGERPRINT: &str = - "6b0cb90304c510f9142a555fe2b7cf31b9f68f6f37286f4471fd5d03e91da311"; -/// The SHA-256 fingerprint of the `OPRFNullifier` witness graph. -pub const NULLIFIER_GRAPH_FINGERPRINT: &str = - "c1d951716e3b74b72e4ea0429986849cadc43cccc630a7ee44a56a6199a66b9a"; - -#[cfg(all(feature = "embed-zkeys", not(docsrs)))] -const CIRCUIT_ARCHIVE: &[u8] = { - #[cfg(feature = "zstd-compress-zkeys")] - { - include_bytes!(concat!(env!("OUT_DIR"), "/circuit_files.tar.zst")) - } - #[cfg(not(feature = "zstd-compress-zkeys"))] - { - include_bytes!(concat!(env!("OUT_DIR"), "/circuit_files.tar")) - } -}; - -#[cfg(all(feature = "embed-zkeys", docsrs))] -const CIRCUIT_ARCHIVE: &[u8] = &[]; - -#[cfg(feature = "embed-zkeys")] -#[derive(Clone, Debug)] -pub struct EmbeddedCircuitFiles { - /// Embedded query witness graph bytes. - pub query_graph: Vec, - /// Embedded nullifier witness graph bytes. - pub nullifier_graph: Vec, - /// Embedded query zkey bytes (decompressed if `compress-zkeys` is enabled). - pub query_zkey: Vec, - /// Embedded nullifier zkey bytes (decompressed if `compress-zkeys` is enabled). - pub nullifier_zkey: Vec, -} - -#[cfg(feature = "embed-zkeys")] -static CIRCUIT_FILES: std::sync::OnceLock> = - std::sync::OnceLock::new(); - -/// Error type for OPRF operations and proof generation. -#[derive(Debug, thiserror::Error)] -pub enum ProofError { - /// Error originating from `oprf_client`. - #[error(transparent)] - OprfError(#[from] taceo_oprf::client::Error), - /// Errors originating from proof inputs - #[error(transparent)] - ProofInputError(#[from] errors::ProofInputError), - /// Errors originating from Groth16 proof generation or verification. - #[error(transparent)] - ZkError(#[from] Groth16Error), - /// Catch-all for other internal errors. - #[error(transparent)] - InternalError(#[from] eyre::Report), -} - -// ============================================================================ -// Circuit Material Loaders -// ============================================================================ - -/// Loads the [`CircomGroth16Material`] for the uniqueness proof (internally also nullifier proof) -/// from the embedded keys in the binary without caching. -/// -/// # Returns -/// The nullifier material. -/// -/// # Errors -/// Will return an error if the zkey file cannot be loaded. -#[cfg(feature = "embed-zkeys")] -pub fn load_embedded_nullifier_material() -> eyre::Result { - let files = load_embedded_circuit_files()?; - load_nullifier_material_from_reader( - files.nullifier_zkey.as_slice(), - files.nullifier_graph.as_slice(), - ) -} - -/// Loads the [`CircomGroth16Material`] for the uniqueness proof (internally also query proof) -/// from the optional zkey file or from embedded keys in the binary. -/// -/// # Returns -/// The query material -/// -/// # Errors -/// Will return an error if the zkey file cannot be loaded. -#[cfg(feature = "embed-zkeys")] -pub fn load_embedded_query_material() -> eyre::Result { - let files = load_embedded_circuit_files()?; - load_query_material_from_reader(files.query_zkey.as_slice(), files.query_graph.as_slice()) -} - -/// Loads the [`CircomGroth16Material`] for the nullifier proof from the provided reader. -/// -/// # Errors -/// Will return an error if the material cannot be loaded or verified. -pub fn load_nullifier_material_from_reader( - zkey: impl Read, - graph: impl Read, -) -> eyre::Result { - Ok(build_nullifier_builder().build_from_reader(zkey, graph)?) -} - -/// Loads the [`CircomGroth16Material`] for the query proof from the provided reader. -/// -/// # Errors -/// Will return an error if the material cannot be loaded or verified. -pub fn load_query_material_from_reader( - zkey: impl Read, - graph: impl Read, -) -> eyre::Result { - Ok(build_query_builder().build_from_reader(zkey, graph)?) -} - -/// Loads the [`CircomGroth16Material`] for the nullifier proof from the provided paths. -/// -/// # Panics -/// Will panic if the material cannot be loaded or verified. -pub fn load_nullifier_material_from_paths( - zkey: impl AsRef, - graph: impl AsRef, -) -> CircomGroth16Material { - build_nullifier_builder() - .build_from_paths(zkey, graph) - .expect("works when loading embedded groth16-material") -} - -/// Loads the [`CircomGroth16Material`] for the query proof from the provided paths. -/// -/// # Errors -/// Will return an error if the material cannot be loaded or verified. -pub fn load_query_material_from_paths( - zkey: impl AsRef, - graph: impl AsRef, -) -> eyre::Result { - Ok(build_query_builder().build_from_paths(zkey, graph)?) -} - -#[cfg(feature = "embed-zkeys")] -pub fn load_embedded_circuit_files() -> eyre::Result { - let files = get_circuit_files()?; - Ok(files.clone()) -} - -#[cfg(feature = "embed-zkeys")] -fn get_circuit_files() -> eyre::Result<&'static EmbeddedCircuitFiles> { - let files = CIRCUIT_FILES.get_or_init(|| init_circuit_files().map_err(|e| e.to_string())); - match files { - Ok(files) => Ok(files), - Err(err) => Err(eyre::eyre!(err.clone())), - } -} - -#[cfg(feature = "embed-zkeys")] -fn init_circuit_files() -> eyre::Result { - use std::io::Read as _; - - use eyre::ContextCompat; - - // Step 1: Decode archive bytes (optional zstd decompression) - let tar_bytes: Vec = { - #[cfg(feature = "zstd-compress-zkeys")] - { - zstd::stream::decode_all(CIRCUIT_ARCHIVE)? - } - #[cfg(not(feature = "zstd-compress-zkeys"))] - { - CIRCUIT_ARCHIVE.to_vec() - } - }; - - // Step 2: Untar — extract 4 entries by filename - let mut query_graph = None; - let mut nullifier_graph = None; - let mut query_zkey = None; - let mut nullifier_zkey = None; - - let mut archive = tar::Archive::new(tar_bytes.as_slice()); - for entry in archive.entries()? { - let mut entry = entry?; - let path = entry.path()?.to_path_buf(); - let name = path - .file_name() - .and_then(|n| n.to_str()) - .unwrap_or_default(); - - let mut buf = Vec::with_capacity(entry.size() as usize); - entry.read_to_end(&mut buf)?; - - match name { - "OPRFQueryGraph.bin" => query_graph = Some(buf), - "OPRFNullifierGraph.bin" => nullifier_graph = Some(buf), - "OPRFQuery.arks.zkey" => query_zkey = Some(buf), - "OPRFNullifier.arks.zkey" => nullifier_zkey = Some(buf), - _ => {} - } - } - - let query_graph = query_graph.context("OPRFQueryGraph.bin not found in archive")?; - let nullifier_graph = nullifier_graph.context("OPRFNullifierGraph.bin not found in archive")?; - #[allow(unused_mut)] - let mut query_zkey = query_zkey.context("OPRFQuery zkey not found in archive")?; - #[allow(unused_mut)] - let mut nullifier_zkey = nullifier_zkey.context("OPRFNullifier zkey not found in archive")?; - - // Step 3: ARK decompress zkeys if compress-zkeys is active - #[cfg(feature = "compress-zkeys")] - { - if let Ok(decompressed) = ark_decompress_zkey(&query_zkey) { - query_zkey = decompressed; - } - if let Ok(decompressed) = ark_decompress_zkey(&nullifier_zkey) { - nullifier_zkey = decompressed; - } - } - - Ok(EmbeddedCircuitFiles { - query_graph, - nullifier_graph, - query_zkey, - nullifier_zkey, - }) -} - -/// ARK-decompresses a zkey. -#[cfg(feature = "compress-zkeys")] -pub fn ark_decompress_zkey(compressed: &[u8]) -> eyre::Result> { - let zkey = as ark_serialize::CanonicalDeserialize>::deserialize_with_mode( - compressed, - ark_serialize::Compress::Yes, - ark_serialize::Validate::Yes, - )?; - - let mut uncompressed = Vec::new(); - ark_serialize::CanonicalSerialize::serialize_with_mode( - &zkey, - &mut uncompressed, - ark_serialize::Compress::No, - )?; - Ok(uncompressed) -} - -fn build_nullifier_builder() -> CircomGroth16MaterialBuilder { - CircomGroth16MaterialBuilder::new() - .fingerprint_zkey(NULLIFIER_ZKEY_FINGERPRINT.into()) - .fingerprint_graph(NULLIFIER_GRAPH_FINGERPRINT.into()) - .bbf_num_2_bits_helper() - .bbf_inv() - .bbf_legendre() - .bbf_sqrt_input() - .bbf_sqrt_unchecked() -} - -fn build_query_builder() -> CircomGroth16MaterialBuilder { - CircomGroth16MaterialBuilder::new() - .fingerprint_zkey(QUERY_ZKEY_FINGERPRINT.into()) - .fingerprint_graph(QUERY_GRAPH_FINGERPRINT.into()) - .bbf_num_2_bits_helper() - .bbf_inv() - .bbf_legendre() - .bbf_sqrt_input() - .bbf_sqrt_unchecked() -} - -// ============================================================================ -// Uniqueness Proof (internally also called nullifier proof) Generation -// ============================================================================ - -/// FIXME. Description. -/// Generates the Groth16 nullifier proof .... -/// -/// Internally can be a Session Proof or Uniqueness Proof -/// -/// # Errors -/// -/// Returns [`ProofError`] if proof generation or verification fails. -#[allow(clippy::too_many_arguments)] -pub fn generate_nullifier_proof( - nullifier_material: &CircomGroth16Material, - rng: &mut R, - credential: &Credential, - credential_sub_blinding_factor: FieldElement, - oprf_nullifier: OprfNullifier, - request_item: &RequestItem, - session_id: Option, - session_id_r_seed: FieldElement, - expires_at_min: u64, -) -> Result< - ( - ark_groth16::Proof, - Vec, - Nullifier, - ), - ProofError, -> { - let cred_signature = credential - .signature - .clone() - .ok_or_else(|| ProofError::InternalError(eyre::eyre!("Credential not signed")))?; - - let nullifier_input = NullifierProofCircuitInput:: { - query_input: oprf_nullifier.query_proof_input, - issuer_schema_id: credential.issuer_schema_id.into(), - cred_pk: credential.issuer.pk, - cred_hashes: [*credential.claims_hash()?, *credential.associated_data_hash], - cred_genesis_issued_at: credential.genesis_issued_at.into(), - cred_genesis_issued_at_min: request_item.genesis_issued_at_min.unwrap_or(0).into(), - cred_expires_at: credential.expires_at.into(), - cred_id: credential.id.into(), - cred_sub_blinding_factor: *credential_sub_blinding_factor, - cred_s: cred_signature.s, - cred_r: cred_signature.r, - id_commitment_r: *session_id_r_seed, - id_commitment: *session_id.unwrap_or(FieldElement::ZERO), - dlog_e: oprf_nullifier.verifiable_oprf_output.dlog_proof.e, - dlog_s: oprf_nullifier.verifiable_oprf_output.dlog_proof.s, - oprf_pk: oprf_nullifier - .verifiable_oprf_output - .oprf_public_key - .inner(), - oprf_response_blinded: oprf_nullifier.verifiable_oprf_output.blinded_response, - oprf_response: oprf_nullifier.verifiable_oprf_output.unblinded_response, - signal_hash: *request_item.signal_hash(), - // The `current_timestamp` constraint in the circuit is used to specify the minimum expiration time for the credential. - // The circuit verifies that `current_timestamp < cred_expires_at`. - current_timestamp: expires_at_min.into(), - }; - - let _ = errors::check_nullifier_input_validity(&nullifier_input)?; - - let (proof, public) = nullifier_material.generate_proof(&nullifier_input, rng)?; - nullifier_material.verify_proof(&proof, &public)?; - - let nullifier: Nullifier = FieldElement::from(public[0]).into(); - - // Verify that the computed nullifier matches the OPRF output. - if nullifier != oprf_nullifier.nullifier { - return Err(ProofError::InternalError(eyre::eyre!( - "Computed nullifier does not match OPRF output" - ))); - } - - Ok((proof, public, nullifier)) -} - -#[cfg(all(test, feature = "embed-zkeys"))] -mod tests { - use super::*; - - #[test] - fn loads_embedded_circuit_files() { - let files = load_embedded_circuit_files().unwrap(); - assert!(!files.query_graph.is_empty()); - assert!(!files.nullifier_graph.is_empty()); - assert!(!files.query_zkey.is_empty()); - assert!(!files.nullifier_zkey.is_empty()); - } - - #[test] - fn builds_materials_from_embedded_readers() { - let files = load_embedded_circuit_files().unwrap(); - load_query_material_from_reader(files.query_zkey.as_slice(), files.query_graph.as_slice()) - .unwrap(); - load_nullifier_material_from_reader( - files.nullifier_zkey.as_slice(), - files.nullifier_graph.as_slice(), - ) - .unwrap(); - } - - #[test] - fn convenience_embedded_material_loaders_work() { - load_embedded_query_material().unwrap(); - load_embedded_nullifier_material().unwrap(); - } - - #[cfg(feature = "compress-zkeys")] - #[test] - fn ark_decompress_zkey_roundtrip() { - use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Compress, Validate}; - use circom_types::{ark_bn254::Bn254, groth16::ArkZkey}; - - let files = load_embedded_circuit_files().unwrap(); - let zkey = ArkZkey::::deserialize_with_mode( - files.query_zkey.as_slice(), - Compress::No, - Validate::Yes, - ) - .unwrap(); - let mut compressed = Vec::new(); - zkey.serialize_with_mode(&mut compressed, Compress::Yes) - .unwrap(); - - let decompressed = ark_decompress_zkey(&compressed).unwrap(); - assert_eq!(decompressed, files.query_zkey); - } -} diff --git a/vendor/world-id-proof/src/proof/errors.rs b/vendor/world-id-proof/src/proof/errors.rs deleted file mode 100644 index 8343c4e94..000000000 --- a/vendor/world-id-proof/src/proof/errors.rs +++ /dev/null @@ -1,847 +0,0 @@ -//! This module contains error types and validation functions for World ID proof inputs. -//! -//! These are intended to assist in producing more helpful error messages for a given proof. -//! If the circuits change in any way, these checks may also need to be updated to match the new logic. -use ark_bn254::Fr; -use ark_ec::{AffineRepr, CurveGroup}; -use ark_ff::{PrimeField, Zero}; -use eddsa_babyjubjub::EdDSAPublicKey; -use taceo_oprf::core::{dlog_equality::DLogEqualityProof, oprf::BlindingFactor}; -use world_id_primitives::{ - FieldElement, - authenticator::{AuthenticatorPublicKeySet, MAX_AUTHENTICATOR_KEYS}, - circuit_inputs::{NullifierProofCircuitInput, QueryProofCircuitInput}, - merkle::MerkleInclusionProof, -}; - -type BaseField = ark_babyjubjub::Fq; -type Affine = ark_babyjubjub::EdwardsAffine; - -#[derive(Debug, thiserror::Error)] -/// Errors that can occur when validating the inputs for a single World ID proof. -pub enum ProofInputError { - /// The specified Merkle tree depth is invalid. - #[error("The specified Merkle tree depth is invalid (expected: {expected}, got: {is}).")] - InvalidMerkleTreeDepth { - /// Expected depth. - expected: usize, - /// Actual depth. - is: BaseField, - }, - /// The set of authenticator public keys is invalid. - #[error("The set of authenticator public keys is invalid.")] - InvalidAuthenticatorPublicKeySet, - /// The provided Merkle tree **inclusion proof** is invalid (the root may or may not be valid for the `WorldIDRegistry` tree) - #[error("The provided Merkle tree inclusion proof is invalid.")] - InvalidMerkleTreeInclusionProof, - /// The signature from the authenticator for the request is invalid. - #[error("The signature over the nonce and RP ID is invalid.")] - InvalidQuerySignature, - /// The provided blinding factor is invalid, or the sub is incorrect. - #[error("The provided blinding factor is invalid.")] - InvalidBlindingFactor, - /// The provided credential has expired. - #[error( - "The provided credential has expired (expires_at: {expires_at}, check_timestamp: {current_timestamp})." - )] - CredentialExpired { - /// Current timestamp. - current_timestamp: u64, - /// Expiration timestamp. - expires_at: u64, - }, - /// The provided credential genesis issue timestamp is expired. - #[error( - "The provided credential has a genesis issued at date that is too old (genesis_issued_at: {genesis_issued_at}, check_timestamp: {genesis_issued_at_min})." - )] - CredentialGenesisExpired { - /// Minimum Issue date. - genesis_issued_at_min: u64, - /// Genesis issue timestamp. - genesis_issued_at: u64, - }, - /// A value is out of bounds. - #[error("The value '{name}' is out of bounds (got: {is}, limit: {limit}).")] - ValueOutOfBounds { - /// Name of the value for error message. - name: &'static str, - /// Actual value. - is: BaseField, - /// Upper limit, not inclusive. - limit: BaseField, - }, - /// The credential signature is invalid. This signals the issued credential is invalid. - #[error("The credential signature is invalid for the given issuer public key.")] - InvalidCredentialSignature, - /// The provided point is not a valid point in the prime-order subgroup of the `BabyJubJub` curve. - #[error( - "The provided point '{name}' is not a valid point in the prime-order subgroup of the BabyJubJub curve." - )] - InvalidBabyJubJubPoint { - /// Name of the point for error message. - name: &'static str, - }, - /// The provided OPRF proof is invalid. - #[error("The provided OPRF DlogEquality proof is invalid.")] - InvalidOprfProof, - /// The provided unblinded OPRF response point is invalid. - #[error("The provided unblinded OPRF response point is invalid.")] - InvalidOprfResponse, - /// The provided session ID commitment is invalid. - #[error( - "The provided session ID commitment is invalid for the given id and session id randomness." - )] - InvalidSessionId, -} - -/// This method checks the validity of the input parameters by emulating the operations that are proved in ZK and raising Errors that would result in an invalid proof. -/// -/// Returns the blinded OPRF query point if everything is ok. -/// -/// # Errors -/// This function will return a [`ProofInputError`] if any of the checks fail. -/// The `Display` implementation of this error can be used to get a human-readable error message on which parts of the input were invalid. -pub fn check_query_input_validity( - inputs: &QueryProofCircuitInput, -) -> Result { - // 1. Check that the depth is within bounds. - if inputs.depth != BaseField::new((TREE_DEPTH as u64).into()) { - return Err(ProofInputError::InvalidMerkleTreeDepth { - expected: TREE_DEPTH, - is: inputs.depth, - }); - } - // 2. Check the merkle proof is valid - // Check the Merkle tree idx is valid. - let idx_u64 = u64::try_from(FieldElement::from(inputs.mt_index)).map_err(|_| { - ProofInputError::ValueOutOfBounds { - name: "Merkle tree index", - is: inputs.mt_index, - limit: BaseField::new((1u64 << TREE_DEPTH).into()), - } - })?; - if idx_u64 >= (1u64 << TREE_DEPTH) { - return Err(ProofInputError::ValueOutOfBounds { - name: "Merkle tree index", - is: inputs.mt_index, - limit: BaseField::new((1u64 << TREE_DEPTH).into()), - }); - } - - // Build the leaf from the PKs. - let pk_set = AuthenticatorPublicKeySet::new( - inputs - .pk - .iter() - .map(|&x| EdDSAPublicKey { pk: x }) - .collect(), - ) - .map_err(|_| ProofInputError::InvalidAuthenticatorPublicKeySet)?; - let pk_set_hash = pk_set.leaf_hash(); - let merkle_tree_inclusion_proof = MerkleInclusionProof::new( - FieldElement::from(inputs.merkle_root), - idx_u64, - inputs.siblings.map(FieldElement::from), - ); - if !merkle_tree_inclusion_proof.is_valid(FieldElement::from(pk_set_hash)) { - return Err(ProofInputError::InvalidMerkleTreeInclusionProof); - } - - // 3. Check that the signature is valid. - let pk_index_usize = usize::try_from(FieldElement::from(inputs.pk_index)).map_err(|_| { - ProofInputError::ValueOutOfBounds { - name: "Authenticator PubKey index", - is: inputs.pk_index, - limit: BaseField::new((MAX_AUTHENTICATOR_KEYS as u64).into()), - } - })?; - let pk = pk_set - .get(pk_index_usize) - .ok_or_else(|| ProofInputError::ValueOutOfBounds { - name: "Authenticator PubKey index", - is: inputs.pk_index, - limit: BaseField::new((MAX_AUTHENTICATOR_KEYS as u64).into()), - })?; - - if !inputs.r.is_on_curve() || !inputs.r.is_in_correct_subgroup_assuming_on_curve() { - return Err(ProofInputError::InvalidBabyJubJubPoint { - name: "Query Signature R", - }); - } - if !pk.pk.is_on_curve() || !pk.pk.is_in_correct_subgroup_assuming_on_curve() { - return Err(ProofInputError::InvalidBabyJubJubPoint { - name: "Authenticator Public Key", - }); - } - - let _rp_id_u64 = u64::try_from(FieldElement::from(inputs.rp_id)).map_err(|_| { - ProofInputError::ValueOutOfBounds { - name: "RP Id", - is: inputs.pk_index, - limit: BaseField::new((MAX_AUTHENTICATOR_KEYS as u64).into()), - } - })?; - let query = world_id_primitives::authenticator::oprf_query_digest( - idx_u64, - FieldElement::from(inputs.action), - FieldElement::from(inputs.rp_id), - ); - let signature = eddsa_babyjubjub::EdDSASignature { - r: inputs.r, - s: inputs.s, - }; - - if !pk.verify(*query, &signature) { - return Err(ProofInputError::InvalidQuerySignature); - } - - let blinding_factor = BlindingFactor::from_scalar(inputs.beta) - .map_err(|_| ProofInputError::InvalidBlindingFactor)?; - let query_point = taceo_oprf::core::oprf::client::blind_query(*query, blinding_factor); - - Ok(query_point.blinded_query()) -} - -/// This method checks the validity of the input parameters by emulating the operations that are proved in ZK and raising Errors that would result in an invalid proof. -/// -/// Returns the computed nullifier if everything is ok. -/// -/// # Errors -/// This function will return a [`ProofInputError`] if any of the checks fail. -/// The `Display` implementation of this error can be used to get a human-readable error message on which parts of the input were invalid. -#[expect( - clippy::too_many_lines, - reason = "necessary checks for input validity should be in one function" -)] -pub fn check_nullifier_input_validity( - inputs: &NullifierProofCircuitInput, -) -> Result { - // 1. Check the validity of the query input. - let blinded_query = check_query_input_validity(&inputs.query_input)?; - - // 2. Credential validity checks - // Check timestamps are within bounds. - let current_timestamp_u64 = u64::try_from(FieldElement::from(inputs.current_timestamp)) - .map_err(|_| ProofInputError::ValueOutOfBounds { - name: "current timestamp", - is: inputs.current_timestamp, - limit: BaseField::new(u64::MAX.into()), - })?; - let credential_expires_at_u64 = u64::try_from(FieldElement::from(inputs.cred_expires_at)) - .map_err(|_| ProofInputError::ValueOutOfBounds { - name: "credential expiry timestamp", - is: inputs.current_timestamp, - limit: BaseField::new(u64::MAX.into()), - })?; - // Check that the credential has not expired. - if credential_expires_at_u64 <= current_timestamp_u64 { - return Err(ProofInputError::CredentialExpired { - current_timestamp: current_timestamp_u64, - expires_at: credential_expires_at_u64, - }); - } - // Genesis checks - let genesis_issued_at_u64 = u64::try_from(FieldElement::from(inputs.cred_genesis_issued_at)) - .map_err(|_| ProofInputError::ValueOutOfBounds { - name: "credential genesis issued at", - is: inputs.cred_genesis_issued_at, - limit: BaseField::new(u64::MAX.into()), - })?; - let genesis_issued_at_min_u64 = - u64::try_from(FieldElement::from(inputs.cred_genesis_issued_at_min)).map_err(|_| { - ProofInputError::ValueOutOfBounds { - name: "credential genesis issued at minimum bound", - is: inputs.cred_genesis_issued_at_min, - limit: BaseField::new(u64::MAX.into()), - } - })?; - if genesis_issued_at_min_u64 > genesis_issued_at_u64 { - return Err(ProofInputError::CredentialGenesisExpired { - genesis_issued_at_min: genesis_issued_at_min_u64, - genesis_issued_at: genesis_issued_at_u64, - }); - } - - let blinded_subject = sub( - FieldElement::from(inputs.query_input.mt_index), - FieldElement::from(inputs.cred_sub_blinding_factor), - ); - - let cred_hash = hash_credential( - FieldElement::from(inputs.issuer_schema_id), - blinded_subject, - FieldElement::from(inputs.cred_genesis_issued_at), - FieldElement::from(inputs.cred_expires_at), - FieldElement::from(inputs.cred_hashes[0]), - FieldElement::from(inputs.cred_hashes[1]), - FieldElement::from(inputs.cred_id), - ); - let pk = EdDSAPublicKey { pk: inputs.cred_pk }; - - let signature = eddsa_babyjubjub::EdDSASignature { - r: inputs.cred_r, - s: inputs.cred_s, - }; - - if !inputs.cred_r.is_on_curve() || !inputs.cred_r.is_in_correct_subgroup_assuming_on_curve() { - return Err(ProofInputError::InvalidBabyJubJubPoint { - name: "Credential Signature R", - }); - } - if !pk.pk.is_on_curve() || !pk.pk.is_in_correct_subgroup_assuming_on_curve() { - return Err(ProofInputError::InvalidBabyJubJubPoint { - name: "Credential Public Key", - }); - } - - if !pk.verify(*cred_hash, &signature) { - return Err(ProofInputError::InvalidCredentialSignature); - } - - // 3. Dlog Equality proof checks - if !inputs.oprf_pk.is_on_curve() || !inputs.oprf_pk.is_in_correct_subgroup_assuming_on_curve() { - return Err(ProofInputError::InvalidBabyJubJubPoint { - name: "OPRF Public Key", - }); - } - if !inputs.oprf_response_blinded.is_on_curve() - || !inputs - .oprf_response_blinded - .is_in_correct_subgroup_assuming_on_curve() - { - return Err(ProofInputError::InvalidBabyJubJubPoint { - name: "OPRF Blinded Response", - }); - } - - // check dlog eq proof is valid - let dlog_proof = DLogEqualityProof { - e: inputs.dlog_e, - s: inputs.dlog_s, - }; - dlog_proof - .verify( - inputs.oprf_pk, - blinded_query, - inputs.oprf_response_blinded, - Affine::generator(), - ) - .map_err(|_| ProofInputError::InvalidOprfProof)?; - - // check that the unblinded response is correct - if !inputs.oprf_response.is_on_curve() - || !inputs - .oprf_response - .is_in_correct_subgroup_assuming_on_curve() - { - return Err(ProofInputError::InvalidBabyJubJubPoint { - name: "OPRF Unblinded Response", - }); - } - let expected_blinded_response = (inputs.oprf_response * inputs.query_input.beta).into_affine(); - if expected_blinded_response != inputs.oprf_response_blinded { - return Err(ProofInputError::InvalidOprfResponse); - } - - // check that session_id commitment is correct - if !inputs.id_commitment.is_zero() { - let expected_commitment = session_id_commitment( - FieldElement::from(inputs.query_input.mt_index), - FieldElement::from(inputs.id_commitment_r), - ); - if expected_commitment != FieldElement::from(inputs.id_commitment) { - return Err(ProofInputError::InvalidSessionId); - } - } - - // 4. Compute the nullifier - let nullfier = oprf_finalize_hash( - *world_id_primitives::authenticator::oprf_query_digest( - #[expect( - clippy::missing_panics_doc, - reason = "checked in check_query_input_validity" - )] - u64::try_from(FieldElement::from(inputs.query_input.mt_index)).unwrap(), - FieldElement::from(inputs.query_input.action), - FieldElement::from(inputs.query_input.rp_id), - ), - inputs.oprf_response, - ); - - Ok(nullfier) -} - -// Helper functions to recompute various hashes used in the circuit - -// Recompute the blinded subject, copied from credential -fn sub(leaf_index: FieldElement, blinding_factor: FieldElement) -> FieldElement { - let sub_ds = Fr::from_be_bytes_mod_order(b"H_CS(id, r)"); - let mut input = [sub_ds, *leaf_index, *blinding_factor]; - poseidon2::bn254::t3::permutation_in_place(&mut input); - input[1].into() -} -// Recompute the OPRF finalization hash -fn oprf_finalize_hash(query: BaseField, oprf_response: Affine) -> FieldElement { - let finalize_ds = Fr::from_be_bytes_mod_order(super::OPRF_PROOF_DS); - let mut input = [finalize_ds, query, oprf_response.x, oprf_response.y]; - poseidon2::bn254::t4::permutation_in_place(&mut input); - input[1].into() -} - -// Recompute the session_id_commitment -fn session_id_commitment(user_id: FieldElement, commitment_rand: FieldElement) -> FieldElement { - let sub_ds = Fr::from_be_bytes_mod_order(b"H(id, r)"); - let mut input = [sub_ds, *user_id, *commitment_rand]; - poseidon2::bn254::t3::permutation_in_place(&mut input); - input[1].into() -} - -// Recompute the credential hash, copied from credential -fn hash_credential( - issuer_schema_id: FieldElement, - sub: FieldElement, - genesis_issued_at: FieldElement, - expires_at: FieldElement, - claims_hash: FieldElement, - associated_data_hash: FieldElement, - id: FieldElement, -) -> FieldElement { - let cred_ds = Fr::from_be_bytes_mod_order(b"POSEIDON2+EDDSA-BJJ"); - let mut input = [ - cred_ds, - *issuer_schema_id, - *sub, - *genesis_issued_at, - *expires_at, - *claims_hash, - *associated_data_hash, - *id, - ]; - poseidon2::bn254::t8::permutation_in_place(&mut input); - input[1].into() -} - -#[cfg(test)] -mod tests { - use ark_ec::twisted_edwards::Affine; - use std::str::FromStr; - use world_id_primitives::circuit_inputs::{NullifierProofCircuitInput, QueryProofCircuitInput}; - - use crate::proof::errors::{check_nullifier_input_validity, check_query_input_validity}; - - // gotten these values by `dbg`-ing the struct in the e2e_authenticator_generate test - fn get_valid_query_proof_input() -> QueryProofCircuitInput<30> { - QueryProofCircuitInput { - pk: [Affine { - x: ark_babyjubjub::Fq::from_str( - "19037598474602150174935475944965340829216795940473064039209388058233204431288", - ).unwrap(), - y: ark_babyjubjub::Fq::from_str( - "3549932221586364715003722955756497910920276078443163728621283280434115857197", - ).unwrap(), - }, - Affine::zero(), - Affine::zero(), - Affine::zero(), - Affine::zero(), - Affine::zero(), - Affine::zero(), - ], - pk_index: ark_bn254::Fr::from(0u64), - s: ark_babyjubjub::Fr::from_str( - "2692248185200295468055279425612708965310378163906753799023551825366269352327", - ).unwrap(), - r: Affine { - x: ark_babyjubjub::Fq::from_str( - "14689596469778385278298478829656243946283084496217945909620117398922933730711", - ).unwrap(), - y: ark_babyjubjub::Fq::from_str( - "4424830738973486800075394160997493242162871494907432163152597205147606706197", - ).unwrap(), - }, - merkle_root: ark_bn254::Fr::from_str("4959814736111706042728533661656003495359474679272202023690954858781105690707").unwrap(), - depth: ark_babyjubjub::Fq::from(30u64), - mt_index: ark_bn254::Fr::from(1u64), - siblings: [ - ark_bn254::Fr::from_str("0").unwrap(), - ark_bn254::Fr::from_str("15621590199821056450610068202457788725601603091791048810523422053872049975191").unwrap(), - ark_bn254::Fr::from_str("15180302612178352054084191513289999058431498575847349863917170755410077436260").unwrap(), - ark_bn254::Fr::from_str("20846426933296943402289409165716903143674406371782261099735847433924593192150").unwrap(), - ark_bn254::Fr::from_str("19570709311100149041770094415303300085749902031216638721752284824736726831172").unwrap(), - ark_bn254::Fr::from_str("11737142173000203701607979434185548337265641794352013537668027209469132654026").unwrap(), - ark_bn254::Fr::from_str("11865865012735342650993929214218361747705569437250152833912362711743119784159").unwrap(), - ark_bn254::Fr::from_str("1493463551715988755902230605042557878234810673525086316376178495918903796315").unwrap(), - ark_bn254::Fr::from_str("18746103596419850001763894956142528089435746267438407061601783590659355049966").unwrap(), - ark_bn254::Fr::from_str("21234194473503024590374857258930930634542887619436018385581872843343250130100").unwrap(), - ark_bn254::Fr::from_str("14681119568252857310414189897145410009875739166689283501408363922419813627484").unwrap(), - ark_bn254::Fr::from_str("13243470632183094581890559006623686685113540193867211988709619438324105679244").unwrap(), - ark_bn254::Fr::from_str("19463898140191333844443019106944343282402694318119383727674782613189581590092").unwrap(), - ark_bn254::Fr::from_str("10565902370220049529800497209344287504121041033501189980624875736992201671117").unwrap(), - ark_bn254::Fr::from_str("5560307625408070902174028041423028597194394554482880015024167821933869023078").unwrap(), - ark_bn254::Fr::from_str("20576730574720116265513866548855226316241518026808984067485384181494744706390").unwrap(), - ark_bn254::Fr::from_str("11166760821615661136366651998133963805984915741187325490784169611245269155689").unwrap(), - ark_bn254::Fr::from_str("13692603500396323648417392244466291089928913430742736835590182936663435788822").unwrap(), - ark_bn254::Fr::from_str("11129674755567463025028188404867541558752927519269975708924528737249823830641").unwrap(), - ark_bn254::Fr::from_str("6673535049007525806710184801639542254440636510496168661971704157154828514023").unwrap(), - ark_bn254::Fr::from_str("7958154589163466663626421142270206662020519181323839780192984613274682930816").unwrap(), - ark_bn254::Fr::from_str("3739156991379607404516753076057250171966250101655747790592556040569841550790").unwrap(), - ark_bn254::Fr::from_str("1334107297020502384420211493664486465203492095766400031330900935069700302301").unwrap(), - ark_bn254::Fr::from_str("20357028769054354174264046872903423695314313082869184437966002491602414517674").unwrap(), - ark_bn254::Fr::from_str("19392290367394672558538719012722289280213395590510602524366987685302929990731").unwrap(), - ark_bn254::Fr::from_str("7360502715619830055199267117332475946442427205382059394111067387016428818088").unwrap(), - ark_bn254::Fr::from_str("9629177338475347225553791169746168712988898028547587350296027054067573957412").unwrap(), - ark_bn254::Fr::from_str("21877160135037839571797468541807904053886800340144060811298025652177410263004").unwrap(), - ark_bn254::Fr::from_str("7105691694342706282901391345307729036900705570482804586768449537652208350743").unwrap(), - ark_bn254::Fr::from_str("15888057581779748293164452094398990053773731478520540058125130669204703869637").unwrap(), - ], - beta: ark_babyjubjub::Fr::from_str("1277277022932719396321614946989807194659268059729440522321681213750340643042").unwrap(), - rp_id: ark_bn254::Fr::from_str("14631649082411674499").unwrap(), - action: ark_bn254::Fr::from_str("8982441576518976929447725179565370305223105654688049122733783421407497941726").unwrap(), - nonce: ark_bn254::Fr::from_str("8530676162050357218814694371816107906694725175836943927290214963954696613748").unwrap(), - } - } - - #[test] - fn test_valid_query_proof_input() { - let inputs = get_valid_query_proof_input(); - let _ = check_query_input_validity(&inputs).unwrap(); - } - - #[test] - fn test_invalid_query_proof_input() { - let inputs = get_valid_query_proof_input(); - { - let mut inputs = inputs.clone(); - inputs.depth = ark_babyjubjub::Fq::from(29u64); // invalid depth - assert!(matches!( - check_query_input_validity(&inputs).unwrap_err(), - super::ProofInputError::InvalidMerkleTreeDepth { .. } - )); - } - { - let mut inputs = inputs.clone(); - // 1 << 30 - inputs.mt_index = ark_bn254::Fr::from(1073741824u64); - assert!(matches!( - check_query_input_validity(&inputs).unwrap_err(), - super::ProofInputError::ValueOutOfBounds { - name: "Merkle tree index", - .. - } - )); - } - { - let mut inputs = inputs.clone(); - inputs.merkle_root = ark_bn254::Fr::from(12345u64); - assert!(matches!( - check_query_input_validity(&inputs).unwrap_err(), - super::ProofInputError::InvalidMerkleTreeInclusionProof - )); - } - { - let mut inputs = inputs.clone(); - inputs.pk_index = ark_bn254::Fr::from(7u64); // MAX_AUTHENTICATOR_KEYS is 7, so index 7 is out of bounds (0-6) - assert!(matches!( - check_query_input_validity(&inputs).unwrap_err(), - super::ProofInputError::ValueOutOfBounds { - name: "Authenticator PubKey index", - .. - } - )); - } - { - let mut inputs = inputs.clone(); - inputs.r = Affine { - x: ark_babyjubjub::Fq::from(1u64), - y: ark_babyjubjub::Fq::from(2u64), - }; - assert!(matches!( - check_query_input_validity(&inputs).unwrap_err(), - super::ProofInputError::InvalidBabyJubJubPoint { - name: "Query Signature R" - } - )); - } - { - let mut inputs = inputs.clone(); - inputs.pk[0] = Affine { - x: ark_babyjubjub::Fq::from(1u64), - y: ark_babyjubjub::Fq::from(2u64), - }; - - // Recompute the merkle root so the proof is valid - let pk_set = world_id_primitives::authenticator::AuthenticatorPublicKeySet::new( - inputs - .pk - .iter() - .map(|&x| eddsa_babyjubjub::EdDSAPublicKey { pk: x }) - .collect(), - ) - .unwrap(); - let mut current = pk_set.leaf_hash(); - let idx = - u64::try_from(world_id_primitives::FieldElement::from(inputs.mt_index)).unwrap(); - for (i, sibling) in inputs.siblings.iter().enumerate() { - let sibling_fr = *world_id_primitives::FieldElement::from(*sibling); - if (idx >> i) & 1 == 0 { - let mut state = poseidon2::bn254::t2::permutation(&[current, sibling_fr]); - state[0] += current; - current = state[0]; - } else { - let mut state = poseidon2::bn254::t2::permutation(&[sibling_fr, current]); - state[0] += sibling_fr; - current = state[0]; - } - } - inputs.merkle_root = current; - - assert!(matches!( - check_query_input_validity(&inputs).unwrap_err(), - super::ProofInputError::InvalidBabyJubJubPoint { - name: "Authenticator Public Key" - } - )); - } - { - let mut inputs = inputs.clone(); - inputs.action = ark_bn254::Fr::from(12345u64); - assert!(matches!( - check_query_input_validity(&inputs).unwrap_err(), - super::ProofInputError::InvalidQuerySignature - )); - } - } - - fn get_valid_nullifier_proof_input() -> NullifierProofCircuitInput<30> { - NullifierProofCircuitInput { - query_input: get_valid_query_proof_input(), - issuer_schema_id: ark_bn254::Fr::from(1u64), - cred_pk: Affine { - x: ark_babyjubjub::Fq::from_str( - "15406775215557320288232407896017344573719706795510112309920214099347968981892", - ) - .unwrap(), - y: ark_babyjubjub::Fq::from_str( - "486388649729314270871358770861421181497883381447163109744630700259216042819", - ) - .unwrap(), - }, - cred_hashes: [ - ark_bn254::Fr::from_str( - "14272087287699568472569351444185311392108883722570788958733484799744115401870", - ) - .unwrap(), - ark_bn254::Fr::from_str("0").unwrap(), - ], - cred_genesis_issued_at: ark_bn254::Fr::from(1770125923u64), - cred_expires_at: ark_bn254::Fr::from(1770125983u64), - cred_s: ark_babyjubjub::Fr::from_str( - "1213918488111680600555111454085490191981091366153388773926786471247948539005", - ) - .unwrap(), - cred_r: Affine { - x: ark_babyjubjub::Fq::from_str( - "15844586803954862856390946258558419582000810449135704981677693963391564067969", - ) - .unwrap(), - y: ark_babyjubjub::Fq::from_str( - "592710378120172403096018676235519447487818389124797234601458948988041235710", - ) - .unwrap(), - }, - current_timestamp: ark_bn254::Fr::from(1770125908u64), - cred_genesis_issued_at_min: ark_bn254::Fr::from(0u64), - cred_sub_blinding_factor: ark_bn254::Fr::from_str( - "12170146734368267085913078854954627576787934009906407554611507307540342380837", - ) - .unwrap(), - cred_id: ark_bn254::Fr::from(3198767490419873482u64), - id_commitment_r: ark_bn254::Fr::from_str( - "11722352184830287916674945948108962396487445899741105828127518108056503126019", - ) - .unwrap(), - id_commitment: ark_bn254::Fr::from(0u64), - dlog_e: ark_bn254::Fr::from_str( - "20738873297635092620048980552264360096607713029337408079647701591795211132447", - ) - .unwrap(), - dlog_s: ark_babyjubjub::Fr::from_str( - "409914485496464180245985942628922659137136006706846380135829705769429965654", - ) - .unwrap(), - oprf_pk: Affine { - x: ark_babyjubjub::Fq::from_str( - "2124016492737602714904869498047199181102594928943726277329982080254326092458", - ) - .unwrap(), - y: ark_babyjubjub::Fq::from_str( - "13296886400185574560491768605341786437896334271868835545571935419923854148448", - ) - .unwrap(), - }, - oprf_response_blinded: Affine { - x: ark_babyjubjub::Fq::from_str( - "186021305824089989598292966483056363224488147240980559441958002546059602483", - ) - .unwrap(), - y: ark_babyjubjub::Fq::from_str( - "16813058203546508924422863380215026034284821141284206571184467783067057954778", - ) - .unwrap(), - }, - oprf_response: Affine { - x: ark_babyjubjub::Fq::from_str( - "10209445202057032226639052993170591937356545068582397532992536070677055126187", - ) - .unwrap(), - y: ark_babyjubjub::Fq::from_str( - "21877375411477040679486668720099554257785799784699842830375906922948306109699", - ) - .unwrap(), - }, - signal_hash: ark_bn254::Fr::from_str( - "37938388892362834151584770384290207919364301626797345218722464515205243407", - ) - .unwrap(), - } - } - - #[test] - fn test_valid_nullifier_proof_input() { - let inputs = get_valid_nullifier_proof_input(); - let _ = check_nullifier_input_validity(&inputs).unwrap(); - } - - #[test] - fn test_invalid_nullifier_proof_input() { - let inputs = get_valid_nullifier_proof_input(); - { - let mut inputs = inputs.clone(); - inputs.current_timestamp = - ark_babyjubjub::Fq::from_str("123465723894591324701234982134000070").unwrap(); // invalid timestamp - assert!(matches!( - check_nullifier_input_validity(&inputs).unwrap_err(), - super::ProofInputError::ValueOutOfBounds { - name: "current timestamp", - .. - } - )); - } - { - let mut inputs = inputs.clone(); - inputs.current_timestamp = inputs.cred_expires_at; - assert!(matches!( - check_nullifier_input_validity(&inputs).unwrap_err(), - super::ProofInputError::CredentialExpired { .. } - )); - } - { - let mut inputs = inputs.clone(); - // genesis issued at 1770125923 - inputs.cred_genesis_issued_at_min = ark_bn254::Fr::from(1770125924u64); - assert!(matches!( - check_nullifier_input_validity(&inputs).unwrap_err(), - super::ProofInputError::CredentialGenesisExpired { .. } - )); - } - { - let mut inputs = inputs.clone(); - inputs.cred_r = Affine { - x: ark_babyjubjub::Fq::from(1u64), - y: ark_babyjubjub::Fq::from(2u64), - }; - assert!(matches!( - check_nullifier_input_validity(&inputs).unwrap_err(), - super::ProofInputError::InvalidBabyJubJubPoint { - name: "Credential Signature R" - } - )); - } - { - let mut inputs = inputs.clone(); - inputs.cred_pk = Affine { - x: ark_babyjubjub::Fq::from(1u64), - y: ark_babyjubjub::Fq::from(2u64), - }; - assert!(matches!( - check_nullifier_input_validity(&inputs).unwrap_err(), - super::ProofInputError::InvalidBabyJubJubPoint { - name: "Credential Public Key" - } - )); - } - { - let mut inputs = inputs.clone(); - inputs.cred_s = ark_babyjubjub::Fr::from(12345u64); - assert!(matches!( - check_nullifier_input_validity(&inputs).unwrap_err(), - super::ProofInputError::InvalidCredentialSignature - )); - } - { - let mut inputs = inputs.clone(); - inputs.oprf_pk = Affine { - x: ark_babyjubjub::Fq::from(1u64), - y: ark_babyjubjub::Fq::from(2u64), - }; - assert!(matches!( - check_nullifier_input_validity(&inputs).unwrap_err(), - super::ProofInputError::InvalidBabyJubJubPoint { - name: "OPRF Public Key" - } - )); - } - { - let mut inputs = inputs.clone(); - inputs.oprf_response_blinded = Affine { - x: ark_babyjubjub::Fq::from(1u64), - y: ark_babyjubjub::Fq::from(2u64), - }; - assert!(matches!( - check_nullifier_input_validity(&inputs).unwrap_err(), - super::ProofInputError::InvalidBabyJubJubPoint { - name: "OPRF Blinded Response" - } - )); - } - { - let mut inputs = inputs.clone(); - inputs.dlog_s = ark_babyjubjub::Fr::from(12345u64); - assert!(matches!( - check_nullifier_input_validity(&inputs).unwrap_err(), - super::ProofInputError::InvalidOprfProof - )); - } - { - let mut inputs = inputs.clone(); - inputs.oprf_response = Affine { - x: ark_babyjubjub::Fq::from(1u64), - y: ark_babyjubjub::Fq::from(2u64), - }; - assert!(matches!( - check_nullifier_input_validity(&inputs).unwrap_err(), - super::ProofInputError::InvalidBabyJubJubPoint { - name: "OPRF Unblinded Response" - } - )); - } - { - let mut inputs = inputs.clone(); - // Valid point but incorrect for the blinded response - use ark_ec::AffineRepr; - inputs.oprf_response = ark_babyjubjub::EdwardsAffine::generator(); - assert!(matches!( - check_nullifier_input_validity(&inputs).unwrap_err(), - super::ProofInputError::InvalidOprfResponse - )); - } - { - let mut inputs = inputs.clone(); - inputs.id_commitment = ark_bn254::Fr::from(12345u64); - assert!(matches!( - check_nullifier_input_validity(&inputs).unwrap_err(), - super::ProofInputError::InvalidSessionId - )); - } - } -} diff --git a/walletkit-core/Cargo.toml b/walletkit-core/Cargo.toml index baba9e516..7550a0b8b 100644 --- a/walletkit-core/Cargo.toml +++ b/walletkit-core/Cargo.toml @@ -47,7 +47,6 @@ tracing-log = "0.2" tracing-subscriber = { version = "0.3", features = ["env-filter"] } zeroize = "1" uuid = { version = "1.10", features = ["v4"] } -uniffi = { workspace = true } taceo-oprf = { version = "0.7.1", default-features = false, features = ["client"] } world-id-core = { workspace = true, features = ["authenticator"] } ciborium = "0.2.2" diff --git a/walletkit-core/src/authenticator/mod.rs b/walletkit-core/src/authenticator/mod.rs index 19fe41833..44f92bdfe 100644 --- a/walletkit-core/src/authenticator/mod.rs +++ b/walletkit-core/src/authenticator/mod.rs @@ -254,13 +254,12 @@ impl Authenticator { store: Arc, ) -> Result { let config = Config::from_environment(environment, rpc_url, region)?; - let authenticator = CoreAuthenticator::init( - seed, - config, - Arc::clone(&materials.query), - Arc::clone(&materials.nullifier), - ) - .await?; + let authenticator = CoreAuthenticator::init(seed, config) + .await? + .with_proof_materials( + Arc::clone(&materials.query), + Arc::clone(&materials.nullifier), + ); Ok(Self { inner: authenticator, store, @@ -286,13 +285,12 @@ impl Authenticator { attribute: "config".to_string(), reason: "Invalid config".to_string(), })?; - let authenticator = CoreAuthenticator::init( - seed, - config, - Arc::clone(&materials.query), - Arc::clone(&materials.nullifier), - ) - .await?; + let authenticator = CoreAuthenticator::init(seed, config) + .await? + .with_proof_materials( + Arc::clone(&materials.query), + Arc::clone(&materials.nullifier), + ); Ok(Self { inner: authenticator, store, From f9d2f70faabdf448892658a0eedb0b8a98bba5cc Mon Sep 17 00:00:00 2001 From: Otto Date: Mon, 23 Mar 2026 14:59:54 +0000 Subject: [PATCH 31/33] fix(wasm): move set_vault_changed_listener out of #[uniffi::export] block The UniFFI proc macro processes all methods in the impl block before `#[cfg]` attributes are evaluated, so `VaultChangedListener` was being resolved even on wasm32 where the cfg-gated import is absent. Move the method into the non-uniffi impl block where the `#[cfg]` gate works as expected. --- walletkit-core/src/storage/credential_storage.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/walletkit-core/src/storage/credential_storage.rs b/walletkit-core/src/storage/credential_storage.rs index baba5c5a3..fa0a2cf68 100644 --- a/walletkit-core/src/storage/credential_storage.rs +++ b/walletkit-core/src/storage/credential_storage.rs @@ -329,7 +329,10 @@ impl CredentialStore { } result } +} +/// Implementation not exposed to foreign bindings +impl CredentialStore { /// Registers a listener that is called after every successful vault /// mutation (store, delete, purge). /// @@ -363,10 +366,7 @@ impl CredentialStore { } } } -} -/// Implementation not exposed to foreign bindings -impl CredentialStore { /// Best-effort notification to the registered vault-changed listener. /// No-op on wasm32 where the listener cannot be registered. fn notify_vault_changed(&self) { From ae6dd769ba1542248fd02ba4aa245b0a1b06eee5 Mon Sep 17 00:00:00 2001 From: Otto Date: Mon, 23 Mar 2026 15:51:07 +0000 Subject: [PATCH 32/33] fix(wasm): move cfg-gated backup methods out of uniffi::export block --- .../src/storage/credential_storage.rs | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/walletkit-core/src/storage/credential_storage.rs b/walletkit-core/src/storage/credential_storage.rs index fa0a2cf68..c1a0e7abf 100644 --- a/walletkit-core/src/storage/credential_storage.rs +++ b/walletkit-core/src/storage/credential_storage.rs @@ -259,53 +259,6 @@ impl CredentialStore { .merkle_cache_put(proof_bytes, now, ttl_seconds) } - /// Exports the current vault as an in-memory plaintext (unencrypted) - /// `SQLite` database for backup. - /// - /// The host app is responsible for persisting or uploading the returned - /// bytes - /// - /// # Errors - /// - /// Returns an error if the store is not initialized or the export fails. - #[cfg(not(target_arch = "wasm32"))] - #[expect( - clippy::significant_drop_tightening, - reason = "lock held intentionally for the full operation to prevent concurrent cleanup from deleting in-use temp files" - )] - pub fn export_vault_for_backup(&self) -> StorageResult> { - let inner = self.lock_inner()?; - inner.cleanup_stale_backup_files(); - let path = inner.export_vault_for_backup_to_file()?; - let _cleanup = CleanupFile(path.clone()); - - std::fs::read(&path).map_err(|e| { - StorageError::VaultDb(format!("failed to read exported vault: {e}")) - }) - } - - /// Imports credentials from an in-memory plaintext vault backup. - /// - /// The store must already be initialized via [`init`](Self::init). - /// Intended for restore on a fresh install where the vault is empty. - /// - /// # Errors - /// - /// Returns an error if the store is not initialized or the import fails. - #[cfg(not(target_arch = "wasm32"))] - #[expect( - clippy::needless_pass_by_value, - reason = "Vec required for UniFFI lifting" - )] - pub fn import_vault_from_backup(&self, backup_bytes: Vec) -> StorageResult<()> { - let inner = self.lock_inner()?; - inner.cleanup_stale_backup_files(); - let path = inner.write_temp_backup_file(&backup_bytes)?; - let _cleanup = CleanupFile(path.clone()); - - inner.import_vault_from_file(&path) - } - /// **Development only.** Permanently deletes all stored credentials and their /// associated blob data from the vault. /// @@ -367,6 +320,53 @@ impl CredentialStore { } } + /// Exports the current vault as an in-memory plaintext (unencrypted) + /// `SQLite` database for backup. + /// + /// The host app is responsible for persisting or uploading the returned + /// bytes + /// + /// # Errors + /// + /// Returns an error if the store is not initialized or the export fails. + #[cfg(not(target_arch = "wasm32"))] + #[expect( + clippy::significant_drop_tightening, + reason = "lock held intentionally for the full operation to prevent concurrent cleanup from deleting in-use temp files" + )] + pub fn export_vault_for_backup(&self) -> StorageResult> { + let inner = self.lock_inner()?; + inner.cleanup_stale_backup_files(); + let path = inner.export_vault_for_backup_to_file()?; + let _cleanup = CleanupFile(path.clone()); + + std::fs::read(&path).map_err(|e| { + StorageError::VaultDb(format!("failed to read exported vault: {e}")) + }) + } + + /// Imports credentials from an in-memory plaintext vault backup. + /// + /// The store must already be initialized via [`init`](Self::init). + /// Intended for restore on a fresh install where the vault is empty. + /// + /// # Errors + /// + /// Returns an error if the store is not initialized or the import fails. + #[cfg(not(target_arch = "wasm32"))] + #[expect( + clippy::needless_pass_by_value, + reason = "Vec required for UniFFI lifting" + )] + pub fn import_vault_from_backup(&self, backup_bytes: Vec) -> StorageResult<()> { + let inner = self.lock_inner()?; + inner.cleanup_stale_backup_files(); + let path = inner.write_temp_backup_file(&backup_bytes)?; + let _cleanup = CleanupFile(path.clone()); + + inner.import_vault_from_file(&path) + } + /// Best-effort notification to the registered vault-changed listener. /// No-op on wasm32 where the listener cannot be registered. fn notify_vault_changed(&self) { From 96a898fca81009b2c17434130043b4b8860b11f1 Mon Sep 17 00:00:00 2001 From: Otto Date: Mon, 23 Mar 2026 15:56:02 +0000 Subject: [PATCH 33/33] fix(wasm): move cfg-gated backup methods into native uniffi export block --- .../src/storage/credential_storage.rs | 76 ++++++++++--------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/walletkit-core/src/storage/credential_storage.rs b/walletkit-core/src/storage/credential_storage.rs index c1a0e7abf..ac221a6d5 100644 --- a/walletkit-core/src/storage/credential_storage.rs +++ b/walletkit-core/src/storage/credential_storage.rs @@ -284,42 +284,9 @@ impl CredentialStore { } } -/// Implementation not exposed to foreign bindings +#[cfg(not(target_arch = "wasm32"))] +#[uniffi::export] impl CredentialStore { - /// Registers a listener that is called after every successful vault - /// mutation (store, delete, purge). - /// - /// Only one listener can be active at a time — calling this replaces any - /// previously registered listener. The previous delivery thread shuts down - /// automatically when the old sender is dropped. - /// - /// Delivery happens on a dedicated background thread to avoid re-entering - /// the `UniFFI` call stack (see `logger.rs` for rationale). - /// - /// **Warning:** the listener **must not** call back into this - /// `CredentialStore` — doing so will deadlock. - #[cfg(not(target_arch = "wasm32"))] - pub fn set_vault_changed_listener(&self, listener: Arc) { - let (tx, rx) = mpsc::sync_channel(1); - - match std::thread::Builder::new() - .name("walletkit-vault-notify".into()) - .spawn(move || { - for () in rx { - listener.on_vault_changed(); - } - }) { - Ok(_) => { - if let Ok(mut guard) = self.vault_changed_tx.lock() { - *guard = Some(tx); - } - } - Err(e) => { - tracing::error!("failed to spawn vault notification thread: {e}"); - } - } - } - /// Exports the current vault as an in-memory plaintext (unencrypted) /// `SQLite` database for backup. /// @@ -329,7 +296,6 @@ impl CredentialStore { /// # Errors /// /// Returns an error if the store is not initialized or the export fails. - #[cfg(not(target_arch = "wasm32"))] #[expect( clippy::significant_drop_tightening, reason = "lock held intentionally for the full operation to prevent concurrent cleanup from deleting in-use temp files" @@ -353,7 +319,6 @@ impl CredentialStore { /// # Errors /// /// Returns an error if the store is not initialized or the import fails. - #[cfg(not(target_arch = "wasm32"))] #[expect( clippy::needless_pass_by_value, reason = "Vec required for UniFFI lifting" @@ -366,6 +331,43 @@ impl CredentialStore { inner.import_vault_from_file(&path) } +} + +/// Implementation not exposed to foreign bindings +impl CredentialStore { + /// Registers a listener that is called after every successful vault + /// mutation (store, delete, purge). + /// + /// Only one listener can be active at a time — calling this replaces any + /// previously registered listener. The previous delivery thread shuts down + /// automatically when the old sender is dropped. + /// + /// Delivery happens on a dedicated background thread to avoid re-entering + /// the `UniFFI` call stack (see `logger.rs` for rationale). + /// + /// **Warning:** the listener **must not** call back into this + /// `CredentialStore` — doing so will deadlock. + #[cfg(not(target_arch = "wasm32"))] + pub fn set_vault_changed_listener(&self, listener: Arc) { + let (tx, rx) = mpsc::sync_channel(1); + + match std::thread::Builder::new() + .name("walletkit-vault-notify".into()) + .spawn(move || { + for () in rx { + listener.on_vault_changed(); + } + }) { + Ok(_) => { + if let Ok(mut guard) = self.vault_changed_tx.lock() { + *guard = Some(tx); + } + } + Err(e) => { + tracing::error!("failed to spawn vault notification thread: {e}"); + } + } + } /// Best-effort notification to the registered vault-changed listener. /// No-op on wasm32 where the listener cannot be registered.