diff --git a/Cargo.lock b/Cargo.lock index 1e941168f4..2042dd9ea1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2674,11 +2674,15 @@ dependencies = [ "fhe-traits", "fhe-util", "hex", + "itertools 0.14.0", + "ndarray", "num-bigint", + "num-traits", "rand 0.8.5", "strum", "thiserror 1.0.69", "zkfhe-greco", + "zkfhe-shared", ] [[package]] diff --git a/crates/bfv-helpers/Cargo.toml b/crates/bfv-helpers/Cargo.toml index ff4608be0f..9f3113408d 100644 --- a/crates/bfv-helpers/Cargo.toml +++ b/crates/bfv-helpers/Cargo.toml @@ -15,7 +15,11 @@ fhe-traits.workspace = true fhe-util = { git = "https://github.com/gnosisguild/fhe.rs" } fhe.workspace = true greco = { package = "zkfhe-greco", git = "https://github.com/gnosisguild/zkfhe-generator" } +itertools = "0.14.0" +ndarray = "0.15" num-bigint = { workspace = true } +num-traits = "0.2" +shared = { package = "zkfhe-shared", git = "https://github.com/gnosisguild/zkfhe-generator" } strum.workspace = true rand.workspace = true thiserror = { workspace = true } diff --git a/crates/bfv-helpers/src/lib.rs b/crates/bfv-helpers/src/lib.rs index 40e4e653c9..9549e68341 100644 --- a/crates/bfv-helpers/src/lib.rs +++ b/crates/bfv-helpers/src/lib.rs @@ -5,7 +5,7 @@ // or FITNESS FOR A PARTICULAR PURPOSE. pub mod client; -mod util; +pub mod utils; use alloy_dyn_abi::{DynSolType, DynSolValue}; use alloy_primitives::U256; diff --git a/crates/bfv-helpers/src/utils/greco.rs b/crates/bfv-helpers/src/utils/greco.rs new file mode 100644 index 0000000000..e7fb066199 --- /dev/null +++ b/crates/bfv-helpers/src/utils/greco.rs @@ -0,0 +1,277 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + +use alloy_dyn_abi::{DynSolType, DynSolValue}; +use alloy_primitives::I256; +use fhe::bfv::{BfvParameters, Ciphertext}; +use fhe_math::rq::{traits::TryConvertFrom, Poly, Representation}; +use itertools::izip; +use ndarray::Array2; +use num_bigint::BigInt; +use num_traits::ToPrimitive; +use shared::constants::get_zkp_modulus; +use std::sync::Arc; + +/// Converts a greco coefficient (centered, in standard form) to BFV format [0, qi). +/// Standard-form coefficients are centered coefficients reduced mod ZKP modulus. +/// If standard_form >= zkp_modulus/2, it represents a negative centered coefficient. +fn convert_greco_coefficient_to_bfv(centered_coeff: &BigInt, qi: u64, zkp_modulus: &BigInt) -> u64 { + let qi_bigint = BigInt::from(qi); + let half_zkp = zkp_modulus / 2u64; + + // Recover centered coefficient mod qi + // If standard_form >= zkp_modulus/2, it's a negative centered value: centered = standard_form - zkp_modulus + let centered_mod_qi = if centered_coeff >= &half_zkp { + (centered_coeff - zkp_modulus) % &qi_bigint + } else { + centered_coeff % &qi_bigint + }; + + // Un-center: convert from [-(qi-1)/2, (qi-1)/2] to [0, qi) + // Use modular arithmetic: (centered_mod_qi + qi) % qi ensures result is in [0, qi) + let result = (¢ered_mod_qi + &qi_bigint) % &qi_bigint; + result + .to_u64() + .expect("Result should be in [0, qi) and fit in u64") +} + +/// Converts greco-formatted coefficients (reversed, centered) to BFV coefficients. +fn convert_greco_coefficients_to_bfv( + greco_coeffs: &[BigInt], + qi: u64, + zkp_modulus: &BigInt, +) -> Vec { + greco_coeffs + .iter() + .rev() + .map(|coeff| convert_greco_coefficient_to_bfv(coeff, qi, zkp_modulus)) + .collect() +} + +/// Converts greco-formatted coefficients back to a BFV ciphertext. +/// +/// Takes greco-formatted coefficients (centered, reversed, in standard form) and reconstructs +/// the BFV ciphertext. Conversion is exact modulo qi for each modulus. +/// +/// # Safety +/// This function assumes valid input: +/// - `ct0is` and `ct1is` must have length equal to the number of moduli +/// - Each coefficient vector must have length equal to the polynomial degree +/// +/// # Arguments +/// * `ct0is` - Greco coefficients for ct0 (one vector per modulus, standard form) +/// * `ct1is` - Greco coefficients for ct1 (one vector per modulus, standard form) +/// * `params` - BFV parameters +pub fn greco_to_bfv_ciphertext( + ct0is: &[Vec], + ct1is: &[Vec], + params: &Arc, +) -> Ciphertext { + let moduli = params.moduli(); + let degree = params.degree(); + + // Convert greco coefficients to BFV format for each modulus + let zkp_modulus = get_zkp_modulus(); + let mut ct0_coeffs_all = Vec::with_capacity(moduli.len()); + let mut ct1_coeffs_all = Vec::with_capacity(moduli.len()); + + for (ct0i, ct1i, qi) in izip!(ct0is, ct1is, moduli) { + ct0_coeffs_all.push(convert_greco_coefficients_to_bfv(ct0i, *qi, &zkp_modulus)); + ct1_coeffs_all.push(convert_greco_coefficients_to_bfv(ct1i, *qi, &zkp_modulus)); + } + + // Create Poly objects with all RNS limbs + let ctx = params.ctx()[0].clone(); + let ct0_array = Array2::from_shape_fn((moduli.len(), degree), |(i, j)| ct0_coeffs_all[i][j]); + let ct1_array = Array2::from_shape_fn((moduli.len(), degree), |(i, j)| ct1_coeffs_all[i][j]); + + let mut ct0_poly = + Poly::try_convert_from(ct0_array, &ctx, false, Some(Representation::PowerBasis)) + .expect("Failed to create ct0 Poly: invalid coefficient format"); + let mut ct1_poly = + Poly::try_convert_from(ct1_array, &ctx, false, Some(Representation::PowerBasis)) + .expect("Failed to create ct1 Poly: invalid coefficient format"); + + ct0_poly.change_representation(Representation::Ntt); + ct1_poly.change_representation(Representation::Ntt); + + Ciphertext::new(vec![ct0_poly, ct1_poly], params) + .expect("Failed to create Ciphertext: invalid polynomial format") +} + +/// Decodes ABI-encoded greco ciphertext from bytes32[] array. +/// +/// The bytes are expected to be ABI-encoded bytes32[] arrays from Solidity contracts. +/// The array contains ct0is coefficients followed by ct1is coefficients, where each +/// coefficient is a bytes32 value. The coefficients are organized as: +/// - First `num_moduli * degree` bytes32 values are ct0is (grouped by modulus) +/// - Next `num_moduli * degree` bytes32 values are ct1is (grouped by modulus) +/// +/// # Safety +/// This function assumes valid input: +/// - `bytes` must be valid ABI-encoded bytes32[] array +/// - Array must contain exactly `2 * num_moduli * degree` bytes32 values +/// - All values must be valid bytes32 FixedBytes +/// +/// # Arguments +/// * `bytes` - ABI-encoded bytes32[] array containing greco ciphertext coefficients +/// * `params` - BFV parameters (used to determine num_moduli and degree) +/// +/// # Returns +/// A tuple of (ct0is, ct1is) where each is Vec> (one vector per modulus) +pub fn abi_decode_greco_ciphertext( + bytes: &[u8], + params: &Arc, +) -> (Vec>, Vec>) { + let degree = params.degree(); + let num_moduli = params.moduli().len(); + + // ABI-decode the bytes to get bytes32[] array + let array_type = DynSolType::Array(Box::new(DynSolType::FixedBytes(32))); + let decoded = array_type + .abi_decode(bytes) + .expect("Failed to ABI decode bytes32[] array: invalid encoding"); + + let bytes32_array = match decoded { + DynSolValue::Array(arr) => arr, + _ => panic!("Expected array from ABI decode, got invalid type"), + }; + + let ct0is_bytes32_count = num_moduli * degree; + + // Split into ct0is and ct1is (use slices to avoid unnecessary allocations) + let (ct0is_bytes32, ct1is_bytes32) = bytes32_array.split_at(ct0is_bytes32_count); + + // Helper function to extract bytes32 from DynSolValue (assumes valid input) + fn extract_bytes32(value: &DynSolValue) -> [u8; 32] { + match value { + DynSolValue::FixedBytes(b, _) => b + .as_slice() + .try_into() + .expect("Invalid bytes32 length: expected 32 bytes"), + _ => panic!("Expected bytes32 FixedBytes, got invalid type"), + } + } + + // Convert bytes32 arrays to greco coefficient format + let mut ct0is = Vec::with_capacity(num_moduli); + let mut ct1is = Vec::with_capacity(num_moduli); + + for i in 0..num_moduli { + let mut ct0_modulus = Vec::with_capacity(degree); + let mut ct1_modulus = Vec::with_capacity(degree); + + for j in 0..degree { + let idx = i * degree + j; + + // Convert ct0 and ct1 bytes32 to BigInt + let ct0_bytes32 = extract_bytes32(&ct0is_bytes32[idx]); + let ct1_bytes32 = extract_bytes32(&ct1is_bytes32[idx]); + + ct0_modulus.push(bytes32_to_bigint(&ct0_bytes32)); + ct1_modulus.push(bytes32_to_bigint(&ct1_bytes32)); + } + + ct0is.push(ct0_modulus); + ct1is.push(ct1_modulus); + } + + (ct0is, ct1is) +} + +/// Converts bytes32 (signed 256-bit, two's complement, big-endian) to BigInt +fn bytes32_to_bigint(bytes: &[u8; 32]) -> BigInt { + // Use I256::from_be_bytes which handles two's complement conversion automatically + let i256 = I256::from_be_bytes(*bytes); + + // Convert I256 to BigInt via its string representation + // I256 handles two's complement correctly, so we can use its Display implementation + use std::str::FromStr; + BigInt::from_str(&i256.to_string()) + .expect("I256::to_string() should always produce a valid BigInt string") +} + +#[cfg(test)] +mod tests { + use super::*; + use alloy_primitives::FixedBytes; + use fhe::bfv::{Encoding, Plaintext, PublicKey, SecretKey}; + use fhe_traits::{DeserializeParametrized, FheEncoder, Serialize}; + use greco::vectors::GrecoVectors; + use rand::thread_rng; + + /// Helper function to set up test parameters, keys, and ciphertext + fn setup_test() -> ( + Arc, + Ciphertext, + (Vec>, Vec>), + ) { + use crate::{BfvParamSet, BfvParamSets}; + let params = BfvParamSet::from(BfvParamSets::InsecureSet512_10_1).build_arc(); + + let mut rng = thread_rng(); + let sk = SecretKey::random(¶ms, &mut rng); + let pk = PublicKey::new(&sk, &mut rng); + + let vote = vec![1u64, 0u64, 0u64]; + let pt = Plaintext::try_encode(&vote, Encoding::poly(), ¶ms).unwrap(); + let (ct, u_rns, e0_rns, e1_rns) = pk.try_encrypt_extended(&pt, &mut rng).unwrap(); + + let greco_vectors = + GrecoVectors::compute(&pt, &u_rns, &e0_rns, &e1_rns, &ct, &pk, ¶ms).unwrap(); + let standard_vectors = greco_vectors.standard_form(); + + (params, ct, (standard_vectors.ct0is, standard_vectors.ct1is)) + } + + /// Helper function to convert BigInt to bytes32 (big-endian, two's complement) + fn bigint_to_bytes32(bigint: &BigInt) -> [u8; 32] { + use std::str::FromStr; + let i256 = I256::from_str(&bigint.to_string()) + .expect("BigInt should fit in I256 range for bytes32 conversion"); + i256.to_be_bytes() + } + + #[test] + fn test_greco_to_bfv_ciphertext() { + let (params, original_ct, (ct0is, ct1is)) = setup_test(); + + let reconstructed_ct = greco_to_bfv_ciphertext(&ct0is, &ct1is, ¶ms); + + assert_eq!(reconstructed_ct.c.len(), original_ct.c.len()); + assert_eq!(reconstructed_ct.level, original_ct.level); + + // Verify serialization/deserialization works + let ct_bytes = reconstructed_ct.to_bytes(); + let deserialized_ct = Ciphertext::from_bytes(&ct_bytes, ¶ms).unwrap(); + assert_eq!(deserialized_ct.c.len(), original_ct.c.len()); + } + + #[test] + fn test_abi_decode_greco_ciphertext_round_trip() { + let (params, original_ct, (ct0is, ct1is)) = setup_test(); + + // Convert greco coefficients to bytes32[] and ABI-encode + let mut bytes32_array = Vec::new(); + for coeffs in [&ct0is, &ct1is] { + for modulus_coeffs in coeffs { + for coeff in modulus_coeffs { + let bytes32 = bigint_to_bytes32(coeff); + bytes32_array.push(DynSolValue::FixedBytes(FixedBytes::from(bytes32), 32)); + } + } + } + + let encoded_bytes = DynSolValue::Array(bytes32_array).abi_encode(); + + // Test full round-trip: ABI decode -> greco -> BFV. + let (ct0is, ct1is) = abi_decode_greco_ciphertext(&encoded_bytes, ¶ms); + let reconstructed_ct = greco_to_bfv_ciphertext(&ct0is, &ct1is, ¶ms); + + assert_eq!(reconstructed_ct.c.len(), original_ct.c.len()); + assert_eq!(reconstructed_ct.level, original_ct.level); + } +} diff --git a/crates/bfv-helpers/src/util.rs b/crates/bfv-helpers/src/utils/mod.rs similarity index 97% rename from crates/bfv-helpers/src/util.rs rename to crates/bfv-helpers/src/utils/mod.rs index 01905f1bca..97658678b9 100644 --- a/crates/bfv-helpers/src/util.rs +++ b/crates/bfv-helpers/src/utils/mod.rs @@ -10,12 +10,14 @@ use fhe_traits::FheEncoder; use fhe_util::transcode_from_bytes; use std::{cmp::min, fmt, sync::Arc, time::Duration}; +pub mod greco; + /// Macros to time code and display a human-readable duration. pub mod timeit { #[allow(unused_macros)] macro_rules! timeit_n { ($name:expr, $loops:expr, $code:expr) => {{ - use util::DisplayDuration; + use crate::utils::DisplayDuration; let start = std::time::Instant::now(); let r = $code; for _ in 1..$loops { @@ -33,7 +35,7 @@ pub mod timeit { #[allow(unused_macros)] macro_rules! timeit { ($name:expr, $code:expr) => {{ - use util::DisplayDuration; + use crate::utils::DisplayDuration; let start = std::time::Instant::now(); let r = $code; println!("⏱ {}: {}", $name, DisplayDuration(start.elapsed())); diff --git a/docs/pages/write-e3-contract.mdx b/docs/pages/write-e3-contract.mdx index 0e09cbe04d..5276e5bc55 100644 --- a/docs/pages/write-e3-contract.mdx +++ b/docs/pages/write-e3-contract.mdx @@ -71,7 +71,7 @@ your Data Provider. The function should be implemented in the E3 Program contrac - **Data Decoding**: Decode encrypted input data to its intended format. - **ZKP Verification**: Verify any associated ZKPs to ensure input correctness. -- **Input Acceptance**: Return validated input for inclusion in the computation. +- **Input Validation**: Validate the input data and revert if invalid. **Example:** diff --git a/examples/CRISP/Cargo.lock b/examples/CRISP/Cargo.lock index 0df54a6e5d..82265ce9c8 100644 --- a/examples/CRISP/Cargo.lock +++ b/examples/CRISP/Cargo.lock @@ -2264,11 +2264,15 @@ dependencies = [ "fhe-math", "fhe-traits", "fhe-util", + "itertools 0.14.0", + "ndarray", "num-bigint", + "num-traits", "rand 0.8.5", "strum", "thiserror 1.0.69", "zkfhe-greco", + "zkfhe-shared", ] [[package]] diff --git a/examples/CRISP/circuits/src/main.nr b/examples/CRISP/circuits/src/main.nr index 0453c2330a..2ef2150b7c 100644 --- a/examples/CRISP/circuits/src/main.nr +++ b/examples/CRISP/circuits/src/main.nr @@ -56,7 +56,7 @@ fn main( balance: Field, // Whether this is the first vote for this slot. is_first_vote: pub bool, -) { +) -> pub ([Polynomial<512>; 2], [Polynomial<512>; 2]) { // Verify the ECDSA signature. let is_signature_valid = verify_signature(hashed_message, public_key_x, public_key_y, signature); @@ -120,7 +120,7 @@ fn main( // Verify the correct coefficient values and that the vote is <= balance check_coefficient_values_with_balance(k1, params.crypto_params().q_mod_t, balance); - // (ct0is, ct1is) + (ct0is, ct1is) } else { // check if vote == 0. let is_vote_zero = check_coefficient_zero(k1); @@ -130,11 +130,11 @@ fn main( // If so, (ct0is, ct1is) should be returned. if is_first_vote { - // (ct0is, ct1is) + (ct0is, ct1is) } else { // check if the sum is valid assert(is_ct_add_valid); - // (sum_ct0is, sum_ct1is) + (sum_ct0is, sum_ct1is) } } } diff --git a/examples/CRISP/client/libs/wasm/pkg/crisp_worker.js b/examples/CRISP/client/libs/crispWorker.js similarity index 74% rename from examples/CRISP/client/libs/wasm/pkg/crisp_worker.js rename to examples/CRISP/client/libs/crispWorker.js index 1016704317..ac3d0bca3b 100755 --- a/examples/CRISP/client/libs/wasm/pkg/crisp_worker.js +++ b/examples/CRISP/client/libs/crispWorker.js @@ -6,18 +6,19 @@ import { encryptVoteAndGenerateCRISPInputs, - generateProofWithReturnValue, + generateProof, VotingMode, encodeVote, encryptVote, generateMerkleProof, hashLeaf, + encodeSolidityProof, } from '@crisp-e3/sdk' self.onmessage = async function (event) { const { type, data } = event.data switch (type) { - case 'encrypt_vote': + case 'generate_proof': try { const { voteId, publicKey, address, signature, message } = data @@ -49,22 +50,16 @@ self.onmessage = async function (event) { isFirstVote: true, }) - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { proof, returnValue } = await generateProofWithReturnValue(inputs) - - // TODO: returnValue is the encrypted vote. We need to convert it from Noir format to BFV format - // instead of using the encryptVote function (which should be removed from the SDK). + const proof = await generateProof(inputs) + const encodedProof = encodeSolidityProof(proof) self.postMessage({ - type: 'encrypt_vote', + type: 'generate_proof', success: true, - encryptedVote: { - vote: encryptedVote, - proof: proof.proof, - }, + encodedProof, }) } catch (error) { - self.postMessage({ type: 'encrypt_vote', success: false, error: error.message }) + self.postMessage({ type: 'generate_proof', success: false, error: error.message }) } break diff --git a/examples/CRISP/client/package.json b/examples/CRISP/client/package.json index 7c390302ad..08c8ab6f89 100644 --- a/examples/CRISP/client/package.json +++ b/examples/CRISP/client/package.json @@ -18,7 +18,7 @@ "deploy": "gh-pages -d dist" }, "dependencies": { - "@crisp-e3/sdk": "0.2.3-test", + "@crisp-e3/sdk": "0.3.0-test", "@emotion/babel-plugin": "^11.11.0", "@emotion/react": "^11.11.4", "@phosphor-icons/react": "^2.1.4", diff --git a/examples/CRISP/client/src/context/voteManagement/VoteManagement.context.tsx b/examples/CRISP/client/src/context/voteManagement/VoteManagement.context.tsx index 21fed90add..4c614137b7 100644 --- a/examples/CRISP/client/src/context/voteManagement/VoteManagement.context.tsx +++ b/examples/CRISP/client/src/context/voteManagement/VoteManagement.context.tsx @@ -40,7 +40,7 @@ const VoteManagementProvider = ({ children }: VoteManagementProviderProps) => { /** * Voting Management Methods **/ - const { isLoading: wasmLoading, encryptVote } = useWebAssemblyHook() + const { isLoading: wasmLoading, generateProof } = useWebAssemblyHook() const { isLoading: enclaveLoading, getRoundStateLite: getRoundStateLiteRequest, @@ -137,7 +137,7 @@ const VoteManagementProvider = ({ children }: VoteManagementProviderProps) => { broadcastVote, setVotingRound, setUser, - encryptVote, + generateProof, }} > {children} diff --git a/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts b/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts index a417030143..3fd7363a6f 100644 --- a/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts +++ b/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts @@ -6,7 +6,7 @@ import type React from 'react' import { ReactNode } from 'react' -import { BroadcastVoteRequest, BroadcastVoteResponse, VoteStateLite, VotingRound, EncryptedVote } from '@/model/vote.model' +import { BroadcastVoteRequest, BroadcastVoteResponse, VoteStateLite, VotingRound } from '@/model/vote.model' import { Poll, PollRequestResult, PollResult } from '@/model/poll.model' export type VoteManagementContextType = { @@ -28,13 +28,7 @@ export type VoteManagementContextType = { getPastPolls: () => Promise setVotingRound: React.Dispatch> setUser: React.Dispatch> - encryptVote: ( - voteId: bigint, - publicKey: Uint8Array, - address: string, - signature: string, - message: string, - ) => Promise + generateProof: (voteId: bigint, publicKey: Uint8Array, address: string, signature: string, message: string) => Promise broadcastVote: (vote: BroadcastVoteRequest) => Promise getRoundStateLite: (roundCount: number) => Promise setPastPolls: React.Dispatch> diff --git a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts index 8d9a19f80b..74098154f9 100644 --- a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts @@ -14,19 +14,19 @@ import { Poll } from '@/model/poll.model' import { BroadcastVoteRequest } from '@/model/vote.model' export const useVoteCasting = () => { - const { user, roundState, votingRound, encryptVote, broadcastVote, setTxUrl } = useVoteManagementContext() + const { user, roundState, votingRound, generateProof, broadcastVote, setTxUrl } = useVoteManagementContext() const { signMessageAsync } = useSignMessage() const { showToast } = useNotificationAlertContext() const navigate = useNavigate() const [isLoading, setIsLoading] = useState(false) - const handleVoteEncryption = useCallback( + const handleProofGeneration = useCallback( async (vote: Poll, address: string, signature: string, message: string) => { - if (!votingRound) throw new Error('No voting round available for encryption') - return encryptVote(BigInt(vote.value), new Uint8Array(votingRound.pk_bytes), address, signature, message) + if (!votingRound) throw new Error('No voting round available for proof generation') + return generateProof(BigInt(vote.value), new Uint8Array(votingRound.pk_bytes), address, signature, message) }, - [encryptVote, votingRound], + [generateProof, votingRound], ) const castVoteWithProof = useCallback( @@ -50,15 +50,14 @@ export const useVoteCasting = () => { const signature = await signMessageAsync({ message }) try { - const voteEncrypted = await handleVoteEncryption(pollSelected, user.address, signature, message) - if (!voteEncrypted) { - throw new Error('Failed to encrypt vote.') + const encodedProof = await handleProofGeneration(pollSelected, user.address, signature, message) + if (!encodedProof) { + throw new Error('Failed to generate proof.') } const voteRequest: BroadcastVoteRequest = { round_id: roundState.id, - enc_vote_bytes: Array.from(voteEncrypted.vote), - proof: Array.from(voteEncrypted.proof), + encoded_proof: encodedProof, address: user.address, } @@ -106,7 +105,7 @@ export const useVoteCasting = () => { setIsLoading(false) } }, - [user, roundState, votingRound, encryptVote, broadcastVote, setTxUrl, showToast, navigate, handleVoteEncryption, signMessageAsync], + [user, roundState, votingRound, generateProof, broadcastVote, setTxUrl, showToast, navigate, handleProofGeneration, signMessageAsync], ) return { castVoteWithProof, isLoading } diff --git a/examples/CRISP/client/src/hooks/wasm/useWebAssembly.tsx b/examples/CRISP/client/src/hooks/wasm/useWebAssembly.tsx index c5441adfaa..dc51072911 100644 --- a/examples/CRISP/client/src/hooks/wasm/useWebAssembly.tsx +++ b/examples/CRISP/client/src/hooks/wasm/useWebAssembly.tsx @@ -7,7 +7,6 @@ import { useState, useEffect } from 'react' import { handleGenericError } from '@/utils/handle-generic-error' import { useNotificationAlertContext } from '@/context/NotificationAlert' -import { EncryptedVote } from '@/model/vote.model' export const useWebAssemblyHook = () => { const { showToast } = useNotificationAlertContext() @@ -15,7 +14,7 @@ export const useWebAssemblyHook = () => { const [worker, setWorker] = useState(null) useEffect(() => { - const newWorker = new Worker(new URL('libs/wasm/pkg/crisp_worker.js', import.meta.url), { + const newWorker = new Worker(new URL('libs/crispWorker.js', import.meta.url), { type: 'module', }) setWorker(newWorker) @@ -24,37 +23,32 @@ export const useWebAssemblyHook = () => { } }, []) - const encryptVote = async ( + const generateProof = async ( voteId: bigint, publicKey: Uint8Array, address: string, signature: string, message: string, - ): Promise => { + ): Promise => { if (!worker) { console.error('WebAssembly worker not initialized') return } - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { setIsLoading(true) - worker.postMessage({ type: 'encrypt_vote', data: { voteId, publicKey, address, signature, message } }) + worker.postMessage({ type: 'generate_proof', data: { voteId, publicKey, address, signature, message } }) worker.onmessage = async (event) => { - const { type, success, encryptedVote, error } = event.data - if (type === 'encrypt_vote') { + const { type, success, encodedProof, error } = event.data + if (type === 'generate_proof') { if (success) { - const { vote, proof } = encryptedVote - - resolve({ - vote: vote, - proof: proof, - }) + resolve(encodedProof) } else { showToast({ type: 'danger', message: error, }) - handleGenericError('encryptVote', new Error(error)) + handleGenericError('generateProof', new Error(error)) reject(new Error(error)) } setIsLoading(false) @@ -65,6 +59,6 @@ export const useWebAssemblyHook = () => { return { isLoading, - encryptVote, + generateProof, } } diff --git a/examples/CRISP/client/src/model/vote.model.ts b/examples/CRISP/client/src/model/vote.model.ts index a2f7082e11..0281b48eb2 100644 --- a/examples/CRISP/client/src/model/vote.model.ts +++ b/examples/CRISP/client/src/model/vote.model.ts @@ -23,8 +23,7 @@ export interface CurrentRound { export interface BroadcastVoteRequest { round_id: number - enc_vote_bytes: number[] - proof: number[] + encoded_proof: string address: string } @@ -51,8 +50,3 @@ export interface VoteStateLite { committee_public_key: number[] emojis: [string, string] } - -export interface EncryptedVote { - vote: Uint8Array - proof: Uint8Array -} diff --git a/examples/CRISP/enclave.config.yaml b/examples/CRISP/enclave.config.yaml index 2104bf53ad..b08f24d19d 100644 --- a/examples/CRISP/enclave.config.yaml +++ b/examples/CRISP/enclave.config.yaml @@ -3,59 +3,50 @@ chains: rpc_url: ws://localhost:8545 contracts: e3_program: - address: "0x67d269191c92Caf3cD7723F116c85e6E9bf55933" + address: '0x67d269191c92Caf3cD7723F116c85e6E9bf55933' deploy_block: 1 enclave: - address: "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0" + address: '0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0' deploy_block: 13 ciphernode_registry: - address: "0x610178dA211FEF7D417bC0e6FeD39F05609AD788" + address: '0x610178dA211FEF7D417bC0e6FeD39F05609AD788' deploy_block: 11 bonding_registry: - address: "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6" + address: '0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6' deploy_block: 8 fee_token: - address: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" + address: '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' deploy_block: 4 program: dev: true - # risc0: - # risc0_dev_mode: 0 # 0 = production (Boundless), 1 = dev mode (fake proofs) - # boundless: - # rpc_url: "https://sepolia.infura.io/v3/YOUR_KEY" - # private_key: "PRIVATE_KEY" # Use env vars for secrets - # pinata_jwt: "PINATA_JWT" # For uploading programs - # program_url: "https://gateway.pinata.cloud/ipfs/QmNMRAB7DW43JSmENfzGmD96G6sqaeBBNfTVrrq5WQae3D" # Pre-uploaded program - # onchain: true # true = onchain requests, false = offchain - nodes: cn1: - address: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" + address: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8' quic_port: 9201 autonetkey: true autopassword: true cn2: - address: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC" + address: '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC' quic_port: 9202 autonetkey: true autopassword: true cn3: - address: "0x90F79bf6EB2c4f870365E785982E1f101E93b906" + address: '0x90F79bf6EB2c4f870365E785982E1f101E93b906' quic_port: 9203 autonetkey: true autopassword: true cn4: - address: "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65" + address: '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65' quic_port: 9204 autonetkey: true autopassword: true cn5: - address: "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc" + address: '0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc' quic_port: 9205 autonetkey: true autopassword: true ag: - address: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' quic_port: 9206 autonetkey: true autopassword: true diff --git a/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol b/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol index 6032ace6b7..10e37d9b10 100644 --- a/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol +++ b/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol @@ -142,7 +142,7 @@ contract CRISPProgram is IE3Program, Ownable { } /// @inheritdoc IE3Program - function validateInput(uint256 e3Id, address, bytes memory data) external returns (bytes memory input) { + function validateInput(uint256 e3Id, address, bytes memory data) external { // it should only be called via Enclave for now require(authorizedContracts[msg.sender] || msg.sender == owner(), CallerNotAuthorized()); // We need to ensure that the CRISP admin set the merkle root of the census. @@ -150,34 +150,36 @@ contract CRISPProgram is IE3Program, Ownable { if (data.length == 0) revert EmptyInputData(); - (bytes memory noirProof, bytes memory vote, address slot) = abi.decode(data, (bytes, bytes, address)); + (bytes memory noirProof, bytes32[] memory vote, address slotAddress) = abi.decode(data, (bytes, bytes32[], address)); - (uint40 voteIndex, bool isFirstVote) = _processVote(e3Id, slot, vote); + bytes memory voteBytes = abi.encode(vote); - bytes32[] memory noirPublicInputs = new bytes32[](2); + (uint40 voteIndex, bool isFirstVote) = _processVote(e3Id, slotAddress, voteBytes); + + bytes32[] memory noirPublicInputs = new bytes32[](2 + vote.length); // Set public inputs for the proof. Order must match Noir circuit. - noirPublicInputs[0] = bytes32(uint256(uint160(slot))); + noirPublicInputs[0] = bytes32(uint256(uint160(slotAddress))); // Pass isFirstVote flag to verifier (1 = first vote, 0 = re-vote) noirPublicInputs[1] = bytes32(uint256(isFirstVote ? 1 : 0)); - // noirPublicInputs[x] = bytes32(roundData.censusMerkleRoot); + // Set the encrypted vote to the noir public inputs. + for (uint256 i = 0; i < vote.length; i++) { + noirPublicInputs[i + 2] = vote[i]; + } // Check if the ciphertext was encrypted correctly if (!HONK_VERIFIER.verify(noirProof, noirPublicInputs)) { revert InvalidNoirProof(); } - // return the vote so that it can be stored in Enclave's input merkle tree - input = vote; - - emit InputPublished(e3Id, vote, voteIndex); + emit InputPublished(e3Id, voteBytes, voteIndex); } /// @notice Process a vote: insert or update in the merkle tree depending /// on whether it's the first vote or an override. - function _processVote(uint256 e3Id, address slot, bytes memory vote) internal returns (uint40 voteIndex, bool isFirstVote) { - uint40 storedIndexPlusOne = voteSlots[e3Id][slot]; + function _processVote(uint256 e3Id, address slotAddress, bytes memory vote) internal returns (uint40 voteIndex, bool isFirstVote) { + uint40 storedIndexPlusOne = voteSlots[e3Id][slotAddress]; // we treat the index 0 as not voted yet // any valid index will be index + 1 @@ -185,7 +187,7 @@ contract CRISPProgram is IE3Program, Ownable { // FIRST VOTE isFirstVote = true; voteIndex = votes[e3Id].numberOfLeaves; - voteSlots[e3Id][slot] = voteIndex + 1; + voteSlots[e3Id][slotAddress] = voteIndex + 1; votes[e3Id]._insert(PoseidonT3.hash([uint256(keccak256(vote)), voteIndex])); } else { // RE-VOTE diff --git a/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol b/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol index 746eb129eb..131cfb765a 100644 --- a/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol +++ b/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol @@ -7,85 +7,85 @@ pragma solidity >=0.8.21; uint256 constant N = 262144; uint256 constant LOG_N = 18; -uint256 constant NUMBER_OF_PUBLIC_INPUTS = 18; -uint256 constant VK_HASH = 0x2ff65b3b1227a20d0c924ebc4e44aeb31fb7ccd71bac28e9f8fd37dc49da29c8; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 2066; +uint256 constant VK_HASH = 0x2116432a8071b45d4f2e0cec74a985a1ea1de1008309715fdb59de0707087fc2; library HonkVerificationKey { function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) { Honk.VerificationKey memory vk = Honk.VerificationKey({ circuitSize: uint256(262144), logCircuitSize: uint256(18), - publicInputsSize: uint256(18), + publicInputsSize: uint256(2066), ql: Honk.G1Point({ - x: uint256(0x11d2594b443f9f0e2460917341675aee376aca26792ddb3cd1c06304f21c8a55), - y: uint256(0x147974d2dfdd4b425fc12e3096f4434a285e18a7940f5107823a50638e283ce1) + x: uint256(0x1a7b36f05cef7bbf455873db9784a29f833916dc5aaec66352970e302061c914), + y: uint256(0x0f80256a61ab446a5a2dbda239e52a9dc4612566d9b57155ffb2dbaf896ee88a) }), qr: Honk.G1Point({ - x: uint256(0x0e920f6b1843cc1ebb215dc23e070c3064fb8f1ee6492719325a81ca38cf8d13), - y: uint256(0x1d66ef884a73e6d6c17ec6ed5385464c1822a531af2d61dda6f89ae859664d1f) + x: uint256(0x1d540f31fb58beab584c40ce6e44e8b400f0b0cd9f5ed8f71b27269167916477), + y: uint256(0x1d0f60d6bc410f430eeb967c817849dcb1f5fcb45acb45dddcd1c7306c46d58f) }), qo: Honk.G1Point({ - x: uint256(0x0f1e4cff2cea50c67dd5dae1d4b4bda0f9ca1697541bdef014d9dccd2dbe07b1), - y: uint256(0x03c891f31ec3d9cca6c3f87c930e6b6717f43dd3b1454c52ace22d3da83611c0) + x: uint256(0x0d01c3cf036f68eb05e2834a383eaf491e1b4aa843c656c95e89241ab91b20be), + y: uint256(0x2d85c7fa52638d3bc184768dde6db2de10517bb67b6354f97d789d1c6d64a94a) }), q4: Honk.G1Point({ - x: uint256(0x1a5b636720a932b05fb09b94a79a7adf83dd9531342c05359be52ecf21a30228), - y: uint256(0x1fdb1abaa94e111b1ce5e112fd4559c941261b3480714003978a5e20b4a6aed9) + x: uint256(0x16727ccc1a7e6087d61c039c831ce6e35f5cd651defebe160e2a27b11d0c1f15), + y: uint256(0x17588e2f3eca2c4c3e02110b937ec015b5a05faff5eb0d06ba0d3d0001f6807b) }), qm: Honk.G1Point({ - x: uint256(0x0fb26657d3f369affd4bd2dffbc14e31871eac59b4c971b87ab0e9762d463719), - y: uint256(0x2514a943d9449e852c24403c8bdb8986d27db11e40698aa1f838caa0c9653843) + x: uint256(0x1fcd39a2deebf311e4d2ee6ca968cbcdcff11301f480a15d9e8e333c520e4675), + y: uint256(0x1f1fd8948d841a97f8b1a1ee522c1a9c36976bafd69a78eae5b5277ada8170f2) }), qc: Honk.G1Point({ - x: uint256(0x03dd54eab58ff033e1397c441bd59dbe946583469ff9beb3d0f90cc827f6b824), - y: uint256(0x070af1bc0cc02855b039eb60f6e954d596224ca76943d9672ede492e890c0ebf) + x: uint256(0x14b308df277ab4a529e283968d9dd492894497202d2c7a1705a3baa46da22bf4), + y: uint256(0x0c053c7a09b99f2623559aa459bff68335b4f5a5cfa96f6cdb6f1e28736f3191) }), qLookup: Honk.G1Point({ - x: uint256(0x21a54a89cbeebd91bcfe99fc3628c8d7f91853e51a99c70416534381bbee5dbe), - y: uint256(0x11c15c3410c26e292aafa7edec4cad982fc7d2008e2bf6c7bbc0ef98ce0f409d) + x: uint256(0x205057a47479c3744023a35ca3d08d79c3499d9af48e264ecb31823713bbbca8), + y: uint256(0x19b2541dcaae69df644bec1bb8ce13455719c73fcadac3763d81a6b1c70560f3) }), qArith: Honk.G1Point({ - x: uint256(0x0d1609a8ec4f25fa7b217b0a87d1710ae9da9f6c554cb7071fdf6b2c5510f4c7), - y: uint256(0x17e80ec7d4625c538d0b2f4f873cdbf5e863f855864127546b7687f9e4219d8d) + x: uint256(0x08670013c484727f3f6403409aa693f057ffa2ebff47a46baac04a4fc534df86), + y: uint256(0x21231b3fe164af29a57dadd72611a977c9ceb0adacfb21707da1a7fce0a2fcc5) }), qDeltaRange: Honk.G1Point({ - x: uint256(0x2623b4f2d877052bf31faa8d172e6d39d5e292a3b583ee74f6a5b5a0163203c8), - y: uint256(0x2bf3a4fbd79fb788029e245d0078be987a73dec0cde1e67b55179bf4578910d1) + x: uint256(0x2d6d8c24ae1ff6b1b50818fb62f53e37bacde5e15637cf1d4a9f1bcd43996c03), + y: uint256(0x15d94db2dd8bbca416175f0986178aa8c31ff76d4eeb347714e329c5074a56f9) }), qElliptic: Honk.G1Point({ - x: uint256(0x278c1c3acc9ae6b465135c5406a5e8dd5a51037903d760b363abff74d2f0df92), - y: uint256(0x110567952ed56be6739318f73b82ad83b02c0159e68f03d90fd52f8db9946051) + x: uint256(0x1db949cfaf913cba16771ea4d25c8c61fac22a4997abd0d82b1f04b2583839a5), + y: uint256(0x02804f2992af78447a4f46446c54b2ca316153accede32c59264d97a62165a20) }), qMemory: Honk.G1Point({ - x: uint256(0x1c29dbc12d004c26670b59448af05d4c3b5f2eecd3f086e7896ce22c698c5c6a), - y: uint256(0x268dc250b95f8ecd726d15e4409ebf763af67b09c685c7da3174497ee5127d65) + x: uint256(0x1701619666d10f73d14baf14921415a2ae4fe904afc516361e7f68f5d546e77d), + y: uint256(0x14c78fcb02f92b527f6b4bd642d8f4ee1579aa7e23c83949b29497a7a6543a82) }), qNnf: Honk.G1Point({ - x: uint256(0x2818ace88bf73e07c8bf1a8878ad6f936512a5e303cb9a9f4af985467df37c46), - y: uint256(0x0f20f007e0cb54af379b294676171d9ca1934a963caefde146ee7f625e2c5d00) + x: uint256(0x23d505077a2f45f5375c4d97115598aa4786fd480daa58e9fe644c1987995fe5), + y: uint256(0x189d4e39e2419279e09ee6e8ea98d271c1dc23f12f14c87428a55956251f8c64) }), qPoseidon2External: Honk.G1Point({ - x: uint256(0x1a208152997d2d48201b997e49e49c522067b245d4c94450ef02887d511087a0), - y: uint256(0x16c09f153732dbab6f9ec80da0715959a6b57ab6ac2468172792552f190f6950) + x: uint256(0x1c85ee1a141b05ef5df7bcc013ec60761f13bbc1cae6f4bd2a77acd5dfef24f9), + y: uint256(0x22c4ff8e4338cacfc1eb5fb512be1001ebb07802c71a9cda55c61a7d57cca39e) }), qPoseidon2Internal: Honk.G1Point({ - x: uint256(0x009a4c1c007070426d5f1f0fe913fe2ee74a8aeb598e343c94fa984d45a35371), - y: uint256(0x13a87462c64480e7c13d825ded6941bcb16f345c12dbcb7a06cb49652ae91127) + x: uint256(0x2113c7a6c03bd198a71e11df5b7051aa5adfde3ef9eed17465a6de8056584499), + y: uint256(0x214660396a999c68ec9e72b887fa3f65bd7c693d4ab805d07c3f4aa8f4fa6bf6) }), s1: Honk.G1Point({ - x: uint256(0x2236add2b6ab2ac2e61a9062fc6886a2bc51fbb2b0497806da0613ead3cdb5fc), - y: uint256(0x165013b3821f29b7fc6cd18fc22686394318c7825bf7ddcf03c3a19a0ebed60f) + x: uint256(0x114067cffd29c0983fae6e709b1acf5b4d6e15667af850a3ab748bd2ee5ebeda), + y: uint256(0x0a2a21e3ad07cdbdf9cdb7a0bdb59a509f5f6fc745714179b1a5a0ca67157431) }), s2: Honk.G1Point({ - x: uint256(0x2b3cb131591dfd70dc30a5925a7448e244589110113f1e9c117ae34480254a79), - y: uint256(0x00e900caa7fcb79f61c1b09ff17dd0b0b966bc4298261ce2a8908487d88ea666) + x: uint256(0x23c4429ccca13d58716a2c6c7970cbb99dd2b13095d32804a294cd0e38ce88d0), + y: uint256(0x1c3f97d8c4dc3c173320a0618a5821e8b80d7739c088bb23300400a6230fde4a) }), s3: Honk.G1Point({ - x: uint256(0x14121d5752c1b9ae7a956e9628587eb5419df8c49db331e30359475f048f8374), - y: uint256(0x1597ef8f3ea011b9142d842fa1757f5356f0ff4945e9cbb037f1927adef98688) + x: uint256(0x19a9e2fa7fd4475fb5eda1ae16c72d4c19092dc4bbfdbb2cb159209c860dcd26), + y: uint256(0x00a2e28e53cc3a626dceea4cd1cdb7452f1054612fa6f4fa326e1bdfa71d3fa8) }), s4: Honk.G1Point({ - x: uint256(0x0fc1aec685dfe28c7b979fe8afc13daefa3a95a49f4d06296a24a39baf967917), - y: uint256(0x2078322e9618a86dbb28aa8090853c36a90a1bdb01b49a5d7b268de821c97291) + x: uint256(0x095bec0997e0a80fa5135eeafad26bf4d40307dcfad6d1b45b72fef4b74503c6), + y: uint256(0x2dee87ca275d32e8e7a2c51451e0d03e3c1149efaaa20ae8b8dae42a288c18b1) }), t1: Honk.G1Point({ x: uint256(0x08a5ba822823e5f21f5585f7d90f070aaad388561d817362c819850cccf82580), @@ -104,28 +104,28 @@ library HonkVerificationKey { y: uint256(0x1e5e5f5acbdcd05a0ebffacea7a5426da9ec26a79cbb95692c9e9a499ff0155a) }), id1: Honk.G1Point({ - x: uint256(0x302646cb4dc8134563bf8460f114035088b0bfc6c340077951d3f5b57439f502), - y: uint256(0x136217e6360b05ff14d183d73a56d126ee998bc5cb314d4087d72b9662c9c31f) + x: uint256(0x04c94d6d300959fe9483fa91bfdff0f6167a2a718800ad1bbf0cd3759e8a57eb), + y: uint256(0x194f8fad06add0adcdd30f4337a73e9380d087c075d0a163c3023afc03bad8c4) }), id2: Honk.G1Point({ - x: uint256(0x19f50846b7dedb2a01e7c2f29700d6e1469cb975c3b67a89259648c175fd6ef8), - y: uint256(0x1b52618a63e49f157b51f5a319d722d444add080caac9dde6ffa55fa223fe532) + x: uint256(0x069b8a17848adb8e056afb34f4f351aacb40b9164321a4990845b6a288240f99), + y: uint256(0x110494e3d7dd391ae6c41b16f810275b7dbe1a8e749cdf19e87f3ede984fc57b) }), id3: Honk.G1Point({ - x: uint256(0x107f9fdd9404f82635fca1cf57a9dc2835c2d6ec02c506b627bfc1ed871ffb5a), - y: uint256(0x20dbdd2acc9c9538e1a12d0820ff17936b705d4e9150e3d38e35d92adafd0e6d) + x: uint256(0x287fa9b1d6f14f25442f4b45aa6b8015d874e8ee32ce5b6c6b9d37c4c1af382d), + y: uint256(0x08037c54f284e0b070ce529ae47b842c5f0062deb629f22d9336de5efddf1660) }), id4: Honk.G1Point({ - x: uint256(0x1dccf6ae62a9400491db145f058f040f348c8f423504410c6f25a9ea50f7b1bd), - y: uint256(0x06dcc9943f7cbd3723a886bd995b1a8ba73dee0b6152a3e4c15472b6c2ca2b19) + x: uint256(0x1797c469d204fbd6000ed31a8c65d2df08e9b2ed4155ae07a451221f75ff9282), + y: uint256(0x2e7f2c1496e92023c68efc470d5757d684659d10888f921f260acde0664f1d9d) }), lagrangeFirst: Honk.G1Point({ x: uint256(0x0000000000000000000000000000000000000000000000000000000000000001), y: uint256(0x0000000000000000000000000000000000000000000000000000000000000002) }), lagrangeLast: Honk.G1Point({ - x: uint256(0x0eb1f2bf7633aa596a6e6bcc1ee366271a4839ee9e27d77ec7a5e99b25f968a4), - y: uint256(0x0a21c76613c0bf28e5ba78f9f370abac74ca0423ebfb64b65623dd9a06d0d061) + x: uint256(0x251eb0b16450815cda5eaaef0ffa6cde8b0927ad0c8a195a940b9c3a468a542d), + y: uint256(0x0a214dd7528af9a23a272d8f0c608c50577c65d71e4f9031e731c526b610fae3) }) }); return vk; diff --git a/examples/CRISP/packages/crisp-contracts/contracts/Mocks/MockCRISPProgram.sol b/examples/CRISP/packages/crisp-contracts/contracts/Mocks/MockCRISPProgram.sol index 87d00d0e9f..f817eef810 100644 --- a/examples/CRISP/packages/crisp-contracts/contracts/Mocks/MockCRISPProgram.sol +++ b/examples/CRISP/packages/crisp-contracts/contracts/Mocks/MockCRISPProgram.sol @@ -139,12 +139,10 @@ contract MockCRISPProgram is IE3Program, Ownable { } /// @inheritdoc IE3Program - function validateInput(uint256 e3Id, address, bytes memory data) external returns (bytes memory input) { + function validateInput(uint256 e3Id, address, bytes memory data) external { if (data.length == 0) revert EmptyInputData(); (, , bytes memory vote, ) = abi.decode(data, (bytes, bytes32[], bytes, address)); - - input = vote; } /// @notice Decode the tally from the plaintext output diff --git a/examples/CRISP/packages/crisp-contracts/package.json b/examples/CRISP/packages/crisp-contracts/package.json index 79be2f15c9..13e9365638 100644 --- a/examples/CRISP/packages/crisp-contracts/package.json +++ b/examples/CRISP/packages/crisp-contracts/package.json @@ -1,6 +1,6 @@ { "name": "@crisp-e3/contracts", - "version": "0.2.3-test", + "version": "0.3.0-test", "type": "module", "files": [ "contracts", diff --git a/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts b/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts index c662a355d7..efd2412b04 100644 --- a/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts +++ b/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts @@ -4,8 +4,7 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -import { network } from 'hardhat' -import { zeroAddress, zeroHash } from 'viem' +import { zeroAddress } from 'viem' import { ZKInputsGenerator } from '@crisp-e3/zk-inputs' import { encryptVoteAndGenerateCRISPInputs, @@ -15,59 +14,20 @@ import { MESSAGE, generateMerkleProof, hashLeaf, + encodeSolidityProof, } from '@crisp-e3/sdk' - import { expect } from 'chai' -import type { HonkVerifier, MockEnclave } from '../types' - -import { CRISPProgram__factory as CRISPProgramFactory } from '../types' +import { deployCRISPProgram, deployHonkVerifier, deployMockEnclave, nonZeroAddress, ethers } from './utils' let zkInputsGenerator = ZKInputsGenerator.withDefaults() let publicKey = zkInputsGenerator.generatePublicKey() const previousCiphertext = zkInputsGenerator.encryptVote(publicKey, new BigInt64Array([0n])) describe('CRISP Contracts', function () { - const nonZeroAddress = '0xc6e7DF5E7b4f2A278906862b61205850344D4e7d' - - let poseidonT3Address: string - - before(async () => { - const { ethers } = await network.connect() - - const poseidonT3 = await ethers.deployContract('PoseidonT3') - await poseidonT3.waitForDeployment() - poseidonT3Address = await poseidonT3.getAddress() - }) - - describe('deployment', () => { - it('should deploy the contracts', async () => { - const { ethers } = await network.connect() - - const programFactory = await ethers.getContractFactory( - CRISPProgramFactory.abi, - CRISPProgramFactory.linkBytecode({ - 'npm/poseidon-solidity@0.0.5/PoseidonT3.sol:PoseidonT3': poseidonT3Address, - }), - ) - const program = await programFactory.deploy(nonZeroAddress, nonZeroAddress, nonZeroAddress, zeroHash) - - expect(await program.getAddress()).to.not.equal(zeroAddress) - }) - }) - describe('decode tally', () => { it('should decode different tallies correctly', async () => { - const { ethers } = await network.connect() - const mockEnclave = (await ethers.deployContract('MockEnclave')) as MockEnclave - - const programFactory = await ethers.getContractFactory( - CRISPProgramFactory.abi, - CRISPProgramFactory.linkBytecode({ - 'npm/poseidon-solidity@0.0.5/PoseidonT3.sol:PoseidonT3': poseidonT3Address, - }), - ) - - const program = await programFactory.deploy(await mockEnclave.getAddress(), nonZeroAddress, nonZeroAddress, zeroHash) + const mockEnclave = await deployMockEnclave() + const crispProgram = await deployCRISPProgram({ mockEnclave }) // 2 * 2 + 1 * 1 = 5 Y // 2 * 1 + 0 * 1 = 2 N @@ -78,7 +38,7 @@ describe('CRISP Contracts', function () { await mockEnclave.setPlaintextOutput(tally1) - const decodedTally1 = await program.decodeTally(0) + const decodedTally1 = await crispProgram.decodeTally(0) expect(decodedTally1[0]).to.equal(5n) expect(decodedTally1[1]).to.equal(2n) @@ -91,7 +51,7 @@ describe('CRISP Contracts', function () { ] await mockEnclave.setPlaintextOutput(tally2) - const decodedTally2 = await program.decodeTally(0) + const decodedTally2 = await crispProgram.decodeTally(0) expect(decodedTally2[0]).to.equal(8277n) expect(decodedTally2[1]).to.equal(1218n) @@ -103,36 +63,64 @@ describe('CRISP Contracts', function () { // It needs some time to generate the proof. this.timeout(60000) - const { ethers } = await network.connect() + const [signer] = await ethers.getSigners() + + const honkVerifier = await deployHonkVerifier() - const signers = await ethers.getSigners() - const signer = signers[0] - const address = (await signer.getAddress()).toLowerCase() as `0x${string}` + const slotAddress = signer.address.toLowerCase() as `0x${string}` - const zkTranscriptLib = await ethers.deployContract('ZKTranscriptLib') - await zkTranscriptLib.waitForDeployment() - const zkTranscriptLibAddress = await zkTranscriptLib.getAddress() + const vote = { yes: 10n, no: 0n } + const balance = vote.yes + const encodedVote = encodeVote(vote, VotingMode.GOVERNANCE, balance) - const HonkVerifierFactory = await ethers.getContractFactory('HonkVerifier', { - libraries: { - 'project/contracts/CRISPVerifier.sol:ZKTranscriptLib': zkTranscriptLibAddress, - }, + const signature = (await signer.signMessage(MESSAGE)) as `0x${string}` + const leaf = hashLeaf(slotAddress, balance.toString()) + const leaves = [...[10n, 20n], leaf] + + const threshold = 0n + const merkleProof = generateMerkleProof(threshold, balance, slotAddress, leaves) + + const inputs = await encryptVoteAndGenerateCRISPInputs({ + encodedVote, + publicKey, + previousCiphertext, + signature, + message: MESSAGE, + merkleData: merkleProof, + balance, + slotAddress, + isFirstVote: true, }) - // Deploy HonkVerifier with the linked library - const honkVerifier = (await HonkVerifierFactory.deploy()) as HonkVerifier + const proof = await generateProof(inputs) - const vote = { yes: 10n, no: 0n } - const votingPower = vote.yes + const isValid = await honkVerifier.verify(proof.proof, proof.publicInputs) + + expect(isValid).to.be.true + }) + + it('should validate input correctly', async function () { + // It needs some time to generate the proof. + this.timeout(60000) + + const [signer] = await ethers.getSigners() + + const crispProgram = await deployCRISPProgram() - const encodedVote = encodeVote(vote, VotingMode.GOVERNANCE, votingPower) + const address = signer.address.toLowerCase() as `0x${string}` + + const e3Id = 1n + + const vote = { yes: 10n, no: 0n } + const balance = vote.yes + const encodedVote = encodeVote(vote, VotingMode.GOVERNANCE, balance) const signature = (await signer.signMessage(MESSAGE)) as `0x${string}` - const leaf = hashLeaf(address, vote.yes.toString()) + const leaf = hashLeaf(address, balance.toString()) const leaves = [...[10n, 20n], leaf] const threshold = 0n - const merkleProof = generateMerkleProof(threshold, vote.yes, address, leaves) + const merkleProof = generateMerkleProof(threshold, balance, address, leaves) const inputs = await encryptVoteAndGenerateCRISPInputs({ encodedVote, @@ -141,16 +129,20 @@ describe('CRISP Contracts', function () { signature, message: MESSAGE, merkleData: merkleProof, - balance: vote.yes, + balance, slotAddress: address, isFirstVote: true, }) const proof = await generateProof(inputs) + const encodedProof = encodeSolidityProof(proof) - const isValid = await honkVerifier.verify(proof.proof, proof.publicInputs) + // Call next functions with fake data for testing. + await crispProgram.setRoundData(e3Id, merkleProof.proof.root, nonZeroAddress, 1n) + await crispProgram.validate(e3Id, 0n, '0x', '0x') - expect(isValid).to.be.true + // If it doesn't throw, the test is successful. + await crispProgram.validateInput(e3Id, zeroAddress, encodedProof) }) }) }) diff --git a/examples/CRISP/packages/crisp-contracts/tests/utils.ts b/examples/CRISP/packages/crisp-contracts/tests/utils.ts new file mode 100644 index 0000000000..af4c785843 --- /dev/null +++ b/examples/CRISP/packages/crisp-contracts/tests/utils.ts @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + +import { network } from 'hardhat' +import { zeroHash } from 'viem' +import { CRISPProgram, HonkVerifier, MockEnclave, PoseidonT3 } from '../types' + +// Non-zero address used in the tests. +export const nonZeroAddress = '0xc6e7DF5E7b4f2A278906862b61205850344D4e7d' + +export const { ethers } = await network.connect() +export const abiCoder = ethers.AbiCoder.defaultAbiCoder() + +/** + * Deploy a contract and return the address. + * @param contractName - The name of the contract to deploy. + * @returns The address of the deployed contract. + */ +export async function deployContract(contractName: string) { + const contract = await ethers.deployContract(contractName) + await contract.waitForDeployment() + + return contract +} + +/** + * Deploy PoseidonT3 and return the address. + * @returns The address of the deployed PoseidonT3 contract. + */ +export async function deployPoseidonT3() { + const contract = await deployContract('PoseidonT3') + + return contract as unknown as PoseidonT3 +} + +/** + * Deploy MockEnclave and return the address. + * @returns The address of the deployed MockEnclave contract. + */ +export async function deployMockEnclave() { + const contract = await deployContract('MockEnclave') + + return contract as unknown as MockEnclave +} + +/** + * Deploy HonkVerifier and return the address. + * @returns The address of the deployed HonkVerifier contract. + */ +export async function deployHonkVerifier() { + const zkTranscriptLib = await deployContract('ZKTranscriptLib') + + const HonkVerifierFactory = await ethers.getContractFactory('HonkVerifier', { + libraries: { + 'project/contracts/CRISPVerifier.sol:ZKTranscriptLib': await zkTranscriptLib.getAddress(), + }, + }) + + const honkVerifier = await HonkVerifierFactory.deploy() + + await honkVerifier.waitForDeployment() + + return honkVerifier as unknown as HonkVerifier +} + +export async function deployCRISPProgram( + contracts: { mockEnclave?: MockEnclave; honkVerifier?: HonkVerifier; poseidonT3?: PoseidonT3 } = {}, +) { + const poseidonT3 = contracts.poseidonT3 || (await deployPoseidonT3()) + const honkVerifier = contracts.honkVerifier || (await deployHonkVerifier()) + const mockEnclave = contracts.mockEnclave || (await deployMockEnclave()) + + const programFactory = await ethers.getContractFactory('CRISPProgram', { + libraries: { + 'npm/poseidon-solidity@0.0.5/PoseidonT3.sol:PoseidonT3': await poseidonT3.getAddress(), + }, + }) + + const program = await programFactory.deploy(await mockEnclave.getAddress(), nonZeroAddress, await honkVerifier.getAddress(), zeroHash) + + await program.waitForDeployment() + + return program as CRISPProgram +} diff --git a/examples/CRISP/packages/crisp-sdk/package.json b/examples/CRISP/packages/crisp-sdk/package.json index 39c77796bc..1d5ceb377d 100644 --- a/examples/CRISP/packages/crisp-sdk/package.json +++ b/examples/CRISP/packages/crisp-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@crisp-e3/sdk", - "version": "0.2.3-test", + "version": "0.3.0-test", "type": "module", "author": { "name": "gnosisguild", diff --git a/examples/CRISP/packages/crisp-sdk/src/vote.ts b/examples/CRISP/packages/crisp-sdk/src/vote.ts index f47754eb0d..b0532cd035 100644 --- a/examples/CRISP/packages/crisp-sdk/src/vote.ts +++ b/examples/CRISP/packages/crisp-sdk/src/vote.ts @@ -13,6 +13,8 @@ import { Noir, type CompiledCircuit } from '@noir-lang/noir_js' import { UltraHonkBackend, type ProofData } from '@aztec/bb.js' import circuit from '../../../circuits/target/crisp_circuit.json' import { privateKeyToAccount } from 'viem/accounts' +import { bytesToHex, encodeAbiParameters, parseAbiParameters, numberToHex, getAddress } from 'viem/utils' +import { Hex } from 'viem' /** * This utility function calculates the first valid index for vote options @@ -321,3 +323,16 @@ export const verifyProof = async (proof: ProofData): Promise => { return isValid } + +/** + * Encode the proof data into a format that can be used by the CRISP program in Solidity + * to validate the proof. + * @param proof The proof data. + * @returns The encoded proof data as a hex string. + */ +export const encodeSolidityProof = (proof: ProofData): Hex => { + const vote = proof.publicInputs.slice(2) as `0x${string}`[] + const slotAddress = getAddress(numberToHex(BigInt(proof.publicInputs[0]), { size: 20 })) + + return encodeAbiParameters(parseAbiParameters('bytes, bytes32[], address'), [bytesToHex(proof.proof), vote, slotAddress]) +} diff --git a/examples/CRISP/packages/crisp-zk-inputs/package.json b/examples/CRISP/packages/crisp-zk-inputs/package.json index 030e54cc47..392eacfd59 100644 --- a/examples/CRISP/packages/crisp-zk-inputs/package.json +++ b/examples/CRISP/packages/crisp-zk-inputs/package.json @@ -2,7 +2,7 @@ "name": "@crisp-e3/zk-inputs", "type": "module", "description": "Core logic to pre-compute CRISP ZK inputs (WASM/JavaScript bindings).", - "version": "0.2.3-test", + "version": "0.3.0-test", "license": "LGPL-3.0-only", "repository": { "type": "git", diff --git a/examples/CRISP/program/src/lib.rs b/examples/CRISP/program/src/lib.rs index 5ade113aa7..1d894a3851 100644 --- a/examples/CRISP/program/src/lib.rs +++ b/examples/CRISP/program/src/lib.rs @@ -4,10 +4,13 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -use e3_bfv_helpers::decode_bfv_params_arc; +use e3_bfv_helpers::{ + decode_bfv_params_arc, + utils::greco::{abi_decode_greco_ciphertext, greco_to_bfv_ciphertext}, +}; use e3_compute_provider::FHEInputs; use fhe::bfv::Ciphertext; -use fhe_traits::{DeserializeParametrized, Serialize}; +use fhe_traits::Serialize; /// CRISP Implementation of the CiphertextProcessor function pub fn fhe_processor(fhe_inputs: &FHEInputs) -> Vec { @@ -15,7 +18,9 @@ pub fn fhe_processor(fhe_inputs: &FHEInputs) -> Vec { let mut sum = Ciphertext::zero(¶ms); for ciphertext_bytes in &fhe_inputs.ciphertexts { - let ciphertext = Ciphertext::from_bytes(&ciphertext_bytes.0, ¶ms).unwrap(); + let (ct0is, ct1is) = abi_decode_greco_ciphertext(&ciphertext_bytes.0, ¶ms); + let ciphertext = greco_to_bfv_ciphertext(&ct0is, &ct1is, ¶ms); + sum += &ciphertext; } diff --git a/examples/CRISP/server/src/server/models.rs b/examples/CRISP/server/src/server/models.rs index 441a946334..d10c083c46 100644 --- a/examples/CRISP/server/src/server/models.rs +++ b/examples/CRISP/server/src/server/models.rs @@ -78,10 +78,9 @@ pub struct CTRequest { } #[derive(Debug, Deserialize, Serialize)] -pub struct EncryptedVote { +pub struct VoteRequest { pub round_id: u64, - pub enc_vote_bytes: Vec, - pub proof: Vec, + pub encoded_proof: String, pub address: String, } diff --git a/examples/CRISP/server/src/server/routes/voting.rs b/examples/CRISP/server/src/server/routes/voting.rs index d6d966065b..d75ef36629 100644 --- a/examples/CRISP/server/src/server/routes/voting.rs +++ b/examples/CRISP/server/src/server/routes/voting.rs @@ -7,15 +7,12 @@ use crate::server::{ app_data::AppData, database::SledDB, - models::{EncryptedVote, VoteResponse, VoteResponseStatus}, + models::{VoteRequest, VoteResponse, VoteResponseStatus}, repo::CrispE3Repository, CONFIG, }; use actix_web::{web, HttpResponse, Responder}; -use alloy::{ - dyn_abi::DynSolValue, - primitives::{Address, Bytes, U256}, -}; +use alloy::primitives::{Bytes, U256}; use e3_sdk::evm_helpers::contracts::{EnclaveContract, EnclaveWrite}; use eyre::Error; use log::{error, info}; @@ -30,35 +27,38 @@ pub fn setup_routes(config: &mut web::ServiceConfig) { /// /// # Arguments /// -/// * `EncryptedVote` - The vote data to be broadcast +/// * `VoteRequest` - The vote data to be broadcast /// /// # Returns /// /// * A JSON response indicating the success or failure of the operation async fn broadcast_encrypted_vote( - data: web::Json, + data: web::Json, store: web::Data, ) -> impl Responder { - let vote = data.into_inner(); - info!("[e3_id={}] Broadcasting encrypted vote", vote.round_id); + let vote_request = data.into_inner(); + info!( + "[e3_id={}] Broadcasting encrypted vote", + vote_request.round_id + ); // Validate and update vote status let has_voted = match store - .e3(vote.round_id) - .has_voted(vote.address.clone()) + .e3(vote_request.round_id) + .has_voted(vote_request.address.clone()) .await { Ok(voted) => voted, Err(e) => { error!( "[e3_id={}] Database error checking vote status: {:?}", - vote.round_id, e + vote_request.round_id, e ); return HttpResponse::InternalServerError().json("Internal server error"); } }; if has_voted { - info!("[e3_id={}] User has already voted", vote.round_id); + info!("[e3_id={}] User has already voted", vote_request.round_id); return HttpResponse::Ok().json(VoteResponse { status: VoteResponseStatus::UserAlreadyVoted, tx_hash: None, @@ -66,26 +66,45 @@ async fn broadcast_encrypted_vote( }); } - let mut repo = store.e3(vote.round_id); + let mut repo = store.e3(vote_request.round_id); - if let Err(e) = repo.insert_voter_address(vote.address.clone()).await { + if let Err(e) = repo + .insert_voter_address(vote_request.address.clone()) + .await + { error!( "[e3_id={}] Database error inserting voter: {:?}", - vote.round_id, e + vote_request.round_id, e ); return HttpResponse::InternalServerError().json("Internal server error"); } - let address: Address = vote.address.parse().expect("Invalid address"); - - let e3_id = U256::from(vote.round_id); - let params_value = DynSolValue::Tuple(vec![ - DynSolValue::Bytes(vote.proof), - DynSolValue::Bytes(vote.enc_vote_bytes), - DynSolValue::Address(address), - ]); + let e3_id = U256::from(vote_request.round_id); - let encoded_params = Bytes::from(params_value.abi_encode_params()); + // encoded_proof is already encoded in JavaScript, just decode from hex + let hex_str = vote_request + .encoded_proof + .strip_prefix("0x") + .unwrap_or(&vote_request.encoded_proof); + let encoded_proof = match hex::decode(hex_str) { + Ok(decoded) => Bytes::from(decoded), + Err(e) => { + error!( + "[e3_id={}] Failed to decode encoded_proof: {:?}", + vote_request.round_id, e + ); + // Rollback voter insertion before returning error + let _ = match repo.remove_voter_address(&vote_request.address).await { + Ok(_) => (), + Err(e) => error!("Error rolling back the vote: {e}"), + }; + return HttpResponse::BadRequest().json(VoteResponse { + status: VoteResponseStatus::FailedBroadcast, + tx_hash: None, + message: Some("Invalid hex encoded proof".to_string()), + }); + } + }; // Broadcast vote to blockchain let contract = match EnclaveContract::new( @@ -98,23 +117,31 @@ async fn broadcast_encrypted_vote( Ok(c) => c, Err(e) => { error!( - "[e3_id={}] Database error checking vote status: {:?}", - vote.round_id, e + "[e3_id={}] Contract creation failed: {:?}", + vote_request.round_id, e ); + // Rollback voter insertion before returning error + let _ = match repo.remove_voter_address(&vote_request.address).await { + Ok(_) => (), + Err(e) => error!("Error rolling back the vote: {e}"), + }; return HttpResponse::InternalServerError().json("Internal server error"); } }; - match contract.publish_input(e3_id, encoded_params).await { + match contract.publish_input(e3_id, encoded_proof).await { Ok(hash) => { - info!("[e3_id={}] Vote broadcasted successfully", vote.round_id); + info!( + "[e3_id={}] Vote broadcasted successfully", + vote_request.round_id + ); HttpResponse::Ok().json(VoteResponse { status: VoteResponseStatus::Success, tx_hash: Some(hash.transaction_hash.to_string()), message: Some("Vote Successful".to_string()), }) } - Err(e) => handle_vote_error(e, repo, &vote.address).await, + Err(e) => handle_vote_error(e, repo, &vote_request.address).await, } } diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json b/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json index ca902b2e54..a22ff66387 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json @@ -924,5 +924,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/IEnclave.sol", - "buildInfoId": "solc-0_8_28-16cb5d9b415ecf0909fb7f9bf39bab654b7f0bfc" + "buildInfoId": "solc-0_8_28-940fe788ca85c1fff59bdda0a8faa3394c1bfc84" } \ No newline at end of file diff --git a/packages/enclave-contracts/contracts/interfaces/IE3Program.sol b/packages/enclave-contracts/contracts/interfaces/IE3Program.sol index 4ea7a82943..b247b790d3 100644 --- a/packages/enclave-contracts/contracts/interfaces/IE3Program.sol +++ b/packages/enclave-contracts/contracts/interfaces/IE3Program.sol @@ -42,10 +42,9 @@ interface IE3Program { /// @param e3Id ID of the E3 computation /// @param sender The account that is submitting the input /// @param data The input data to be validated - /// @return input The decoded, policy-approved application payload function validateInput( uint256 e3Id, address sender, bytes memory data - ) external returns (bytes memory input); + ) external; } diff --git a/packages/enclave-contracts/contracts/test/MockE3Program.sol b/packages/enclave-contracts/contracts/test/MockE3Program.sol index 27902dccfc..30048ca983 100644 --- a/packages/enclave-contracts/contracts/test/MockE3Program.sol +++ b/packages/enclave-contracts/contracts/test/MockE3Program.sol @@ -37,12 +37,10 @@ contract MockE3Program is IE3Program { uint256, address sender, bytes memory data - ) external pure returns (bytes memory input) { + ) external pure { if (data.length == 3 || sender == address(0)) { revert InvalidInput(); } - - input = data; } function verify( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 954e6334db..d14232cf59 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -143,7 +143,7 @@ importers: examples/CRISP/client: dependencies: '@crisp-e3/sdk': - specifier: 0.2.3-test + specifier: 0.3.0-test version: link:../packages/crisp-sdk '@emotion/babel-plugin': specifier: ^11.11.0 @@ -165,7 +165,7 @@ importers: version: 1.13.2 connectkit: specifier: ^1.9.0 - version: 1.9.1(@babel/core@7.28.5)(@tanstack/react-query@5.90.6(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12)) + version: 1.9.1(@babel/core@7.28.5)(@tanstack/react-query@5.90.6(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76)) ethers: specifier: ^6.12.0 version: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -186,7 +186,7 @@ importers: version: 15.6.6(react@18.3.1) viem: specifier: 2.38.6 - version: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) + version: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) vite-plugin-node-polyfills: specifier: ^0.22.0 version: 0.22.0(rollup@4.52.5)(vite@5.4.21(@types/node@22.7.5)) @@ -198,7 +198,7 @@ importers: version: 4.3.2(typescript@5.8.3)(vite@5.4.21(@types/node@22.7.5)) wagmi: specifier: ^2.14.16 - version: 2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12) + version: 2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 @@ -11103,16 +11103,16 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@base-org/account@2.4.0(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12)': + '@base-org/account@2.4.0(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76)': dependencies: '@coinbase/cdp-sdk': 1.38.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(utf-8-validate@5.0.10)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@noble/hashes': 1.4.0 clsx: 1.2.1 eventemitter3: 5.0.1 idb-keyval: 6.2.1 - ox: 0.6.9(typescript@5.8.3)(zod@4.1.12) + ox: 0.6.9(typescript@5.8.3)(zod@3.25.76) preact: 10.24.2 - viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) zustand: 5.0.3(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) transitivePeerDependencies: - '@types/react' @@ -11215,6 +11215,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@coinbase/wallet-sdk@4.3.6(@types/react@18.3.26)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.8.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.3(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + '@coinbase/wallet-sdk@4.3.6(@types/react@18.3.26)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@noble/hashes': 1.4.0 @@ -11919,6 +11939,14 @@ snapshots: '@semaphore-protocol/contracts': 4.14.0 solady: 0.1.4 + '@gemini-wallet/core@0.3.1(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + '@metamask/rpc-errors': 7.0.2 + eventemitter3: 5.0.1 + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - supports-color + '@gemini-wallet/core@0.3.1(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))': dependencies: '@metamask/rpc-errors': 7.0.2 @@ -12985,6 +13013,17 @@ snapshots: - utf-8-validate - zod + '@reown/appkit-common@1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + '@reown/appkit-common@1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: big.js: 6.2.2 @@ -12996,6 +13035,41 @@ snapshots: - utf-8-validate - zod + '@reown/appkit-controllers@1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 1.13.2(@types/react@18.3.26)(react@18.3.1) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + '@reown/appkit-controllers@1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) @@ -13031,6 +13105,42 @@ snapshots: - utf-8-validate - zod + '@reown/appkit-pay@1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.26)(react@18.3.1))(zod@3.25.76) + lit: 3.3.0 + valtio: 1.13.2(@types/react@18.3.26)(react@18.3.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + '@reown/appkit-pay@1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) @@ -13071,6 +13181,43 @@ snapshots: dependencies: buffer: 6.0.3 + '@reown/appkit-scaffold-ui@1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.26)(react@18.3.1))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.26)(react@18.3.1))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - valtio + - zod + '@reown/appkit-scaffold-ui@1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.26)(react@18.3.1))(zod@4.1.12)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) @@ -13108,6 +13255,41 @@ snapshots: - valtio - zod + '@reown/appkit-ui@1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + '@reown/appkit-ui@1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) @@ -13143,6 +13325,44 @@ snapshots: - utf-8-validate - zod + '@reown/appkit-utils@1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.26)(react@18.3.1))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 1.13.2(@types/react@18.3.26)(react@18.3.1) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + '@reown/appkit-utils@1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.26)(react@18.3.1))(zod@4.1.12)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) @@ -13192,6 +13412,49 @@ snapshots: - typescript - utf-8-validate + '@reown/appkit@1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-pay': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.26)(react@18.3.1))(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.26)(react@18.3.1))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.0 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@18.3.26)(react@18.3.1) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + '@reown/appkit@1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) @@ -13364,6 +13627,16 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) @@ -13374,6 +13647,16 @@ snapshots: - utf-8-validate - zod + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.23.1 + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.23.1 @@ -14819,9 +15102,9 @@ snapshots: '@vue/shared@3.5.22': {} - '@wagmi/connectors@6.1.3(0b1a0c7e1852d0f2478f1048dd2722c1)': + '@wagmi/connectors@6.1.3(615998432ed1538eed571631714b7da2)': dependencies: - '@base-org/account': 2.4.0(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12) + '@base-org/account': 2.4.0(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12) '@coinbase/wallet-sdk': 4.3.6(@types/react@18.3.26)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.1.12) '@gemini-wallet/core': 0.3.1(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)) '@metamask/sdk': 0.33.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -14830,7 +15113,7 @@ snapshots: '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)) '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - porto: 0.2.35(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)))(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12)) + porto: 0.2.35(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)))(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12)) viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) optionalDependencies: typescript: 5.8.3 @@ -14873,19 +15156,19 @@ snapshots: - ws - zod - '@wagmi/connectors@6.1.3(615998432ed1538eed571631714b7da2)': + '@wagmi/connectors@6.1.3(d4aa626e1ce01c77feebfbcfe6b62584)': dependencies: - '@base-org/account': 2.4.0(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12) - '@coinbase/wallet-sdk': 4.3.6(@types/react@18.3.26)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.1.12) - '@gemini-wallet/core': 0.3.1(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)) + '@base-org/account': 2.4.0(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76) + '@coinbase/wallet-sdk': 4.3.6(@types/react@18.3.26)(bufferutil@4.0.9)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76) + '@gemini-wallet/core': 0.3.1(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) '@metamask/sdk': 0.33.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) - '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)) - '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - porto: 0.2.35(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)))(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12)) - viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) + porto: 0.2.35(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76)) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -14927,6 +15210,21 @@ snapshots: - ws - zod + '@wagmi/core@2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.8.3) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.0(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + optionalDependencies: + '@tanstack/query-core': 5.90.6 + typescript: 5.8.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + '@wagmi/core@2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))': dependencies: eventemitter3: 5.0.1 @@ -14942,6 +15240,50 @@ snapshots: - react - use-sync-external-store + '@walletconnect/core@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + '@walletconnect/core@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@walletconnect/heartbeat': 1.2.2 @@ -14986,6 +15328,50 @@ snapshots: - utf-8-validate - zod + '@walletconnect/core@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + '@walletconnect/core@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@walletconnect/heartbeat': 1.2.2 @@ -15034,6 +15420,47 @@ snapshots: dependencies: tslib: 1.14.1 + '@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/sign-client': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.1 + '@walletconnect/universal-provider': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + '@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@reown/appkit': 1.7.8(@types/react@18.3.26)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) @@ -15168,6 +15595,42 @@ snapshots: dependencies: tslib: 1.14.1 + '@walletconnect/sign-client@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + '@walletconnect/sign-client@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@walletconnect/core': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) @@ -15204,6 +15667,42 @@ snapshots: - utf-8-validate - zod + '@walletconnect/sign-client@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + '@walletconnect/sign-client@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@walletconnect/core': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) @@ -15302,6 +15801,46 @@ snapshots: - ioredis - uploadthing + '@walletconnect/universal-provider@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + '@walletconnect/universal-provider@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@walletconnect/events': 1.0.1 @@ -15342,6 +15881,46 @@ snapshots: - utf-8-validate - zod + '@walletconnect/universal-provider@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + '@walletconnect/universal-provider@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@walletconnect/events': 1.0.1 @@ -15382,6 +15961,50 @@ snapshots: - utf-8-validate - zod + '@walletconnect/utils@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + '@walletconnect/utils@2.21.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@noble/ciphers': 1.2.1 @@ -15426,6 +16049,50 @@ snapshots: - utf-8-validate - zod + '@walletconnect/utils@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + '@walletconnect/utils@2.21.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)': dependencies: '@noble/ciphers': 1.2.1 @@ -16307,12 +16974,12 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 - connectkit@1.9.1(@babel/core@7.28.5)(@tanstack/react-query@5.90.6(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12)): + connectkit@1.9.1(@babel/core@7.28.5)(@tanstack/react-query@5.90.6(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76)): dependencies: '@tanstack/react-query': 5.90.6(react@18.3.1) buffer: 6.0.3 detect-browser: 5.3.0 - family: 0.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12)) + family: 0.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76)) framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) qrcode: 1.5.4 react: 18.3.1 @@ -16321,8 +16988,8 @@ snapshots: react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resize-observer-polyfill: 1.5.1 styled-components: 5.3.11(@babel/core@7.28.5)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) - viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) - wagmi: 2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76) transitivePeerDependencies: - '@babel/core' - react-is @@ -17497,12 +18164,12 @@ snapshots: eyes@0.1.8: {} - family@0.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12)): + family@0.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76)): optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) - wagmi: 2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76) family@0.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12)): optionalDependencies: @@ -20043,6 +20710,20 @@ snapshots: os-browserify@0.3.0: {} + ox@0.6.9(typescript@5.8.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.1.1(typescript@5.8.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + ox@0.6.9(typescript@5.8.3)(zod@4.1.12): dependencies: '@adraffy/ens-normalize': 1.11.1 @@ -20386,21 +21067,21 @@ snapshots: style-value-types: 5.0.0 tslib: 2.8.1 - porto@0.2.35(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)))(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12)): + porto@0.2.35(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76)): dependencies: - '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) hono: 4.10.4 idb-keyval: 6.2.2 mipd: 0.0.7(typescript@5.8.3) ox: 0.9.14(typescript@5.8.3)(zod@4.1.12) - viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) zod: 4.1.12 zustand: 5.0.8(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: '@tanstack/react-query': 5.90.6(react@18.3.1) react: 18.3.1 typescript: 5.8.3 - wagmi: 2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12) + wagmi: 2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76) transitivePeerDependencies: - '@types/react' - immer @@ -22402,14 +23083,14 @@ snapshots: vscode-uri@3.1.0: {} - wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12): + wagmi@2.19.2(@tanstack/query-core@5.90.6)(@tanstack/react-query@5.90.6(react@18.3.1))(@types/react@18.3.26)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76): dependencies: '@tanstack/react-query': 5.90.6(react@18.3.1) - '@wagmi/connectors': 6.1.3(0b1a0c7e1852d0f2478f1048dd2722c1) - '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12)) + '@wagmi/connectors': 6.1.3(d4aa626e1ce01c77feebfbcfe6b62584) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.6)(@types/react@18.3.26)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: diff --git a/templates/default/Cargo.lock b/templates/default/Cargo.lock index 163c7df0ab..c9deb20c34 100644 --- a/templates/default/Cargo.lock +++ b/templates/default/Cargo.lock @@ -1105,11 +1105,15 @@ dependencies = [ "fhe-math", "fhe-traits", "fhe-util", + "itertools 0.14.0", + "ndarray", "num-bigint", + "num-traits", "rand 0.8.5", "strum", "thiserror", "zkfhe-greco", + "zkfhe-shared", ] [[package]] diff --git a/templates/default/contracts/MyProgram.sol b/templates/default/contracts/MyProgram.sol index 9bd048b9d8..a7ab693ae3 100755 --- a/templates/default/contracts/MyProgram.sol +++ b/templates/default/contracts/MyProgram.sol @@ -67,15 +67,12 @@ contract MyProgram is IE3Program, Ownable { /// @notice Validates input /// @param sender The account that is submitting the input. /// @param data The input to be verified. - /// @return input The input data. - function validateInput(uint256 e3Id, address sender, bytes memory data) external returns (bytes memory input) { + function validateInput(uint256 e3Id, address sender, bytes memory data) external { if (data.length == 0) revert EmptyInputData(); // You can add your own validation logic here. // EXAMPLE: https://github.com/gnosisguild/enclave/blob/main/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol - input = data; - uint256 index = inputs[e3Id].numberOfLeaves; inputs[e3Id]._insert(PoseidonT3.hash([uint256(keccak256(data)), index]));