diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index edf321bd3b..3ceaffc87f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,6 +27,30 @@ permissions: packages: write jobs: + crisp_rust_unit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Rust 1.86.0 + uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.86.0 + + # We must install foundry in order to be able to test anvil + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + + - name: Install solc + run: | + sudo add-apt-repository ppa:ethereum/ethereum \ + && sudo apt-get update -y \ + && sudo apt-get install -y solc + + - name: Run CRISP Unit Tests + working-directory: ./examples/CRISP + run: "cargo test" + rust_unit: runs-on: ubuntu-latest steps: diff --git a/crates/bfv-helpers/src/client.rs b/crates/bfv-helpers/src/client.rs index fbda448154..0c858bf63c 100644 --- a/crates/bfv-helpers/src/client.rs +++ b/crates/bfv-helpers/src/client.rs @@ -125,7 +125,7 @@ where #[cfg(test)] mod tests { - use crate::BfvParams; + use crate::BfvParamSets; use super::*; @@ -135,7 +135,7 @@ mod tests { use fhe::bfv::{Ciphertext, PublicKey, SecretKey}; use fhe_traits::{DeserializeParametrized, FheDecrypter, Serialize}; - let param_set = BfvParams::InsecureSet2048_1032193_1.into(); + let param_set = BfvParamSets::InsecureSet2048_1032193_1.into(); let params = build_bfv_params_from_set_arc(param_set); let degree = param_set.degree; let plaintext_modulus = param_set.plaintext_modulus; @@ -160,7 +160,7 @@ mod tests { use fhe::bfv::{Ciphertext, PublicKey, SecretKey}; use fhe_traits::{DeserializeParametrized, FheDecrypter, Serialize}; - let param_set = BfvParams::InsecureSet2048_1032193_1.into(); + let param_set = BfvParamSets::InsecureSet2048_1032193_1.into(); let params = build_bfv_params_from_set_arc(param_set); let degree = param_set.degree; let plaintext_modulus = param_set.plaintext_modulus; @@ -192,7 +192,7 @@ mod tests { use fhe::bfv::{Ciphertext, PublicKey, SecretKey}; use fhe_traits::{DeserializeParametrized, FheDecrypter, Serialize}; - let param_set = BfvParams::InsecureSet2048_1032193_1.into(); + let param_set = BfvParamSets::InsecureSet2048_1032193_1.into(); let params = build_bfv_params_from_set_arc(param_set); let degree = param_set.degree; let plaintext_modulus = param_set.plaintext_modulus; @@ -223,7 +223,7 @@ mod tests { use fhe::bfv::{Ciphertext, PublicKey, SecretKey}; use fhe_traits::{DeserializeParametrized, FheDecrypter, Serialize}; - let param_set = BfvParams::InsecureSet2048_1032193_1.into(); + let param_set = BfvParamSets::InsecureSet2048_1032193_1.into(); let params = build_bfv_params_from_set_arc(param_set); let degree = param_set.degree; let plaintext_modulus = param_set.plaintext_modulus; diff --git a/crates/bfv-helpers/src/lib.rs b/crates/bfv-helpers/src/lib.rs index d2df9cbc2b..40e4e653c9 100644 --- a/crates/bfv-helpers/src/lib.rs +++ b/crates/bfv-helpers/src/lib.rs @@ -34,7 +34,7 @@ type Result = std::result::Result; /// Predefined BFV parameters for common use cases /// Note that 10 is the default value for both error1 and error2 variance /// for both BFV and TRBFV (if not explicitly set). -pub enum BfvParams { +pub enum BfvParamSets { // List parameter strings and variants here // /// Standard BFV development parameters set (DO NOT USE IN PRODUCTION). @@ -77,17 +77,17 @@ pub enum BfvParams { } // Map for getters -impl BfvParams { +impl BfvParamSets { /// Return the given param set based on the input key &str. pub fn get_params_by_str(key: &str) -> Result { - key.parse::() + key.parse::() .map(|k| k.into()) .map_err(|_| Error::UnknownParamSet(key.to_string())) } /// List all the available parameter keys pub fn get_params_list() -> Vec { - BfvParams::iter() + BfvParamSets::iter() .map(|key| { let s: &'static str = key.into(); s.to_string() @@ -96,9 +96,9 @@ impl BfvParams { } } -impl From for BfvParamSet { - fn from(value: BfvParams) -> Self { - use BfvParams as B; +impl From for BfvParamSet { + fn from(value: BfvParamSets) -> Self { + use BfvParamSets as B; match value { // List each new parameter set here B::InsecureSet2048_1032193_1 => BfvParamSet { @@ -158,6 +158,18 @@ pub struct BfvParamSet { pub error1_variance: Option<&'static str>, } +impl BfvParamSet { + /// Build the BfvParamSet into an fhe.rs BfvParameters struct + pub fn build(self) -> BfvParameters { + build_bfv_params_from_set(self) + } + + /// Build the BfvParamSet into an fhe.rs Arc struct + pub fn build_arc(self) -> Arc { + Arc::new(self.build()) + } +} + /// Builds BFV parameters from a `BfvParamSet`. /// /// This is a convenience function that consumes a `BfvParamSet` struct @@ -618,7 +630,7 @@ mod tests { #[test] fn test_params_constant() { - let param_set: BfvParamSet = BfvParams::InsecureSet2048_1032193_1.into(); + let param_set: BfvParamSet = BfvParamSets::InsecureSet2048_1032193_1.into(); assert_eq!(param_set.degree, 2048); assert_eq!(param_set.plaintext_modulus, 1032193); assert_eq!(param_set.moduli, &[0x3FFFFFFF000001]); @@ -626,7 +638,7 @@ mod tests { #[test] fn test_params_function() { - let param_set = BfvParams::InsecureSet2048_1032193_1.into(); + let param_set = BfvParamSets::InsecureSet2048_1032193_1.into(); let params = build_bfv_params_from_set(param_set); assert_eq!(params.degree(), param_set.degree); @@ -636,7 +648,7 @@ mod tests { #[test] fn test_params_arc_function() { - let param_set = BfvParams::InsecureSet2048_1032193_1.into(); + let param_set = BfvParamSets::InsecureSet2048_1032193_1.into(); let params = build_bfv_params_from_set_arc(param_set); assert_eq!(params.degree(), param_set.degree); @@ -646,7 +658,7 @@ mod tests { #[test] fn test_params_encoding_roundtrip() { - let param_set = BfvParams::InsecureSet2048_1032193_1.into(); + let param_set = BfvParamSets::InsecureSet2048_1032193_1.into(); let params = build_bfv_params_from_set(param_set); let encoded = encode_bfv_params(¶ms); let decoded = decode_bfv_params(&encoded); @@ -660,7 +672,7 @@ mod tests { #[test] fn test_params_arc_encoding_roundtrip() { - let param_set = BfvParams::InsecureSet2048_1032193_1.into(); + let param_set = BfvParamSets::InsecureSet2048_1032193_1.into(); let params = build_bfv_params_from_set_arc(param_set); let encoded = encode_bfv_params(¶ms); let decoded = decode_bfv_params_arc(&encoded); @@ -674,7 +686,7 @@ mod tests { #[test] fn test_params_trbfv_encoding_roundtrip() { - let param_set = BfvParams::Set8192_1000_4.into(); + let param_set = BfvParamSets::Set8192_1000_4.into(); let params = build_bfv_params_from_set(param_set); let encoded = encode_bfv_params(¶ms); let decoded = decode_bfv_params(&encoded); diff --git a/crates/evm/src/helpers.rs b/crates/evm/src/helpers.rs index d4f63eee5d..c655a33924 100644 --- a/crates/evm/src/helpers.rs +++ b/crates/evm/src/helpers.rs @@ -9,7 +9,7 @@ use alloy::{ providers::{ fillers::{ BlobGasFiller, ChainIdFiller, FillProvider, GasFiller, JoinFill, NonceFiller, - WalletFiller, + SimpleNonceManager, WalletFiller, }, Identity, Provider, ProviderBuilder, RootProvider, }, @@ -99,8 +99,11 @@ pub type ConcreteReadProvider = FillProvider< pub type ConcreteWriteProvider = FillProvider< JoinFill< JoinFill< - Identity, - JoinFill>>, + JoinFill< + alloy::providers::Identity, + JoinFill>>, + >, + NonceFiller, >, WalletFiller, >, @@ -133,12 +136,14 @@ impl ProviderConfig { let provider = if self.rpc.is_websocket() { ProviderBuilder::new() + .with_simple_nonce_management() .wallet(wallet) .connect_ws(self.create_ws_connect()?) .await .context("Failed to connect to WebSocket RPC. Check if the node is running and URL is correct.")? } else { ProviderBuilder::new() + .with_simple_nonce_management() .wallet(wallet) .connect_client(self.create_http_client()?) }; diff --git a/crates/sdk/Cargo.toml b/crates/sdk/Cargo.toml index e2c356a7fc..a021995a58 100644 --- a/crates/sdk/Cargo.toml +++ b/crates/sdk/Cargo.toml @@ -7,6 +7,13 @@ description = "E3 - Enclave SDK" repository = "https://github.com/gnosisguild/enclave/crates/sdk" [dependencies] -e3-evm-helpers.workspace = true -e3-bfv-helpers.workspace = true -e3-indexer.workspace = true +e3-evm-helpers = { workspace = true, optional = true } +e3-bfv-helpers = { workspace = true, optional = true } +e3-indexer = { workspace = true, optional = true } + +[features] +default = ["full"] +full = ["evm", "bfv", "indexer"] +indexer = ["dep:e3-indexer"] +evm = ["dep:e3-evm-helpers"] +bfv = ["dep:e3-bfv-helpers"] diff --git a/crates/sdk/src/lib.rs b/crates/sdk/src/lib.rs index 9cbab3b6aa..6dd328db42 100644 --- a/crates/sdk/src/lib.rs +++ b/crates/sdk/src/lib.rs @@ -4,6 +4,11 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. +#[cfg(feature = "bfv")] pub use e3_bfv_helpers as bfv_helpers; + +#[cfg(feature = "evm")] pub use e3_evm_helpers as evm_helpers; + +#[cfg(feature = "indexer")] pub use e3_indexer as indexer; diff --git a/crates/test-helpers/src/bin/fake_encrypt.rs b/crates/test-helpers/src/bin/fake_encrypt.rs index ab5d84d044..517d6340b9 100644 --- a/crates/test-helpers/src/bin/fake_encrypt.rs +++ b/crates/test-helpers/src/bin/fake_encrypt.rs @@ -8,7 +8,7 @@ use clap::Parser; use e3_sdk::bfv_helpers::build_bfv_params_from_set_arc; use e3_sdk::bfv_helpers::decode_bfv_params; -use e3_sdk::bfv_helpers::BfvParams; +use e3_sdk::bfv_helpers::BfvParamSets; use fhe::bfv::{Encoding, Plaintext, PublicKey}; use fhe_traits::{DeserializeParametrized, FheEncoder, FheEncrypter, Serialize}; use rand::SeedableRng; @@ -55,7 +55,7 @@ fn main() -> Result<(), Box> { let params = if let Some(params_bytes) = args.params { Arc::new(decode_bfv_params(¶ms_bytes.0)) } else { - build_bfv_params_from_set_arc(BfvParams::InsecureSet2048_1032193_1.into()) + build_bfv_params_from_set_arc(BfvParamSets::InsecureSet2048_1032193_1.into()) }; let pubkey = PublicKey::from_bytes(&bytes, ¶ms)?; let raw_plaintext = args.plaintext; diff --git a/crates/test-helpers/src/lib.rs b/crates/test-helpers/src/lib.rs index 07d8456e81..51a40ac77d 100644 --- a/crates/test-helpers/src/lib.rs +++ b/crates/test-helpers/src/lib.rs @@ -19,7 +19,7 @@ use e3_events::{ }; use e3_fhe::{create_crp, setup_crp_params, ParamsWithCrp}; use e3_net::{DocumentPublisher, NetEventTranslator}; -use e3_sdk::bfv_helpers::{BfvParamSet, BfvParams}; +use e3_sdk::bfv_helpers::{BfvParamSet, BfvParamSets}; use e3_utils::SharedRng; use fhe::bfv::{BfvParameters, Ciphertext, Encoding, Plaintext, PublicKey}; use fhe::mbfv::CommonRandomPoly; @@ -87,7 +87,7 @@ pub fn get_common_setup( let rng = create_shared_rng_from_u64(42); let seed = create_seed_from_u64(123); - let param_set = param_set.unwrap_or(BfvParams::InsecureSet2048_1032193_1.into()); + let param_set = param_set.unwrap_or(BfvParamSets::InsecureSet2048_1032193_1.into()); let degree = param_set.degree; let plaintext_modulus = param_set.plaintext_modulus; let moduli = param_set.moduli; diff --git a/crates/wasm/src/lib.rs b/crates/wasm/src/lib.rs index 0fc3e80afd..33dc069ce5 100644 --- a/crates/wasm/src/lib.rs +++ b/crates/wasm/src/lib.rs @@ -6,7 +6,7 @@ use e3_bfv_helpers::{ client::{bfv_encrypt, bfv_verifiable_encrypt}, - BfvParamSet, BfvParams, + BfvParamSet, BfvParamSets, }; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; @@ -164,7 +164,7 @@ pub fn bfv_verifiable_encrypt_vector( /// Returns error if the parameter set name is invalid or serialization fails. pub fn get_bfv_params(name: &str) -> Result { let params = - BfvParams::get_params_by_str(name).map_err(|e| JsValue::from_str(&e.to_string()))?; + BfvParamSets::get_params_by_str(name).map_err(|e| JsValue::from_str(&e.to_string()))?; let js_params = BfvParamSetJs::from(¶ms); let serializer = serde_wasm_bindgen::Serializer::new().serialize_large_number_types_as_bigints(true); @@ -181,7 +181,7 @@ pub fn get_bfv_params(name: &str) -> Result { /// Includes both production-ready sets (e.g., "SET_8192_1000_4") and /// insecure sets for testing (prefixed with "INSECURE_"). pub fn get_bfv_params_list() -> Vec { - BfvParams::get_params_list() + BfvParamSets::get_params_list() } #[derive(Serialize, Deserialize)] diff --git a/examples/CRISP/Cargo.lock b/examples/CRISP/Cargo.lock index 27dcf8e039..72614a8689 100644 --- a/examples/CRISP/Cargo.lock +++ b/examples/CRISP/Cargo.lock @@ -1962,6 +1962,7 @@ dependencies = [ "chrono", "clap", "config", + "crisp-constants", "derivative", "dialoguer", "dotenvy", @@ -1987,6 +1988,13 @@ dependencies = [ "tokio", ] +[[package]] +name = "crisp-constants" +version = "0.1.0" +dependencies = [ + "e3-sdk", +] + [[package]] name = "crisp-zk-inputs" version = "0.1.0" @@ -6543,6 +6551,8 @@ name = "zk-inputs" version = "0.1.0" dependencies = [ "bigint-poly", + "crisp-constants", + "e3-sdk", "eyre", "fhe", "fhe-math", diff --git a/examples/CRISP/Cargo.toml b/examples/CRISP/Cargo.toml index 606ce335d5..82acc35d76 100644 --- a/examples/CRISP/Cargo.toml +++ b/examples/CRISP/Cargo.toml @@ -5,7 +5,8 @@ members = [ "program", "crates/zk-inputs", "crates/zk-inputs-wasm", - "crates/evm_helpers" + "crates/evm_helpers", + "crates/crisp-constants" ] resolver = "3" @@ -18,6 +19,7 @@ repository = "https://github.com/gnosisguild/enclave" [workspace.dependencies] e3-user-program = { path = "./program" } +crisp-constants = { path = "./crates/crisp-constants" } alloy = { version = "=1.0.41", features = ["full", "rpc-types-eth"] } alloy-primitives = { version = "=1.3.0", default-features = false, features = [ @@ -34,7 +36,7 @@ derivative = "=2.2.0" e3-compute-provider = { path = "../../crates/compute-provider" } e3-program-server = { path = "../../crates/program-server" } e3-bfv-helpers = { path = "../../crates/bfv-helpers" } -e3-sdk = { path = "../../crates/sdk" } +e3-sdk = { path = "../../crates/sdk", default-features = false } eyre = "=0.6.12" env_logger = "=0.11.8" hex = { version = "=0.4.3" } diff --git a/examples/CRISP/circuits/src/main.nr b/examples/CRISP/circuits/src/main.nr index 51c0dd8a37..947546bd59 100644 --- a/examples/CRISP/circuits/src/main.nr +++ b/examples/CRISP/circuits/src/main.nr @@ -18,27 +18,27 @@ use utils::{check_coefficient_values_with_balance, check_coefficient_zero}; fn main( // Ciphertext Addition Section. - prev_ct0is: [Polynomial<2048>; 1], // todo: make this pub - prev_ct1is: [Polynomial<2048>; 1], // todo: make this pub - sum_ct0is: [Polynomial<2048>; 1], - sum_ct1is: [Polynomial<2048>; 1], - sum_r0is: [Polynomial<2048>; 1], - sum_r1is: [Polynomial<2048>; 1], + prev_ct0is: [Polynomial<512>; 2], // todo: make this pub + prev_ct1is: [Polynomial<512>; 2], // todo: make this pub + sum_ct0is: [Polynomial<512>; 2], + sum_ct1is: [Polynomial<512>; 2], + sum_r0is: [Polynomial<512>; 2], + sum_r1is: [Polynomial<512>; 2], // Greco Section. - params: Params<2048, 1>, // todo: make this pub - pk0is: [Polynomial<2048>; 1], - pk1is: [Polynomial<2048>; 1], - ct0is: [Polynomial<2048>; 1], - ct1is: [Polynomial<2048>; 1], - u: Polynomial<2048>, - e0: Polynomial<2048>, - e1: Polynomial<2048>, - e0is: [Polynomial<2048>; 1], - k1: Polynomial<2048>, - r1is: [Polynomial<4095>; 1], - r2is: [Polynomial<2047>; 1], - p1is: [Polynomial<4095>; 1], - p2is: [Polynomial<2047>; 1], + params: Params<512, 2>, // todo: make this pub + pk0is: [Polynomial<512>; 2], + pk1is: [Polynomial<512>; 2], + ct0is: [Polynomial<512>; 2], + ct1is: [Polynomial<512>; 2], + u: Polynomial<512>, + e0: Polynomial<512>, + e1: Polynomial<512>, + e0is: [Polynomial<512>; 2], + k1: Polynomial<512>, + r1is: [Polynomial<1023>; 2], + r2is: [Polynomial<511>; 2], + p1is: [Polynomial<1023>; 2], + p2is: [Polynomial<511>; 2], // ECDSA Section. public_key_x: [u8; 32], public_key_y: [u8; 32], @@ -72,7 +72,7 @@ fn main( merkle_proof_siblings, ); - let greco: Greco<2048, 1, 54, 54, 5, 5, 5, 20, 20, 54, 16, 54> = Greco::new( + let greco: Greco<512, 2, 36, 36, 2, 6, 6, 4, 10, 36, 10, 36> = Greco::new( params, pk0is, pk1is, @@ -89,7 +89,7 @@ fn main( p2is, ); - let ct_add: CiphertextAddition<2048, 1, 54, 54, 54> = CiphertextAddition::new( + let ct_add: CiphertextAddition<512, 2, 36, 36, 36> = CiphertextAddition::new( params.crypto_params(), ct0is, ct1is, diff --git a/examples/CRISP/crates/crisp-constants/Cargo.toml b/examples/CRISP/crates/crisp-constants/Cargo.toml new file mode 100644 index 0000000000..443b493f99 --- /dev/null +++ b/examples/CRISP/crates/crisp-constants/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "crisp-constants" +version.workspace = true +edition.workspace = true +license.workspace = true +description.workspace = true +repository.workspace = true + +[dependencies] +e3-sdk = { workspace = true, default-features = false, features=["bfv"] } diff --git a/examples/CRISP/crates/crisp-constants/src/lib.rs b/examples/CRISP/crates/crisp-constants/src/lib.rs new file mode 100644 index 0000000000..bf31a6cb0c --- /dev/null +++ b/examples/CRISP/crates/crisp-constants/src/lib.rs @@ -0,0 +1,13 @@ +// 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 e3_sdk::bfv_helpers::{BfvParamSet, BfvParamSets}; + +// This could eventually be set here with an environment var once we allow for dynamic circuit selection. +pub fn get_default_paramset() -> BfvParamSet { + // NOTE: parameters are insecure. These parameters are mainly for testing and demonstration + BfvParamSets::InsecureSet512_10_1.into() +} diff --git a/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs b/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs index 09d945dd57..cdfff8be8b 100644 --- a/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs +++ b/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs @@ -34,17 +34,16 @@ impl ZKInputsGenerator { ) -> Result { let plaintext_modulus_u64 = plaintext_modulus as u64; let moduli_vec: Vec = moduli.into_iter().map(|m| m as u64).collect(); - - let generator = CoreZKInputsGenerator::new(degree, plaintext_modulus_u64, &moduli_vec) - .map_err(|e| JsValue::from_str(&e.to_string()))?; + // Should we pass an error1_variance here? + let generator = + CoreZKInputsGenerator::new(degree, plaintext_modulus_u64, &moduli_vec, None); Ok(ZKInputsGenerator { generator }) } /// Create a new JavaScript CRISP ZK inputs generator with default BFV parameters. #[wasm_bindgen(js_name = "withDefaults")] pub fn with_defaults() -> Result { - let generator = CoreZKInputsGenerator::with_defaults() - .map_err(|e| JsValue::from_str(&e.to_string()))?; + let generator = CoreZKInputsGenerator::with_defaults(); Ok(ZKInputsGenerator { generator }) } @@ -137,7 +136,7 @@ impl ZKInputsGenerator { mod tests { use super::*; use wasm_bindgen_test::*; - use zk_inputs::DEFAULT_DEGREE; + const DEFAULT_DEGREE: usize = 512; wasm_bindgen_test_configure!(run_in_browser); diff --git a/examples/CRISP/crates/zk-inputs/Cargo.toml b/examples/CRISP/crates/zk-inputs/Cargo.toml index b8f6af1ce6..af6ba0ce03 100644 --- a/examples/CRISP/crates/zk-inputs/Cargo.toml +++ b/examples/CRISP/crates/zk-inputs/Cargo.toml @@ -7,6 +7,8 @@ repository.workspace = true description = "Core logic to pre-compute CRISP ZK inputs." [dependencies] +e3-sdk = { workspace = true, default-features = false, features=["bfv"] } +crisp-constants.workspace = true fhe.workspace = true fhe-math.workspace = true fhe-traits.workspace = true diff --git a/examples/CRISP/crates/zk-inputs/src/lib.rs b/examples/CRISP/crates/zk-inputs/src/lib.rs index e73387268c..a1feeae9dc 100644 --- a/examples/CRISP/crates/zk-inputs/src/lib.rs +++ b/examples/CRISP/crates/zk-inputs/src/lib.rs @@ -8,48 +8,48 @@ //! //! This crate contains the main logic for generating CRISP inputs for zero-knowledge proofs. +use crisp_constants::get_default_paramset; +use e3_sdk::bfv_helpers::build_bfv_params_arc; +use e3_sdk::bfv_helpers::BfvParamSet; +use e3_sdk::bfv_helpers::BfvParamSets; use eyre::{Context, Result}; +use fhe::bfv::BfvParameters; use fhe::bfv::Ciphertext; use fhe::bfv::PublicKey; use fhe::bfv::SecretKey; -use fhe::bfv::{BfvParameters, BfvParametersBuilder}; use fhe::bfv::{Encoding, Plaintext}; -use fhe_math::rq::Poly; -use fhe_math::rq::Representation; use fhe_traits::{DeserializeParametrized, FheEncoder, Serialize}; use greco::bounds::GrecoBounds; use greco::vectors::GrecoVectors; -use num_bigint::BigInt; -use num_bigint::BigUint; -use num_bigint::ToBigInt; use rand::thread_rng; use std::sync::Arc; - mod ciphertext_addition; use crate::ciphertext_addition::CiphertextAdditionInputs; mod serialization; use serialization::{construct_inputs, serialize_inputs_to_json}; -// Default BFV parameters constants for testing purposes. -pub const DEFAULT_DEGREE: usize = 2048; -pub const DEFAULT_PLAINTEXT_MODULUS: u64 = 1032193; -pub const DEFAULT_MODULI: [u64; 1] = [0x3FFFFFFF000001]; - pub struct ZKInputsGenerator { bfv_params: Arc, } impl ZKInputsGenerator { /// Creates a new generator with the specified BFV parameters. - pub fn new(degree: usize, plaintext_modulus: u64, moduli: &[u64]) -> Result { - let bfv_params = BfvParametersBuilder::new() - .set_degree(degree) - .set_plaintext_modulus(plaintext_modulus) - .set_moduli(moduli) - .build_arc() - .map_err(|e| eyre::eyre!("Invalid BFV parameters: {}", e))?; - Ok(Self { bfv_params }) + pub fn new( + degree: usize, + plaintext_modulus: u64, + moduli: &[u64], + error1_variance: Option<&str>, + ) -> Self { + let bfv_params = build_bfv_params_arc(degree, plaintext_modulus, moduli, error1_variance); + Self { bfv_params } + } + + /// Creates a new generator with the specified BFV parameter set. + pub fn from_set(set: BfvParamSet) -> Self { + let bfv_params = set.build_arc(); + + Self { bfv_params } } /// Creates a generator with default BFV parameters for testing purposes. @@ -59,8 +59,8 @@ impl ZKInputsGenerator { /// - The default parameters are not suitable for production. /// # Returns /// A new ZKInputsGenerator instance with default BFV parameters - pub fn with_defaults() -> Result { - Self::new(DEFAULT_DEGREE, DEFAULT_PLAINTEXT_MODULUS, &DEFAULT_MODULI) + pub fn with_defaults() -> Self { + Self::from_set(get_default_paramset()) } /// Generates CRISP ZK inputs for a vote encryption and addition operation. @@ -168,6 +168,8 @@ impl ZKInputsGenerator { mod tests { use super::*; + const DEFAULT_DEGREE: usize = 512; + /// Helper function to create a vote vector with alternating 0s and 1s (deterministic) fn create_vote_vector() -> Vec { (0..DEFAULT_DEGREE).map(|i| (i % 2) as u64).collect() @@ -175,7 +177,7 @@ mod tests { #[test] fn test_inputs_generation_with_defaults() { - let generator = ZKInputsGenerator::with_defaults().expect("failed to create generator"); + let generator = ZKInputsGenerator::with_defaults(); let public_key = generator .generate_public_key() .expect("failed to generate public key"); @@ -195,8 +197,12 @@ mod tests { #[test] fn test_inputs_generation_with_custom_params() { - let generator = ZKInputsGenerator::new(2048, 1032193, &[0x3FFFFFFF000001]) - .expect("failed to create generator"); + let generator = ZKInputsGenerator::from_set(BfvParamSet { + degree: 2048, + plaintext_modulus: 1032193, + moduli: &[0x3FFFFFFF000001], + error1_variance: None, + }); let public_key = generator .generate_public_key() .expect("failed to generate public key"); @@ -216,7 +222,7 @@ mod tests { #[test] fn test_inputs_generation_with_vote_0() { - let generator = ZKInputsGenerator::with_defaults().expect("failed to create generator"); + let generator = ZKInputsGenerator::with_defaults(); let public_key = generator .generate_public_key() .expect("failed to generate public key"); @@ -236,7 +242,12 @@ mod tests { #[test] fn test_get_bfv_params() { - let generator = ZKInputsGenerator::with_defaults().expect("failed to create generator"); + let generator = ZKInputsGenerator::from_set(BfvParamSet { + degree: 2048, + plaintext_modulus: 1032193, + moduli: &[0x3FFFFFFF000001], + error1_variance: None, + }); let bfv_params = generator.get_bfv_params(); assert!(bfv_params.degree() == 2048); @@ -246,7 +257,7 @@ mod tests { #[test] fn test_secure_rng_usage() { - let generator = ZKInputsGenerator::with_defaults().expect("failed to create generator"); + let generator = ZKInputsGenerator::with_defaults(); // Test that functions use secure randomness (no deterministic seed). let public_key = generator @@ -271,7 +282,7 @@ mod tests { // Error handling tests #[test] fn test_invalid_inputs() { - let generator = ZKInputsGenerator::with_defaults().expect("failed to create generator"); + let generator = ZKInputsGenerator::with_defaults(); let vote = create_vote_vector(); // Test invalid byte inputs. @@ -290,7 +301,7 @@ mod tests { // Core functionality tests #[test] fn test_vote_values() { - let generator = ZKInputsGenerator::with_defaults().expect("failed to create generator"); + let generator = ZKInputsGenerator::with_defaults(); let public_key = generator .generate_public_key() .expect("failed to generate public key"); @@ -308,20 +319,9 @@ mod tests { assert!(result_1.is_ok()); } - #[test] - fn test_bfv_params_consistency() { - let generator = ZKInputsGenerator::with_defaults().expect("failed to create generator"); - let bfv_params = generator.get_bfv_params(); - - // Verify default parameters. - assert_eq!(bfv_params.degree(), 2048); - assert_eq!(bfv_params.plaintext(), 1032193); - assert_eq!(bfv_params.moduli(), &[0x3FFFFFFF000001]); - } - #[test] fn test_json_output_structure() { - let generator = ZKInputsGenerator::with_defaults().expect("failed to create generator"); + let generator = ZKInputsGenerator::with_defaults(); let public_key = generator .generate_public_key() .expect("failed to generate public key"); @@ -354,7 +354,7 @@ mod tests { #[test] fn test_cryptographic_properties() { - let generator = ZKInputsGenerator::with_defaults().expect("Failed to create generator"); + let generator = ZKInputsGenerator::with_defaults(); let public_key = generator .generate_public_key() .expect("Failed to generate public key"); diff --git a/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol b/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol index 80d765b88f..03bc320a97 100644 --- a/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol +++ b/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol @@ -5,82 +5,82 @@ // or FITNESS FOR A PARTICULAR PURPOSE. pragma solidity >=0.8.21; -uint256 constant N = 524288; -uint256 constant LOG_N = 19; +uint256 constant N = 262144; +uint256 constant LOG_N = 18; uint256 constant NUMBER_OF_PUBLIC_INPUTS = 2; library HonkVerificationKey { function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) { Honk.VerificationKey memory vk = Honk.VerificationKey({ - circuitSize: uint256(524288), - logCircuitSize: uint256(19), + circuitSize: uint256(262144), + logCircuitSize: uint256(18), publicInputsSize: uint256(2), ql: Honk.G1Point({ - x: uint256(0x118ad815dcaaf1a56f3e2bb81e72c1c6fec28dda580cfc7dc1c9f18b9ce04f4a), - y: uint256(0x2ea986b3b4656c2a34e3ec507f48fc94bd2ae7cbb54cc09055966b1ddf82c14f) + x: uint256(0x0d4a81fe29e51321f6e188fb872011b41a1a5b88aeebe115815c673a4b84ea73), + y: uint256(0x121babb1f6562b399e7d8f703e77dd12ec22149d625b2d446f7bfd840d9104aa) }), qr: Honk.G1Point({ - x: uint256(0x1eff288b6b832fa0601b2eba847a40f4130d4fc9d7045176331165408411722a), - y: uint256(0x05d740279424eaa5f1ef475c91faa0bddff9c53ce2a1905de8ee1cb1688cccd4) + x: uint256(0x236b322ee093dccf3425e5e5073d54bb9a459239bc4972044448038626be08aa), + y: uint256(0x201a32a3edacb146c84d733539f9f3feb1daa5778a297f6a84463961cbb5312d) }), qo: Honk.G1Point({ - x: uint256(0x288ddf249921808bd5c40c3db2260bf32b4fd873942037e18f9837f19628932d), - y: uint256(0x27bb5e03aed222c564c03dab98883a6e70bed4c51a642b1c13bef788003e0834) + x: uint256(0x192e409775f86ca55d138c9fc13f0fb5ab0556ed50b54c36d8e24756588f03df), + y: uint256(0x1a1b144946b95bacb469ed43fc6695495a1fb598d0b45de236d1d5b530bb0f38) }), q4: Honk.G1Point({ - x: uint256(0x0da8135ea1251a83d9f7baeb4fde65f110e764900c760274cdc606deda727cfd), - y: uint256(0x203f103e4b14fcb24976d2c05210fc3cc6ef1231d059bd3803264a30cd660ce0) + x: uint256(0x0d3b3ba7d12e9007c9fe8404360ca1d9b800841d1f8c0542e5768f7ecfd411c0), + y: uint256(0x012627b76c507f18dab2f1086dcb83df326b3d6355e6333232a610149e04084b) }), qm: Honk.G1Point({ - x: uint256(0x2dc67af66df99710729c064b2bbc5533eef5209b480b83ac22a6b558d7b12774), - y: uint256(0x2d2e5082c8b754eadfe985231d824991b69ee6baadfda0fcadd71e1d979cedd3) + x: uint256(0x1f7d981d0d1a6c07148bbcb3940674424c4decb50ea95df10eb82ba1a51ba70d), + y: uint256(0x1cb8bec5edc12596db6288ca3cc688b889c30af4a5bc5cd71fa5557e30d4252b) }), qc: Honk.G1Point({ - x: uint256(0x190facd1a2a06dbcd1050ca0197b31a62a0e337f50b2fed4d8922dbcf5b59a82), - y: uint256(0x055c88f56cb085878c6be12a6da01e43e63547c5d022416167fbdc394eeadf0d) + x: uint256(0x1ba62c6c1d5e17c1d40929a46b6addafed65ec99ace3660ae4091178c80c5449), + y: uint256(0x0c1702e2479196f0f4f0297e52854df65e731557152845caf540b566e11fe894) }), qArith: Honk.G1Point({ - x: uint256(0x2aa294a1cdd6d4f1742232efba3ce702bcd4e02545af5851209d7c32f1687072), - y: uint256(0x1e9bae0aac2f6a43ca1191f2fa64865ff3db937db207d834f77ce71b475ce24b) + x: uint256(0x2ccacdfb395f850922ffebbef7ec4b222bc194d8750f7774901672b7d75f64ca), + y: uint256(0x2ce12caa0e91988dc3d70643f789140eaeca39928fc33846857ea61168208f56) }), qDeltaRange: Honk.G1Point({ - x: uint256(0x1126fa181863c775f48afe0192d690f4f7d8082da38154659b5cf10ed0718a89), - y: uint256(0x273d50b0100f293f225de7c56c5418a32d3ba2a076ccb44b6c853ed7b0f622e8) + x: uint256(0x2d9209d62f9266d9888238c3034d15cde8ad5cc6fcd87ee9d06c03ec747fd929), + y: uint256(0x01cd76cd8fd89485c7b1deb67540fa43bc93b587467829f76eff469daea75944) }), qElliptic: Honk.G1Point({ - x: uint256(0x2c444b27242e32bb83792bed507771c19093a2789af4c0fda85e13669aaab4b0), - y: uint256(0x16a2386a8d4151e1798606966ee917834f6f67c24938aa367a007e02779b1a60) + x: uint256(0x2e33766731af3ff7768cf33d2c863cfc0efe291f57f1bec53d2c3c9f65f1fb71), + y: uint256(0x101a6f4d62bba878a17456723d08d05d9b58f39f8e0fbb8fd79dc7ef8ad8e111) }), qAux: Honk.G1Point({ - x: uint256(0x21db08ac00c89bb8e502038f99d37f80af55fee3d4e7ae6b2e74b0f7dc2596bc), - y: uint256(0x03f5ea27626a6fa42b9e7c4ebcc045c4af86be444fc09d993955e1f80ed7150e) + x: uint256(0x131a89a189e924538047b5589c7163f149da383c035f9fd09afef7e2ad6de4ae), + y: uint256(0x0d5df2b88d446fa1ddeee79afded1a9d124cd852125317e1ea6fe05e15f9370a) }), qLookup: Honk.G1Point({ x: uint256(0x255e9b4a2d66a47d22f21b21ccc7735af13f37baf30e7cfced18b6ddafc8cde5), y: uint256(0x09b915ecbc06a5805cda9165c383dacee8d6c40617ec9dc2e2aa0b576fb34917) }), qPoseidon2External: Honk.G1Point({ - x: uint256(0x0e447a7114a3174a08edc404850e5d6c3865e0ab2e487d6b1de37998fcdf6441), - y: uint256(0x26f68414b5f396a7973497b516a7732020607554c0009e4147b4da7d8ccd3893) + x: uint256(0x0003a0762bacb1aecfac12122edd7461aead19dad3dbb4b66b51abd5b86f7054), + y: uint256(0x1308e5ceb8304c2246027cd5cf974b3b3a6cf34acabb140855c58cb5c8f16849) }), qPoseidon2Internal: Honk.G1Point({ - x: uint256(0x0b1b4900e506b76af25cb10a130b116b40f92d29adb948d4867706f3c7855434), - y: uint256(0x155b0bb7e31f5126a2d090c1df1f8c235942868f8d520fb3f5dbd91822a7cb3c) + x: uint256(0x05f7b35529af89e788d50e2d62637084c31a6e74bbc67042a90706fc7e35cb48), + y: uint256(0x1d51cf8b6ffa03b318d0ccb4e226b28eac49b5df17925e0c2f32a3fc2caafeae) }), s1: Honk.G1Point({ - x: uint256(0x005f82ab77449f121bfe6dd1a569b7ecacbd30d4ffb073947dce0c281407de94), - y: uint256(0x228ea5044365dbdfc8206b9afca8f92f5f50699d1cf06f201270ac5ce985ffec) + x: uint256(0x214530944de85842b322e51ff2de0efec597c520acfe6d1fe272e5e3452229c0), + y: uint256(0x10081da07ca6ac083f510ccb1c3ac091882a1762a3909bca7a66d4ebcf1a2161) }), s2: Honk.G1Point({ - x: uint256(0x0d9e60b4bb55e464855f887ed938da6cd41939df84d958b8e378c3ccd199a9e4), - y: uint256(0x1195897e02c2db98c2744c5e56c07cdd17a62c92a7096ffe0bee415230b614f9) + x: uint256(0x1c07846224fd71e335dc3cb5c41f17abc639652fb981368302d1726425dff257), + y: uint256(0x0c66098b3772a51d6cc93a2f1b2d4f271cf6e904bc97ab7bd2e02114470bce5a) }), s3: Honk.G1Point({ - x: uint256(0x2e3e80ca9578d5f9a1b2ec033a375744715a35dcf4f1ed8b0d8840e7412a2012), - y: uint256(0x0f83887ef0089e2192177f611c29db6b53243e5144f02a787b60fc771ab34742) + x: uint256(0x019e52269f6c189d5da486b06450e0727172082502d24bef2f310b2e35ca7089), + y: uint256(0x052adaf878afdcc0e5af0ea1f2404d67011a200b198cdc87b82a73d76be4f18a) }), s4: Honk.G1Point({ - x: uint256(0x20481189ae2b294708b74c459ce471d700e7878df5785dbd6067ed6c7c7e2861), - y: uint256(0x1a432c75361053a9ee0a03da028ce71717d8252d6d11d3034ab3848537e6516c) + x: uint256(0x0bd39ef53453140569c95e4bf8dbcbc89da6f4f7f8f7195afba70b941f2e63fc), + y: uint256(0x175e7768c8a938c9df3e8251118669457d0d26a0a802d820373bb33899f8b20d) }), t1: Honk.G1Point({ x: uint256(0x161fe258de60ba620db6e59df1b7fd8b94ca15d3fc494e04b5ac396f222a1b6b), @@ -99,28 +99,28 @@ library HonkVerificationKey { y: uint256(0x2666cdf753a3f674e441aff59ff17dbf22d428bbfa89ee5e7a92b21bc42613fa) }), id1: Honk.G1Point({ - x: uint256(0x283571bfdd0dba0476afc47090fb467dce871cbf01c92d6a73e78b2f5e5b69bc), - y: uint256(0x241cb4d786d0f2b030e666bcba317b554a6eb6903e24a70b0f99692541c9453e) + x: uint256(0x141f652ca82f89d21a9fedf4d06d647cc16f8bbc9dd1ae284a36fa78663ced05), + y: uint256(0x0bf2a5d62e9a29c83f2e21130ba3f6936981d682f75d4f21ccdab70590faa30e) }), id2: Honk.G1Point({ - x: uint256(0x00592b972b5d4a104424616a477e29093601464b79e7f4f894054db2e816a094), - y: uint256(0x2d53a1d83717b68da903a348ba8919ce836bc2e8368fb5c8bab33e755d67eb55) + x: uint256(0x00fed1b10d2b31d4825faa9e63f3ef014355c93ec419a62e0a4fe5b00cdd88d6), + y: uint256(0x1cf62e72ad9b0384f5293f6f5a0ecc992712b4566ac4b0ed0f62a61032066063) }), id3: Honk.G1Point({ - x: uint256(0x2503637bf08354f75c866efd81dbc91923d5364077f5c7585f74782630c5fcd8), - y: uint256(0x074d878b9efa561face1ff22160351abda5f7458a42479ee10dcc175c04a2ae1) + x: uint256(0x16a82971758f188fd90094e1acae19b595b86e5e1f38d450e19e84ff3de92443), + y: uint256(0x1bc3d4546fbbf19900cb2ebaa9019d1fb9560b251094600a51706817b0e56bec) }), id4: Honk.G1Point({ - x: uint256(0x2fc9cb8caa3b282a361c73557381a42018d5e9150e19fe4e89b9212230177515), - y: uint256(0x2f3b69a2cf1e43183093a42a2a1b9ceaa92e2921e3c01ef7d2d2072124fcf57d) + x: uint256(0x1b73bd96d9b34de6f33c1daed6d96639a8f3f2a0390d4992429875b811bf20a0), + y: uint256(0x02e44a0a9186518054ed35d2f1fcd1dc33edbd8d43dab937bbe49fddccb8fd42) }), lagrangeFirst: Honk.G1Point({ x: uint256(0x0000000000000000000000000000000000000000000000000000000000000001), y: uint256(0x0000000000000000000000000000000000000000000000000000000000000002) }), lagrangeLast: Honk.G1Point({ - x: uint256(0x1066442d8b6c8e1b86cdbe7f2726021b3a63451cc6d6865dc63805e15f201032), - y: uint256(0x21a92a004929571d6c55b4ddf6657b09436f649f0c9fa082525d0d00c79a1bb9) + x: uint256(0x132bb33414e0a9997c0b8c1bce8e1acd531ee3d4fb1d0d4dfae36eb6ee7cd7bf), + y: uint256(0x073d022b02cdb9ad4f36da0f146c285a2d3dbca83ba375e2513863603c0b13b6) }) }); return vk; diff --git a/examples/CRISP/server/Cargo.toml b/examples/CRISP/server/Cargo.toml index 24fcc3e456..88eda16571 100644 --- a/examples/CRISP/server/Cargo.toml +++ b/examples/CRISP/server/Cargo.toml @@ -43,8 +43,9 @@ lean-imt = "=0.1.2" # Local dependencies e3-compute-provider.workspace = true -e3-sdk.workspace = true +e3-sdk = { workspace = true, default-features = false, features=["full"] } evm-helpers = { path = "../crates/evm_helpers" } +crisp-constants.workspace = true # CLI and user interaction dialoguer = { version = "=0.11.0", features = ["fuzzy-select"] } diff --git a/examples/CRISP/server/src/cli/commands.rs b/examples/CRISP/server/src/cli/commands.rs index 5b509d033f..befa0dafc0 100644 --- a/examples/CRISP/server/src/cli/commands.rs +++ b/examples/CRISP/server/src/cli/commands.rs @@ -4,8 +4,9 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. +use crisp_constants::get_default_paramset; use dialoguer::{theme::ColorfulTheme, FuzzySelect, Input}; -use e3_sdk::bfv_helpers::BfvParams; +use e3_sdk::bfv_helpers::BfvParamSets; use log::info; use num_bigint::BigUint; use reqwest::Client; @@ -328,7 +329,7 @@ pub async fn decrypt_and_publish_result( } fn generate_bfv_parameters() -> Arc { - build_bfv_params_from_set_arc(BfvParams::InsecureSet2048_1032193_1.into()) + build_bfv_params_from_set_arc(get_default_paramset()) } fn generate_keys(params: &Arc) -> (SecretKey, PublicKey) { diff --git a/examples/CRISP/server/src/server/routes/rounds.rs b/examples/CRISP/server/src/server/routes/rounds.rs index 9bea7d8d1f..e491339e1e 100644 --- a/examples/CRISP/server/src/server/routes/rounds.rs +++ b/examples/CRISP/server/src/server/routes/rounds.rs @@ -13,7 +13,8 @@ use crate::server::models::{ use actix_web::{web, HttpResponse, Responder}; use alloy::primitives::{Address, Bytes, U256}; use chrono::Utc; -use e3_sdk::bfv_helpers::{build_bfv_params_from_set_arc, encode_bfv_params, BfvParams}; +use crisp_constants::get_default_paramset; +use e3_sdk::bfv_helpers::{build_bfv_params_from_set_arc, encode_bfv_params}; use e3_sdk::evm_helpers::contracts::{EnclaveContract, EnclaveRead, EnclaveWrite}; use log::{error, info}; use num_bigint::BigUint; @@ -179,9 +180,7 @@ pub async fn initialize_crisp_round( } info!("Generating parameters..."); - let params = encode_bfv_params(&build_bfv_params_from_set_arc( - BfvParams::InsecureSet2048_1032193_1.into(), - )); + let params = encode_bfv_params(&build_bfv_params_from_set_arc(get_default_paramset())); let token_address: Address = token_address.parse()?; let balance_threshold = BigUint::parse_bytes(balance_threshold.as_bytes(), 10) diff --git a/examples/CRISP/test/crisp.spec.ts b/examples/CRISP/test/crisp.spec.ts index 70f3eb3bdd..069a5258aa 100644 --- a/examples/CRISP/test/crisp.spec.ts +++ b/examples/CRISP/test/crisp.spec.ts @@ -15,7 +15,7 @@ async function runCliInit(): Promise { // Execute the command and wait for it to complete const output = execSync( "pnpm cli init --token-address 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 --balance-threshold 1000", - { encoding: "utf-8" } + { encoding: "utf-8" }, ); console.log("Command output:", output); const lines = output.trim().split("\n"); @@ -47,7 +47,7 @@ async function checkE3Activated(e3id: number): Promise { async function waitForE3Activation( e3id: number, - maxWaitMs: number = 300000 + maxWaitMs: number = 300000, ): Promise { const startTime = Date.now(); while (Date.now() - startTime < maxWaitMs) { @@ -66,7 +66,7 @@ const { expect } = test; async function ensureHomePageLoaded(page: Page) { return await expect(page.locator("h4")).toHaveText( - "Coercion-Resistant Impartial Selection Protocol" + "Coercion-Resistant Impartial Selection Protocol", ); } @@ -93,7 +93,7 @@ test("CRISP smoke test", async ({ context, metamaskPage, basicSetup.walletPassword, - extensionId + extensionId, ); log("runCliInit()..."); @@ -127,7 +127,7 @@ test("CRISP smoke test", async ({ await page.locator('button:has-text("Cast Vote")').click(); log(`confirming MetaMask signature request...`); await metamask.confirmSignature(); - const WAIT = 300_000; + const WAIT = 310_000; log(`waiting for ${WAIT}ms...`); await page.waitForTimeout(WAIT); log(`clicking historic polls button...`); @@ -136,11 +136,11 @@ test("CRISP smoke test", async ({ await expect(page.locator("h1")).toHaveText("Historic polls"); log(`asserting that result has 100% on the vote we clicked on...`); await expect( - page.locator("[data-test-id='poll-0-0'] [data-test-id='poll-result-0'] h3") + page.locator("[data-test-id='poll-0-0'] [data-test-id='poll-result-0'] h3"), ).toHaveText("100%"); log(`asserting that result has 0% on the vote we did not click on...`); await expect( - page.locator("[data-test-id='poll-0-0'] [data-test-id='poll-result-1'] h3") + page.locator("[data-test-id='poll-0-0'] [data-test-id='poll-result-1'] h3"), ).toHaveText("0%"); log("============================================"); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1578f1f6c1..173b71f546 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -144,7 +144,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@8.18.3(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@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)) ethers: specifier: ^6.12.0 version: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -177,7 +177,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@8.18.3(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@4.1.12))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12) devDependencies: '@tailwindcss/typography': specifier: ^0.5.12 @@ -562,7 +562,7 @@ importers: version: 2.38.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.1.12) 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@4.1.12))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12) devDependencies: '@enclave-e3/config': specifier: workspace:* @@ -679,7 +679,7 @@ importers: version: 5.3.0 '@risc0/ethereum': specifier: file:lib/risc0-ethereum - version: file:templates/default/lib/risc0-ethereum + version: risc0-ethereum@file:templates/default/lib/risc0-ethereum '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -2973,9 +2973,6 @@ packages: '@reown/appkit@1.7.8': resolution: {integrity: sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==} - '@risc0/ethereum@file:templates/default/lib/risc0-ethereum': - resolution: {directory: templates/default/lib/risc0-ethereum, type: directory} - '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} @@ -8500,6 +8497,9 @@ packages: resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} engines: {node: '>= 0.8'} + risc0-ethereum@file:templates/default/lib/risc0-ethereum: + resolution: {directory: templates/default/lib/risc0-ethereum, type: directory} + robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} @@ -12851,8 +12851,6 @@ snapshots: - utf-8-validate - zod - '@risc0/ethereum@file:templates/default/lib/risc0-ethereum': {} - '@rolldown/pluginutils@1.0.0-beta.27': {} '@rollup/plugin-inject@5.0.5(rollup@4.52.5)': @@ -15822,6 +15820,26 @@ 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)): + 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)) + framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + qrcode: 1.5.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-state: 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + resize-observer-polyfill: 1.5.1 + styled-components: 5.3.11(@babel/core@7.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) + transitivePeerDependencies: + - '@babel/core' + - react-is + 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@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.12)): dependencies: '@tanstack/react-query': 5.90.6(react@18.3.1) @@ -16989,6 +17007,13 @@ 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)): + 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) + 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: react: 18.3.1 @@ -20346,6 +20371,8 @@ snapshots: hash-base: 3.1.2 inherits: 2.0.4 + risc0-ethereum@file:templates/default/lib/risc0-ethereum: {} + robust-predicates@3.0.2: {} rollup@4.52.5: diff --git a/templates/default/program/src/lib.rs b/templates/default/program/src/lib.rs index 27f1c29595..0bdd444763 100644 --- a/templates/default/program/src/lib.rs +++ b/templates/default/program/src/lib.rs @@ -27,7 +27,7 @@ mod tests { use super::*; use anyhow::Result; use e3_bfv_helpers::BfvParamSet; - use e3_bfv_helpers::{BfvParams, build_bfv_params_arc, encode_bfv_params}; + use e3_bfv_helpers::{BfvParamSets, build_bfv_params_arc, encode_bfv_params}; use fhe::bfv::{Encoding, Plaintext, PublicKey, SecretKey}; use fhe_traits::FheEncoder; use fhe_traits::FheEncrypter; @@ -38,7 +38,7 @@ mod tests { fn test() -> Result<()> { let mut rng = thread_rng(); - let params_set: BfvParamSet = BfvParams::InsecureSet2048_1032193_1.into(); + let params_set: BfvParamSet = BfvParamSets::InsecureSet2048_1032193_1.into(); let params = build_bfv_params_arc( params_set.degree, params_set.plaintext_modulus,