From 671faa54475a28dd6aa31c86d21aa5b9c64355e3 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Thu, 8 May 2025 17:33:29 -0300 Subject: [PATCH 01/22] feat: agg-mode example contract --- examples/L2/contracts/README.md | 66 +++++++++++++++++++ examples/L2/contracts/foundry.toml | 6 ++ .../script/StateTransitionDeployer.sol | 21 ++++++ examples/L2/contracts/src/StateTransition.sol | 31 +++++++++ 4 files changed, 124 insertions(+) create mode 100644 examples/L2/contracts/README.md create mode 100644 examples/L2/contracts/foundry.toml create mode 100644 examples/L2/contracts/script/StateTransitionDeployer.sol create mode 100644 examples/L2/contracts/src/StateTransition.sol diff --git a/examples/L2/contracts/README.md b/examples/L2/contracts/README.md new file mode 100644 index 0000000000..9265b45584 --- /dev/null +++ b/examples/L2/contracts/README.md @@ -0,0 +1,66 @@ +## Foundry + +**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** + +Foundry consists of: + +- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). +- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. +- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. +- **Chisel**: Fast, utilitarian, and verbose solidity REPL. + +## Documentation + +https://book.getfoundry.sh/ + +## Usage + +### Build + +```shell +$ forge build +``` + +### Test + +```shell +$ forge test +``` + +### Format + +```shell +$ forge fmt +``` + +### Gas Snapshots + +```shell +$ forge snapshot +``` + +### Anvil + +```shell +$ anvil +``` + +### Deploy + +```shell +$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key +``` + +### Cast + +```shell +$ cast +``` + +### Help + +```shell +$ forge --help +$ anvil --help +$ cast --help +``` diff --git a/examples/L2/contracts/foundry.toml b/examples/L2/contracts/foundry.toml new file mode 100644 index 0000000000..25b918f9c9 --- /dev/null +++ b/examples/L2/contracts/foundry.toml @@ -0,0 +1,6 @@ +[profile.default] +src = "src" +out = "out" +libs = ["lib"] + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/examples/L2/contracts/script/StateTransitionDeployer.sol b/examples/L2/contracts/script/StateTransitionDeployer.sol new file mode 100644 index 0000000000..e4c0194681 --- /dev/null +++ b/examples/L2/contracts/script/StateTransitionDeployer.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Script, console} from "forge-std/Script.sol"; +import {StateTransition} from "../src/StateTransition.sol"; + +contract StateTransitionDeployer is Script { + StateTransition public stateTransitionContract; + + function setUp() public {} + + function run(address _alignedProofAggregationService) public returns (address) { + vm.startBroadcast(); + + stateTransitionContract = new StateTransition(_alignedProofAggregationService); + + vm.stopBroadcast(); + + return address(stateTransitionContract); + } +} diff --git a/examples/L2/contracts/src/StateTransition.sol b/examples/L2/contracts/src/StateTransition.sol new file mode 100644 index 0000000000..975c49e4d0 --- /dev/null +++ b/examples/L2/contracts/src/StateTransition.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +contract StateTransition { + event StateUpdated(bytes32) + + bytes32 public PROGRAM_ID = 0x00; + bytes32 public stateRoot; + address public alignedProofAggregator; + + constructor(address _alignedProofAggregator) { + alignedProofAggregator = _alignedProofAggregator; + } + + function updateState(bytes publicInputs, bytes32[] merkleProof) public { + bytes memory callData = abi.encodeWithSignature( + "verifyProofInclusion(bytes32[],bytes32,bytes)", merkleProof, programId, publicInputs + ); + (bool callResult, bytes memory response) = alignedProofAggregator.staticcall(callData); + require(callWasSuccessful, "static_call failed"); + + bool proofVerified = abi.decode(response, (bool)); + require(proofVerified, "proof not verified in aligned"); + + (prevStateRoot, newStateRoot) = abi.decode(publicInputs, (bytes32, UserStateUpdate[])); + require(prevStateRoot == stateRoot); + stateRoot = newStateRoot; + + emit StateUpdated(stateRoot); + } +} From 2e6cb0ebdf78d23b8a82c6aa18213010c1378de4 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Thu, 8 May 2025 17:34:02 -0300 Subject: [PATCH 02/22] feat: initial code --- examples/L2/src/lib.rs | 0 examples/L2/src/main.rs | 160 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 examples/L2/src/lib.rs create mode 100644 examples/L2/src/main.rs diff --git a/examples/L2/src/lib.rs b/examples/L2/src/lib.rs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/L2/src/main.rs b/examples/L2/src/main.rs new file mode 100644 index 0000000000..74729ae837 --- /dev/null +++ b/examples/L2/src/main.rs @@ -0,0 +1,160 @@ +use std::{ + collections::HashMap, + fs::File, + io::{BufReader, BufWriter}, +}; + +use lambdaworks_crypto::merkle_tree::{merkle::MerkleTree, traits::IsMerkleTreeBackend}; +use primitive_types::{H160, U256}; +use rand::Rng; +use serde::{Deserialize, Serialize}; +use sha3::{Digest, Keccak256}; + +#[derive(Clone, Default, Serialize, Deserialize)] +pub struct UserState { + pub address: H160, + pub balance: U256, + pub nonce: U256, +} + +impl IsMerkleTreeBackend for UserState { + type Node = [u8; 32]; + type Data = UserState; + + fn hash_data(leaf: &Self::Data) -> Self::Node { + let mut hasher = Keccak256::new(); + + let mut balance_bytes: [u8; 32] = [0u8; 32]; + let mut nonce_bytes: [u8; 32] = [0u8; 32]; + leaf.balance.to_little_endian(&mut balance_bytes); + leaf.nonce.to_little_endian(&mut nonce_bytes); + + hasher.update(leaf.address); + hasher.update(&balance_bytes); + hasher.update(&nonce_bytes); + hasher.finalize().into() + } + + fn hash_new_parent(child_1: &Self::Node, child_2: &Self::Node) -> Self::Node { + let mut hasher = Keccak256::new(); + hasher.update(child_1); + hasher.update(child_2); + hasher.finalize().into() + } +} + +struct DB { + pub user_states: HashMap, + pub root: [u8; 32], + pub file_path: String, +} + +#[derive(Debug)] +pub enum DBError { + IO(String), +} + +impl DB { + pub fn new(file_path: String) -> Result { + let file = File::open(&file_path).map_err(|e| DBError::IO(e.to_string()))?; + let reader = BufReader::new(file); + let user_states: Vec = + serde_json::from_reader(reader).map_err(|e| DBError::IO(e.to_string()))?; + let root = MerkleTree::::build(&user_states).unwrap().root; + + let mut user_states_map: HashMap = HashMap::new(); + for state in user_states { + user_states_map.insert(state.address, state); + } + + let db = Self { + user_states: user_states_map, + root, + file_path, + }; + + Ok(db) + } + + pub fn save(&self) -> Result<(), DBError> { + let file = File::create(&self.file_path).map_err(|e| DBError::IO(e.to_string()))?; + let writer = BufWriter::new(file); + let values: Vec = self.user_states.clone().into_values().collect(); + serde_json::to_writer(writer, &values).map_err(|e| DBError::IO(e.to_string()))?; + + Ok(()) + } + + pub fn commitment(&self) -> [u8; 32] { + let values: Vec = self.user_states.clone().into_values().collect(); + let root = MerkleTree::::build(&values).unwrap().root; + root + } + + fn initial_state() -> Vec { + vec![] + } + + pub fn upsert(&mut self, address: H160, newState: UserState) { + self.user_states.insert(address, newState); + } +} + +struct Transfer { + pub from: H160, + pub to: H160, + pub amount: U256, +} + +fn generate_random_transfers(db: &DB, num_to_generate: usize) -> Vec { + let mut transfers = vec![]; + let mut rng = rand::thread_rng(); + + for _ in 0..num_to_generate { + let accounts: Vec<&UserState> = db.user_states.values().collect(); + + let sender = accounts + .get(rng.gen_range(0..db.user_states.len())) + .cloned() + .unwrap(); + + let receiver = accounts + .get(rng.gen_range(0..db.user_states.len())) + .cloned() + .unwrap(); + + let transfer = Transfer { + amount: sender.balance / 2, + from: sender.address, + to: receiver.address, + }; + + transfers.push(transfer); + } + + transfers +} + +fn prove_state_transition(db: &mut DB, transfers: Vec) {} + +fn main() { + // 0. Load merkle tree file, if not created, create initial state + let mut db = DB::new("./db".to_string()).expect("create db"); + + // 1. Create random transfers + let account_updates = generate_random_transfers(&db, 10); + + // 2. Call zkvm and pass (MerkleTree, Updates to perform) + let proof = prove_state_transition(&mut db, account_updates); + + // Fow now, in order for a proof to be aggregated, we first need to submit it via the fast mode or verification layer + // Let's suppose that our L2 would run the prover once every 24hs and submit it on aligned + // Once aligned aggregates the proof we will be notified and we'll send the new state commitment on chain + + // 4. Send the proof to aligned and wait for verification + // let response = send_proof_to_be_verified_on_aligned(proof); + // 5. Wait until proof is aggregated + // ... + // 6. Send updateState transaction to Ethereum + // let receipt = update_state_on_chain(); +} From 1e65322c3441b7a875261aea8c9ff3369d1ca1e7 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Thu, 8 May 2025 17:34:20 -0300 Subject: [PATCH 03/22] feat: risc0, sp1 zkvm programs --- examples/L2/zkvm_programs/Cargo.lock | 1535 +++++++++++++++++++ examples/L2/zkvm_programs/Cargo.toml | 6 + examples/L2/zkvm_programs/risc0/Cargo.toml | 13 + examples/L2/zkvm_programs/risc0/src/lib.rs | 0 examples/L2/zkvm_programs/risc0/src/main.rs | 24 + examples/L2/zkvm_programs/sp1/Cargo.toml | 13 + examples/L2/zkvm_programs/sp1/src/lib.rs | 0 examples/L2/zkvm_programs/sp1/src/main.rs | 24 + 8 files changed, 1615 insertions(+) create mode 100644 examples/L2/zkvm_programs/Cargo.lock create mode 100644 examples/L2/zkvm_programs/Cargo.toml create mode 100644 examples/L2/zkvm_programs/risc0/Cargo.toml create mode 100644 examples/L2/zkvm_programs/risc0/src/lib.rs create mode 100644 examples/L2/zkvm_programs/risc0/src/main.rs create mode 100644 examples/L2/zkvm_programs/sp1/Cargo.toml create mode 100644 examples/L2/zkvm_programs/sp1/src/lib.rs create mode 100644 examples/L2/zkvm_programs/sp1/src/main.rs diff --git a/examples/L2/zkvm_programs/Cargo.lock b/examples/L2/zkvm_programs/Cargo.lock new file mode 100644 index 0000000000..7186e1c3f3 --- /dev/null +++ b/examples/L2/zkvm_programs/Cargo.lock @@ -0,0 +1,1535 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy 0.7.35", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-r1cs-std", + "ark-std", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" +dependencies = [ + "ahash", + "ark-crypto-primitives-macros", + "ark-ec", + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-snark", + "ark-std", + "blake2", + "derivative", + "digest", + "fnv", + "merlin", + "sha2", +] + +[[package]] +name = "ark-crypto-primitives-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "educe", + "fnv", + "hashbrown", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "arrayvec", + "digest", + "educe", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-groth16" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff", + "ark-serialize", + "ark-std", + "educe", + "fnv", + "hashbrown", +] + +[[package]] +name = "ark-r1cs-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-relations", + "ark-std", + "educe", + "num-bigint", + "num-integer", + "num-traits", + "tracing", +] + +[[package]] +name = "ark-relations" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" +dependencies = [ + "ark-ff", + "ark-std", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "arrayvec", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-snark" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" +dependencies = [ + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "borsh" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "bytemuck" +version = "1.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cc" +version = "1.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "gcd" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +dependencies = [ + "allocator-api2", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "include_bytes_aligned" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core", + "zeroize", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.9.0", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "no_std_strings" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b0c77c1b780822bc749a33e39aeb2c07584ab93332303babeabb645298a76e" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "p3-baby-bear" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ecc3edc6fb8186268e05031c26a8b2b1e567957d63adcae1026d55d6bb189b" +dependencies = [ + "num-bigint", + "p3-field", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "rand", + "serde", +] + +[[package]] +name = "p3-dft" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eece7b035978976138622b116fefe6c4cc372b1ce70739c40e7a351a9bb68f1f" +dependencies = [ + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-field" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f0edf3fde4fd0d1455e901fc871c558010ae18db6e68f1b0fa111391855316" +dependencies = [ + "itertools 0.12.1", + "num-bigint", + "num-traits", + "p3-util", + "rand", + "serde", +] + +[[package]] +name = "p3-matrix" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60961b4d7ffd2e8412ce4e66e213de610356df71cc4e396519c856a664138a27" +dependencies = [ + "itertools 0.12.1", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand", + "serde", + "tracing", +] + +[[package]] +name = "p3-maybe-rayon" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bbe762738c382c9483410f52348ab9de41bb42c391e8171643a71486cf1ef8f" + +[[package]] +name = "p3-mds" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4127956cc6c783b7d021c5c42d5d89456d5f3bda4a7b165fcc2a3fd4e78fbede" +dependencies = [ + "itertools 0.12.1", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-symmetric", + "p3-util", + "rand", +] + +[[package]] +name = "p3-poseidon2" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be09497da406a98e89dc05c1ce539eeef29541bad61a5b2108a44ffe94dd0b4c" +dependencies = [ + "gcd", + "p3-field", + "p3-mds", + "p3-symmetric", + "rand", + "serde", +] + +[[package]] +name = "p3-symmetric" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7d954033f657d48490344ca4b3dbcc054962a0e92831b736666bb2f5e5820b" +dependencies = [ + "itertools 0.12.1", + "p3-field", + "serde", +] + +[[package]] +name = "p3-util" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6ce0b6bee23fd54e05306f6752ae80b0b71a91166553ab39d7899801497237" +dependencies = [ + "serde", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "postcard" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.25", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "risc0-binfmt" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "borsh", + "derive_more", + "elf", + "lazy_static", + "postcard", + "risc0-zkp", + "risc0-zkvm-platform", + "semver", + "serde", + "tracing", +] + +[[package]] +name = "risc0-circuit-keccak" +version = "1.4.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "bytemuck", + "paste", + "risc0-binfmt", + "risc0-circuit-recursion", + "risc0-core", + "risc0-zkp", + "tracing", +] + +[[package]] +name = "risc0-circuit-recursion" +version = "1.4.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "metal", + "risc0-core", + "risc0-zkp", + "tracing", +] + +[[package]] +name = "risc0-circuit-rv32im" +version = "2.0.1" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "bit-vec", + "bytemuck", + "derive_more", + "paste", + "risc0-binfmt", + "risc0-core", + "risc0-zkp", + "serde", + "tracing", +] + +[[package]] +name = "risc0-core" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "rand_core", +] + +[[package]] +name = "risc0-groth16" +version = "1.4.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ec", + "ark-groth16", + "ark-serialize", + "bytemuck", + "hex", + "num-bigint", + "num-traits", + "risc0-binfmt", + "risc0-zkp", + "serde", + "stability", +] + +[[package]] +name = "risc0-zkos-v1compat" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "include_bytes_aligned", + "no_std_strings", +] + +[[package]] +name = "risc0-zkp" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "blake2", + "borsh", + "bytemuck", + "cfg-if", + "digest", + "hex", + "hex-literal", + "metal", + "paste", + "rand_core", + "risc0-core", + "risc0-zkvm-platform", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkvm" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "borsh", + "bytemuck", + "derive_more", + "getrandom", + "hex", + "risc0-binfmt", + "risc0-circuit-keccak", + "risc0-circuit-recursion", + "risc0-circuit-rv32im", + "risc0-core", + "risc0-groth16", + "risc0-zkos-v1compat", + "risc0-zkp", + "risc0-zkvm-platform", + "rrs-lib", + "semver", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkvm-platform" +version = "2.0.1" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "bytemuck", + "cfg-if", + "getrandom", + "libm", + "stability", +] + +[[package]] +name = "risc0_state_transition_program" +version = "0.1.0" +dependencies = [ + "risc0-zkvm", + "serde", + "serde_json", +] + +[[package]] +name = "rrs-lib" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" +dependencies = [ + "downcast-rs", + "paste", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "sp1-lib" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3ef88f90458b6116da164e9c4c4596c49c8cca1944bfe02850b48b232a06b90" +dependencies = [ + "bincode", + "serde", + "sp1-primitives", +] + +[[package]] +name = "sp1-primitives" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc282347d405f23fc8a7cfe93c82e772920bf2e0722cf828eaea69ed530e49" +dependencies = [ + "bincode", + "blake3", + "cfg-if", + "hex", + "lazy_static", + "num-bigint", + "p3-baby-bear", + "p3-field", + "p3-poseidon2", + "p3-symmetric", + "serde", + "sha2", +] + +[[package]] +name = "sp1-zkvm" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d56dda97ba9915e7484a607e7517783d7422591c815e8dbfdbb716d77198760" +dependencies = [ + "cfg-if", + "getrandom", + "lazy_static", + "libm", + "p3-baby-bear", + "p3-field", + "rand", + "sha2", + "sp1-lib", + "sp1-primitives", +] + +[[package]] +name = "sp1_state_transition_program" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "sp1-zkvm", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "stability" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" +dependencies = [ + "quote", + "syn 2.0.101", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "toml_datetime" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" + +[[package]] +name = "toml_edit" +version = "0.22.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "tracing-core", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winnow" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +dependencies = [ + "memchr", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive 0.8.25", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] diff --git a/examples/L2/zkvm_programs/Cargo.toml b/examples/L2/zkvm_programs/Cargo.toml new file mode 100644 index 0000000000..3c9384a180 --- /dev/null +++ b/examples/L2/zkvm_programs/Cargo.toml @@ -0,0 +1,6 @@ +[workspace] +name = "zkvm_state_transition_programs" +version = "0.1.0" +edition = "2021" +resolver = "2" +members = ["sp1", "risc0"] diff --git a/examples/L2/zkvm_programs/risc0/Cargo.toml b/examples/L2/zkvm_programs/risc0/Cargo.toml new file mode 100644 index 0000000000..60c21a3992 --- /dev/null +++ b/examples/L2/zkvm_programs/risc0/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "risc0_state_transition_program" +version = "0.1.0" +edition = "2021" +resolver = "2" + +[dependencies] +serde = { version = "1.0.203" } +serde_json = "1.0.117" +risc0-zkvm = { git = "https://github.com/risc0/risc0", tag="v2.0.0", default-features = false, features = ["unstable", "std"] } + +[lib] +path = "./src/lib.rs" diff --git a/examples/L2/zkvm_programs/risc0/src/lib.rs b/examples/L2/zkvm_programs/risc0/src/lib.rs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/L2/zkvm_programs/risc0/src/main.rs b/examples/L2/zkvm_programs/risc0/src/main.rs new file mode 100644 index 0000000000..7797adab78 --- /dev/null +++ b/examples/L2/zkvm_programs/risc0/src/main.rs @@ -0,0 +1,24 @@ +#![no_main] + +use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; +use risc0_aggregation_program::{Input, Risc0ImageIdAndPubInputs}; +use risc0_zkvm::guest::env; + +risc0_zkvm::guest::entry!(main); + +fn main() { + let input = env::read::(); + + for Risc0ImageIdAndPubInputs { + image_id, + public_inputs, + } in &input.proofs_image_id_and_pub_inputs + { + env::verify(image_id.clone(), &public_inputs).expect("proof to be verified correctly"); + } + + let merkle_tree: MerkleTree = + MerkleTree::build(&input.proofs_image_id_and_pub_inputs).unwrap(); + + env::commit_slice(&merkle_tree.root); +} diff --git a/examples/L2/zkvm_programs/sp1/Cargo.toml b/examples/L2/zkvm_programs/sp1/Cargo.toml new file mode 100644 index 0000000000..ea30a2f2c0 --- /dev/null +++ b/examples/L2/zkvm_programs/sp1/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "sp1_state_transition_program" +version = "0.1.0" +edition = "2021" +resolver = "2" + +[dependencies] +sp1-zkvm = { version = "4.1.3", features = ["verify"] } +serde = { version = "1.0.203", features = ["derive"] } +serde_json = "1.0.117" + +[lib] +path = "./src/lib.rs" diff --git a/examples/L2/zkvm_programs/sp1/src/lib.rs b/examples/L2/zkvm_programs/sp1/src/lib.rs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/L2/zkvm_programs/sp1/src/main.rs b/examples/L2/zkvm_programs/sp1/src/main.rs new file mode 100644 index 0000000000..9b66ce2e1c --- /dev/null +++ b/examples/L2/zkvm_programs/sp1/src/main.rs @@ -0,0 +1,24 @@ +#![no_main] +sp1_zkvm::entrypoint!(main); + +use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; +use sha2::{Digest, Sha256}; +use sha3::Keccak256; +use sp1_aggregation_program::{Input, SP1VkAndPubInputs}; + +pub fn main() { + let input = sp1_zkvm::io::read::(); + + // Verify the proofs. + for proof in input.proofs_vk_and_pub_inputs.iter() { + let vkey = proof.vk; + let public_values = &proof.public_inputs; + let public_values_digest = Sha256::digest(public_values); + sp1_zkvm::lib::verify::verify_sp1_proof(&vkey, &public_values_digest.into()); + } + + let merkle_tree: MerkleTree = + MerkleTree::build(&input.proofs_vk_and_pub_inputs).unwrap(); + + sp1_zkvm::io::commit_slice(&merkle_tree.root); +} From a816bec8fc0438845bd88fbee17d90a2983fa407 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Thu, 8 May 2025 17:34:35 -0300 Subject: [PATCH 04/22] chore: project boilerplate --- examples/L2/Cargo.lock | 7371 ++++++++++++++++++++++++++++++++++++++++ examples/L2/Cargo.toml | 28 + examples/L2/Makefile | 9 + examples/L2/README.md | 3 + examples/L2/build.rs | 10 + 5 files changed, 7421 insertions(+) create mode 100644 examples/L2/Cargo.lock create mode 100644 examples/L2/Cargo.toml create mode 100644 examples/L2/Makefile create mode 100644 examples/L2/README.md create mode 100644 examples/L2/build.rs diff --git a/examples/L2/Cargo.lock b/examples/L2/Cargo.lock new file mode 100644 index 0000000000..640e78899a --- /dev/null +++ b/examples/L2/Cargo.lock @@ -0,0 +1,7371 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addchain" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" +dependencies = [ + "num-bigint 0.3.3", + "num-integer", + "num-traits", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy 0.7.35", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy-consensus" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2179ba839ac532f50279f5da2a6c5047f791f03f6f808b4dfab11327b97902f" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "auto_impl", + "c-kzg", + "derive_more 2.0.1", + "either", + "k256", + "once_cell", + "rand 0.8.5", + "serde", + "serde_with", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-consensus-any" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aec6f67bdc62aa277e0ec13c1b1fb396c8a62b65c8e9bd8c1d3583cc6d1a8dd3" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-eip2124" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "crc", + "serde", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-eip2930" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b82752a889170df67bbb36d42ca63c531eb16274f0d7299ae2a680facba17bd" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804cefe429015b4244966c006d25bda5545fa9db5990e9c9079faf255052f50a" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-eips" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "609515c1955b33af3d78d26357540f68c5551a90ef58fd53def04f2aa074ec43" +dependencies = [ + "alloy-eip2124", + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "auto_impl", + "c-kzg", + "derive_more 2.0.1", + "either", + "serde", + "sha2", +] + +[[package]] +name = "alloy-json-abi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0068ae277f5ee3153a95eaea8ff10e188ed8ccde9b7f9926305415a2c0ab2442" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3994ab6ff6bdeb5aebe65381a8f6a47534789817570111555e8ac413e242ce06" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0be3aa020a6d3aa7601185b4c1a7d6f3a5228cb5424352db63064b29a455c891" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "derive_more 2.0.1", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498f2ee2eef38a6db0fc810c7bf7daebdf5f2fa8d04adb8bd53e54e91ddbdea3" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a12fe11d0b8118e551c29e1a67ccb6d01cc07ef08086df30f07487146de6fa1" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 2.0.1", + "foldhash", + "hashbrown 0.15.3", + "indexmap 2.9.0", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.9.1", + "ruint", + "rustc-hash 2.1.1", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1a40595b927dfb07218459037837dbc8de8500a26024bb6ff0548dd2ccc13e0" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2a9f64e0f69cfb6029e2a044519a1bdd44ce9fc334d5315a7b9837f7a6748e5" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.14.0", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-serde" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4dba6ff08916bc0a9cbba121ce21f67c0b554c39cf174bc7b9df6c651bd3c3b" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c580da7f00f3999e44e327223044d6732358627f93043e22d92c583f6583556" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "either", + "elliptic-curve", + "k256", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-signer-local" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00f0f07862bd8f6bc66c953660693c5903062c2c9d308485b2a6eee411089e7" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand 0.8.5", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-sol-macro" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d3ef8e0d622453d969ba3cded54cf6800efdc85cb929fe22c5bdf8335666757" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0e84bd0693c69a8fbe3ec0008465e029c6293494df7cb07580bf4a33eff52e1" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap 2.9.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.101", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3de663412dadf9b64f4f92f507f78deebcc92339d12cf15f88ded65d41c7935" +dependencies = [ + "const-hex", + "dunce", + "heck 0.5.0", + "macro-string", + "proc-macro2", + "quote", + "syn 2.0.101", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "251273c5aa1abb590852f795c938730fa641832fc8fa77b5478ed1bf11b6097e" +dependencies = [ + "serde", + "winnow 0.7.10", +] + +[[package]] +name = "alloy-sol-types" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5460a975434ae594fe2b91586253c1beb404353b78f0a55bf124abcd79557b15" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-trie" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "983d99aa81f586cef9dae38443245e585840fcf0fc58b09aee0b1f27aed1d500" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more 2.0.1", + "nybbles", + "serde", + "smallvec", + "tracing", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-r1cs-std", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" +dependencies = [ + "ahash", + "ark-crypto-primitives-macros", + "ark-ec", + "ark-ff 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-snark", + "ark-std 0.5.0", + "blake2", + "derivative", + "digest 0.10.7", + "fnv", + "merlin", + "sha2", +] + +[[package]] +name = "ark-crypto-primitives-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.3", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-groth16" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff 0.5.0", + "ark-poly", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.3", +] + +[[package]] +name = "ark-r1cs-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-relations", + "ark-std 0.5.0", + "educe", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "tracing", +] + +[[package]] +name = "ark-relations" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" +dependencies = [ + "ark-ff 0.5.0", + "ark-std 0.5.0", + "tracing", + "tracing-subscriber 0.2.25", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-snark" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" +dependencies = [ + "ark-ff 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower 0.5.2", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "futures-core", + "getrandom 0.2.16", + "instant", + "pin-project-lite", + "rand 0.8.5", + "tokio", +] + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "serde", + "windows-targets 0.52.6", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bindgen" +version = "0.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +dependencies = [ + "bitflags 2.9.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.101", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "bls12_381" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3c196a77437e7cc2fb515ce413a6401291578b5afc8ecb29a3c7ab957f05941" +dependencies = [ + "ff 0.12.1", + "group 0.12.1", + "pairing", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "blst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "bonsai-sdk" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bce8d6acc5286a16e94c29e9c885d1869358885e08a6feeb6bc54e36fe20055" +dependencies = [ + "duplicate", + "maybe-async", + "reqwest", + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "borsh" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +dependencies = [ + "once_cell", + "proc-macro-crate 3.3.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "bytemuck" +version = "1.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] + +[[package]] +name = "c-kzg" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7318cfa722931cb5fe0838b98d3ce5621e75f6a6408abc21721d80de9223f2e4" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.26", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.26", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "cbindgen" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fce8dd7fcfcbf3a0a87d8f515194b49d6135acab73e18bd380d1d93bb1a15eb" +dependencies = [ + "clap", + "heck 0.4.1", + "indexmap 2.9.0", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.101", + "tempfile", + "toml", +] + +[[package]] +name = "cc" +version = "1.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" +dependencies = [ + "shlex", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", +] + +[[package]] +name = "const-hex" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array 0.14.7", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array 0.14.7", + "typenum", +] + +[[package]] +name = "ctrlc" +version = "3.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "697b5419f348fd5ae2478e8018cb016c00a5881c7f46c717de98ffd135a5651c" +dependencies = [ + "nix", + "windows-sys 0.59.0", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.101", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "dashu" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b3e5ac1e23ff1995ef05b912e2b012a8784506987a2651552db2c73fb3d7e0" +dependencies = [ + "dashu-base", + "dashu-float", + "dashu-int", + "dashu-macros", + "dashu-ratio", + "rustversion", +] + +[[package]] +name = "dashu-base" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b80bf6b85aa68c58ffea2ddb040109943049ce3fbdf4385d0380aef08ef289" + +[[package]] +name = "dashu-float" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85078445a8dbd2e1bd21f04a816f352db8d333643f0c9b78ca7c3d1df71063e7" +dependencies = [ + "dashu-base", + "dashu-int", + "num-modular", + "num-order", + "rustversion", + "static_assertions", +] + +[[package]] +name = "dashu-int" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee99d08031ca34a4d044efbbb21dff9b8c54bb9d8c82a189187c0651ffdb9fbf" +dependencies = [ + "cfg-if", + "dashu-base", + "num-modular", + "num-order", + "rustversion", + "static_assertions", +] + +[[package]] +name = "dashu-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93381c3ef6366766f6e9ed9cf09e4ef9dec69499baf04f0c60e70d653cf0ab10" +dependencies = [ + "dashu-base", + "dashu-float", + "dashu-int", + "dashu-ratio", + "paste", + "proc-macro2", + "quote", + "rustversion", +] + +[[package]] +name = "dashu-ratio" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e33b04dd7ce1ccf8a02a69d3419e354f2bbfdf4eb911a0b7465487248764c9" +dependencies = [ + "dashu-base", + "dashu-float", + "dashu-int", + "num-modular", + "num-order", + "rustversion", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn 2.0.101", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "docker-generate" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf673e0848ef09fa4aeeba78e681cf651c0c7d35f76ee38cec8e55bc32fa111" + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "downloader" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ac1e888d6830712d565b2f3a974be3200be9296bc1b03db8251a4cbf18a4a34" +dependencies = [ + "digest 0.10.7", + "futures", + "rand 0.8.5", + "reqwest", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "duplicate" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de78e66ac9061e030587b2a2e75cc88f22304913c907b11307bca737141230cb" +dependencies = [ + "heck 0.4.1", + "proc-macro-error", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "serdect", + "signature", + "spki", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] + +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff 0.13.1", + "generic-array 0.14.7", + "group 0.13.0", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", + "serde", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "eventsource-stream" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab" +dependencies = [ + "futures-core", + "nom", + "pin-project-lite", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "bitvec", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "bitvec", + "byteorder", + "ff_derive", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "ff_derive" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f10d12652036b0e99197587c6ba87a8fc3031986499973c030d8b44fcc151b60" +dependencies = [ + "addchain", + "num-bigint 0.3.3", + "num-integer", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "gcd" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" + +[[package]] +name = "gen_ops" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "304de19db7028420975a296ab0fcbbc8e69438c4ed254a1e41e2a7f37d5f0e0a" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "generic-array" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96512db27971c2c3eece70a1e106fbe6c87760234e31e8f7e5634912fe52794a" +dependencies = [ + "serde", + "typenum", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "memuse", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.1", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.9.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "halo2" +version = "0.1.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a23c779b38253fe1538102da44ad5bd5378495a61d2c4ee18d64eaa61ae5995" +dependencies = [ + "halo2_proofs", +] + +[[package]] +name = "halo2_proofs" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e925780549adee8364c7f2b685c753f6f3df23bde520c67416e93bf615933760" +dependencies = [ + "blake2b_simd", + "ff 0.12.1", + "group 0.12.1", + "pasta_curves 0.4.1", + "rand_core 0.6.4", + "rayon", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", +] + +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 0.26.11", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "libc", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.61.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "include_bytes_aligned" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.3", + "serde", +] + +[[package]] +name = "indicatif" +version = "0.17.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width", + "web-time", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jubjub" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a575df5f985fe1cd5b2b05664ff6accfc46559032b954529fd225a2168d27b0f" +dependencies = [ + "bitvec", + "bls12_381", + "ff 0.12.1", + "group 0.12.1", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "serdect", + "sha2", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "lambdaworks-crypto" +version = "0.12.0" +source = "git+https://github.com/lambdaclass/lambdaworks.git?rev=5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b#5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b" +dependencies = [ + "lambdaworks-math", + "rand 0.8.5", + "rand_chacha 0.3.1", + "serde", + "sha2", + "sha3", +] + +[[package]] +name = "lambdaworks-math" +version = "0.12.0" +source = "git+https://github.com/lambdaclass/lambdaworks.git?rev=5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b#5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b" +dependencies = [ + "getrandom 0.2.16", + "rand 0.8.5", + "serde", + "serde_json", +] + +[[package]] +name = "lazy-regex" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60c7310b93682b36b98fa7ea4de998d3463ccbebd94d935d6b48ba5b6ffa7126" +dependencies = [ + "lazy-regex-proc_macros", + "once_cell", + "regex", +] + +[[package]] +name = "lazy-regex-proc_macros" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba01db5ef81e17eb10a5e0f2109d1b3a3e29bac3070fdbd7d156bf7dbd206a1" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.101", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.0", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.3", +] + +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "maybe-async" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memuse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d97bbf43eb4f088f8ca469930cde17fa036207c9a5e02ccc5107c4e8b17c964" + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.9.0", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.9.0", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "no_std_strings" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b0c77c1b780822bc749a33e39aeb2c07584ab93332303babeabb645298a76e" + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint 0.4.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-modular" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f" + +[[package]] +name = "num-order" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6" +dependencies = [ + "num-modular", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint 0.4.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "nybbles" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" +dependencies = [ + "alloy-rlp", + "const-hex", + "proptest", + "serde", + "smallvec", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p3-air" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3079235eaa131553ae7ff992317ebeb1d431d238896315672869570ef0c38d" +dependencies = [ + "p3-field", + "p3-matrix", +] + +[[package]] +name = "p3-baby-bear" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ecc3edc6fb8186268e05031c26a8b2b1e567957d63adcae1026d55d6bb189b" +dependencies = [ + "num-bigint 0.4.6", + "p3-field", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-bn254-fr" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e3df8d85259448803639657a4aafdf4caad9422f9be6264187f179fa0bc761" +dependencies = [ + "ff 0.13.1", + "num-bigint 0.4.6", + "p3-field", + "p3-poseidon2", + "p3-symmetric", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-challenger" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11466fe23e14dd6d61512c8ce5a068de87e3d92954058b05b24ae12b7824a960" +dependencies = [ + "p3-field", + "p3-maybe-rayon", + "p3-symmetric", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "p3-commit" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30877bdc426bfa5ebb0033dbc45ba1b083dfeb0db7ad7628c72a5be7562324ce" +dependencies = [ + "itertools 0.12.1", + "p3-challenger", + "p3-field", + "p3-matrix", + "p3-util", + "serde", +] + +[[package]] +name = "p3-dft" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eece7b035978976138622b116fefe6c4cc372b1ce70739c40e7a351a9bb68f1f" +dependencies = [ + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-field" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f0edf3fde4fd0d1455e901fc871c558010ae18db6e68f1b0fa111391855316" +dependencies = [ + "itertools 0.12.1", + "num-bigint 0.4.6", + "num-traits", + "p3-util", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-fri" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07df36a633712e2a73387674a7e1922f3e58bc28b4e55359b2d3749e146f8faa" +dependencies = [ + "itertools 0.12.1", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-interpolation", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "p3-interpolation" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a09b01809167d6e39e8a34779eb2d5fca50d0ff7b2d13661953b46dc74bf1619" +dependencies = [ + "p3-field", + "p3-matrix", + "p3-util", +] + +[[package]] +name = "p3-keccak-air" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f6bacf49ba7c1d9c436994ace80a96c3532462c655e4339919d5b397035e56" +dependencies = [ + "p3-air", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-matrix" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60961b4d7ffd2e8412ce4e66e213de610356df71cc4e396519c856a664138a27" +dependencies = [ + "itertools 0.12.1", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand 0.8.5", + "serde", + "tracing", +] + +[[package]] +name = "p3-maybe-rayon" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bbe762738c382c9483410f52348ab9de41bb42c391e8171643a71486cf1ef8f" +dependencies = [ + "rayon", +] + +[[package]] +name = "p3-mds" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4127956cc6c783b7d021c5c42d5d89456d5f3bda4a7b165fcc2a3fd4e78fbede" +dependencies = [ + "itertools 0.12.1", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-symmetric", + "p3-util", + "rand 0.8.5", +] + +[[package]] +name = "p3-merkle-tree" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f7eff1ddec74ee4178b40b2b4630f4bf5a02abf2d9619c8c4f8295e59d02a1" +dependencies = [ + "itertools 0.12.1", + "p3-commit", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-symmetric", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "p3-poseidon2" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be09497da406a98e89dc05c1ce539eeef29541bad61a5b2108a44ffe94dd0b4c" +dependencies = [ + "gcd", + "p3-field", + "p3-mds", + "p3-symmetric", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-symmetric" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7d954033f657d48490344ca4b3dbcc054962a0e92831b736666bb2f5e5820b" +dependencies = [ + "itertools 0.12.1", + "p3-field", + "serde", +] + +[[package]] +name = "p3-uni-stark" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064b3923492d182e768dff8a19a36d7742b0166dbff75455fdc99187d3115dd3" +dependencies = [ + "itertools 0.12.1", + "p3-air", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "p3-util" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6ce0b6bee23fd54e05306f6752ae80b0b71a91166553ab39d7899801497237" +dependencies = [ + "serde", +] + +[[package]] +name = "pairing" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" +dependencies = [ + "group 0.12.1", +] + +[[package]] +name = "parity-scale-codec" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" +dependencies = [ + "proc-macro-crate 3.3.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "pasta_curves" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc65faf8e7313b4b1fbaa9f7ca917a0eed499a9663be71477f87993604341d8" +dependencies = [ + "blake2b_simd", + "ff 0.12.1", + "group 0.12.1", + "lazy_static", + "rand 0.8.5", + "static_assertions", + "subtle", +] + +[[package]] +name = "pasta_curves" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" +dependencies = [ + "blake2b_simd", + "ff 0.13.1", + "group 0.13.0", + "lazy_static", + "rand 0.8.5", + "static_assertions", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +dependencies = [ + "memchr", + "thiserror 2.0.12", + "ucd-trie", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "portable-atomic" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[package]] +name = "postcard" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.25", +] + +[[package]] +name = "prettyplease" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +dependencies = [ + "proc-macro2", + "syn 2.0.101", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-serde", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit 0.22.26", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proof_aggregator" +version = "0.1.0" +dependencies = [ + "lambdaworks-crypto", + "primitive-types", + "rand 0.8.5", + "risc0-build", + "risc0-zkvm 2.0.2", + "risc0_state_transition_program", + "serde", + "serde_json", + "serde_yaml", + "sha3", + "sp1-build", + "sp1-sdk", + "sp1_state_transition_program", +] + +[[package]] +name = "proptest" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.9.0", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax 0.8.5", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quinn" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.1", + "rustls", + "socket2", + "thiserror 2.0.12", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcbafbbdbb0f638fe3f35f3c56739f77a8a1d070cb25603226c83339b391472b" +dependencies = [ + "bytes", + "getrandom 0.3.2", + "rand 0.9.1", + "ring", + "rustc-hash 2.1.1", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.12", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "serde", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", + "serde", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "range-set-blaze" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8421b5d459262eabbe49048d362897ff3e3830b44eac6cfe341d6acb2f0f13d2" +dependencies = [ + "gen_ops", + "itertools 0.12.1", + "num-integer", + "num-traits", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rayon-scan" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f87cc11a0140b4b0da0ffc889885760c61b13672d80a908920b2c0df078fa14" +dependencies = [ + "rayon", +] + +[[package]] +name = "redox_syscall" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower 0.5.2", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots 0.26.11", + "windows-registry", +] + +[[package]] +name = "reqwest-middleware" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" +dependencies = [ + "anyhow", + "async-trait", + "http", + "reqwest", + "serde", + "thiserror 1.0.69", + "tower-service", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "risc0-binfmt" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "borsh", + "derive_more 2.0.1", + "elf", + "lazy_static", + "postcard", + "risc0-zkp 2.0.0", + "risc0-zkvm-platform 2.0.1", + "semver 1.0.26", + "serde", + "tracing", +] + +[[package]] +name = "risc0-binfmt" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fe7599ac55ad77515608ec42a9727001559fe4f579c533cb7c973b54800c05" +dependencies = [ + "anyhow", + "borsh", + "derive_more 2.0.1", + "elf", + "lazy_static", + "postcard", + "risc0-zkp 2.0.1", + "risc0-zkvm-platform 2.0.2", + "semver 1.0.26", + "serde", + "tracing", +] + +[[package]] +name = "risc0-build" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31d104165340cba919a3dac26c4be7da04b20b941601a7ad50c04834c4d26de5" +dependencies = [ + "anyhow", + "cargo_metadata 0.19.2", + "derive_builder", + "dirs", + "docker-generate", + "hex", + "risc0-binfmt 2.0.1", + "risc0-zkos-v1compat 2.0.1", + "risc0-zkp 2.0.1", + "risc0-zkvm-platform 2.0.2", + "rzup", + "semver 1.0.26", + "serde", + "serde_json", + "stability", + "tempfile", +] + +[[package]] +name = "risc0-circuit-keccak" +version = "1.4.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "bytemuck", + "paste", + "risc0-binfmt 2.0.0", + "risc0-circuit-recursion 1.4.0", + "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", + "risc0-zkp 2.0.0", + "tracing", +] + +[[package]] +name = "risc0-circuit-keccak" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd8acfc84307ed1be64cf9fefc390963fc22b2865d027f03405977a0cfa9747" +dependencies = [ + "anyhow", + "bytemuck", + "paste", + "risc0-binfmt 2.0.1", + "risc0-circuit-recursion 2.0.1", + "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "risc0-zkp 2.0.1", + "tracing", +] + +[[package]] +name = "risc0-circuit-recursion" +version = "1.4.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "metal", + "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", + "risc0-zkp 2.0.0", + "tracing", +] + +[[package]] +name = "risc0-circuit-recursion" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd1514e94440e2da301f48d345e1937b315147f58c5dc4992feb045324651d" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "metal", + "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "risc0-zkp 2.0.1", + "tracing", +] + +[[package]] +name = "risc0-circuit-rv32im" +version = "2.0.1" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "bit-vec", + "bytemuck", + "derive_more 2.0.1", + "paste", + "risc0-binfmt 2.0.0", + "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", + "risc0-zkp 2.0.0", + "serde", + "tracing", +] + +[[package]] +name = "risc0-circuit-rv32im" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f6ed144d8b8f93c4a6096e3dd90f9dcbd91eff83eae690a72fd6e640760b94" +dependencies = [ + "anyhow", + "bit-vec", + "bytemuck", + "derive_more 2.0.1", + "paste", + "risc0-binfmt 2.0.1", + "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "risc0-zkp 2.0.1", + "serde", + "tracing", +] + +[[package]] +name = "risc0-core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317bbf70a8750b64d4fd7a2bdc9d7d5f30d8bb305cae486962c797ef35c8d08e" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "rand_core 0.6.4", +] + +[[package]] +name = "risc0-core" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "rand_core 0.6.4", +] + +[[package]] +name = "risc0-groth16" +version = "1.4.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ec", + "ark-groth16", + "ark-serialize 0.5.0", + "bytemuck", + "hex", + "num-bigint 0.4.6", + "num-traits", + "risc0-binfmt 2.0.0", + "risc0-zkp 2.0.0", + "serde", + "stability", +] + +[[package]] +name = "risc0-groth16" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b31cb7b2a46f0cdaf71803ea7e0389af9f5bc1aea2531106f2972b241f26e98" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ec", + "ark-groth16", + "ark-serialize 0.5.0", + "bytemuck", + "hex", + "num-bigint 0.4.6", + "num-traits", + "risc0-binfmt 2.0.1", + "risc0-zkp 2.0.1", + "serde", + "stability", +] + +[[package]] +name = "risc0-zkos-v1compat" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "include_bytes_aligned", + "no_std_strings", +] + +[[package]] +name = "risc0-zkos-v1compat" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f76c479b69d1987cb54ac72dcc017197296fdcd6daf78fafc10cbbd3a167a7de" +dependencies = [ + "include_bytes_aligned", + "no_std_strings", +] + +[[package]] +name = "risc0-zkp" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "blake2", + "borsh", + "bytemuck", + "cfg-if", + "digest 0.10.7", + "hex", + "hex-literal", + "metal", + "paste", + "rand_core 0.6.4", + "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", + "risc0-zkvm-platform 2.0.1", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkp" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa210a232361fd671b30918469856b64d715f2564956d0a5df97ab6cb116d28b" +dependencies = [ + "anyhow", + "blake2", + "borsh", + "bytemuck", + "cfg-if", + "digest 0.10.7", + "hex", + "hex-literal", + "metal", + "paste", + "rand_core 0.6.4", + "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "risc0-zkvm-platform 2.0.2", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkvm" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "borsh", + "bytemuck", + "derive_more 2.0.1", + "getrandom 0.2.16", + "hex", + "risc0-binfmt 2.0.0", + "risc0-circuit-keccak 1.4.0", + "risc0-circuit-recursion 1.4.0", + "risc0-circuit-rv32im 2.0.1", + "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", + "risc0-groth16 1.4.0", + "risc0-zkos-v1compat 2.0.0", + "risc0-zkp 2.0.0", + "risc0-zkvm-platform 2.0.1", + "rrs-lib", + "semver 1.0.26", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkvm" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a049319790277845335445b549d49e66341f4a7ffba7f7aaa1e77e2fc4a9c19" +dependencies = [ + "anyhow", + "bincode", + "bonsai-sdk", + "borsh", + "bytemuck", + "bytes", + "derive_more 2.0.1", + "getrandom 0.2.16", + "hex", + "lazy-regex", + "prost", + "risc0-binfmt 2.0.1", + "risc0-build", + "risc0-circuit-keccak 2.0.1", + "risc0-circuit-recursion 2.0.1", + "risc0-circuit-rv32im 2.0.3", + "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "risc0-groth16 2.0.1", + "risc0-zkos-v1compat 2.0.1", + "risc0-zkp 2.0.1", + "risc0-zkvm-platform 2.0.2", + "rrs-lib", + "rzup", + "semver 1.0.26", + "serde", + "sha2", + "stability", + "tempfile", + "tracing", +] + +[[package]] +name = "risc0-zkvm-platform" +version = "2.0.1" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "bytemuck", + "cfg-if", + "getrandom 0.2.16", + "libm", + "stability", +] + +[[package]] +name = "risc0-zkvm-platform" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e4de2938eaf24892ef927d9cef6e4acb6a19ce01c017cd498533896f633f332" +dependencies = [ + "bytemuck", + "cfg-if", + "getrandom 0.2.16", + "getrandom 0.3.2", + "libm", + "stability", +] + +[[package]] +name = "risc0_state_transition_program" +version = "0.1.0" +dependencies = [ + "risc0-zkvm 2.0.0", + "serde", + "serde_json", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "rrs-lib" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" +dependencies = [ + "downcast-rs", + "paste", +] + +[[package]] +name = "rrs-succinct" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3372685893a9f67d18e98e792d690017287fd17379a83d798d958e517d380fa9" +dependencies = [ + "downcast-rs", + "num_enum", + "paste", +] + +[[package]] +name = "ruint" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78a46eb779843b2c4f21fac5773e25d6d5b7c8f0922876c91541790d2ca27eef" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rand 0.9.1", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.26", +] + +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7149975849f1abb3832b246010ef62ccc80d3a76169517ada7188252b9cfb437" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "rzup" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "400558bf12d4292a7804093b60a437ba8b0219ea7d53716b2c010a0d31e5f4a8" +dependencies = [ + "semver 1.0.26", + "serde", + "strum", + "tempfile", + "thiserror 2.0.12", + "toml", + "yaml-rust2", +] + +[[package]] +name = "scale-info" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" +dependencies = [ + "cfg-if", + "derive_more 1.0.0", + "parity-scale-codec", + "scale-info-derive", +] + +[[package]] +name = "scale-info-derive" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" +dependencies = [ + "proc-macro-crate 3.3.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "scc" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22b2d775fb28f245817589471dd49c5edf64237f4a19d10ce9a92ff4651a27f4" +dependencies = [ + "sdd", +] + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sdd" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "584e070911c7017da6cb2eb0788d09f43d789029b5877d3e5ecc8acf86ceee21" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array 0.14.7", + "pkcs8", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.9.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.9.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.9.0", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + +[[package]] +name = "serial_test" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b258109f244e1d6891bf1053a55d63a5cd4f8f4c30cf9a1280989f80e7a1fa9" +dependencies = [ + "futures", + "log", + "once_cell", + "parking_lot", + "scc", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "size" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fed904c7fb2856d868b92464fc8fa597fce366edea1a9cbfaa8cb5fe080bd6d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +dependencies = [ + "serde", +] + +[[package]] +name = "snowbridge-amcl" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460a9ed63cdf03c1b9847e8a12a5f5ba19c4efd5869e4a737e05be25d7c427e5" +dependencies = [ + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "socket2" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "sp1-build" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b45dd7a9d3703f82b1f5e8fdd6c5fb8af1e3b4037f1ffc533435717d567a56" +dependencies = [ + "anyhow", + "cargo_metadata 0.18.1", + "chrono", + "clap", + "dirs", +] + +[[package]] +name = "sp1-core-executor" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1988844b2273313bf1a3861684f7415f68c00d51139475fd3d72f2326fd6d" +dependencies = [ + "bincode", + "bytemuck", + "clap", + "elf", + "enum-map", + "eyre", + "hashbrown 0.14.5", + "hex", + "itertools 0.13.0", + "nohash-hasher", + "num", + "p3-baby-bear", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand 0.8.5", + "range-set-blaze", + "rrs-succinct", + "serde", + "serde_json", + "sp1-curves", + "sp1-primitives", + "sp1-stark", + "strum", + "strum_macros", + "subenum", + "thiserror 1.0.69", + "tiny-keccak", + "tracing", + "typenum", + "vec_map", +] + +[[package]] +name = "sp1-core-machine" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7911eeaa80da1eb55ce5bf4c9442d3f1cad85e6dae41601b3ce23d45c48a5871" +dependencies = [ + "bincode", + "cbindgen", + "cc", + "cfg-if", + "elliptic-curve", + "generic-array 1.1.0", + "glob", + "hashbrown 0.14.5", + "hex", + "itertools 0.13.0", + "k256", + "num", + "num_cpus", + "p256", + "p3-air", + "p3-baby-bear", + "p3-challenger", + "p3-field", + "p3-keccak-air", + "p3-matrix", + "p3-maybe-rayon", + "p3-poseidon2", + "p3-symmetric", + "p3-uni-stark", + "p3-util", + "pathdiff", + "rand 0.8.5", + "rayon", + "rayon-scan", + "serde", + "serde_json", + "size", + "snowbridge-amcl", + "sp1-core-executor", + "sp1-curves", + "sp1-derive", + "sp1-primitives", + "sp1-stark", + "static_assertions", + "strum", + "strum_macros", + "tempfile", + "thiserror 1.0.69", + "tracing", + "tracing-forest", + "tracing-subscriber 0.3.19", + "typenum", + "web-time", +] + +[[package]] +name = "sp1-cuda" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4bab3c90ca3408ac50cbff14d629205a5178fb3623a2e354a416d9d7560fe02" +dependencies = [ + "bincode", + "ctrlc", + "prost", + "serde", + "sp1-core-machine", + "sp1-prover", + "tokio", + "tracing", + "twirp-rs", +] + +[[package]] +name = "sp1-curves" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a198a00a1700ea0073a7481138abf256e3f38a15892c42721cdbec5d64d0f4e7" +dependencies = [ + "cfg-if", + "dashu", + "elliptic-curve", + "generic-array 1.1.0", + "itertools 0.13.0", + "k256", + "num", + "p256", + "p3-field", + "serde", + "snowbridge-amcl", + "sp1-primitives", + "sp1-stark", + "typenum", +] + +[[package]] +name = "sp1-derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24e3a9d2afa63fa83792c223084abf62c2cb3a60188651e9aa567e25e9fd344d" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sp1-lib" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3ef88f90458b6116da164e9c4c4596c49c8cca1944bfe02850b48b232a06b90" +dependencies = [ + "bincode", + "serde", + "sp1-primitives", +] + +[[package]] +name = "sp1-primitives" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc282347d405f23fc8a7cfe93c82e772920bf2e0722cf828eaea69ed530e49" +dependencies = [ + "bincode", + "blake3", + "cfg-if", + "hex", + "lazy_static", + "num-bigint 0.4.6", + "p3-baby-bear", + "p3-field", + "p3-poseidon2", + "p3-symmetric", + "serde", + "sha2", +] + +[[package]] +name = "sp1-prover" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f694e15302f83608c4be7efbf879f0f2b04c2f90129fc8fe9b625299f59e6200" +dependencies = [ + "anyhow", + "bincode", + "clap", + "dirs", + "downloader", + "enum-map", + "eyre", + "hashbrown 0.14.5", + "hex", + "itertools 0.13.0", + "lru", + "num-bigint 0.4.6", + "p3-baby-bear", + "p3-bn254-fr", + "p3-challenger", + "p3-commit", + "p3-field", + "p3-matrix", + "p3-symmetric", + "p3-util", + "rayon", + "serde", + "serde_json", + "serial_test", + "sha2", + "sp1-core-executor", + "sp1-core-machine", + "sp1-primitives", + "sp1-recursion-circuit", + "sp1-recursion-compiler", + "sp1-recursion-core", + "sp1-recursion-gnark-ffi", + "sp1-stark", + "thiserror 1.0.69", + "tracing", + "tracing-appender", + "tracing-subscriber 0.3.19", +] + +[[package]] +name = "sp1-recursion-circuit" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134d651075d5de59e212f02ae7d6f1155e5fe2af228c0cab92096d4e8359b619" +dependencies = [ + "hashbrown 0.14.5", + "itertools 0.13.0", + "num-traits", + "p3-air", + "p3-baby-bear", + "p3-bn254-fr", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-symmetric", + "p3-uni-stark", + "p3-util", + "rand 0.8.5", + "rayon", + "serde", + "sp1-core-executor", + "sp1-core-machine", + "sp1-derive", + "sp1-primitives", + "sp1-recursion-compiler", + "sp1-recursion-core", + "sp1-recursion-gnark-ffi", + "sp1-stark", + "tracing", +] + +[[package]] +name = "sp1-recursion-compiler" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d630ab95063c1cf52668b23cdae8a216f5749604c3b063f5cdec20ef2c60d086" +dependencies = [ + "backtrace", + "itertools 0.13.0", + "p3-baby-bear", + "p3-bn254-fr", + "p3-field", + "p3-symmetric", + "serde", + "sp1-core-machine", + "sp1-primitives", + "sp1-recursion-core", + "sp1-recursion-derive", + "sp1-stark", + "tracing", + "vec_map", +] + +[[package]] +name = "sp1-recursion-core" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2edcf518cedb3d0947f14688089812aec56089b45bdfc5dd162ea25ec8902d7" +dependencies = [ + "backtrace", + "cbindgen", + "cc", + "cfg-if", + "ff 0.13.1", + "glob", + "hashbrown 0.14.5", + "itertools 0.13.0", + "num_cpus", + "p3-air", + "p3-baby-bear", + "p3-bn254-fr", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-maybe-rayon", + "p3-merkle-tree", + "p3-poseidon2", + "p3-symmetric", + "p3-util", + "pathdiff", + "rand 0.8.5", + "serde", + "sp1-core-machine", + "sp1-derive", + "sp1-primitives", + "sp1-stark", + "static_assertions", + "thiserror 1.0.69", + "tracing", + "vec_map", + "zkhash", +] + +[[package]] +name = "sp1-recursion-derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45acfb50730a6271d8546975063df0946ffaa28d2ce0d0041e7905fb90c9c254" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sp1-recursion-gnark-ffi" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1bc3fc71f6eafaa1dc5fa9b309ecf55075c14a18561540937a1e2e3964670" +dependencies = [ + "anyhow", + "bincode", + "bindgen", + "cc", + "cfg-if", + "hex", + "num-bigint 0.4.6", + "p3-baby-bear", + "p3-field", + "p3-symmetric", + "serde", + "serde_json", + "sha2", + "sp1-core-machine", + "sp1-recursion-compiler", + "sp1-stark", + "tempfile", + "tracing", +] + +[[package]] +name = "sp1-sdk" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9dc0553bed3674fe271a65dd9cdd3569670c619fdc3aaac7588cc6fce39e622" +dependencies = [ + "alloy-primitives", + "alloy-signer", + "alloy-signer-local", + "alloy-sol-types", + "anyhow", + "async-trait", + "backoff", + "bincode", + "cfg-if", + "dirs", + "eventsource-stream", + "futures", + "hashbrown 0.14.5", + "hex", + "indicatif", + "itertools 0.13.0", + "k256", + "p3-baby-bear", + "p3-field", + "p3-fri", + "prost", + "reqwest", + "reqwest-middleware", + "serde", + "serde_json", + "sp1-build", + "sp1-core-executor", + "sp1-core-machine", + "sp1-cuda", + "sp1-primitives", + "sp1-prover", + "sp1-stark", + "strum", + "strum_macros", + "tempfile", + "thiserror 1.0.69", + "tokio", + "tonic", + "tracing", + "twirp-rs", +] + +[[package]] +name = "sp1-stark" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3623ca4fe6bf08b3f4211f63cc59a115f0559913e2846ec4e65ad4a8524de3d" +dependencies = [ + "arrayref", + "hashbrown 0.14.5", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "p3-air", + "p3-baby-bear", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-maybe-rayon", + "p3-merkle-tree", + "p3-poseidon2", + "p3-symmetric", + "p3-uni-stark", + "p3-util", + "rayon-scan", + "serde", + "sp1-derive", + "sp1-primitives", + "strum", + "strum_macros", + "sysinfo", + "tracing", +] + +[[package]] +name = "sp1-zkvm" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d56dda97ba9915e7484a607e7517783d7422591c815e8dbfdbb716d77198760" +dependencies = [ + "cfg-if", + "getrandom 0.2.16", + "lazy_static", + "libm", + "p3-baby-bear", + "p3-field", + "rand 0.8.5", + "sha2", + "sp1-lib", + "sp1-primitives", +] + +[[package]] +name = "sp1_state_transition_program" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "sp1-zkvm", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stability" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" +dependencies = [ + "quote", + "syn 2.0.101", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + +[[package]] +name = "subenum" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5d5dfb8556dd04017db5e318bbeac8ab2b0c67b76bf197bfb79e9b29f18ecf" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0f0d4760f4c2a0823063b2c70e97aa2ad185f57be195172ccc0e23c4b787c4" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "sysinfo" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "rayon", + "windows", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +dependencies = [ + "fastrand", + "getrandom 0.3.2", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.26", +] + +[[package]] +name = "toml_datetime" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.9.0", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +dependencies = [ + "indexmap 2.9.0", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow 0.7.10", +] + +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + +[[package]] +name = "tonic" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64", + "bytes", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "prost", + "rustls-native-certs", + "rustls-pemfile", + "socket2", + "tokio", + "tokio-rustls", + "tokio-stream", + "tower 0.4.13", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand 0.8.5", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror 1.0.69", + "time", + "tracing-subscriber 0.3.19", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-forest" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee40835db14ddd1e3ba414292272eddde9dad04d3d4b65509656414d1c42592f" +dependencies = [ + "ansi_term", + "smallvec", + "thiserror 1.0.69", + "tracing", + "tracing-subscriber 0.3.19", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "twirp-rs" +version = "0.13.0-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27dfcc06b8d9262bc2d4b8d1847c56af9971a52dd8a0076876de9db763227d0d" +dependencies = [ + "async-trait", + "axum", + "futures", + "http", + "http-body-util", + "hyper", + "prost", + "reqwest", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tower 0.5.2", + "url", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +dependencies = [ + "serde", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.0", +] + +[[package]] +name = "webpki-roots" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings 0.4.0", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result", + "windows-strings 0.3.1", + "windows-targets 0.53.0", +] + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yaml-rust2" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a1a1c0bc9823338a3bdf8c61f994f23ac004c6fa32c08cd152984499b445e8d" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive 0.8.25", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zkhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4352d1081da6922701401cdd4cbf29a2723feb4cfabb5771f6fee8e9276da1c7" +dependencies = [ + "ark-ff 0.4.2", + "ark-std 0.4.0", + "bitvec", + "blake2", + "bls12_381", + "byteorder", + "cfg-if", + "group 0.12.1", + "group 0.13.0", + "halo2", + "hex", + "jubjub", + "lazy_static", + "pasta_curves 0.5.1", + "rand 0.8.5", + "serde", + "sha2", + "sha3", + "subtle", +] diff --git a/examples/L2/Cargo.toml b/examples/L2/Cargo.toml new file mode 100644 index 0000000000..9dfadebc5a --- /dev/null +++ b/examples/L2/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "proof_aggregator" +version = "0.1.0" +edition = "2021" + + +[dependencies] +serde = { version = "1.0.203", features = ["derive"] } +serde_json = "1.0.117" +serde_yaml = "0.9" +sp1-sdk = "4.1.3" +sp1_state_transition_program = { path = "./zkvm_programs/sp1/" } +risc0-zkvm = { version = "2.0.1" } +risc0_state_transition_program = { path = "./zkvm_programs/risc0/" } +lambdaworks-crypto = { git = "https://github.com/lambdaclass/lambdaworks.git", rev = "5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b", features = ["serde"]} +sha3 = "0.10.8" +primitive-types = { version = "0.12.0", features = ["serde"] } +rand = "0.8" + +[build-dependencies] +sp1-build = { version = "4.1.3" } +risc0-build = { version = "2.0.0" } + +[package.metadata.risc0] +methods = ["./zkvm_programs/risc0"] + +[profile.release] +opt-level = 3 diff --git a/examples/L2/Makefile b/examples/L2/Makefile new file mode 100644 index 0000000000..e41c94c73f --- /dev/null +++ b/examples/L2/Makefile @@ -0,0 +1,9 @@ +.PHONY: + +SHELL := /bin/bash + +# Either sp1|risc0 +ZKVM=sp1 + +run: + cargo run --release diff --git a/examples/L2/README.md b/examples/L2/README.md new file mode 100644 index 0000000000..41aa66f106 --- /dev/null +++ b/examples/L2/README.md @@ -0,0 +1,3 @@ +# Integrating your application with aggregation mode + +This example will guide you through how to integrate your application with aligned Proof Aggregation service. diff --git a/examples/L2/build.rs b/examples/L2/build.rs new file mode 100644 index 0000000000..11db0d264b --- /dev/null +++ b/examples/L2/build.rs @@ -0,0 +1,10 @@ +fn main() { + // sp1_build::build_program_with_args("./zkvm_programs/sp1", { + // sp1_build::BuildArgs { + // output_directory: Some("./zkvm_programs/sp1/elf".to_string()), + // ..Default::default() + // } + // }); + + // risc0_build::embed_methods(); +} From 4f2aa2ff5ccf538e6fe883407eef15da2194cd86 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Fri, 9 May 2025 11:42:43 -0300 Subject: [PATCH 05/22] feat: sp1 state transition program --- examples/L2/Cargo.lock | 40 +-- examples/L2/Cargo.toml | 1 - examples/L2/build.rs | 14 +- examples/L2/zkvm_programs/Cargo.lock | 303 ++++++++++++++++++ examples/L2/zkvm_programs/sp1/Cargo.toml | 3 + .../sp1/elf/sp1_state_transition_program | Bin 0 -> 216196 bytes examples/L2/zkvm_programs/sp1/src/lib.rs | 58 ++++ examples/L2/zkvm_programs/sp1/src/main.rs | 54 +++- 8 files changed, 426 insertions(+), 47 deletions(-) create mode 100755 examples/L2/zkvm_programs/sp1/elf/sp1_state_transition_program diff --git a/examples/L2/Cargo.lock b/examples/L2/Cargo.lock index 640e78899a..8bf89098c3 100644 --- a/examples/L2/Cargo.lock +++ b/examples/L2/Cargo.lock @@ -236,7 +236,7 @@ dependencies = [ "ruint", "rustc-hash 2.1.1", "serde", - "sha3", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak", ] @@ -3040,7 +3040,7 @@ dependencies = [ "rand_chacha 0.3.1", "serde", "sha2", - "sha3", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4103,8 +4103,7 @@ dependencies = [ "risc0_state_transition_program", "serde", "serde_json", - "serde_yaml", - "sha3", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", "sp1-build", "sp1-sdk", "sp1_state_transition_program", @@ -5308,19 +5307,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap 2.9.0", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - [[package]] name = "serdect" version = "0.2.0" @@ -5377,6 +5363,15 @@ dependencies = [ "keccak", ] +[[package]] +name = "sha3" +version = "0.10.8" +source = "git+https://github.com/sp1-patches/RustCrypto-hashes?tag=sha3-v0.10.8-patch-v1#8f6d303c0861ba7e5adcc36207c0f41fe5edaabc" +dependencies = [ + "digest 0.10.7", + "keccak", +] + [[package]] name = "sha3-asm" version = "0.1.4" @@ -5939,8 +5934,11 @@ dependencies = [ name = "sp1_state_transition_program" version = "0.1.0" dependencies = [ + "lambdaworks-crypto", + "primitive-types", "serde", "serde_json", + "sha3 0.10.8 (git+https://github.com/sp1-patches/RustCrypto-hashes?tag=sha3-v0.10.8-patch-v1)", "sp1-zkvm", ] @@ -6608,12 +6606,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - [[package]] name = "untrusted" version = "0.9.0" @@ -7366,6 +7358,6 @@ dependencies = [ "rand 0.8.5", "serde", "sha2", - "sha3", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", "subtle", ] diff --git a/examples/L2/Cargo.toml b/examples/L2/Cargo.toml index 9dfadebc5a..fd93e8bec7 100644 --- a/examples/L2/Cargo.toml +++ b/examples/L2/Cargo.toml @@ -7,7 +7,6 @@ edition = "2021" [dependencies] serde = { version = "1.0.203", features = ["derive"] } serde_json = "1.0.117" -serde_yaml = "0.9" sp1-sdk = "4.1.3" sp1_state_transition_program = { path = "./zkvm_programs/sp1/" } risc0-zkvm = { version = "2.0.1" } diff --git a/examples/L2/build.rs b/examples/L2/build.rs index 11db0d264b..3d64eb64fb 100644 --- a/examples/L2/build.rs +++ b/examples/L2/build.rs @@ -1,10 +1,8 @@ fn main() { - // sp1_build::build_program_with_args("./zkvm_programs/sp1", { - // sp1_build::BuildArgs { - // output_directory: Some("./zkvm_programs/sp1/elf".to_string()), - // ..Default::default() - // } - // }); - - // risc0_build::embed_methods(); + sp1_build::build_program_with_args("./zkvm_programs/sp1", { + sp1_build::BuildArgs { + output_directory: Some("./zkvm_programs/sp1/elf".to_string()), + ..Default::default() + } + }); } diff --git a/examples/L2/zkvm_programs/Cargo.lock b/examples/L2/zkvm_programs/Cargo.lock index 7186e1c3f3..c0a9ed78d6 100644 --- a/examples/L2/zkvm_programs/Cargo.lock +++ b/examples/L2/zkvm_programs/Cargo.lock @@ -285,6 +285,18 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "blake2" version = "0.10.6" @@ -345,6 +357,18 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + [[package]] name = "bytemuck" version = "1.23.0" @@ -404,6 +428,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "constant_time_eq" version = "0.3.1" @@ -446,6 +490,12 @@ dependencies = [ "libc", ] +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + [[package]] name = "crypto-common" version = "0.1.6" @@ -568,6 +618,18 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fnv" version = "1.0.7" @@ -601,6 +663,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "gcd" version = "2.3.0" @@ -624,8 +692,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -649,6 +719,35 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "include_bytes_aligned" version = "0.1.4" @@ -689,6 +788,16 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "keccak" version = "0.1.5" @@ -698,6 +807,30 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "lambdaworks-crypto" +version = "0.12.0" +source = "git+https://github.com/lambdaclass/lambdaworks.git?rev=5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b#5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b" +dependencies = [ + "lambdaworks-math", + "rand", + "rand_chacha", + "serde", + "sha2", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lambdaworks-math" +version = "0.12.0" +source = "git+https://github.com/lambdaclass/lambdaworks.git?rev=5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b#5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b" +dependencies = [ + "getrandom", + "rand", + "serde", + "serde_json", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -928,6 +1061,34 @@ dependencies = [ "serde", ] +[[package]] +name = "parity-scale-codec" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "paste" version = "1.0.15" @@ -961,6 +1122,18 @@ dependencies = [ "zerocopy 0.8.25", ] +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-serde", + "uint", +] + [[package]] name = "proc-macro-crate" version = "3.3.0" @@ -988,6 +1161,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.8.5" @@ -1204,6 +1383,18 @@ dependencies = [ "paste", ] +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + [[package]] name = "ryu" version = "1.0.20" @@ -1262,6 +1453,25 @@ dependencies = [ "digest", ] +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "git+https://github.com/sp1-patches/RustCrypto-hashes?tag=sha3-v0.10.8-patch-v1#8f6d303c0861ba7e5adcc36207c0f41fe5edaabc" +dependencies = [ + "digest", + "keccak", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1321,8 +1531,11 @@ dependencies = [ name = "sp1_state_transition_program" version = "0.1.0" dependencies = [ + "lambdaworks-crypto", + "primitive-types", "serde", "serde_json", + "sha3 0.10.8 (git+https://github.com/sp1-patches/RustCrypto-hashes?tag=sha3-v0.10.8-patch-v1)", "sp1-zkvm", ] @@ -1342,6 +1555,12 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "subtle" version = "2.6.1" @@ -1370,6 +1589,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "toml_datetime" version = "0.6.9" @@ -1435,6 +1660,18 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unicode-ident" version = "1.0.18" @@ -1465,6 +1702,63 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + [[package]] name = "winnow" version = "0.7.10" @@ -1474,6 +1768,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "zerocopy" version = "0.7.35" diff --git a/examples/L2/zkvm_programs/sp1/Cargo.toml b/examples/L2/zkvm_programs/sp1/Cargo.toml index ea30a2f2c0..f354d9b249 100644 --- a/examples/L2/zkvm_programs/sp1/Cargo.toml +++ b/examples/L2/zkvm_programs/sp1/Cargo.toml @@ -8,6 +8,9 @@ resolver = "2" sp1-zkvm = { version = "4.1.3", features = ["verify"] } serde = { version = "1.0.203", features = ["derive"] } serde_json = "1.0.117" +primitive-types = { version = "0.12.0", features = ["serde"] } +lambdaworks-crypto = { git = "https://github.com/lambdaclass/lambdaworks.git", rev = "5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b", features = ["serde"]} +sha3 = { git = "https://github.com/sp1-patches/RustCrypto-hashes", tag = "sha3-v0.10.8-patch-v1" } [lib] path = "./src/lib.rs" diff --git a/examples/L2/zkvm_programs/sp1/elf/sp1_state_transition_program b/examples/L2/zkvm_programs/sp1/elf/sp1_state_transition_program new file mode 100755 index 0000000000000000000000000000000000000000..f35f4068ddce506898f3afbe4ad047b244baf25c GIT binary patch literal 216196 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 z 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

xyRG`A+!DNZhoe#Eyb1H@gjW50%tmYyzNJqN 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%0ANF3;l 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 Self::Node { + let mut hasher = Keccak256::new(); + + let mut balance_bytes: [u8; 32] = [0u8; 32]; + let mut nonce_bytes: [u8; 32] = [0u8; 32]; + leaf.balance.to_little_endian(&mut balance_bytes); + leaf.nonce.to_little_endian(&mut nonce_bytes); + + hasher.update(leaf.address); + hasher.update(&balance_bytes); + hasher.update(&nonce_bytes); + hasher.finalize().into() + } + + fn hash_new_parent(child_1: &Self::Node, child_2: &Self::Node) -> Self::Node { + let mut hasher = Keccak256::new(); + hasher.update(child_1); + hasher.update(child_2); + hasher.finalize().into() + } +} + +#[derive(Deserialize, Serialize)] +pub struct Transfer { + pub from: H160, + pub to: H160, + pub amount: U256, +} + +#[derive(Deserialize, Serialize)] +pub struct ProgramInput { + pub user_states: HashMap, + pub transfers: Vec, +} + +#[derive(Serialize, Deserialize)] +pub struct ProgramOutput { + pub initial_state_merkle_root: [u8; 32], + pub post_state_merkle_root: [u8; 32], +} diff --git a/examples/L2/zkvm_programs/sp1/src/main.rs b/examples/L2/zkvm_programs/sp1/src/main.rs index 9b66ce2e1c..ed0023b597 100644 --- a/examples/L2/zkvm_programs/sp1/src/main.rs +++ b/examples/L2/zkvm_programs/sp1/src/main.rs @@ -2,23 +2,49 @@ sp1_zkvm::entrypoint!(main); use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; -use sha2::{Digest, Sha256}; -use sha3::Keccak256; -use sp1_aggregation_program::{Input, SP1VkAndPubInputs}; +use sp1_state_transition_program::{ProgramInput, ProgramOutput, UserState}; pub fn main() { - let input = sp1_zkvm::io::read::(); - - // Verify the proofs. - for proof in input.proofs_vk_and_pub_inputs.iter() { - let vkey = proof.vk; - let public_values = &proof.public_inputs; - let public_values_digest = Sha256::digest(public_values); - sp1_zkvm::lib::verify::verify_sp1_proof(&vkey, &public_values_digest.into()); + let mut input = sp1_zkvm::io::read::(); + + let initial_state: Vec = input.user_states.clone().into_values().collect(); + let initial_state_merkle_tree: MerkleTree = + MerkleTree::build(&initial_state).expect("to build merkle tree with the provided state"); + let initial_state_merkle_root = initial_state_merkle_tree.root; + + for transfer in input.transfers { + let mut user_from = input + .user_states + .get(&transfer.from) + .expect("User must exist in state") + .clone(); + let mut user_to = input + .user_states + .get(&transfer.to) + .expect("User must exist in state") + .clone(); + + if user_from.balance >= transfer.amount { + user_from.balance -= transfer.amount + } else { + panic!("User does not have enough balance to perform the transfer"); + } + + user_to.balance += transfer.amount; + + input.user_states.insert(transfer.from, user_from.clone()); + input.user_states.insert(transfer.to, user_to.clone()); } - let merkle_tree: MerkleTree = - MerkleTree::build(&input.proofs_vk_and_pub_inputs).unwrap(); + let post_state: Vec = input.user_states.clone().into_values().collect(); + let post_state_merkle_tree: MerkleTree = + MerkleTree::build(&post_state).expect("to build merkle tree with the provided state"); + let post_state_merkle_root = post_state_merkle_tree.root; + + let program_output = ProgramOutput { + initial_state_merkle_root, + post_state_merkle_root, + }; - sp1_zkvm::io::commit_slice(&merkle_tree.root); + sp1_zkvm::io::commit(&program_output); } From dff072800d16b8cac27299dd10eee936f4d884dc Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Fri, 9 May 2025 15:28:19 -0300 Subject: [PATCH 06/22] feat: share types between programs and send proof to aligned --- batcher/aligned-sdk/src/core/types.rs | 5 +- examples/L2/Cargo.lock | 3141 ++++--- examples/L2/Cargo.toml | 25 +- examples/L2/crates/l2/Cargo.lock | 7362 +++++++++++++++++ examples/L2/crates/l2/Cargo.toml | 22 + examples/L2/{ => crates/l2}/build.rs | 0 .../L2/{src/main.rs => crates/l2/src/lib.rs} | 122 +- .../{ => crates/l2}/zkvm_programs/Cargo.lock | 901 +- .../{ => crates/l2}/zkvm_programs/Cargo.toml | 5 +- .../l2}/zkvm_programs/sp1/Cargo.toml | 1 + .../sp1/elf/sp1_state_transition_program | Bin 0 -> 219684 bytes .../L2/crates/l2/zkvm_programs/sp1/src/lib.rs | 16 + .../l2}/zkvm_programs/sp1/src/main.rs | 3 +- examples/L2/crates/types/Cargo.toml | 15 + .../sp1 => crates/types}/src/lib.rs | 18 +- examples/L2/src/lib.rs | 0 examples/L2/zkvm_programs/risc0/Cargo.toml | 13 - examples/L2/zkvm_programs/risc0/src/lib.rs | 0 examples/L2/zkvm_programs/risc0/src/main.rs | 24 - .../sp1/elf/sp1_state_transition_program | Bin 216196 -> 0 bytes 20 files changed, 9448 insertions(+), 2225 deletions(-) create mode 100644 examples/L2/crates/l2/Cargo.lock create mode 100644 examples/L2/crates/l2/Cargo.toml rename examples/L2/{ => crates/l2}/build.rs (100%) rename examples/L2/{src/main.rs => crates/l2/src/lib.rs} (56%) rename examples/L2/{ => crates/l2}/zkvm_programs/Cargo.lock (54%) rename examples/L2/{ => crates/l2}/zkvm_programs/Cargo.toml (57%) rename examples/L2/{ => crates/l2}/zkvm_programs/sp1/Cargo.toml (95%) create mode 100755 examples/L2/crates/l2/zkvm_programs/sp1/elf/sp1_state_transition_program create mode 100644 examples/L2/crates/l2/zkvm_programs/sp1/src/lib.rs rename examples/L2/{ => crates/l2}/zkvm_programs/sp1/src/main.rs (95%) create mode 100644 examples/L2/crates/types/Cargo.toml rename examples/L2/{zkvm_programs/sp1 => crates/types}/src/lib.rs (76%) delete mode 100644 examples/L2/src/lib.rs delete mode 100644 examples/L2/zkvm_programs/risc0/Cargo.toml delete mode 100644 examples/L2/zkvm_programs/risc0/src/lib.rs delete mode 100644 examples/L2/zkvm_programs/risc0/src/main.rs delete mode 100755 examples/L2/zkvm_programs/sp1/elf/sp1_state_transition_program diff --git a/batcher/aligned-sdk/src/core/types.rs b/batcher/aligned-sdk/src/core/types.rs index 2de4a7d348..9211875452 100644 --- a/batcher/aligned-sdk/src/core/types.rs +++ b/batcher/aligned-sdk/src/core/types.rs @@ -3,9 +3,8 @@ use std::fmt::Display; use std::fmt::Formatter; use std::str::FromStr; -use ethers::core::k256::ecdsa::SigningKey; -use ethers::signers::Signer; -use ethers::signers::Wallet; +pub use ethers::core::k256::ecdsa::SigningKey; +pub use ethers::signers::{Signer, Wallet}; use ethers::types::transaction::eip712::EIP712Domain; use ethers::types::transaction::eip712::Eip712; use ethers::types::transaction::eip712::Eip712Error; diff --git a/examples/L2/Cargo.lock b/examples/L2/Cargo.lock index 8bf89098c3..88143563f0 100644 --- a/examples/L2/Cargo.lock +++ b/examples/L2/Cargo.lock @@ -2,6 +2,16 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + [[package]] name = "addchain" version = "0.2.0" @@ -28,16 +38,27 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", "once_cell", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -49,6 +70,27 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-sdk" +version = "0.1.0" +dependencies = [ + "ciborium", + "dialoguer", + "ethers", + "futures-util", + "hex", + "lambdaworks-crypto", + "log", + "reqwest 0.12.15", + "serde", + "serde_json", + "serde_repr", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio", + "tokio-tungstenite 0.23.1", + "url", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -502,72 +544,6 @@ version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" -[[package]] -name = "ark-bn254" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-r1cs-std", - "ark-std 0.5.0", -] - -[[package]] -name = "ark-crypto-primitives" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" -dependencies = [ - "ahash", - "ark-crypto-primitives-macros", - "ark-ec", - "ark-ff 0.5.0", - "ark-relations", - "ark-serialize 0.5.0", - "ark-snark", - "ark-std 0.5.0", - "blake2", - "derivative", - "digest 0.10.7", - "fnv", - "merlin", - "sha2", -] - -[[package]] -name = "ark-crypto-primitives-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-ec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-poly", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.3", - "itertools 0.13.0", - "num-bigint 0.4.6", - "num-integer", - "num-traits", - "zeroize", -] - [[package]] name = "ark-ff" version = "0.3.0" @@ -606,26 +582,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "ark-ff" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" -dependencies = [ - "ark-ff-asm 0.5.0", - "ark-ff-macros 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "educe", - "itertools 0.13.0", - "num-bigint 0.4.6", - "num-traits", - "paste", - "zeroize", -] - [[package]] name = "ark-ff-asm" version = "0.3.0" @@ -646,16 +602,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ark-ff-asm" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" -dependencies = [ - "quote", - "syn 2.0.101", -] - [[package]] name = "ark-ff-macros" version = "0.3.0" @@ -681,78 +627,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ark-ff-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" -dependencies = [ - "num-bigint 0.4.6", - "num-traits", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-groth16" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" -dependencies = [ - "ark-crypto-primitives", - "ark-ec", - "ark-ff 0.5.0", - "ark-poly", - "ark-relations", - "ark-serialize 0.5.0", - "ark-std 0.5.0", -] - -[[package]] -name = "ark-poly" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.3", -] - -[[package]] -name = "ark-r1cs-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-relations", - "ark-std 0.5.0", - "educe", - "num-bigint 0.4.6", - "num-integer", - "num-traits", - "tracing", -] - -[[package]] -name = "ark-relations" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" -dependencies = [ - "ark-ff 0.5.0", - "ark-std 0.5.0", - "tracing", - "tracing-subscriber 0.2.25", -] - [[package]] name = "ark-serialize" version = "0.3.0" @@ -774,42 +648,6 @@ dependencies = [ "num-bigint 0.4.6", ] -[[package]] -name = "ark-serialize" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" -dependencies = [ - "ark-serialize-derive", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "num-bigint 0.4.6", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-snark" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" -dependencies = [ - "ark-ff 0.5.0", - "ark-relations", - "ark-serialize 0.5.0", - "ark-std 0.5.0", -] - [[package]] name = "ark-std" version = "0.3.0" @@ -830,22 +668,6 @@ dependencies = [ "rand 0.8.5", ] -[[package]] -name = "ark-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "arraydeque" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" - [[package]] name = "arrayref" version = "0.3.9" @@ -861,6 +683,15 @@ dependencies = [ "serde", ] +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + [[package]] name = "async-stream" version = "0.3.6" @@ -894,6 +725,17 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version 0.4.1", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -927,10 +769,10 @@ dependencies = [ "axum-core", "bytes", "futures-util", - "http", - "http-body", + "http 1.3.1", + "http-body 1.0.1", "http-body-util", - "hyper", + "hyper 1.6.0", "hyper-util", "itoa", "matchit", @@ -943,7 +785,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", "tower 0.5.2", "tower-layer", @@ -960,13 +802,13 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http", - "http-body", + "http 1.3.1", + "http-body 1.0.1", "http-body-util", "mime", "pin-project-lite", "rustversion", - "sync_wrapper", + "sync_wrapper 1.0.2", "tower-layer", "tower-service", "tracing", @@ -1008,6 +850,18 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" @@ -1020,6 +874,12 @@ version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bincode" version = "1.3.3" @@ -1049,15 +909,30 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec 0.6.3", +] + [[package]] name = "bit-set" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ - "bit-vec", + "bit-vec 0.8.0", ] +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bit-vec" version = "0.8.0" @@ -1105,7 +980,7 @@ checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" dependencies = [ "arrayref", "arrayvec", - "constant_time_eq", + "constant_time_eq 0.3.1", ] [[package]] @@ -1118,15 +993,9 @@ dependencies = [ "arrayvec", "cc", "cfg-if", - "constant_time_eq", + "constant_time_eq 0.3.1", ] -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - [[package]] name = "block-buffer" version = "0.10.4" @@ -1162,39 +1031,13 @@ dependencies = [ ] [[package]] -name = "bonsai-sdk" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bce8d6acc5286a16e94c29e9c885d1869358885e08a6feeb6bc54e36fe20055" -dependencies = [ - "duplicate", - "maybe-async", - "reqwest", - "serde", - "thiserror 1.0.69", -] - -[[package]] -name = "borsh" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" -dependencies = [ - "borsh-derive", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.5.7" +name = "bs58" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ - "once_cell", - "proc-macro-crate 3.3.0", - "proc-macro2", - "quote", - "syn 2.0.101", + "sha2", + "tinyvec", ] [[package]] @@ -1214,20 +1057,6 @@ name = "bytemuck" version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] [[package]] name = "byteorder" @@ -1245,17 +1074,37 @@ dependencies = [ ] [[package]] -name = "c-kzg" -version = "2.1.1" +name = "bzip2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7318cfa722931cb5fe0838b98d3ce5621e75f6a6408abc21721d80de9223f2e4" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" dependencies = [ - "blst", - "cc", - "glob", - "hex", + "bzip2-sys", "libc", - "once_cell", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "c-kzg" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7318cfa722931cb5fe0838b98d3ce5621e75f6a6408abc21721d80de9223f2e4" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", "serde", ] @@ -1291,20 +1140,6 @@ dependencies = [ "thiserror 1.0.69", ] -[[package]] -name = "cargo_metadata" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.26", - "serde", - "serde_json", - "thiserror 2.0.12", -] - [[package]] name = "cbindgen" version = "0.27.0" @@ -1326,10 +1161,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.21" +version = "1.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" +checksum = "32db95edf998450acc7881c932f94cd9b05c87b4b2599e8bab064753da4acfd1" dependencies = [ + "jobserver", + "libc", "shlex", ] @@ -1367,6 +1204,43 @@ dependencies = [ "windows-link", ] +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clang-sys" version = "1.8.1" @@ -1419,10 +1293,56 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] -name = "cobs" -version = "0.2.3" +name = "coins-bip32" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" +dependencies = [ + "bs58", + "coins-core", + "digest 0.10.7", + "hmac", + "k256", + "serde", + "sha2", + "thiserror 1.0.69", +] + +[[package]] +name = "coins-bip39" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" +dependencies = [ + "bitvec", + "coins-bip32", + "hmac", + "once_cell", + "pbkdf2 0.12.2", + "rand 0.8.5", + "sha2", + "thiserror 1.0.69", +] + +[[package]] +name = "coins-core" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" +dependencies = [ + "base64 0.21.7", + "bech32", + "bs58", + "digest 0.10.7", + "generic-array 0.14.7", + "hex", + "ripemd", + "serde", + "serde_derive", + "sha2", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.69", +] [[package]] name = "colorchoice" @@ -1482,6 +1402,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + [[package]] name = "constant_time_eq" version = "0.3.1" @@ -1514,17 +1440,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "libc", -] - [[package]] name = "cpufeatures" version = "0.2.17" @@ -1549,6 +1464,15 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -1611,6 +1535,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + [[package]] name = "ctrlc" version = "3.4.6" @@ -1734,6 +1667,12 @@ dependencies = [ "rustversion", ] +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + [[package]] name = "der" version = "0.7.10" @@ -1766,37 +1705,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive_builder" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "derive_builder_macro" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" -dependencies = [ - "derive_builder_core", - "syn 2.0.101", -] - [[package]] name = "derive_more" version = "1.0.0" @@ -1838,6 +1746,19 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "dialoguer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +dependencies = [ + "console", + "shell-words", + "tempfile", + "thiserror 1.0.69", + "zeroize", +] + [[package]] name = "digest" version = "0.9.0" @@ -1868,6 +1789,16 @@ dependencies = [ "dirs-sys", ] +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + [[package]] name = "dirs-sys" version = "0.4.1" @@ -1880,6 +1811,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -1891,12 +1833,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "docker-generate" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf673e0848ef09fa4aeeba78e681cf651c0c7d35f76ee38cec8e55bc32fa111" - [[package]] name = "downcast-rs" version = "1.2.1" @@ -1912,7 +1848,7 @@ dependencies = [ "digest 0.10.7", "futures", "rand 0.8.5", - "reqwest", + "reqwest 0.12.15", "thiserror 1.0.69", "tokio", ] @@ -1923,16 +1859,6 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" -[[package]] -name = "duplicate" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de78e66ac9061e030587b2a2e75cc88f22304913c907b11307bca737141230cb" -dependencies = [ - "heck 0.4.1", - "proc-macro-error", -] - [[package]] name = "ecdsa" version = "0.16.9" @@ -1948,18 +1874,6 @@ dependencies = [ "spki", ] -[[package]] -name = "educe" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "either" version = "1.15.0" @@ -1997,16 +1911,13 @@ dependencies = [ ] [[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - -[[package]] -name = "embedded-io" -version = "0.6.1" +name = "ena" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +dependencies = [ + "log", +] [[package]] name = "encode_unicode" @@ -2023,6 +1934,24 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "enr" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a3d8dc56e02f954cac8eb489772c552c473346fc34f67412bb6244fd647f7e4" +dependencies = [ + "base64 0.21.7", + "bytes", + "hex", + "k256", + "log", + "rand 0.8.5", + "rlp", + "serde", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize", +] + [[package]] name = "enum-map" version = "2.7.3" @@ -2044,26 +1973,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "enum-ordinalize" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" -dependencies = [ - "enum-ordinalize-derive", -] - -[[package]] -name = "enum-ordinalize-derive" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -2081,29 +1990,348 @@ dependencies = [ ] [[package]] -name = "eventsource-stream" -version = "0.2.3" +name = "eth-keystore" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab" +checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" dependencies = [ - "futures-core", - "nom", - "pin-project-lite", + "aes", + "ctr", + "digest 0.10.7", + "hex", + "hmac", + "pbkdf2 0.11.0", + "rand 0.8.5", + "scrypt", + "serde", + "serde_json", + "sha2", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.69", + "uuid", ] [[package]] -name = "eyre" -version = "0.6.12" +name = "ethabi" +version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" dependencies = [ - "indenter", + "ethereum-types", + "hex", "once_cell", + "regex", + "serde", + "serde_json", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.69", + "uint", ] [[package]] -name = "fastrand" -version = "2.3.0" +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "primitive-types", + "scale-info", + "uint", +] + +[[package]] +name = "ethers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816841ea989f0c69e459af1cf23a6b0033b19a55424a1ea3a30099becdb8dec0" +dependencies = [ + "ethers-addressbook", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-middleware", + "ethers-providers", + "ethers-signers", + "ethers-solc", +] + +[[package]] +name = "ethers-addressbook" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5495afd16b4faa556c3bba1f21b98b4983e53c1755022377051a975c3b021759" +dependencies = [ + "ethers-core", + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "ethers-contract" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fceafa3578c836eeb874af87abacfb041f92b4da0a78a5edd042564b8ecdaaa" +dependencies = [ + "const-hex", + "ethers-contract-abigen", + "ethers-contract-derive", + "ethers-core", + "ethers-providers", + "futures-util", + "once_cell", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "ethers-contract-abigen" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04ba01fbc2331a38c429eb95d4a570166781f14290ef9fdb144278a90b5a739b" +dependencies = [ + "Inflector", + "const-hex", + "dunce", + "ethers-core", + "ethers-etherscan", + "eyre", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "reqwest 0.11.27", + "serde", + "serde_json", + "syn 2.0.101", + "toml", + "walkdir", +] + +[[package]] +name = "ethers-contract-derive" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87689dcabc0051cde10caaade298f9e9093d65f6125c14575db3fd8c669a168f" +dependencies = [ + "Inflector", + "const-hex", + "ethers-contract-abigen", + "ethers-core", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.101", +] + +[[package]] +name = "ethers-core" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" +dependencies = [ + "arrayvec", + "bytes", + "cargo_metadata", + "chrono", + "const-hex", + "elliptic-curve", + "ethabi", + "generic-array 0.14.7", + "k256", + "num_enum 0.7.3", + "once_cell", + "open-fastrlp", + "rand 0.8.5", + "rlp", + "serde", + "serde_json", + "strum", + "syn 2.0.101", + "tempfile", + "thiserror 1.0.69", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "ethers-etherscan" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" +dependencies = [ + "chrono", + "ethers-core", + "reqwest 0.11.27", + "semver 1.0.26", + "serde", + "serde_json", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "ethers-middleware" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f9fdf09aec667c099909d91908d5eaf9be1bd0e2500ba4172c1d28bfaa43de" +dependencies = [ + "async-trait", + "auto_impl", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-providers", + "ethers-signers", + "futures-channel", + "futures-locks", + "futures-util", + "instant", + "reqwest 0.11.27", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tracing", + "tracing-futures", + "url", +] + +[[package]] +name = "ethers-providers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6434c9a33891f1effc9c75472e12666db2fa5a0fec4b29af6221680a6fe83ab2" +dependencies = [ + "async-trait", + "auto_impl", + "base64 0.21.7", + "bytes", + "const-hex", + "enr", + "ethers-core", + "futures-channel", + "futures-core", + "futures-timer", + "futures-util", + "hashers", + "http 0.2.12", + "instant", + "jsonwebtoken", + "once_cell", + "pin-project", + "reqwest 0.11.27", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tokio-tungstenite 0.20.1", + "tracing", + "tracing-futures", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "ws_stream_wasm", +] + +[[package]] +name = "ethers-signers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228875491c782ad851773b652dd8ecac62cda8571d3bc32a5853644dd26766c2" +dependencies = [ + "async-trait", + "coins-bip32", + "coins-bip39", + "const-hex", + "elliptic-curve", + "eth-keystore", + "ethers-core", + "rand 0.8.5", + "sha2", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "ethers-solc" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66244a771d9163282646dbeffe0e6eca4dda4146b6498644e678ac6089b11edd" +dependencies = [ + "cfg-if", + "const-hex", + "dirs", + "dunce", + "ethers-core", + "glob", + "home", + "md-5", + "num_cpus", + "once_cell", + "path-slash", + "rayon", + "regex", + "semver 1.0.26", + "serde", + "serde_json", + "solang-parser", + "svm-rs", + "thiserror 1.0.69", + "tiny-keccak", + "tokio", + "tracing", + "walkdir", + "yansi", +] + +[[package]] +name = "eventsource-stream" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab" +dependencies = [ + "futures-core", + "nom", + "pin-project-lite", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" @@ -2180,6 +2408,22 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" @@ -2194,30 +2438,18 @@ checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "foreign-types" -version = "0.5.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-macros", "foreign-types-shared", ] -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "foreign-types-shared" -version = "0.3.1" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" @@ -2228,6 +2460,16 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "funty" version = "2.0.0" @@ -2282,6 +2524,16 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +[[package]] +name = "futures-locks" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" +dependencies = [ + "futures-channel", + "futures-task", +] + [[package]] name = "futures-macro" version = "0.3.31" @@ -2305,6 +2557,16 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +dependencies = [ + "gloo-timers", + "send_wrapper 0.4.0", +] + [[package]] name = "futures-util" version = "0.3.31" @@ -2329,6 +2591,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "gcd" version = "2.3.0" @@ -2377,9 +2648,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "js-sys", @@ -2401,6 +2672,18 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "group" version = "0.12.1" @@ -2424,6 +2707,25 @@ dependencies = [ "subtle", ] +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.9.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "h2" version = "0.4.10" @@ -2435,7 +2737,7 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http", + "http 1.3.1", "indexmap 2.9.0", "slab", "tokio", @@ -2443,6 +2745,16 @@ dependencies = [ "tracing", ] +[[package]] +name = "half" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +dependencies = [ + "cfg-if", + "crunchy", +] + [[package]] name = "halo2" version = "0.1.0-beta.2" @@ -2496,12 +2808,12 @@ dependencies = [ ] [[package]] -name = "hashlink" -version = "0.9.1" +name = "hashers" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" dependencies = [ - "hashbrown 0.14.5", + "fxhash", ] [[package]] @@ -2531,12 +2843,6 @@ dependencies = [ "serde", ] -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - [[package]] name = "hmac" version = "0.12.1" @@ -2546,6 +2852,26 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http" version = "1.3.1" @@ -2557,6 +2883,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + [[package]] name = "http-body" version = "1.0.1" @@ -2564,7 +2901,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http", + "http 1.3.1", ] [[package]] @@ -2575,8 +2912,8 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http", - "http-body", + "http 1.3.1", + "http-body 1.0.1", "pin-project-lite", ] @@ -2592,6 +2929,30 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + [[package]] name = "hyper" version = "1.6.0" @@ -2601,9 +2962,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2", - "http", - "http-body", + "h2 0.4.10", + "http 1.3.1", + "http-body 1.0.1", "httparse", "httpdate", "itoa", @@ -2613,6 +2974,20 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.32", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + [[package]] name = "hyper-rustls" version = "0.27.5" @@ -2620,13 +2995,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http", - "hyper", + "http 1.3.1", + "hyper 1.6.0", "hyper-util", - "rustls", + "rustls 0.23.27", "rustls-pki-types", "tokio", - "tokio-rustls", + "tokio-rustls 0.26.2", "tower-service", "webpki-roots 0.26.11", ] @@ -2637,13 +3012,29 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper", + "hyper 1.6.0", "hyper-util", "pin-project-lite", "tokio", "tower-service", ] +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.6.0", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + [[package]] name = "hyper-util" version = "0.1.11" @@ -2653,9 +3044,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http", - "http-body", - "hyper", + "http 1.3.1", + "http-body 1.0.1", + "hyper 1.6.0", "libc", "pin-project-lite", "socket2", @@ -2690,21 +3081,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -2713,31 +3105,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -2745,67 +3117,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -2825,9 +3184,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -2842,6 +3201,15 @@ dependencies = [ "parity-scale-codec", ] +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + [[package]] name = "impl-serde" version = "0.4.0" @@ -2862,12 +3230,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "include_bytes_aligned" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" - [[package]] name = "indenter" version = "0.3.3" @@ -2909,6 +3271,15 @@ dependencies = [ "web-time", ] +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array 0.14.7", +] + [[package]] name = "instant" version = "0.1.13" @@ -2939,6 +3310,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.12.1" @@ -2972,6 +3352,16 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + [[package]] name = "js-sys" version = "0.3.77" @@ -2982,6 +3372,20 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.7", + "pem", + "ring 0.16.20", + "serde", + "serde_json", + "simple_asn1", +] + [[package]] name = "jubjub" version = "0.9.0" @@ -3017,17 +3421,64 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ - "cpufeatures", + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "l2_example" +version = "0.1.0" +dependencies = [ + "aligned-sdk", + "bincode", + "lambdaworks-crypto", + "primitive-types", + "rand 0.8.5", + "serde", + "serde_json", + "sp1-build", + "sp1-sdk", + "sp1_state_transition_program", + "types", +] + +[[package]] +name = "lalrpop" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" +dependencies = [ + "ascii-canvas", + "bit-set 0.5.3", + "ena", + "itertools 0.11.0", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax 0.8.5", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", + "walkdir", ] [[package]] -name = "keccak-asm" -version = "0.1.4" +name = "lalrpop-util" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "digest 0.10.7", - "sha3-asm", + "regex-automata 0.4.9", ] [[package]] @@ -3054,36 +3505,13 @@ dependencies = [ "serde_json", ] -[[package]] -name = "lazy-regex" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60c7310b93682b36b98fa7ea4de998d3463ccbebd94d935d6b48ba5b6ffa7126" -dependencies = [ - "lazy-regex-proc_macros", - "once_cell", - "regex", -] - -[[package]] -name = "lazy-regex-proc_macros" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ba01db5ef81e17eb10a5e0f2109d1b3a3e29bac3070fdbd7d156bf7dbd206a1" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn 2.0.101", -] - [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin", + "spin 0.9.8", ] [[package]] @@ -3126,9 +3554,9 @@ checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" @@ -3155,6 +3583,12 @@ dependencies = [ "hashbrown 0.15.3", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "macro-string" version = "0.1.4" @@ -3166,15 +3600,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - [[package]] name = "matchers" version = "0.1.0" @@ -3191,14 +3616,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] -name = "maybe-async" -version = "0.2.10" +name = "md-5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", + "cfg-if", + "digest 0.10.7", ] [[package]] @@ -3213,33 +3637,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d97bbf43eb4f088f8ca469930cde17fa036207c9a5e02ccc5107c4e8b17c964" -[[package]] -name = "merlin" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" -dependencies = [ - "byteorder", - "keccak", - "rand_core 0.6.4", - "zeroize", -] - -[[package]] -name = "metal" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" -dependencies = [ - "bitflags 2.9.0", - "block", - "core-graphics-types", - "foreign-types", - "log", - "objc", - "paste", -] - [[package]] name = "mime" version = "0.3.17" @@ -3272,6 +3669,29 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework 2.11.1", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.29.0" @@ -3284,12 +3704,6 @@ dependencies = [ "libc", ] -[[package]] -name = "no_std_strings" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5b0c77c1b780822bc749a33e39aeb2c07584ab93332303babeabb645298a76e" - [[package]] name = "nohash-hasher" version = "0.2.0" @@ -3447,7 +3861,16 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" dependencies = [ - "num_enum_derive", + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive 0.7.3", ] [[package]] @@ -3462,6 +3885,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "number_prefix" version = "0.4.0" @@ -3481,15 +3916,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - [[package]] name = "object" version = "0.36.7" @@ -3505,12 +3931,75 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "open-fastrlp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", + "ethereum-types", + "open-fastrlp-derive", +] + +[[package]] +name = "open-fastrlp-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" +dependencies = [ + "bytes", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "openssl" +version = "0.10.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +dependencies = [ + "bitflags 2.9.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "openssl-probe" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +[[package]] +name = "openssl-sys" +version = "0.9.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -3843,6 +4332,17 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "pasta_curves" version = "0.4.1" @@ -3879,12 +4379,49 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + [[package]] name = "pathdiff" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", + "hmac", + "password-hash", + "sha2", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -3911,6 +4448,68 @@ dependencies = [ "ucd-trie", ] +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.9.0", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version 0.4.1", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project" version = "1.1.10" @@ -3953,6 +4552,12 @@ dependencies = [ "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + [[package]] name = "portable-atomic" version = "1.11.0" @@ -3960,15 +4565,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" [[package]] -name = "postcard" -version = "1.1.1" +name = "potential_utf" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" dependencies = [ - "cobs", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "serde", + "zerovec", ] [[package]] @@ -3983,9 +4585,15 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.25", + "zerocopy", ] +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "prettyplease" version = "0.2.32" @@ -4013,51 +4621,29 @@ checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", + "impl-rlp", "impl-serde", + "scale-info", "uint", ] [[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" -dependencies = [ - "toml_edit 0.22.26", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro-crate" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", + "once_cell", + "toml_edit 0.19.15", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-crate" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "proc-macro2", - "quote", - "version_check", + "toml_edit 0.22.26", ] [[package]] @@ -4091,32 +4677,14 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "proof_aggregator" -version = "0.1.0" -dependencies = [ - "lambdaworks-crypto", - "primitive-types", - "rand 0.8.5", - "risc0-build", - "risc0-zkvm 2.0.2", - "risc0_state_transition_program", - "serde", - "serde_json", - "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", - "sp1-build", - "sp1-sdk", - "sp1_state_transition_program", -] - [[package]] name = "proptest" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" dependencies = [ - "bit-set", - "bit-vec", + "bit-set 0.8.0", + "bit-vec 0.8.0", "bitflags 2.9.0", "lazy_static", "num-traits", @@ -4160,9 +4728,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quinn" -version = "0.11.7" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" dependencies = [ "bytes", "cfg_aliases", @@ -4170,7 +4738,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls", + "rustls 0.23.27", "socket2", "thiserror 2.0.12", "tokio", @@ -4180,16 +4748,17 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.11" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcbafbbdbb0f638fe3f35f3c56739f77a8a1d070cb25603226c83339b391472b" +checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" dependencies = [ "bytes", - "getrandom 0.3.2", + "getrandom 0.3.3", + "lru-slab", "rand 0.9.1", - "ring", + "ring 0.17.14", "rustc-hash 2.1.1", - "rustls", + "rustls 0.23.27", "rustls-pki-types", "slab", "thiserror 2.0.12", @@ -4291,7 +4860,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", "serde", ] @@ -4411,473 +4980,157 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.15" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ - "base64", + "base64 0.21.7", "bytes", - "futures-channel", + "encoding_rs", "futures-core", "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pemfile", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tokio-util", - "tower 0.5.2", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 0.26.11", - "windows-registry", -] - -[[package]] -name = "reqwest-middleware" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" -dependencies = [ - "anyhow", - "async-trait", - "http", - "reqwest", - "serde", - "thiserror 1.0.69", - "tower-service", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "risc0-binfmt" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "anyhow", - "borsh", - "derive_more 2.0.1", - "elf", - "lazy_static", - "postcard", - "risc0-zkp 2.0.0", - "risc0-zkvm-platform 2.0.1", - "semver 1.0.26", - "serde", - "tracing", -] - -[[package]] -name = "risc0-binfmt" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fe7599ac55ad77515608ec42a9727001559fe4f579c533cb7c973b54800c05" -dependencies = [ - "anyhow", - "borsh", - "derive_more 2.0.1", - "elf", - "lazy_static", - "postcard", - "risc0-zkp 2.0.1", - "risc0-zkvm-platform 2.0.2", - "semver 1.0.26", - "serde", - "tracing", -] - -[[package]] -name = "risc0-build" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31d104165340cba919a3dac26c4be7da04b20b941601a7ad50c04834c4d26de5" -dependencies = [ - "anyhow", - "cargo_metadata 0.19.2", - "derive_builder", - "dirs", - "docker-generate", - "hex", - "risc0-binfmt 2.0.1", - "risc0-zkos-v1compat 2.0.1", - "risc0-zkp 2.0.1", - "risc0-zkvm-platform 2.0.2", - "rzup", - "semver 1.0.26", - "serde", - "serde_json", - "stability", - "tempfile", -] - -[[package]] -name = "risc0-circuit-keccak" -version = "1.4.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "anyhow", - "bytemuck", - "paste", - "risc0-binfmt 2.0.0", - "risc0-circuit-recursion 1.4.0", - "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", - "risc0-zkp 2.0.0", - "tracing", -] - -[[package]] -name = "risc0-circuit-keccak" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd8acfc84307ed1be64cf9fefc390963fc22b2865d027f03405977a0cfa9747" -dependencies = [ - "anyhow", - "bytemuck", - "paste", - "risc0-binfmt 2.0.1", - "risc0-circuit-recursion 2.0.1", - "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "risc0-zkp 2.0.1", - "tracing", -] - -[[package]] -name = "risc0-circuit-recursion" -version = "1.4.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "anyhow", - "bytemuck", - "hex", - "metal", - "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", - "risc0-zkp 2.0.0", - "tracing", -] - -[[package]] -name = "risc0-circuit-recursion" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd1514e94440e2da301f48d345e1937b315147f58c5dc4992feb045324651d" -dependencies = [ - "anyhow", - "bytemuck", - "hex", - "metal", - "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "risc0-zkp 2.0.1", - "tracing", -] - -[[package]] -name = "risc0-circuit-rv32im" -version = "2.0.1" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "anyhow", - "bit-vec", - "bytemuck", - "derive_more 2.0.1", - "paste", - "risc0-binfmt 2.0.0", - "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", - "risc0-zkp 2.0.0", - "serde", - "tracing", -] - -[[package]] -name = "risc0-circuit-rv32im" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f6ed144d8b8f93c4a6096e3dd90f9dcbd91eff83eae690a72fd6e640760b94" -dependencies = [ - "anyhow", - "bit-vec", - "bytemuck", - "derive_more 2.0.1", - "paste", - "risc0-binfmt 2.0.1", - "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "risc0-zkp 2.0.1", - "serde", - "tracing", -] - -[[package]] -name = "risc0-core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317bbf70a8750b64d4fd7a2bdc9d7d5f30d8bb305cae486962c797ef35c8d08e" -dependencies = [ - "bytemuck", - "bytemuck_derive", - "rand_core 0.6.4", -] - -[[package]] -name = "risc0-core" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "bytemuck", - "bytemuck_derive", - "rand_core 0.6.4", -] - -[[package]] -name = "risc0-groth16" -version = "1.4.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "anyhow", - "ark-bn254", - "ark-ec", - "ark-groth16", - "ark-serialize 0.5.0", - "bytemuck", - "hex", - "num-bigint 0.4.6", - "num-traits", - "risc0-binfmt 2.0.0", - "risc0-zkp 2.0.0", - "serde", - "stability", -] - -[[package]] -name = "risc0-groth16" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b31cb7b2a46f0cdaf71803ea7e0389af9f5bc1aea2531106f2972b241f26e98" -dependencies = [ - "anyhow", - "ark-bn254", - "ark-ec", - "ark-groth16", - "ark-serialize 0.5.0", - "bytemuck", - "hex", - "num-bigint 0.4.6", - "num-traits", - "risc0-binfmt 2.0.1", - "risc0-zkp 2.0.1", - "serde", - "stability", -] - -[[package]] -name = "risc0-zkos-v1compat" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "include_bytes_aligned", - "no_std_strings", -] - -[[package]] -name = "risc0-zkos-v1compat" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f76c479b69d1987cb54ac72dcc017197296fdcd6daf78fafc10cbbd3a167a7de" -dependencies = [ - "include_bytes_aligned", - "no_std_strings", -] - -[[package]] -name = "risc0-zkp" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "anyhow", - "blake2", - "borsh", - "bytemuck", - "cfg-if", - "digest 0.10.7", - "hex", - "hex-literal", - "metal", - "paste", - "rand_core 0.6.4", - "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", - "risc0-zkvm-platform 2.0.1", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-rustls 0.24.2", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", "serde", - "sha2", - "stability", - "tracing", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration 0.5.1", + "tokio", + "tokio-rustls 0.24.1", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.25.4", + "winreg", ] [[package]] -name = "risc0-zkp" -version = "2.0.1" +name = "reqwest" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa210a232361fd671b30918469856b64d715f2564956d0a5df97ab6cb116d28b" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ - "anyhow", - "blake2", - "borsh", - "bytemuck", - "cfg-if", - "digest 0.10.7", - "hex", - "hex-literal", - "metal", - "paste", - "rand_core 0.6.4", - "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "risc0-zkvm-platform 2.0.2", + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.10", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.6.0", + "hyper-rustls 0.27.5", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.27", + "rustls-pemfile 2.2.0", + "rustls-pki-types", "serde", - "sha2", - "stability", - "tracing", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "system-configuration 0.6.1", + "tokio", + "tokio-native-tls", + "tokio-rustls 0.26.2", + "tokio-util", + "tower 0.5.2", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots 0.26.11", + "windows-registry", ] [[package]] -name = "risc0-zkvm" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +name = "reqwest-middleware" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" dependencies = [ "anyhow", - "borsh", - "bytemuck", - "derive_more 2.0.1", - "getrandom 0.2.16", - "hex", - "risc0-binfmt 2.0.0", - "risc0-circuit-keccak 1.4.0", - "risc0-circuit-recursion 1.4.0", - "risc0-circuit-rv32im 2.0.1", - "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", - "risc0-groth16 1.4.0", - "risc0-zkos-v1compat 2.0.0", - "risc0-zkp 2.0.0", - "risc0-zkvm-platform 2.0.1", - "rrs-lib", - "semver 1.0.26", + "async-trait", + "http 1.3.1", + "reqwest 0.12.15", "serde", - "sha2", - "stability", - "tracing", + "thiserror 1.0.69", + "tower-service", ] [[package]] -name = "risc0-zkvm" -version = "2.0.2" +name = "rfc6979" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a049319790277845335445b549d49e66341f4a7ffba7f7aaa1e77e2fc4a9c19" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "anyhow", - "bincode", - "bonsai-sdk", - "borsh", - "bytemuck", - "bytes", - "derive_more 2.0.1", - "getrandom 0.2.16", - "hex", - "lazy-regex", - "prost", - "risc0-binfmt 2.0.1", - "risc0-build", - "risc0-circuit-keccak 2.0.1", - "risc0-circuit-recursion 2.0.1", - "risc0-circuit-rv32im 2.0.3", - "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "risc0-groth16 2.0.1", - "risc0-zkos-v1compat 2.0.1", - "risc0-zkp 2.0.1", - "risc0-zkvm-platform 2.0.2", - "rrs-lib", - "rzup", - "semver 1.0.26", - "serde", - "sha2", - "stability", - "tempfile", - "tracing", + "hmac", + "subtle", ] [[package]] -name = "risc0-zkvm-platform" -version = "2.0.1" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" dependencies = [ - "bytemuck", - "cfg-if", - "getrandom 0.2.16", - "libm", - "stability", + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", ] [[package]] -name = "risc0-zkvm-platform" -version = "2.0.2" +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e4de2938eaf24892ef927d9cef6e4acb6a19ce01c017cd498533896f633f332" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ - "bytemuck", + "cc", "cfg-if", "getrandom 0.2.16", - "getrandom 0.3.2", - "libm", - "stability", + "libc", + "untrusted 0.9.0", + "windows-sys 0.52.0", ] [[package]] -name = "risc0_state_transition_program" -version = "0.1.0" +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "risc0-zkvm 2.0.0", - "serde", - "serde_json", + "digest 0.10.7", ] [[package]] @@ -4887,17 +5140,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ "bytes", + "rlp-derive", "rustc-hex", ] [[package]] -name = "rrs-lib" +name = "rlp-derive" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" +checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" dependencies = [ - "downcast-rs", - "paste", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -4907,7 +5162,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3372685893a9f67d18e98e792d690017287fd17379a83d798d958e517d380fa9" dependencies = [ "downcast-rs", - "num_enum", + "num_enum 0.5.11", "paste", ] @@ -4999,6 +5254,18 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.14", + "rustls-webpki 0.101.7", + "sct", +] + [[package]] name = "rustls" version = "0.23.27" @@ -5007,9 +5274,9 @@ checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ "log", "once_cell", - "ring", + "ring 0.17.14", "rustls-pki-types", - "rustls-webpki", + "rustls-webpki 0.103.3", "subtle", "zeroize", ] @@ -5023,7 +5290,16 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 3.2.0", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", ] [[package]] @@ -5047,13 +5323,23 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.2" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.14", + "untrusted 0.9.0", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7149975849f1abb3832b246010ef62ccc80d3a76169517ada7188252b9cfb437" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ - "ring", + "ring 0.17.14", "rustls-pki-types", - "untrusted", + "untrusted 0.9.0", ] [[package]] @@ -5081,18 +5367,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] -name = "rzup" -version = "0.4.1" +name = "salsa20" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "400558bf12d4292a7804093b60a437ba8b0219ea7d53716b2c010a0d31e5f4a8" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" dependencies = [ - "semver 1.0.26", - "serde", - "strum", - "tempfile", - "thiserror 2.0.12", - "toml", - "yaml-rust2", + "cipher", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", ] [[package]] @@ -5143,6 +5432,28 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "scrypt" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" +dependencies = [ + "hmac", + "pbkdf2 0.11.0", + "salsa20", + "sha2", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.14", + "untrusted 0.9.0", +] + [[package]] name = "sdd" version = "3.0.8" @@ -5164,6 +5475,19 @@ dependencies = [ "zeroize", ] +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + [[package]] name = "security-framework" version = "3.2.0" @@ -5214,6 +5538,18 @@ dependencies = [ "pest", ] +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + [[package]] name = "serde" version = "1.0.219" @@ -5256,6 +5592,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "serde_spanned" version = "0.6.8" @@ -5283,7 +5630,7 @@ version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ - "base64", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", @@ -5342,6 +5689,17 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + [[package]] name = "sha2" version = "0.10.9" @@ -5391,6 +5749,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + [[package]] name = "shlex" version = "1.3.0" @@ -5416,6 +5780,24 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simple_asn1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "thiserror 2.0.12", + "time", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "size" version = "0.4.1" @@ -5460,6 +5842,20 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "solang-parser" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" +dependencies = [ + "itertools 0.11.0", + "lalrpop", + "lalrpop-util", + "phf", + "thiserror 1.0.69", + "unicode-xid", +] + [[package]] name = "sp1-build" version = "4.2.0" @@ -5467,7 +5863,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0b45dd7a9d3703f82b1f5e8fdd6c5fb8af1e3b4037f1ffc533435717d567a56" dependencies = [ "anyhow", - "cargo_metadata 0.18.1", + "cargo_metadata", "chrono", "clap", "dirs", @@ -5563,7 +5959,7 @@ dependencies = [ "thiserror 1.0.69", "tracing", "tracing-forest", - "tracing-subscriber 0.3.19", + "tracing-subscriber", "typenum", "web-time", ] @@ -5690,7 +6086,7 @@ dependencies = [ "thiserror 1.0.69", "tracing", "tracing-appender", - "tracing-subscriber 0.3.19", + "tracing-subscriber", ] [[package]] @@ -5856,7 +6252,7 @@ dependencies = [ "p3-field", "p3-fri", "prost", - "reqwest", + "reqwest 0.12.15", "reqwest-middleware", "serde", "serde_json", @@ -5940,8 +6336,15 @@ dependencies = [ "serde_json", "sha3 0.10.8 (git+https://github.com/sp1-patches/RustCrypto-hashes?tag=sha3-v0.10.8-patch-v1)", "sp1-zkvm", + "types", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + [[package]] name = "spin" version = "0.9.8" @@ -5958,16 +6361,6 @@ dependencies = [ "der", ] -[[package]] -name = "stability" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" -dependencies = [ - "quote", - "syn 2.0.101", -] - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -5980,6 +6373,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + [[package]] name = "strsim" version = "0.11.1" @@ -6024,7 +6429,27 @@ dependencies = [ name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svm-rs" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" +dependencies = [ + "dirs", + "fs2", + "hex", + "once_cell", + "reqwest 0.11.27", + "semver 1.0.26", + "serde", + "serde_json", + "sha2", + "thiserror 1.0.69", + "url", + "zip", +] [[package]] name = "syn" @@ -6060,6 +6485,12 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "sync_wrapper" version = "1.0.2" @@ -6095,6 +6526,48 @@ dependencies = [ "windows", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.9.0", + "core-foundation 0.9.4", + "system-configuration-sys 0.6.0", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tap" version = "1.0.1" @@ -6108,12 +6581,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ "fastrand", - "getrandom 0.3.2", + "getrandom 0.3.3", "once_cell", "rustix", "windows-sys 0.59.0", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -6215,9 +6699,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -6267,13 +6751,33 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.12", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls", + "rustls 0.23.27", "tokio", ] @@ -6288,6 +6792,35 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", + "tungstenite 0.20.1", + "webpki-roots 0.25.4", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" +dependencies = [ + "futures-util", + "log", + "native-tls", + "tokio", + "tokio-native-tls", + "tungstenite 0.23.0", +] + [[package]] name = "tokio-util" version = "0.7.15" @@ -6362,23 +6895,23 @@ dependencies = [ "async-stream", "async-trait", "axum", - "base64", + "base64 0.22.1", "bytes", - "h2", - "http", - "http-body", + "h2 0.4.10", + "http 1.3.1", + "http-body 1.0.1", "http-body-util", - "hyper", + "hyper 1.6.0", "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", "prost", "rustls-native-certs", - "rustls-pemfile", + "rustls-pemfile 2.2.0", "socket2", "tokio", - "tokio-rustls", + "tokio-rustls 0.26.2", "tokio-stream", "tower 0.4.13", "tower-layer", @@ -6415,7 +6948,7 @@ dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", "tower-layer", "tower-service", @@ -6455,7 +6988,7 @@ dependencies = [ "crossbeam-channel", "thiserror 1.0.69", "time", - "tracing-subscriber 0.3.19", + "tracing-subscriber", ] [[package]] @@ -6489,26 +7022,27 @@ dependencies = [ "smallvec", "thiserror 1.0.69", "tracing", - "tracing-subscriber 0.3.19", + "tracing-subscriber", ] [[package]] -name = "tracing-log" -version = "0.2.0" +name = "tracing-futures" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" dependencies = [ - "log", - "once_cell", - "tracing-core", + "pin-project", + "tracing", ] [[package]] -name = "tracing-subscriber" -version = "0.2.25" +name = "tracing-log" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ + "log", + "once_cell", "tracing-core", ] @@ -6536,6 +7070,45 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 0.2.12", + "httparse", + "log", + "rand 0.8.5", + "rustls 0.21.12", + "sha1", + "thiserror 1.0.69", + "url", + "utf-8", +] + +[[package]] +name = "tungstenite" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 1.3.1", + "httparse", + "log", + "native-tls", + "rand 0.8.5", + "sha1", + "thiserror 1.0.69", + "utf-8", +] + [[package]] name = "twirp-rs" version = "0.13.0-succinct" @@ -6545,11 +7118,11 @@ dependencies = [ "async-trait", "axum", "futures", - "http", + "http 1.3.1", "http-body-util", - "hyper", + "hyper 1.6.0", "prost", - "reqwest", + "reqwest 0.12.15", "serde", "serde_json", "thiserror 1.0.69", @@ -6564,6 +7137,17 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "types" +version = "0.1.0" +dependencies = [ + "lambdaworks-crypto", + "primitive-types", + "serde", + "serde_json", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ucd-trie" version = "0.1.7" @@ -6606,6 +7190,12 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + [[package]] name = "untrusted" version = "0.9.0" @@ -6624,10 +7214,10 @@ dependencies = [ ] [[package]] -name = "utf16_iter" -version = "1.0.5" +name = "utf-8" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "utf8_iter" @@ -6641,12 +7231,28 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.16", + "serde", +] + [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "vec_map" version = "0.8.2" @@ -6671,6 +7277,16 @@ dependencies = [ "libc", ] +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -6799,6 +7415,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + [[package]] name = "webpki-roots" version = "0.26.11" @@ -6833,6 +7455,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -7167,6 +7798,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" @@ -7177,16 +7818,29 @@ dependencies = [ ] [[package]] -name = "write16" -version = "1.0.0" +name = "writeable" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] -name = "writeable" -version = "0.5.5" +name = "ws_stream_wasm" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.1", + "send_wrapper 0.6.0", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] [[package]] name = "wyz" @@ -7198,21 +7852,16 @@ dependencies = [ ] [[package]] -name = "yaml-rust2" -version = "0.9.0" +name = "yansi" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a1a1c0bc9823338a3bdf8c61f994f23ac004c6fa32c08cd152984499b445e8d" -dependencies = [ - "arraydeque", - "encoding_rs", - "hashlink", -] +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -7222,9 +7871,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", @@ -7232,33 +7881,13 @@ dependencies = [ "synstructure", ] -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - [[package]] name = "zerocopy" version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "zerocopy-derive 0.8.25", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", + "zerocopy-derive", ] [[package]] @@ -7313,11 +7942,22 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -7326,15 +7966,35 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", "syn 2.0.101", ] +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq 0.1.5", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2 0.11.0", + "sha1", + "time", + "zstd", +] + [[package]] name = "zkhash" version = "0.2.0" @@ -7361,3 +8021,32 @@ dependencies = [ "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", "subtle", ] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.15+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/examples/L2/Cargo.toml b/examples/L2/Cargo.toml index fd93e8bec7..cff82650c3 100644 --- a/examples/L2/Cargo.toml +++ b/examples/L2/Cargo.toml @@ -1,27 +1,18 @@ -[package] -name = "proof_aggregator" +[workspace] +resolver = "2" +members = ["crates/l2", "crates/types"] + +[workspace.package] version = "0.1.0" edition = "2021" - -[dependencies] +[workspace.dependencies] serde = { version = "1.0.203", features = ["derive"] } serde_json = "1.0.117" -sp1-sdk = "4.1.3" -sp1_state_transition_program = { path = "./zkvm_programs/sp1/" } -risc0-zkvm = { version = "2.0.1" } -risc0_state_transition_program = { path = "./zkvm_programs/risc0/" } +primitive-types = { version = "0.12.0", features = ["serde"] } lambdaworks-crypto = { git = "https://github.com/lambdaclass/lambdaworks.git", rev = "5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b", features = ["serde"]} sha3 = "0.10.8" -primitive-types = { version = "0.12.0", features = ["serde"] } -rand = "0.8" - -[build-dependencies] -sp1-build = { version = "4.1.3" } -risc0-build = { version = "2.0.0" } - -[package.metadata.risc0] -methods = ["./zkvm_programs/risc0"] +types = { path = "crates/types" } [profile.release] opt-level = 3 diff --git a/examples/L2/crates/l2/Cargo.lock b/examples/L2/crates/l2/Cargo.lock new file mode 100644 index 0000000000..4e42866a44 --- /dev/null +++ b/examples/L2/crates/l2/Cargo.lock @@ -0,0 +1,7362 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addchain" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" +dependencies = [ + "num-bigint 0.3.3", + "num-integer", + "num-traits", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy 0.7.35", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy-consensus" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2179ba839ac532f50279f5da2a6c5047f791f03f6f808b4dfab11327b97902f" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "auto_impl", + "c-kzg", + "derive_more 2.0.1", + "either", + "k256", + "once_cell", + "rand 0.8.5", + "serde", + "serde_with", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-consensus-any" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aec6f67bdc62aa277e0ec13c1b1fb396c8a62b65c8e9bd8c1d3583cc6d1a8dd3" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-eip2124" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "crc", + "serde", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-eip2930" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b82752a889170df67bbb36d42ca63c531eb16274f0d7299ae2a680facba17bd" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804cefe429015b4244966c006d25bda5545fa9db5990e9c9079faf255052f50a" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-eips" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "609515c1955b33af3d78d26357540f68c5551a90ef58fd53def04f2aa074ec43" +dependencies = [ + "alloy-eip2124", + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "auto_impl", + "c-kzg", + "derive_more 2.0.1", + "either", + "serde", + "sha2", +] + +[[package]] +name = "alloy-json-abi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0068ae277f5ee3153a95eaea8ff10e188ed8ccde9b7f9926305415a2c0ab2442" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3994ab6ff6bdeb5aebe65381a8f6a47534789817570111555e8ac413e242ce06" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0be3aa020a6d3aa7601185b4c1a7d6f3a5228cb5424352db63064b29a455c891" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "derive_more 2.0.1", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498f2ee2eef38a6db0fc810c7bf7daebdf5f2fa8d04adb8bd53e54e91ddbdea3" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a12fe11d0b8118e551c29e1a67ccb6d01cc07ef08086df30f07487146de6fa1" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 2.0.1", + "foldhash", + "hashbrown 0.15.3", + "indexmap 2.9.0", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.9.1", + "ruint", + "rustc-hash 2.1.1", + "serde", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1a40595b927dfb07218459037837dbc8de8500a26024bb6ff0548dd2ccc13e0" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2a9f64e0f69cfb6029e2a044519a1bdd44ce9fc334d5315a7b9837f7a6748e5" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.14.0", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-serde" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4dba6ff08916bc0a9cbba121ce21f67c0b554c39cf174bc7b9df6c651bd3c3b" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c580da7f00f3999e44e327223044d6732358627f93043e22d92c583f6583556" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "either", + "elliptic-curve", + "k256", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-signer-local" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00f0f07862bd8f6bc66c953660693c5903062c2c9d308485b2a6eee411089e7" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand 0.8.5", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-sol-macro" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d3ef8e0d622453d969ba3cded54cf6800efdc85cb929fe22c5bdf8335666757" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0e84bd0693c69a8fbe3ec0008465e029c6293494df7cb07580bf4a33eff52e1" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap 2.9.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.101", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3de663412dadf9b64f4f92f507f78deebcc92339d12cf15f88ded65d41c7935" +dependencies = [ + "const-hex", + "dunce", + "heck 0.5.0", + "macro-string", + "proc-macro2", + "quote", + "syn 2.0.101", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "251273c5aa1abb590852f795c938730fa641832fc8fa77b5478ed1bf11b6097e" +dependencies = [ + "serde", + "winnow 0.7.10", +] + +[[package]] +name = "alloy-sol-types" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5460a975434ae594fe2b91586253c1beb404353b78f0a55bf124abcd79557b15" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-trie" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "983d99aa81f586cef9dae38443245e585840fcf0fc58b09aee0b1f27aed1d500" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more 2.0.1", + "nybbles", + "serde", + "smallvec", + "tracing", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-r1cs-std", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" +dependencies = [ + "ahash", + "ark-crypto-primitives-macros", + "ark-ec", + "ark-ff 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-snark", + "ark-std 0.5.0", + "blake2", + "derivative", + "digest 0.10.7", + "fnv", + "merlin", + "sha2", +] + +[[package]] +name = "ark-crypto-primitives-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.3", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-groth16" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff 0.5.0", + "ark-poly", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.3", +] + +[[package]] +name = "ark-r1cs-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-relations", + "ark-std 0.5.0", + "educe", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "tracing", +] + +[[package]] +name = "ark-relations" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" +dependencies = [ + "ark-ff 0.5.0", + "ark-std 0.5.0", + "tracing", + "tracing-subscriber 0.2.25", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ark-snark" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" +dependencies = [ + "ark-ff 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower 0.5.2", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "futures-core", + "getrandom 0.2.16", + "instant", + "pin-project-lite", + "rand 0.8.5", + "tokio", +] + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "serde", + "windows-targets 0.52.6", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bindgen" +version = "0.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +dependencies = [ + "bitflags 2.9.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.101", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "bls12_381" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3c196a77437e7cc2fb515ce413a6401291578b5afc8ecb29a3c7ab957f05941" +dependencies = [ + "ff 0.12.1", + "group 0.12.1", + "pairing", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "blst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "bonsai-sdk" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bce8d6acc5286a16e94c29e9c885d1869358885e08a6feeb6bc54e36fe20055" +dependencies = [ + "duplicate", + "maybe-async", + "reqwest", + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "borsh" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +dependencies = [ + "once_cell", + "proc-macro-crate 3.3.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "bytemuck" +version = "1.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] + +[[package]] +name = "c-kzg" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7318cfa722931cb5fe0838b98d3ce5621e75f6a6408abc21721d80de9223f2e4" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.26", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.26", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "cbindgen" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fce8dd7fcfcbf3a0a87d8f515194b49d6135acab73e18bd380d1d93bb1a15eb" +dependencies = [ + "clap", + "heck 0.4.1", + "indexmap 2.9.0", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.101", + "tempfile", + "toml", +] + +[[package]] +name = "cc" +version = "1.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" +dependencies = [ + "shlex", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", +] + +[[package]] +name = "const-hex" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array 0.14.7", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array 0.14.7", + "typenum", +] + +[[package]] +name = "ctrlc" +version = "3.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "697b5419f348fd5ae2478e8018cb016c00a5881c7f46c717de98ffd135a5651c" +dependencies = [ + "nix", + "windows-sys 0.59.0", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.101", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "dashu" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b3e5ac1e23ff1995ef05b912e2b012a8784506987a2651552db2c73fb3d7e0" +dependencies = [ + "dashu-base", + "dashu-float", + "dashu-int", + "dashu-macros", + "dashu-ratio", + "rustversion", +] + +[[package]] +name = "dashu-base" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b80bf6b85aa68c58ffea2ddb040109943049ce3fbdf4385d0380aef08ef289" + +[[package]] +name = "dashu-float" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85078445a8dbd2e1bd21f04a816f352db8d333643f0c9b78ca7c3d1df71063e7" +dependencies = [ + "dashu-base", + "dashu-int", + "num-modular", + "num-order", + "rustversion", + "static_assertions", +] + +[[package]] +name = "dashu-int" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee99d08031ca34a4d044efbbb21dff9b8c54bb9d8c82a189187c0651ffdb9fbf" +dependencies = [ + "cfg-if", + "dashu-base", + "num-modular", + "num-order", + "rustversion", + "static_assertions", +] + +[[package]] +name = "dashu-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93381c3ef6366766f6e9ed9cf09e4ef9dec69499baf04f0c60e70d653cf0ab10" +dependencies = [ + "dashu-base", + "dashu-float", + "dashu-int", + "dashu-ratio", + "paste", + "proc-macro2", + "quote", + "rustversion", +] + +[[package]] +name = "dashu-ratio" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e33b04dd7ce1ccf8a02a69d3419e354f2bbfdf4eb911a0b7465487248764c9" +dependencies = [ + "dashu-base", + "dashu-float", + "dashu-int", + "num-modular", + "num-order", + "rustversion", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn 2.0.101", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "docker-generate" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf673e0848ef09fa4aeeba78e681cf651c0c7d35f76ee38cec8e55bc32fa111" + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "downloader" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ac1e888d6830712d565b2f3a974be3200be9296bc1b03db8251a4cbf18a4a34" +dependencies = [ + "digest 0.10.7", + "futures", + "rand 0.8.5", + "reqwest", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "duplicate" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de78e66ac9061e030587b2a2e75cc88f22304913c907b11307bca737141230cb" +dependencies = [ + "heck 0.4.1", + "proc-macro-error", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "serdect", + "signature", + "spki", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] + +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff 0.13.1", + "generic-array 0.14.7", + "group 0.13.0", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", + "serde", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "eventsource-stream" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab" +dependencies = [ + "futures-core", + "nom", + "pin-project-lite", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "bitvec", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "bitvec", + "byteorder", + "ff_derive", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "ff_derive" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f10d12652036b0e99197587c6ba87a8fc3031986499973c030d8b44fcc151b60" +dependencies = [ + "addchain", + "num-bigint 0.3.3", + "num-integer", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "gcd" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" + +[[package]] +name = "gen_ops" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "304de19db7028420975a296ab0fcbbc8e69438c4ed254a1e41e2a7f37d5f0e0a" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "generic-array" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96512db27971c2c3eece70a1e106fbe6c87760234e31e8f7e5634912fe52794a" +dependencies = [ + "serde", + "typenum", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "memuse", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.1", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.9.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "halo2" +version = "0.1.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a23c779b38253fe1538102da44ad5bd5378495a61d2c4ee18d64eaa61ae5995" +dependencies = [ + "halo2_proofs", +] + +[[package]] +name = "halo2_proofs" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e925780549adee8364c7f2b685c753f6f3df23bde520c67416e93bf615933760" +dependencies = [ + "blake2b_simd", + "ff 0.12.1", + "group 0.12.1", + "pasta_curves 0.4.1", + "rand_core 0.6.4", + "rayon", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", +] + +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 0.26.11", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "libc", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.61.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "include_bytes_aligned" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.3", + "serde", +] + +[[package]] +name = "indicatif" +version = "0.17.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width", + "web-time", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jubjub" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a575df5f985fe1cd5b2b05664ff6accfc46559032b954529fd225a2168d27b0f" +dependencies = [ + "bitvec", + "bls12_381", + "ff 0.12.1", + "group 0.12.1", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "serdect", + "sha2", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "lambdaworks-crypto" +version = "0.12.0" +source = "git+https://github.com/lambdaclass/lambdaworks.git?rev=5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b#5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b" +dependencies = [ + "lambdaworks-math", + "rand 0.8.5", + "rand_chacha 0.3.1", + "serde", + "sha2", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lambdaworks-math" +version = "0.12.0" +source = "git+https://github.com/lambdaclass/lambdaworks.git?rev=5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b#5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b" +dependencies = [ + "getrandom 0.2.16", + "rand 0.8.5", + "serde", + "serde_json", +] + +[[package]] +name = "lazy-regex" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60c7310b93682b36b98fa7ea4de998d3463ccbebd94d935d6b48ba5b6ffa7126" +dependencies = [ + "lazy-regex-proc_macros", + "once_cell", + "regex", +] + +[[package]] +name = "lazy-regex-proc_macros" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba01db5ef81e17eb10a5e0f2109d1b3a3e29bac3070fdbd7d156bf7dbd206a1" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.101", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.0", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.3", +] + +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "maybe-async" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memuse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d97bbf43eb4f088f8ca469930cde17fa036207c9a5e02ccc5107c4e8b17c964" + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.9.0", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.9.0", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "no_std_strings" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b0c77c1b780822bc749a33e39aeb2c07584ab93332303babeabb645298a76e" + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint 0.4.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-modular" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f" + +[[package]] +name = "num-order" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6" +dependencies = [ + "num-modular", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint 0.4.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "nybbles" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" +dependencies = [ + "alloy-rlp", + "const-hex", + "proptest", + "serde", + "smallvec", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p3-air" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3079235eaa131553ae7ff992317ebeb1d431d238896315672869570ef0c38d" +dependencies = [ + "p3-field", + "p3-matrix", +] + +[[package]] +name = "p3-baby-bear" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ecc3edc6fb8186268e05031c26a8b2b1e567957d63adcae1026d55d6bb189b" +dependencies = [ + "num-bigint 0.4.6", + "p3-field", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-bn254-fr" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e3df8d85259448803639657a4aafdf4caad9422f9be6264187f179fa0bc761" +dependencies = [ + "ff 0.13.1", + "num-bigint 0.4.6", + "p3-field", + "p3-poseidon2", + "p3-symmetric", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-challenger" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11466fe23e14dd6d61512c8ce5a068de87e3d92954058b05b24ae12b7824a960" +dependencies = [ + "p3-field", + "p3-maybe-rayon", + "p3-symmetric", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "p3-commit" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30877bdc426bfa5ebb0033dbc45ba1b083dfeb0db7ad7628c72a5be7562324ce" +dependencies = [ + "itertools 0.12.1", + "p3-challenger", + "p3-field", + "p3-matrix", + "p3-util", + "serde", +] + +[[package]] +name = "p3-dft" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eece7b035978976138622b116fefe6c4cc372b1ce70739c40e7a351a9bb68f1f" +dependencies = [ + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-field" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f0edf3fde4fd0d1455e901fc871c558010ae18db6e68f1b0fa111391855316" +dependencies = [ + "itertools 0.12.1", + "num-bigint 0.4.6", + "num-traits", + "p3-util", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-fri" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07df36a633712e2a73387674a7e1922f3e58bc28b4e55359b2d3749e146f8faa" +dependencies = [ + "itertools 0.12.1", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-interpolation", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "p3-interpolation" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a09b01809167d6e39e8a34779eb2d5fca50d0ff7b2d13661953b46dc74bf1619" +dependencies = [ + "p3-field", + "p3-matrix", + "p3-util", +] + +[[package]] +name = "p3-keccak-air" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f6bacf49ba7c1d9c436994ace80a96c3532462c655e4339919d5b397035e56" +dependencies = [ + "p3-air", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-matrix" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60961b4d7ffd2e8412ce4e66e213de610356df71cc4e396519c856a664138a27" +dependencies = [ + "itertools 0.12.1", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand 0.8.5", + "serde", + "tracing", +] + +[[package]] +name = "p3-maybe-rayon" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bbe762738c382c9483410f52348ab9de41bb42c391e8171643a71486cf1ef8f" +dependencies = [ + "rayon", +] + +[[package]] +name = "p3-mds" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4127956cc6c783b7d021c5c42d5d89456d5f3bda4a7b165fcc2a3fd4e78fbede" +dependencies = [ + "itertools 0.12.1", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-symmetric", + "p3-util", + "rand 0.8.5", +] + +[[package]] +name = "p3-merkle-tree" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f7eff1ddec74ee4178b40b2b4630f4bf5a02abf2d9619c8c4f8295e59d02a1" +dependencies = [ + "itertools 0.12.1", + "p3-commit", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-symmetric", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "p3-poseidon2" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be09497da406a98e89dc05c1ce539eeef29541bad61a5b2108a44ffe94dd0b4c" +dependencies = [ + "gcd", + "p3-field", + "p3-mds", + "p3-symmetric", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "p3-symmetric" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7d954033f657d48490344ca4b3dbcc054962a0e92831b736666bb2f5e5820b" +dependencies = [ + "itertools 0.12.1", + "p3-field", + "serde", +] + +[[package]] +name = "p3-uni-stark" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064b3923492d182e768dff8a19a36d7742b0166dbff75455fdc99187d3115dd3" +dependencies = [ + "itertools 0.12.1", + "p3-air", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "p3-util" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6ce0b6bee23fd54e05306f6752ae80b0b71a91166553ab39d7899801497237" +dependencies = [ + "serde", +] + +[[package]] +name = "pairing" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" +dependencies = [ + "group 0.12.1", +] + +[[package]] +name = "parity-scale-codec" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" +dependencies = [ + "proc-macro-crate 3.3.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "pasta_curves" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc65faf8e7313b4b1fbaa9f7ca917a0eed499a9663be71477f87993604341d8" +dependencies = [ + "blake2b_simd", + "ff 0.12.1", + "group 0.12.1", + "lazy_static", + "rand 0.8.5", + "static_assertions", + "subtle", +] + +[[package]] +name = "pasta_curves" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" +dependencies = [ + "blake2b_simd", + "ff 0.13.1", + "group 0.13.0", + "lazy_static", + "rand 0.8.5", + "static_assertions", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +dependencies = [ + "memchr", + "thiserror 2.0.12", + "ucd-trie", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "portable-atomic" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[package]] +name = "postcard" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.25", +] + +[[package]] +name = "prettyplease" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +dependencies = [ + "proc-macro2", + "syn 2.0.101", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-serde", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit 0.22.26", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proof_aggregator" +version = "0.1.0" +dependencies = [ + "lambdaworks-crypto", + "primitive-types", + "rand 0.8.5", + "risc0-zkvm 2.0.2", + "risc0_state_transition_program", + "serde", + "serde_json", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", + "sp1-build", + "sp1-sdk", + "sp1_state_transition_program", +] + +[[package]] +name = "proptest" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.9.0", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax 0.8.5", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quinn" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.1", + "rustls", + "socket2", + "thiserror 2.0.12", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcbafbbdbb0f638fe3f35f3c56739f77a8a1d070cb25603226c83339b391472b" +dependencies = [ + "bytes", + "getrandom 0.3.2", + "rand 0.9.1", + "ring", + "rustc-hash 2.1.1", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.12", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "serde", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", + "serde", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "range-set-blaze" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8421b5d459262eabbe49048d362897ff3e3830b44eac6cfe341d6acb2f0f13d2" +dependencies = [ + "gen_ops", + "itertools 0.12.1", + "num-integer", + "num-traits", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rayon-scan" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f87cc11a0140b4b0da0ffc889885760c61b13672d80a908920b2c0df078fa14" +dependencies = [ + "rayon", +] + +[[package]] +name = "redox_syscall" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower 0.5.2", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots 0.26.11", + "windows-registry", +] + +[[package]] +name = "reqwest-middleware" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" +dependencies = [ + "anyhow", + "async-trait", + "http", + "reqwest", + "serde", + "thiserror 1.0.69", + "tower-service", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "risc0-binfmt" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "borsh", + "derive_more 2.0.1", + "elf", + "lazy_static", + "postcard", + "risc0-zkp 2.0.0", + "risc0-zkvm-platform 2.0.1", + "semver 1.0.26", + "serde", + "tracing", +] + +[[package]] +name = "risc0-binfmt" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fe7599ac55ad77515608ec42a9727001559fe4f579c533cb7c973b54800c05" +dependencies = [ + "anyhow", + "borsh", + "derive_more 2.0.1", + "elf", + "lazy_static", + "postcard", + "risc0-zkp 2.0.1", + "risc0-zkvm-platform 2.0.2", + "semver 1.0.26", + "serde", + "tracing", +] + +[[package]] +name = "risc0-build" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31d104165340cba919a3dac26c4be7da04b20b941601a7ad50c04834c4d26de5" +dependencies = [ + "anyhow", + "cargo_metadata 0.19.2", + "derive_builder", + "dirs", + "docker-generate", + "hex", + "risc0-binfmt 2.0.1", + "risc0-zkos-v1compat 2.0.1", + "risc0-zkp 2.0.1", + "risc0-zkvm-platform 2.0.2", + "rzup", + "semver 1.0.26", + "serde", + "serde_json", + "stability", + "tempfile", +] + +[[package]] +name = "risc0-circuit-keccak" +version = "1.4.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "bytemuck", + "paste", + "risc0-binfmt 2.0.0", + "risc0-circuit-recursion 1.4.0", + "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", + "risc0-zkp 2.0.0", + "tracing", +] + +[[package]] +name = "risc0-circuit-keccak" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd8acfc84307ed1be64cf9fefc390963fc22b2865d027f03405977a0cfa9747" +dependencies = [ + "anyhow", + "bytemuck", + "paste", + "risc0-binfmt 2.0.1", + "risc0-circuit-recursion 2.0.1", + "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "risc0-zkp 2.0.1", + "tracing", +] + +[[package]] +name = "risc0-circuit-recursion" +version = "1.4.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "metal", + "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", + "risc0-zkp 2.0.0", + "tracing", +] + +[[package]] +name = "risc0-circuit-recursion" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd1514e94440e2da301f48d345e1937b315147f58c5dc4992feb045324651d" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "metal", + "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "risc0-zkp 2.0.1", + "tracing", +] + +[[package]] +name = "risc0-circuit-rv32im" +version = "2.0.1" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "bit-vec", + "bytemuck", + "derive_more 2.0.1", + "paste", + "risc0-binfmt 2.0.0", + "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", + "risc0-zkp 2.0.0", + "serde", + "tracing", +] + +[[package]] +name = "risc0-circuit-rv32im" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f6ed144d8b8f93c4a6096e3dd90f9dcbd91eff83eae690a72fd6e640760b94" +dependencies = [ + "anyhow", + "bit-vec", + "bytemuck", + "derive_more 2.0.1", + "paste", + "risc0-binfmt 2.0.1", + "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "risc0-zkp 2.0.1", + "serde", + "tracing", +] + +[[package]] +name = "risc0-core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317bbf70a8750b64d4fd7a2bdc9d7d5f30d8bb305cae486962c797ef35c8d08e" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "rand_core 0.6.4", +] + +[[package]] +name = "risc0-core" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "rand_core 0.6.4", +] + +[[package]] +name = "risc0-groth16" +version = "1.4.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ec", + "ark-groth16", + "ark-serialize 0.5.0", + "bytemuck", + "hex", + "num-bigint 0.4.6", + "num-traits", + "risc0-binfmt 2.0.0", + "risc0-zkp 2.0.0", + "serde", + "stability", +] + +[[package]] +name = "risc0-groth16" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b31cb7b2a46f0cdaf71803ea7e0389af9f5bc1aea2531106f2972b241f26e98" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ec", + "ark-groth16", + "ark-serialize 0.5.0", + "bytemuck", + "hex", + "num-bigint 0.4.6", + "num-traits", + "risc0-binfmt 2.0.1", + "risc0-zkp 2.0.1", + "serde", + "stability", +] + +[[package]] +name = "risc0-zkos-v1compat" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "include_bytes_aligned", + "no_std_strings", +] + +[[package]] +name = "risc0-zkos-v1compat" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f76c479b69d1987cb54ac72dcc017197296fdcd6daf78fafc10cbbd3a167a7de" +dependencies = [ + "include_bytes_aligned", + "no_std_strings", +] + +[[package]] +name = "risc0-zkp" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "blake2", + "borsh", + "bytemuck", + "cfg-if", + "digest 0.10.7", + "hex", + "hex-literal", + "metal", + "paste", + "rand_core 0.6.4", + "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", + "risc0-zkvm-platform 2.0.1", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkp" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa210a232361fd671b30918469856b64d715f2564956d0a5df97ab6cb116d28b" +dependencies = [ + "anyhow", + "blake2", + "borsh", + "bytemuck", + "cfg-if", + "digest 0.10.7", + "hex", + "hex-literal", + "metal", + "paste", + "rand_core 0.6.4", + "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "risc0-zkvm-platform 2.0.2", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkvm" +version = "2.0.0" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "anyhow", + "borsh", + "bytemuck", + "derive_more 2.0.1", + "getrandom 0.2.16", + "hex", + "risc0-binfmt 2.0.0", + "risc0-circuit-keccak 1.4.0", + "risc0-circuit-recursion 1.4.0", + "risc0-circuit-rv32im 2.0.1", + "risc0-core 2.0.0 (git+https://github.com/risc0/risc0?tag=v2.0.0)", + "risc0-groth16 1.4.0", + "risc0-zkos-v1compat 2.0.0", + "risc0-zkp 2.0.0", + "risc0-zkvm-platform 2.0.1", + "rrs-lib", + "semver 1.0.26", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkvm" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a049319790277845335445b549d49e66341f4a7ffba7f7aaa1e77e2fc4a9c19" +dependencies = [ + "anyhow", + "bincode", + "bonsai-sdk", + "borsh", + "bytemuck", + "bytes", + "derive_more 2.0.1", + "getrandom 0.2.16", + "hex", + "lazy-regex", + "prost", + "risc0-binfmt 2.0.1", + "risc0-build", + "risc0-circuit-keccak 2.0.1", + "risc0-circuit-recursion 2.0.1", + "risc0-circuit-rv32im 2.0.3", + "risc0-core 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "risc0-groth16 2.0.1", + "risc0-zkos-v1compat 2.0.1", + "risc0-zkp 2.0.1", + "risc0-zkvm-platform 2.0.2", + "rrs-lib", + "rzup", + "semver 1.0.26", + "serde", + "sha2", + "stability", + "tempfile", + "tracing", +] + +[[package]] +name = "risc0-zkvm-platform" +version = "2.0.1" +source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" +dependencies = [ + "bytemuck", + "cfg-if", + "getrandom 0.2.16", + "libm", + "stability", +] + +[[package]] +name = "risc0-zkvm-platform" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e4de2938eaf24892ef927d9cef6e4acb6a19ce01c017cd498533896f633f332" +dependencies = [ + "bytemuck", + "cfg-if", + "getrandom 0.2.16", + "getrandom 0.3.2", + "libm", + "stability", +] + +[[package]] +name = "risc0_state_transition_program" +version = "0.1.0" +dependencies = [ + "risc0-zkvm 2.0.0", + "serde", + "serde_json", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "rrs-lib" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" +dependencies = [ + "downcast-rs", + "paste", +] + +[[package]] +name = "rrs-succinct" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3372685893a9f67d18e98e792d690017287fd17379a83d798d958e517d380fa9" +dependencies = [ + "downcast-rs", + "num_enum", + "paste", +] + +[[package]] +name = "ruint" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78a46eb779843b2c4f21fac5773e25d6d5b7c8f0922876c91541790d2ca27eef" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rand 0.9.1", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.26", +] + +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7149975849f1abb3832b246010ef62ccc80d3a76169517ada7188252b9cfb437" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "rzup" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "400558bf12d4292a7804093b60a437ba8b0219ea7d53716b2c010a0d31e5f4a8" +dependencies = [ + "semver 1.0.26", + "serde", + "strum", + "tempfile", + "thiserror 2.0.12", + "toml", + "yaml-rust2", +] + +[[package]] +name = "scale-info" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" +dependencies = [ + "cfg-if", + "derive_more 1.0.0", + "parity-scale-codec", + "scale-info-derive", +] + +[[package]] +name = "scale-info-derive" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" +dependencies = [ + "proc-macro-crate 3.3.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "scc" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22b2d775fb28f245817589471dd49c5edf64237f4a19d10ce9a92ff4651a27f4" +dependencies = [ + "sdd", +] + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sdd" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "584e070911c7017da6cb2eb0788d09f43d789029b5877d3e5ecc8acf86ceee21" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array 0.14.7", + "pkcs8", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.9.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.9.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + +[[package]] +name = "serial_test" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b258109f244e1d6891bf1053a55d63a5cd4f8f4c30cf9a1280989f80e7a1fa9" +dependencies = [ + "futures", + "log", + "once_cell", + "parking_lot", + "scc", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "git+https://github.com/sp1-patches/RustCrypto-hashes?tag=sha3-v0.10.8-patch-v1#8f6d303c0861ba7e5adcc36207c0f41fe5edaabc" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "size" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fed904c7fb2856d868b92464fc8fa597fce366edea1a9cbfaa8cb5fe080bd6d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +dependencies = [ + "serde", +] + +[[package]] +name = "snowbridge-amcl" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460a9ed63cdf03c1b9847e8a12a5f5ba19c4efd5869e4a737e05be25d7c427e5" +dependencies = [ + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "socket2" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "sp1-build" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b45dd7a9d3703f82b1f5e8fdd6c5fb8af1e3b4037f1ffc533435717d567a56" +dependencies = [ + "anyhow", + "cargo_metadata 0.18.1", + "chrono", + "clap", + "dirs", +] + +[[package]] +name = "sp1-core-executor" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1988844b2273313bf1a3861684f7415f68c00d51139475fd3d72f2326fd6d" +dependencies = [ + "bincode", + "bytemuck", + "clap", + "elf", + "enum-map", + "eyre", + "hashbrown 0.14.5", + "hex", + "itertools 0.13.0", + "nohash-hasher", + "num", + "p3-baby-bear", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand 0.8.5", + "range-set-blaze", + "rrs-succinct", + "serde", + "serde_json", + "sp1-curves", + "sp1-primitives", + "sp1-stark", + "strum", + "strum_macros", + "subenum", + "thiserror 1.0.69", + "tiny-keccak", + "tracing", + "typenum", + "vec_map", +] + +[[package]] +name = "sp1-core-machine" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7911eeaa80da1eb55ce5bf4c9442d3f1cad85e6dae41601b3ce23d45c48a5871" +dependencies = [ + "bincode", + "cbindgen", + "cc", + "cfg-if", + "elliptic-curve", + "generic-array 1.1.0", + "glob", + "hashbrown 0.14.5", + "hex", + "itertools 0.13.0", + "k256", + "num", + "num_cpus", + "p256", + "p3-air", + "p3-baby-bear", + "p3-challenger", + "p3-field", + "p3-keccak-air", + "p3-matrix", + "p3-maybe-rayon", + "p3-poseidon2", + "p3-symmetric", + "p3-uni-stark", + "p3-util", + "pathdiff", + "rand 0.8.5", + "rayon", + "rayon-scan", + "serde", + "serde_json", + "size", + "snowbridge-amcl", + "sp1-core-executor", + "sp1-curves", + "sp1-derive", + "sp1-primitives", + "sp1-stark", + "static_assertions", + "strum", + "strum_macros", + "tempfile", + "thiserror 1.0.69", + "tracing", + "tracing-forest", + "tracing-subscriber 0.3.19", + "typenum", + "web-time", +] + +[[package]] +name = "sp1-cuda" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4bab3c90ca3408ac50cbff14d629205a5178fb3623a2e354a416d9d7560fe02" +dependencies = [ + "bincode", + "ctrlc", + "prost", + "serde", + "sp1-core-machine", + "sp1-prover", + "tokio", + "tracing", + "twirp-rs", +] + +[[package]] +name = "sp1-curves" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a198a00a1700ea0073a7481138abf256e3f38a15892c42721cdbec5d64d0f4e7" +dependencies = [ + "cfg-if", + "dashu", + "elliptic-curve", + "generic-array 1.1.0", + "itertools 0.13.0", + "k256", + "num", + "p256", + "p3-field", + "serde", + "snowbridge-amcl", + "sp1-primitives", + "sp1-stark", + "typenum", +] + +[[package]] +name = "sp1-derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24e3a9d2afa63fa83792c223084abf62c2cb3a60188651e9aa567e25e9fd344d" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sp1-lib" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3ef88f90458b6116da164e9c4c4596c49c8cca1944bfe02850b48b232a06b90" +dependencies = [ + "bincode", + "serde", + "sp1-primitives", +] + +[[package]] +name = "sp1-primitives" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc282347d405f23fc8a7cfe93c82e772920bf2e0722cf828eaea69ed530e49" +dependencies = [ + "bincode", + "blake3", + "cfg-if", + "hex", + "lazy_static", + "num-bigint 0.4.6", + "p3-baby-bear", + "p3-field", + "p3-poseidon2", + "p3-symmetric", + "serde", + "sha2", +] + +[[package]] +name = "sp1-prover" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f694e15302f83608c4be7efbf879f0f2b04c2f90129fc8fe9b625299f59e6200" +dependencies = [ + "anyhow", + "bincode", + "clap", + "dirs", + "downloader", + "enum-map", + "eyre", + "hashbrown 0.14.5", + "hex", + "itertools 0.13.0", + "lru", + "num-bigint 0.4.6", + "p3-baby-bear", + "p3-bn254-fr", + "p3-challenger", + "p3-commit", + "p3-field", + "p3-matrix", + "p3-symmetric", + "p3-util", + "rayon", + "serde", + "serde_json", + "serial_test", + "sha2", + "sp1-core-executor", + "sp1-core-machine", + "sp1-primitives", + "sp1-recursion-circuit", + "sp1-recursion-compiler", + "sp1-recursion-core", + "sp1-recursion-gnark-ffi", + "sp1-stark", + "thiserror 1.0.69", + "tracing", + "tracing-appender", + "tracing-subscriber 0.3.19", +] + +[[package]] +name = "sp1-recursion-circuit" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134d651075d5de59e212f02ae7d6f1155e5fe2af228c0cab92096d4e8359b619" +dependencies = [ + "hashbrown 0.14.5", + "itertools 0.13.0", + "num-traits", + "p3-air", + "p3-baby-bear", + "p3-bn254-fr", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-symmetric", + "p3-uni-stark", + "p3-util", + "rand 0.8.5", + "rayon", + "serde", + "sp1-core-executor", + "sp1-core-machine", + "sp1-derive", + "sp1-primitives", + "sp1-recursion-compiler", + "sp1-recursion-core", + "sp1-recursion-gnark-ffi", + "sp1-stark", + "tracing", +] + +[[package]] +name = "sp1-recursion-compiler" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d630ab95063c1cf52668b23cdae8a216f5749604c3b063f5cdec20ef2c60d086" +dependencies = [ + "backtrace", + "itertools 0.13.0", + "p3-baby-bear", + "p3-bn254-fr", + "p3-field", + "p3-symmetric", + "serde", + "sp1-core-machine", + "sp1-primitives", + "sp1-recursion-core", + "sp1-recursion-derive", + "sp1-stark", + "tracing", + "vec_map", +] + +[[package]] +name = "sp1-recursion-core" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2edcf518cedb3d0947f14688089812aec56089b45bdfc5dd162ea25ec8902d7" +dependencies = [ + "backtrace", + "cbindgen", + "cc", + "cfg-if", + "ff 0.13.1", + "glob", + "hashbrown 0.14.5", + "itertools 0.13.0", + "num_cpus", + "p3-air", + "p3-baby-bear", + "p3-bn254-fr", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-maybe-rayon", + "p3-merkle-tree", + "p3-poseidon2", + "p3-symmetric", + "p3-util", + "pathdiff", + "rand 0.8.5", + "serde", + "sp1-core-machine", + "sp1-derive", + "sp1-primitives", + "sp1-stark", + "static_assertions", + "thiserror 1.0.69", + "tracing", + "vec_map", + "zkhash", +] + +[[package]] +name = "sp1-recursion-derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45acfb50730a6271d8546975063df0946ffaa28d2ce0d0041e7905fb90c9c254" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sp1-recursion-gnark-ffi" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1bc3fc71f6eafaa1dc5fa9b309ecf55075c14a18561540937a1e2e3964670" +dependencies = [ + "anyhow", + "bincode", + "bindgen", + "cc", + "cfg-if", + "hex", + "num-bigint 0.4.6", + "p3-baby-bear", + "p3-field", + "p3-symmetric", + "serde", + "serde_json", + "sha2", + "sp1-core-machine", + "sp1-recursion-compiler", + "sp1-stark", + "tempfile", + "tracing", +] + +[[package]] +name = "sp1-sdk" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9dc0553bed3674fe271a65dd9cdd3569670c619fdc3aaac7588cc6fce39e622" +dependencies = [ + "alloy-primitives", + "alloy-signer", + "alloy-signer-local", + "alloy-sol-types", + "anyhow", + "async-trait", + "backoff", + "bincode", + "cfg-if", + "dirs", + "eventsource-stream", + "futures", + "hashbrown 0.14.5", + "hex", + "indicatif", + "itertools 0.13.0", + "k256", + "p3-baby-bear", + "p3-field", + "p3-fri", + "prost", + "reqwest", + "reqwest-middleware", + "serde", + "serde_json", + "sp1-build", + "sp1-core-executor", + "sp1-core-machine", + "sp1-cuda", + "sp1-primitives", + "sp1-prover", + "sp1-stark", + "strum", + "strum_macros", + "tempfile", + "thiserror 1.0.69", + "tokio", + "tonic", + "tracing", + "twirp-rs", +] + +[[package]] +name = "sp1-stark" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3623ca4fe6bf08b3f4211f63cc59a115f0559913e2846ec4e65ad4a8524de3d" +dependencies = [ + "arrayref", + "hashbrown 0.14.5", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "p3-air", + "p3-baby-bear", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-matrix", + "p3-maybe-rayon", + "p3-merkle-tree", + "p3-poseidon2", + "p3-symmetric", + "p3-uni-stark", + "p3-util", + "rayon-scan", + "serde", + "sp1-derive", + "sp1-primitives", + "strum", + "strum_macros", + "sysinfo", + "tracing", +] + +[[package]] +name = "sp1-zkvm" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d56dda97ba9915e7484a607e7517783d7422591c815e8dbfdbb716d77198760" +dependencies = [ + "cfg-if", + "getrandom 0.2.16", + "lazy_static", + "libm", + "p3-baby-bear", + "p3-field", + "rand 0.8.5", + "sha2", + "sp1-lib", + "sp1-primitives", +] + +[[package]] +name = "sp1_state_transition_program" +version = "0.1.0" +dependencies = [ + "lambdaworks-crypto", + "primitive-types", + "serde", + "serde_json", + "sha3 0.10.8 (git+https://github.com/sp1-patches/RustCrypto-hashes?tag=sha3-v0.10.8-patch-v1)", + "sp1-zkvm", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stability" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" +dependencies = [ + "quote", + "syn 2.0.101", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + +[[package]] +name = "subenum" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5d5dfb8556dd04017db5e318bbeac8ab2b0c67b76bf197bfb79e9b29f18ecf" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0f0d4760f4c2a0823063b2c70e97aa2ad185f57be195172ccc0e23c4b787c4" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "sysinfo" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "rayon", + "windows", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +dependencies = [ + "fastrand", + "getrandom 0.3.2", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.26", +] + +[[package]] +name = "toml_datetime" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.9.0", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +dependencies = [ + "indexmap 2.9.0", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow 0.7.10", +] + +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + +[[package]] +name = "tonic" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64", + "bytes", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "prost", + "rustls-native-certs", + "rustls-pemfile", + "socket2", + "tokio", + "tokio-rustls", + "tokio-stream", + "tower 0.4.13", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand 0.8.5", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror 1.0.69", + "time", + "tracing-subscriber 0.3.19", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-forest" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee40835db14ddd1e3ba414292272eddde9dad04d3d4b65509656414d1c42592f" +dependencies = [ + "ansi_term", + "smallvec", + "thiserror 1.0.69", + "tracing", + "tracing-subscriber 0.3.19", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "twirp-rs" +version = "0.13.0-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27dfcc06b8d9262bc2d4b8d1847c56af9971a52dd8a0076876de9db763227d0d" +dependencies = [ + "async-trait", + "axum", + "futures", + "http", + "http-body-util", + "hyper", + "prost", + "reqwest", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tower 0.5.2", + "url", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +dependencies = [ + "serde", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.0", +] + +[[package]] +name = "webpki-roots" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings 0.4.0", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result", + "windows-strings 0.3.1", + "windows-targets 0.53.0", +] + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yaml-rust2" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a1a1c0bc9823338a3bdf8c61f994f23ac004c6fa32c08cd152984499b445e8d" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive 0.8.25", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zkhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4352d1081da6922701401cdd4cbf29a2723feb4cfabb5771f6fee8e9276da1c7" +dependencies = [ + "ark-ff 0.4.2", + "ark-std 0.4.0", + "bitvec", + "blake2", + "bls12_381", + "byteorder", + "cfg-if", + "group 0.12.1", + "group 0.13.0", + "halo2", + "hex", + "jubjub", + "lazy_static", + "pasta_curves 0.5.1", + "rand 0.8.5", + "serde", + "sha2", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle", +] diff --git a/examples/L2/crates/l2/Cargo.toml b/examples/L2/crates/l2/Cargo.toml new file mode 100644 index 0000000000..fe5ee6bb19 --- /dev/null +++ b/examples/L2/crates/l2/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "l2_example" +version = "0.1.0" +edition = "2021" + +[dependencies] +serde = { workspace = true } +serde_json = { workspace = true } +types = { workspace = true } +lambdaworks-crypto = { workspace = true } +primitive-types = { workspace = true} +rand = "0.8" +sp1-sdk = "4.1.3" +sp1_state_transition_program = { path = "./zkvm_programs/sp1/" } +aligned-sdk = { path = "../../../../batcher/aligned-sdk" } +bincode = "1.3.3" + +[build-dependencies] +sp1-build = { version = "4.1.3" } + +[profile.release] +opt-level = 3 diff --git a/examples/L2/build.rs b/examples/L2/crates/l2/build.rs similarity index 100% rename from examples/L2/build.rs rename to examples/L2/crates/l2/build.rs diff --git a/examples/L2/src/main.rs b/examples/L2/crates/l2/src/lib.rs similarity index 56% rename from examples/L2/src/main.rs rename to examples/L2/crates/l2/src/lib.rs index 74729ae837..5e759610ea 100644 --- a/examples/L2/src/main.rs +++ b/examples/L2/crates/l2/src/lib.rs @@ -4,44 +4,15 @@ use std::{ io::{BufReader, BufWriter}, }; -use lambdaworks_crypto::merkle_tree::{merkle::MerkleTree, traits::IsMerkleTreeBackend}; +use aligned_sdk::core::{ + constants::INSTANT_MAX_FEE_BATCH_SIZE, + types::{AlignedVerificationData, Signer, SigningKey, VerificationData}, +}; +use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; use primitive_types::{H160, U256}; use rand::Rng; -use serde::{Deserialize, Serialize}; -use sha3::{Digest, Keccak256}; - -#[derive(Clone, Default, Serialize, Deserialize)] -pub struct UserState { - pub address: H160, - pub balance: U256, - pub nonce: U256, -} - -impl IsMerkleTreeBackend for UserState { - type Node = [u8; 32]; - type Data = UserState; - - fn hash_data(leaf: &Self::Data) -> Self::Node { - let mut hasher = Keccak256::new(); - - let mut balance_bytes: [u8; 32] = [0u8; 32]; - let mut nonce_bytes: [u8; 32] = [0u8; 32]; - leaf.balance.to_little_endian(&mut balance_bytes); - leaf.nonce.to_little_endian(&mut nonce_bytes); - - hasher.update(leaf.address); - hasher.update(&balance_bytes); - hasher.update(&nonce_bytes); - hasher.finalize().into() - } - - fn hash_new_parent(child_1: &Self::Node, child_2: &Self::Node) -> Self::Node { - let mut hasher = Keccak256::new(); - hasher.update(child_1); - hasher.update(child_2); - hasher.finalize().into() - } -} +use sp1_sdk::SP1Stdin; +use types::{Transfer, UserState}; struct DB { pub user_states: HashMap, @@ -95,17 +66,11 @@ impl DB { vec![] } - pub fn upsert(&mut self, address: H160, newState: UserState) { - self.user_states.insert(address, newState); + pub fn upsert(&mut self, address: H160, new_state: UserState) { + self.user_states.insert(address, new_state); } } -struct Transfer { - pub from: H160, - pub to: H160, - pub amount: U256, -} - fn generate_random_transfers(db: &DB, num_to_generate: usize) -> Vec { let mut transfers = vec![]; let mut rng = rand::thread_rng(); @@ -135,9 +100,67 @@ fn generate_random_transfers(db: &DB, num_to_generate: usize) -> Vec { transfers } -fn prove_state_transition(db: &mut DB, transfers: Vec) {} +const PROGRAM_ELF: &[u8] = include_bytes!("../zkvm_programs/sp1/elf/sp1_state_transition_program"); +fn prove_state_transition( + db: &mut DB, + transfers: Vec, +) -> (sp1_sdk::SP1ProofWithPublicValues, sp1_sdk::SP1VerifyingKey) { + let mut stdin = SP1Stdin::new(); + let program_input = sp1_state_transition_program::ProgramInput { + transfers, + user_states: db.user_states.clone(), + }; + stdin.write(&program_input); + + let prover = sp1_sdk::ProverClient::from_env(); + let (pk, vk) = prover.setup(PROGRAM_ELF); + let proof = prover + .prove(&pk, &stdin) + .groth16() + .run() + .expect("Prover to run fine"); + + (proof, vk) +} + +async fn send_proof_to_be_verified_on_aligned( + proof: sp1_sdk::SP1ProofWithPublicValues, + network: aligned_sdk::core::types::Network, + wallet: aligned_sdk::core::types::Wallet, +) -> AlignedVerificationData { + let proof = bincode::serialize(&proof).expect("Serialize sp1 proof to binary"); + let vm_program_code = PROGRAM_ELF.to_vec(); + + let verification_data = VerificationData { + proof_generator_addr: H160::default(), + proving_system: aligned_sdk::core::types::ProvingSystemId::SP1, + proof, + vm_program_code: Some(vm_program_code), + pub_input: None, + verification_key: None, + }; + + let nonce = aligned_sdk::sdk::get_nonce_from_batcher(network.clone(), wallet.address()) + .await + .expect("Retrieve nonce from aligned batcher"); + + let aligned_verification_data = aligned_sdk::sdk::submit( + network, + &verification_data, + U256::from(INSTANT_MAX_FEE_BATCH_SIZE as u64), + wallet, + nonce, + ) + .await + .expect("Proof to be sent"); + + aligned_verification_data +} -fn main() { +async fn start_l2( + network: aligned_sdk::core::types::Network, + wallet: aligned_sdk::core::types::Wallet, +) { // 0. Load merkle tree file, if not created, create initial state let mut db = DB::new("./db".to_string()).expect("create db"); @@ -145,14 +168,17 @@ fn main() { let account_updates = generate_random_transfers(&db, 10); // 2. Call zkvm and pass (MerkleTree, Updates to perform) - let proof = prove_state_transition(&mut db, account_updates); + let (proof, vk) = prove_state_transition(&mut db, account_updates); + + // 3. If the proving went alright, update the db and verify that the merkle root match // Fow now, in order for a proof to be aggregated, we first need to submit it via the fast mode or verification layer // Let's suppose that our L2 would run the prover once every 24hs and submit it on aligned // Once aligned aggregates the proof we will be notified and we'll send the new state commitment on chain // 4. Send the proof to aligned and wait for verification - // let response = send_proof_to_be_verified_on_aligned(proof); + send_proof_to_be_verified_on_aligned(proof, network, wallet).await; + // 5. Wait until proof is aggregated // ... // 6. Send updateState transaction to Ethereum diff --git a/examples/L2/zkvm_programs/Cargo.lock b/examples/L2/crates/l2/zkvm_programs/Cargo.lock similarity index 54% rename from examples/L2/zkvm_programs/Cargo.lock rename to examples/L2/crates/l2/zkvm_programs/Cargo.lock index c0a9ed78d6..f6de7836a3 100644 --- a/examples/L2/zkvm_programs/Cargo.lock +++ b/examples/L2/crates/l2/zkvm_programs/Cargo.lock @@ -2,244 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy 0.7.35", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" - -[[package]] -name = "ark-bn254" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-r1cs-std", - "ark-std", -] - -[[package]] -name = "ark-crypto-primitives" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" -dependencies = [ - "ahash", - "ark-crypto-primitives-macros", - "ark-ec", - "ark-ff", - "ark-relations", - "ark-serialize", - "ark-snark", - "ark-std", - "blake2", - "derivative", - "digest", - "fnv", - "merlin", - "sha2", -] - -[[package]] -name = "ark-crypto-primitives-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-ec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" -dependencies = [ - "ahash", - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "educe", - "fnv", - "hashbrown", - "itertools 0.13.0", - "num-bigint", - "num-integer", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" -dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", - "arrayvec", - "digest", - "educe", - "itertools 0.13.0", - "num-bigint", - "num-traits", - "paste", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" -dependencies = [ - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-ff-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-groth16" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" -dependencies = [ - "ark-crypto-primitives", - "ark-ec", - "ark-ff", - "ark-poly", - "ark-relations", - "ark-serialize", - "ark-std", -] - -[[package]] -name = "ark-poly" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" -dependencies = [ - "ahash", - "ark-ff", - "ark-serialize", - "ark-std", - "educe", - "fnv", - "hashbrown", -] - -[[package]] -name = "ark-r1cs-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-relations", - "ark-std", - "educe", - "num-bigint", - "num-integer", - "num-traits", - "tracing", -] - -[[package]] -name = "ark-relations" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" -dependencies = [ - "ark-ff", - "ark-std", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "ark-serialize" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" -dependencies = [ - "ark-serialize-derive", - "ark-std", - "arrayvec", - "digest", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "ark-snark" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" -dependencies = [ - "ark-ff", - "ark-relations", - "ark-serialize", - "ark-std", -] - -[[package]] -name = "ark-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" -dependencies = [ - "num-traits", - "rand", -] - [[package]] name = "arrayref" version = "0.3.9" @@ -267,24 +29,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" - [[package]] name = "bitvec" version = "1.0.1" @@ -297,15 +41,6 @@ dependencies = [ "wyz", ] -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest", -] - [[package]] name = "blake3" version = "1.8.2" @@ -319,12 +54,6 @@ dependencies = [ "constant_time_eq", ] -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - [[package]] name = "block-buffer" version = "0.10.4" @@ -334,29 +63,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "borsh" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" -dependencies = [ - "borsh-derive", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" -dependencies = [ - "once_cell", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "bumpalo" version = "3.17.0" @@ -369,26 +75,6 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" -[[package]] -name = "bytemuck" -version = "1.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "byteorder" version = "1.5.0" @@ -410,24 +96,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "cobs" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - [[package]] name = "const_format" version = "0.2.34" @@ -454,33 +122,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "libc", -] - [[package]] name = "cpufeatures" version = "0.2.17" @@ -506,38 +147,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "unicode-xid", -] - [[package]] name = "digest" version = "0.10.7" @@ -545,27 +154,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", - "const-oid", "crypto-common", - "subtle", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "educe" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 2.0.101", ] [[package]] @@ -574,44 +163,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -[[package]] -name = "elf" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" - -[[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - -[[package]] -name = "embedded-io" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" - -[[package]] -name = "enum-ordinalize" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" -dependencies = [ - "enum-ordinalize-derive", -] - -[[package]] -name = "enum-ordinalize-derive" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -630,39 +181,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - [[package]] name = "funty" version = "2.0.0" @@ -703,9 +221,6 @@ name = "hashbrown" version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" -dependencies = [ - "allocator-api2", -] [[package]] name = "hex" @@ -713,12 +228,6 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - [[package]] name = "impl-codec" version = "0.6.0" @@ -745,15 +254,9 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] -[[package]] -name = "include_bytes_aligned" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" - [[package]] name = "indexmap" version = "2.9.0" @@ -773,15 +276,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.15" @@ -836,9 +330,6 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] [[package]] name = "libc" @@ -858,54 +349,12 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "merlin" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" -dependencies = [ - "byteorder", - "keccak", - "rand_core", - "zeroize", -] - -[[package]] -name = "metal" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" -dependencies = [ - "bitflags 2.9.0", - "block", - "core-graphics-types", - "foreign-types", - "log", - "objc", - "paste", -] - -[[package]] -name = "no_std_strings" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5b0c77c1b780822bc749a33e39aeb2c07584ab93332303babeabb645298a76e" - [[package]] name = "num-bigint" version = "0.4.6" @@ -934,15 +383,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - [[package]] name = "once_cell" version = "1.21.3" @@ -983,7 +423,7 @@ version = "0.2.2-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6f0edf3fde4fd0d1455e901fc871c558010ae18db6e68f1b0fa111391855316" dependencies = [ - "itertools 0.12.1", + "itertools", "num-bigint", "num-traits", "p3-util", @@ -997,7 +437,7 @@ version = "0.2.2-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60961b4d7ffd2e8412ce4e66e213de610356df71cc4e396519c856a664138a27" dependencies = [ - "itertools 0.12.1", + "itertools", "p3-field", "p3-maybe-rayon", "p3-util", @@ -1018,7 +458,7 @@ version = "0.2.2-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4127956cc6c783b7d021c5c42d5d89456d5f3bda4a7b165fcc2a3fd4e78fbede" dependencies = [ - "itertools 0.12.1", + "itertools", "p3-dft", "p3-field", "p3-matrix", @@ -1047,7 +487,7 @@ version = "0.2.2-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e7d954033f657d48490344ca4b3dbcc054962a0e92831b736666bb2f5e5820b" dependencies = [ - "itertools 0.12.1", + "itertools", "p3-field", "serde", ] @@ -1086,40 +526,22 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "pin-project-lite" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" -[[package]] -name = "postcard" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" -dependencies = [ - "cobs", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "serde", -] - [[package]] name = "ppv-lite86" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.25", + "zerocopy", ] [[package]] @@ -1197,192 +619,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "risc0-binfmt" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "anyhow", - "borsh", - "derive_more", - "elf", - "lazy_static", - "postcard", - "risc0-zkp", - "risc0-zkvm-platform", - "semver", - "serde", - "tracing", -] - -[[package]] -name = "risc0-circuit-keccak" -version = "1.4.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "anyhow", - "bytemuck", - "paste", - "risc0-binfmt", - "risc0-circuit-recursion", - "risc0-core", - "risc0-zkp", - "tracing", -] - -[[package]] -name = "risc0-circuit-recursion" -version = "1.4.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "anyhow", - "bytemuck", - "hex", - "metal", - "risc0-core", - "risc0-zkp", - "tracing", -] - -[[package]] -name = "risc0-circuit-rv32im" -version = "2.0.1" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "anyhow", - "bit-vec", - "bytemuck", - "derive_more", - "paste", - "risc0-binfmt", - "risc0-core", - "risc0-zkp", - "serde", - "tracing", -] - -[[package]] -name = "risc0-core" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "bytemuck", - "bytemuck_derive", - "rand_core", -] - -[[package]] -name = "risc0-groth16" -version = "1.4.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "anyhow", - "ark-bn254", - "ark-ec", - "ark-groth16", - "ark-serialize", - "bytemuck", - "hex", - "num-bigint", - "num-traits", - "risc0-binfmt", - "risc0-zkp", - "serde", - "stability", -] - -[[package]] -name = "risc0-zkos-v1compat" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "include_bytes_aligned", - "no_std_strings", -] - -[[package]] -name = "risc0-zkp" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "anyhow", - "blake2", - "borsh", - "bytemuck", - "cfg-if", - "digest", - "hex", - "hex-literal", - "metal", - "paste", - "rand_core", - "risc0-core", - "risc0-zkvm-platform", - "serde", - "sha2", - "stability", - "tracing", -] - -[[package]] -name = "risc0-zkvm" -version = "2.0.0" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "anyhow", - "borsh", - "bytemuck", - "derive_more", - "getrandom", - "hex", - "risc0-binfmt", - "risc0-circuit-keccak", - "risc0-circuit-recursion", - "risc0-circuit-rv32im", - "risc0-core", - "risc0-groth16", - "risc0-zkos-v1compat", - "risc0-zkp", - "risc0-zkvm-platform", - "rrs-lib", - "semver", - "serde", - "sha2", - "stability", - "tracing", -] - -[[package]] -name = "risc0-zkvm-platform" -version = "2.0.1" -source = "git+https://github.com/risc0/risc0?tag=v2.0.0#3f26f9d4c2fb8a7e5eb830ae2433c8eae67f5a38" -dependencies = [ - "bytemuck", - "cfg-if", - "getrandom", - "libm", - "stability", -] - -[[package]] -name = "risc0_state_transition_program" -version = "0.1.0" -dependencies = [ - "risc0-zkvm", - "serde", - "serde_json", -] - -[[package]] -name = "rrs-lib" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" -dependencies = [ - "downcast-rs", - "paste", -] - [[package]] name = "rustc-hex" version = "2.1.0" @@ -1401,15 +637,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[package]] -name = "semver" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" -dependencies = [ - "serde", -] - [[package]] name = "serde" version = "1.0.219" @@ -1427,7 +654,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1537,22 +764,7 @@ dependencies = [ "serde_json", "sha3 0.10.8 (git+https://github.com/sp1-patches/RustCrypto-hashes?tag=sha3-v0.10.8-patch-v1)", "sp1-zkvm", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "stability" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" -dependencies = [ - "quote", - "syn 2.0.101", + "types", ] [[package]] @@ -1561,23 +773,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.101" @@ -1618,7 +813,6 @@ version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1632,7 +826,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1642,16 +836,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", - "valuable", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "tracing-core", ] [[package]] @@ -1660,6 +844,17 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "types" +version = "0.1.0" +dependencies = [ + "lambdaworks-crypto", + "primitive-types", + "serde", + "serde_json", + "sha3 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "uint" version = "0.9.5" @@ -1684,12 +879,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - [[package]] name = "version_check" version = "0.9.5" @@ -1723,7 +912,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.101", + "syn", "wasm-bindgen-shared", ] @@ -1745,7 +934,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1777,33 +966,13 @@ dependencies = [ "tap", ] -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - [[package]] name = "zerocopy" version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "zerocopy-derive 0.8.25", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", + "zerocopy-derive", ] [[package]] @@ -1814,25 +983,5 @@ checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", + "syn", ] diff --git a/examples/L2/zkvm_programs/Cargo.toml b/examples/L2/crates/l2/zkvm_programs/Cargo.toml similarity index 57% rename from examples/L2/zkvm_programs/Cargo.toml rename to examples/L2/crates/l2/zkvm_programs/Cargo.toml index 3c9384a180..06cdd25cf0 100644 --- a/examples/L2/zkvm_programs/Cargo.toml +++ b/examples/L2/crates/l2/zkvm_programs/Cargo.toml @@ -3,4 +3,7 @@ name = "zkvm_state_transition_programs" version = "0.1.0" edition = "2021" resolver = "2" -members = ["sp1", "risc0"] +members = ["sp1"] + +[workspace.dependencies] +types = { path = "../../types"} diff --git a/examples/L2/zkvm_programs/sp1/Cargo.toml b/examples/L2/crates/l2/zkvm_programs/sp1/Cargo.toml similarity index 95% rename from examples/L2/zkvm_programs/sp1/Cargo.toml rename to examples/L2/crates/l2/zkvm_programs/sp1/Cargo.toml index f354d9b249..1c7639c5ac 100644 --- a/examples/L2/zkvm_programs/sp1/Cargo.toml +++ b/examples/L2/crates/l2/zkvm_programs/sp1/Cargo.toml @@ -11,6 +11,7 @@ serde_json = "1.0.117" primitive-types = { version = "0.12.0", features = ["serde"] } lambdaworks-crypto = { git = "https://github.com/lambdaclass/lambdaworks.git", rev = "5f8f2cfcc8a1a22f77e8dff2d581f1166eefb80b", features = ["serde"]} sha3 = { git = "https://github.com/sp1-patches/RustCrypto-hashes", tag = "sha3-v0.10.8-patch-v1" } +types = { workspace = true } [lib] path = "./src/lib.rs" diff --git a/examples/L2/crates/l2/zkvm_programs/sp1/elf/sp1_state_transition_program b/examples/L2/crates/l2/zkvm_programs/sp1/elf/sp1_state_transition_program new file mode 100755 index 0000000000000000000000000000000000000000..5bb187b95095aa4a0691056af254d66397f652e9 GIT binary patch literal 219684 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%0D_l8~E7JSnh&!UkYO_ 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 z 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 literal 0 HcmV?d00001 diff --git a/examples/L2/crates/l2/zkvm_programs/sp1/src/lib.rs b/examples/L2/crates/l2/zkvm_programs/sp1/src/lib.rs new file mode 100644 index 0000000000..ec68d725d9 --- /dev/null +++ b/examples/L2/crates/l2/zkvm_programs/sp1/src/lib.rs @@ -0,0 +1,16 @@ +use primitive_types::H160; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use types::{Transfer, UserState}; + +#[derive(Deserialize, Serialize)] +pub struct ProgramInput { + pub user_states: HashMap, + pub transfers: Vec, +} + +#[derive(Serialize, Deserialize)] +pub struct ProgramOutput { + pub initial_state_merkle_root: [u8; 32], + pub post_state_merkle_root: [u8; 32], +} diff --git a/examples/L2/zkvm_programs/sp1/src/main.rs b/examples/L2/crates/l2/zkvm_programs/sp1/src/main.rs similarity index 95% rename from examples/L2/zkvm_programs/sp1/src/main.rs rename to examples/L2/crates/l2/zkvm_programs/sp1/src/main.rs index ed0023b597..6b76d48405 100644 --- a/examples/L2/zkvm_programs/sp1/src/main.rs +++ b/examples/L2/crates/l2/zkvm_programs/sp1/src/main.rs @@ -2,7 +2,8 @@ sp1_zkvm::entrypoint!(main); use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; -use sp1_state_transition_program::{ProgramInput, ProgramOutput, UserState}; +use sp1_state_transition_program::{ProgramInput, ProgramOutput}; +use types::UserState; pub fn main() { let mut input = sp1_zkvm::io::read::(); diff --git a/examples/L2/crates/types/Cargo.toml b/examples/L2/crates/types/Cargo.toml new file mode 100644 index 0000000000..1b0123d553 --- /dev/null +++ b/examples/L2/crates/types/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "types" +version = "0.1.0" +edition = "2021" + +[dependencies] +serde = { workspace = true } +serde_json = { workspace = true } +primitive-types = { workspace = true } +lambdaworks-crypto = { workspace = true } +sha3 = { workspace = true } + + +[profile.release] +opt-level = 3 diff --git a/examples/L2/zkvm_programs/sp1/src/lib.rs b/examples/L2/crates/types/src/lib.rs similarity index 76% rename from examples/L2/zkvm_programs/sp1/src/lib.rs rename to examples/L2/crates/types/src/lib.rs index 33e6726c7d..4130512217 100644 --- a/examples/L2/zkvm_programs/sp1/src/lib.rs +++ b/examples/L2/crates/types/src/lib.rs @@ -1,11 +1,9 @@ -use std::collections::HashMap; - use lambdaworks_crypto::merkle_tree::traits::IsMerkleTreeBackend; use primitive_types::{H160, U256}; use serde::{Deserialize, Serialize}; use sha3::{Digest, Keccak256}; -#[derive(Serialize, Deserialize, Clone)] +#[derive(Clone, Default, Serialize, Deserialize)] pub struct UserState { pub address: H160, pub balance: U256, @@ -38,21 +36,9 @@ impl IsMerkleTreeBackend for UserState { } } -#[derive(Deserialize, Serialize)] +#[derive(Serialize, Deserialize)] pub struct Transfer { pub from: H160, pub to: H160, pub amount: U256, } - -#[derive(Deserialize, Serialize)] -pub struct ProgramInput { - pub user_states: HashMap, - pub transfers: Vec, -} - -#[derive(Serialize, Deserialize)] -pub struct ProgramOutput { - pub initial_state_merkle_root: [u8; 32], - pub post_state_merkle_root: [u8; 32], -} diff --git a/examples/L2/src/lib.rs b/examples/L2/src/lib.rs deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/examples/L2/zkvm_programs/risc0/Cargo.toml b/examples/L2/zkvm_programs/risc0/Cargo.toml deleted file mode 100644 index 60c21a3992..0000000000 --- a/examples/L2/zkvm_programs/risc0/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "risc0_state_transition_program" -version = "0.1.0" -edition = "2021" -resolver = "2" - -[dependencies] -serde = { version = "1.0.203" } -serde_json = "1.0.117" -risc0-zkvm = { git = "https://github.com/risc0/risc0", tag="v2.0.0", default-features = false, features = ["unstable", "std"] } - -[lib] -path = "./src/lib.rs" diff --git a/examples/L2/zkvm_programs/risc0/src/lib.rs b/examples/L2/zkvm_programs/risc0/src/lib.rs deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/examples/L2/zkvm_programs/risc0/src/main.rs b/examples/L2/zkvm_programs/risc0/src/main.rs deleted file mode 100644 index 7797adab78..0000000000 --- a/examples/L2/zkvm_programs/risc0/src/main.rs +++ /dev/null @@ -1,24 +0,0 @@ -#![no_main] - -use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; -use risc0_aggregation_program::{Input, Risc0ImageIdAndPubInputs}; -use risc0_zkvm::guest::env; - -risc0_zkvm::guest::entry!(main); - -fn main() { - let input = env::read::(); - - for Risc0ImageIdAndPubInputs { - image_id, - public_inputs, - } in &input.proofs_image_id_and_pub_inputs - { - env::verify(image_id.clone(), &public_inputs).expect("proof to be verified correctly"); - } - - let merkle_tree: MerkleTree = - MerkleTree::build(&input.proofs_image_id_and_pub_inputs).unwrap(); - - env::commit_slice(&merkle_tree.root); -} diff --git a/examples/L2/zkvm_programs/sp1/elf/sp1_state_transition_program b/examples/L2/zkvm_programs/sp1/elf/sp1_state_transition_program deleted file mode 100755 index f35f4068ddce506898f3afbe4ad047b244baf25c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216196 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 z 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

xyRG`A+!DNZhoe#Eyb1H@gjW50%tmYyzNJqN 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%0ANF3;l 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 Date: Fri, 9 May 2025 16:27:37 -0300 Subject: [PATCH 07/22] fix: contract --- .gitmodules | 3 +++ examples/L2/contracts/lib/forge-std | 1 + examples/L2/contracts/remappings.txt | 1 + .../L2/contracts/script/StateTransitionDeployer.sol | 2 +- examples/L2/contracts/src/StateTransition.sol | 11 ++++++----- 5 files changed, 12 insertions(+), 6 deletions(-) create mode 160000 examples/L2/contracts/lib/forge-std create mode 100644 examples/L2/contracts/remappings.txt diff --git a/.gitmodules b/.gitmodules index 2f56da099e..b48c1c2881 100644 --- a/.gitmodules +++ b/.gitmodules @@ -37,3 +37,6 @@ [submodule "contracts/lib/risc0-ethereum"] path = contracts/lib/risc0-ethereum url = https://github.com/risc0/risc0-ethereum +[submodule "examples/L2/contracts/lib/forge-std"] + path = examples/L2/contracts/lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/examples/L2/contracts/lib/forge-std b/examples/L2/contracts/lib/forge-std new file mode 160000 index 0000000000..77041d2ce6 --- /dev/null +++ b/examples/L2/contracts/lib/forge-std @@ -0,0 +1 @@ +Subproject commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505 diff --git a/examples/L2/contracts/remappings.txt b/examples/L2/contracts/remappings.txt new file mode 100644 index 0000000000..feaba2dd12 --- /dev/null +++ b/examples/L2/contracts/remappings.txt @@ -0,0 +1 @@ +forge-std/=lib/forge-std/src/ diff --git a/examples/L2/contracts/script/StateTransitionDeployer.sol b/examples/L2/contracts/script/StateTransitionDeployer.sol index e4c0194681..227f4d854c 100644 --- a/examples/L2/contracts/script/StateTransitionDeployer.sol +++ b/examples/L2/contracts/script/StateTransitionDeployer.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; -import {Script, console} from "forge-std/Script.sol"; +import "forge-std/Script.sol"; import {StateTransition} from "../src/StateTransition.sol"; contract StateTransitionDeployer is Script { diff --git a/examples/L2/contracts/src/StateTransition.sol b/examples/L2/contracts/src/StateTransition.sol index 975c49e4d0..e3afe463b1 100644 --- a/examples/L2/contracts/src/StateTransition.sol +++ b/examples/L2/contracts/src/StateTransition.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.13; contract StateTransition { - event StateUpdated(bytes32) + event StateUpdated(bytes32); bytes32 public PROGRAM_ID = 0x00; bytes32 public stateRoot; @@ -12,18 +12,19 @@ contract StateTransition { alignedProofAggregator = _alignedProofAggregator; } - function updateState(bytes publicInputs, bytes32[] merkleProof) public { + function updateState(bytes calldata publicInputs, bytes32[] calldata merkleProof) public { bytes memory callData = abi.encodeWithSignature( - "verifyProofInclusion(bytes32[],bytes32,bytes)", merkleProof, programId, publicInputs + "verifyProofInclusion(bytes32[],bytes32,bytes)", merkleProof, PROGRAM_ID, publicInputs ); (bool callResult, bytes memory response) = alignedProofAggregator.staticcall(callData); - require(callWasSuccessful, "static_call failed"); + require(callResult, "static_call failed"); bool proofVerified = abi.decode(response, (bool)); require(proofVerified, "proof not verified in aligned"); - (prevStateRoot, newStateRoot) = abi.decode(publicInputs, (bytes32, UserStateUpdate[])); + (bytes32 prevStateRoot, bytes32 newStateRoot) = abi.decode(publicInputs, (bytes32, bytes32)); require(prevStateRoot == stateRoot); + stateRoot = newStateRoot; emit StateUpdated(stateRoot); From ebc7f840b3d6e9fc2980518a4371216055539982 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Fri, 9 May 2025 16:31:23 -0300 Subject: [PATCH 08/22] feat: separate files and save db after zkvm run --- examples/L2/Cargo.lock | 521 ++++++++++++++++++++++++++- examples/L2/crates/l2/Cargo.toml | 4 + examples/L2/crates/l2/src/aligned.rs | 65 ++++ examples/L2/crates/l2/src/db.rs | 96 +++++ examples/L2/crates/l2/src/lib.rs | 200 ++-------- examples/L2/crates/l2/src/zk.rs | 28 ++ examples/L2/crates/types/src/lib.rs | 2 +- 7 files changed, 739 insertions(+), 177 deletions(-) create mode 100644 examples/L2/crates/l2/src/aligned.rs create mode 100644 examples/L2/crates/l2/src/db.rs create mode 100644 examples/L2/crates/l2/src/zk.rs diff --git a/examples/L2/Cargo.lock b/examples/L2/Cargo.lock index 88143563f0..02b68b520b 100644 --- a/examples/L2/Cargo.lock +++ b/examples/L2/Cargo.lock @@ -97,6 +97,42 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "alloy" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f245ea9ef9be909776941c6c0ce829fb6b79cd6bfafa43762af7a702c4eb8ee4" +dependencies = [ + "alloy-consensus", + "alloy-contract", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-network", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-serde", + "alloy-signer", + "alloy-signer-local", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", +] + +[[package]] +name = "alloy-chains" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7734aecfc58a597dde036e4c5cace2ae43e2f8bf3d406b022a1ef34da178dd49" +dependencies = [ + "alloy-primitives", + "num_enum 0.7.3", + "strum 0.27.1", +] + [[package]] name = "alloy-consensus" version = "0.14.0" @@ -134,6 +170,58 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-contract" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5084cf42388dff75b255308194f9d3e67ae2a93ce7e24262a512cc4043ac1838" +dependencies = [ + "alloy-consensus", + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", + "futures", + "futures-util", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-core" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b2817489e4391d8c0bdf043c842164855e3d697de7a8e9edf24aa30b153ac5" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f90b63261b7744642f6075ed17db6de118eecbe9516ea6c6ffd444b80180b75" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow 0.7.10", +] + [[package]] name = "alloy-eip2124" version = "0.2.0" @@ -166,6 +254,7 @@ checksum = "804cefe429015b4244966c006d25bda5545fa9db5990e9c9079faf255052f50a" dependencies = [ "alloy-primitives", "alloy-rlp", + "k256", "serde", "thiserror 2.0.12", ] @@ -190,6 +279,19 @@ dependencies = [ "sha2", ] +[[package]] +name = "alloy-genesis" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dfec8348d97bd624901c6a4b22bb4c24df8a3128fc3d5e42d24f7b79dfa8588" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "alloy-trie", + "serde", +] + [[package]] name = "alloy-json-abi" version = "1.1.0" @@ -282,6 +384,73 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "alloy-provider" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6ba76d476f475668925f858cc4db51781f12abdaa4e0274eb57a09f574e869" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types-anvil", + "alloy-rpc-types-debug", + "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-rpc-types-txpool", + "alloy-signer", + "alloy-sol-types", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "either", + "futures", + "futures-utils-wasm", + "lru 0.13.0", + "parking_lot", + "pin-project", + "reqwest 0.12.15", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-pubsub" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04135d2fd7fa1fba3afe9f79ec2967259dbc0948e02fa0cd0e33a4a812e2cb0a" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "bimap", + "futures", + "parking_lot", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.2", + "tracing", + "wasmtimer", +] + [[package]] name = "alloy-rlp" version = "0.3.11" @@ -304,6 +473,62 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "alloy-rpc-client" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6a6985b48a536b47aa0aece56e6a0f49240ce5d33a7f0c94f1b312eda79aa1" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-pubsub", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "async-stream", + "futures", + "pin-project", + "reqwest 0.12.15", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.2", + "tracing", + "tracing-futures", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf27873220877cb15125eb6eec2f86c6e9b41473aca85844bd3d9d755bfc0a0" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-anvil", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-rpc-types-txpool", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-anvil" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c349f7339476f13e23308111dfeb67d136c11e7b2a6b1d162f6a124ad4ffb9b" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + [[package]] name = "alloy-rpc-types-any" version = "0.14.0" @@ -315,6 +540,33 @@ dependencies = [ "alloy-serde", ] +[[package]] +name = "alloy-rpc-types-debug" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05525519bd7f37f98875354f0b3693d3ad3c7a7f067e3b8946777920be15cb5b" +dependencies = [ + "alloy-primitives", + "serde", +] + +[[package]] +name = "alloy-rpc-types-engine" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4235d79af20fe5583ca26096258fe9307571a345745c433cfd8c91b41aa2611e" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "derive_more 2.0.1", + "rand 0.8.5", + "serde", + "strum 0.27.1", +] + [[package]] name = "alloy-rpc-types-eth" version = "0.14.0" @@ -335,6 +587,32 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "alloy-rpc-types-trace" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bccbe4594eaa2d69d21fa0b558c44e36202e599eb209da70b405415cb37a354" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "alloy-rpc-types-txpool" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56b8de4afea88d9ca1504b9dee40ffae69a2364aed82ab6e88e4348b41f57f6b" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + [[package]] name = "alloy-serde" version = "0.14.0" @@ -397,6 +675,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0e84bd0693c69a8fbe3ec0008465e029c6293494df7cb07580bf4a33eff52e1" dependencies = [ + "alloy-json-abi", "alloy-sol-macro-input", "const-hex", "heck 0.5.0", @@ -415,12 +694,14 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3de663412dadf9b64f4f92f507f78deebcc92339d12cf15f88ded65d41c7935" dependencies = [ + "alloy-json-abi", "const-hex", "dunce", "heck 0.5.0", "macro-string", "proc-macro2", "quote", + "serde_json", "syn 2.0.101", "syn-solidity", ] @@ -448,6 +729,81 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-transport" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1f1a55f9ff9a48aa0b4a8c616803754620010fbb266edae2f4548f4304373b" +dependencies = [ + "alloy-json-rpc", + "base64 0.22.1", + "derive_more 2.0.1", + "futures", + "futures-utils-wasm", + "parking_lot", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower 0.5.2", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "171b3d8824b6697d6c8325373ec410d230b6c59ce552edfbfabe4e7b8a26aac3" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest 0.12.15", + "serde_json", + "tower 0.5.2", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-ipc" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8a71043836f2144e1fe30f874eb2e9d71d2632d530e35b09fadbf787232f3f4" +dependencies = [ + "alloy-json-rpc", + "alloy-pubsub", + "alloy-transport", + "bytes", + "futures", + "interprocess", + "pin-project", + "serde", + "serde_json", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "alloy-transport-ws" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdde5b241745076bcbf2fcad818f2c42203bd2c5f4b50ea43b628ccbd2147ad6" +dependencies = [ + "alloy-pubsub", + "alloy-transport", + "futures", + "http 1.3.1", + "rustls 0.23.27", + "serde_json", + "tokio", + "tokio-tungstenite 0.26.2", + "tracing", + "ws_stream_wasm", +] + [[package]] name = "alloy-trie" version = "0.8.1" @@ -880,6 +1236,12 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" +[[package]] +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + [[package]] name = "bincode" version = "1.3.3" @@ -1589,6 +1951,20 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "dashu" version = "0.4.2" @@ -1833,6 +2209,12 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "doctest-file" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" + [[package]] name = "downcast-rs" version = "1.2.1" @@ -2168,7 +2550,7 @@ dependencies = [ "rlp", "serde", "serde_json", - "strum", + "strum 0.26.3", "syn 2.0.101", "tempfile", "thiserror 1.0.69", @@ -3289,6 +3671,21 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "interprocess" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" +dependencies = [ + "doctest-file", + "futures-core", + "libc", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -3439,7 +3836,9 @@ name = "l2_example" version = "0.1.0" dependencies = [ "aligned-sdk", + "alloy", "bincode", + "futures-util", "lambdaworks-crypto", "primitive-types", "rand 0.8.5", @@ -3448,6 +3847,7 @@ dependencies = [ "sp1-build", "sp1-sdk", "sp1_state_transition_program", + "tokio", "types", ] @@ -3583,6 +3983,15 @@ dependencies = [ "hashbrown 0.15.3", ] +[[package]] +name = "lru" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" +dependencies = [ + "hashbrown 0.15.3", +] + [[package]] name = "lru-slab" version = "0.1.2" @@ -3891,7 +4300,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", "syn 2.0.101", @@ -4914,6 +5323,12 @@ dependencies = [ "rayon", ] +[[package]] +name = "recvmsg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" + [[package]] name = "redox_syscall" version = "0.5.12" @@ -5898,8 +6313,8 @@ dependencies = [ "sp1-curves", "sp1-primitives", "sp1-stark", - "strum", - "strum_macros", + "strum 0.26.3", + "strum_macros 0.26.4", "subenum", "thiserror 1.0.69", "tiny-keccak", @@ -5953,8 +6368,8 @@ dependencies = [ "sp1-primitives", "sp1-stark", "static_assertions", - "strum", - "strum_macros", + "strum 0.26.3", + "strum_macros 0.26.4", "tempfile", "thiserror 1.0.69", "tracing", @@ -6060,7 +6475,7 @@ dependencies = [ "hashbrown 0.14.5", "hex", "itertools 0.13.0", - "lru", + "lru 0.12.5", "num-bigint 0.4.6", "p3-baby-bear", "p3-bn254-fr", @@ -6263,8 +6678,8 @@ dependencies = [ "sp1-primitives", "sp1-prover", "sp1-stark", - "strum", - "strum_macros", + "strum 0.26.3", + "strum_macros 0.26.4", "tempfile", "thiserror 1.0.69", "tokio", @@ -6302,8 +6717,8 @@ dependencies = [ "serde", "sp1-derive", "sp1-primitives", - "strum", - "strum_macros", + "strum 0.26.3", + "strum_macros 0.26.4", "sysinfo", "tracing", ] @@ -6397,7 +6812,16 @@ version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "strum_macros", + "strum_macros 0.26.4", +] + +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros 0.27.1", ] [[package]] @@ -6413,6 +6837,19 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + [[package]] name = "subenum" version = "1.1.2" @@ -6790,6 +7227,7 @@ dependencies = [ "futures-core", "pin-project-lite", "tokio", + "tokio-util", ] [[package]] @@ -6821,6 +7259,22 @@ dependencies = [ "tungstenite 0.23.0", ] +[[package]] +name = "tokio-tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +dependencies = [ + "futures-util", + "log", + "rustls 0.23.27", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.2", + "tungstenite 0.26.2", + "webpki-roots 0.26.11", +] + [[package]] name = "tokio-util" version = "0.7.15" @@ -7031,6 +7485,8 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" dependencies = [ + "futures", + "futures-task", "pin-project", "tracing", ] @@ -7109,6 +7565,25 @@ dependencies = [ "utf-8", ] +[[package]] +name = "tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +dependencies = [ + "bytes", + "data-encoding", + "http 1.3.1", + "httparse", + "log", + "rand 0.9.1", + "rustls 0.23.27", + "rustls-pki-types", + "sha1", + "thiserror 2.0.12", + "utf-8", +] + [[package]] name = "twirp-rs" version = "0.13.0-succinct" @@ -7395,6 +7870,20 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasmtimer" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + [[package]] name = "web-sys" version = "0.3.77" @@ -7439,6 +7928,12 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "widestring" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" + [[package]] name = "winapi" version = "0.3.9" @@ -7461,7 +7956,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/examples/L2/crates/l2/Cargo.toml b/examples/L2/crates/l2/Cargo.toml index fe5ee6bb19..507058d27e 100644 --- a/examples/L2/crates/l2/Cargo.toml +++ b/examples/L2/crates/l2/Cargo.toml @@ -14,6 +14,10 @@ sp1-sdk = "4.1.3" sp1_state_transition_program = { path = "./zkvm_programs/sp1/" } aligned-sdk = { path = "../../../../batcher/aligned-sdk" } bincode = "1.3.3" +futures-util = "0.3" +tokio = "1.44" +alloy = { version = "0.14", features = ["full", "providers"] } + [build-dependencies] sp1-build = { version = "4.1.3" } diff --git a/examples/L2/crates/l2/src/aligned.rs b/examples/L2/crates/l2/src/aligned.rs new file mode 100644 index 0000000000..a3115e8937 --- /dev/null +++ b/examples/L2/crates/l2/src/aligned.rs @@ -0,0 +1,65 @@ +use aligned_sdk::core::{ + constants::INSTANT_MAX_FEE_BATCH_SIZE, + types::{AlignedVerificationData, Signer, SigningKey, VerificationData, Wallet}, +}; +use primitive_types::U256; + +pub async fn send_proof_to_be_verified_on_aligned( + proof: &sp1_sdk::SP1ProofWithPublicValues, + vm_program_code: Vec, + network: aligned_sdk::core::types::Network, + wallet: Wallet, +) -> AlignedVerificationData { + let proof = bincode::serialize(proof).expect("Serialize sp1 proof to binary"); + + let verification_data = VerificationData { + proof_generator_addr: wallet.address(), + proving_system: aligned_sdk::core::types::ProvingSystemId::SP1, + proof, + vm_program_code: Some(vm_program_code), + pub_input: None, + verification_key: None, + }; + + let nonce = aligned_sdk::sdk::get_nonce_from_batcher(network.clone(), wallet.address()) + .await + .expect("Retrieve nonce from aligned batcher"); + + let aligned_verification_data = aligned_sdk::sdk::submit( + network, + &verification_data, + U256::from(INSTANT_MAX_FEE_BATCH_SIZE as u64), + wallet, + nonce, + ) + .await + .expect("Proof to be sent"); + + aligned_verification_data +} + +pub async fn wait_until_proof_is_aggregated() -> u64 { + // let rpc_url = "wss://eth-mainnet.g.alchemy.com/v2/your-api-key"; + // let ws = WsConnect::new(rpc_url); + // let provider = ProviderBuilder::new().on_ws(ws).await.unwrap(); + + // let uniswap_token_address = + // Address::from_str("1f9840a85d5aF5bf1D1762F925BDADdC4201F984").unwrap(); + + // let filter = Filter::new() + // .address(uniswap_token_address) + // // By specifying an `event` or `event_signature` we listen for a specific event of the + // // contract. In this case the `Transfer(address,address,uint256)` event. + // .event("Transfer(address,address,uint256)") + // .from_block(BlockNumberOrTag::Latest); + + // // Subscribe to logs. + // let sub = provider.subscribe_logs(&filter).await.unwrap(); + // let mut stream = sub.into_stream(); + + // while let Some(log) = stream.next().await { + // println!("Uniswap token logs: {log:?}"); + // } + + 0 +} diff --git a/examples/L2/crates/l2/src/db.rs b/examples/L2/crates/l2/src/db.rs new file mode 100644 index 0000000000..090f3a0d3e --- /dev/null +++ b/examples/L2/crates/l2/src/db.rs @@ -0,0 +1,96 @@ +use std::{ + collections::HashMap, + fs::File, + io::{BufReader, BufWriter}, +}; + +use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; +use primitive_types::H160; +use rand::Rng; +use types::{Transfer, UserState}; + +pub struct DB { + pub user_states: HashMap, + pub root: [u8; 32], + pub file_path: String, +} + +#[derive(Debug)] +pub enum DBError { + IO(String), +} + +impl DB { + pub fn new(file_path: String) -> Result { + let file = File::open(&file_path).map_err(|e| DBError::IO(e.to_string()))?; + let reader = BufReader::new(file); + let user_states: Vec = + serde_json::from_reader(reader).map_err(|e| DBError::IO(e.to_string()))?; + let root = MerkleTree::::build(&user_states).unwrap().root; + + let mut user_states_map: HashMap = HashMap::new(); + for state in user_states { + user_states_map.insert(state.address, state); + } + + let db = Self { + user_states: user_states_map, + root, + file_path, + }; + + Ok(db) + } + + pub fn save(&self) -> Result<(), DBError> { + let file = File::create(&self.file_path).map_err(|e| DBError::IO(e.to_string()))?; + let writer = BufWriter::new(file); + let values: Vec = self.user_states.clone().into_values().collect(); + serde_json::to_writer(writer, &values).map_err(|e| DBError::IO(e.to_string()))?; + + Ok(()) + } + + pub fn commitment(&self) -> [u8; 32] { + let values: Vec = self.user_states.clone().into_values().collect(); + let root = MerkleTree::::build(&values).unwrap().root; + root + } + + fn initial_state() -> Vec { + vec![] + } + + pub fn upsert(&mut self, address: H160, new_state: UserState) { + self.user_states.insert(address, new_state); + } +} + +pub fn generate_random_transfers(db: &DB, num_to_generate: usize) -> Vec { + let mut transfers = vec![]; + let mut rng = rand::thread_rng(); + + for _ in 0..num_to_generate { + let accounts: Vec<&UserState> = db.user_states.values().collect(); + + let sender = accounts + .get(rng.gen_range(0..db.user_states.len())) + .cloned() + .unwrap(); + + let receiver = accounts + .get(rng.gen_range(0..db.user_states.len())) + .cloned() + .unwrap(); + + let transfer = Transfer { + amount: sender.balance / 2, + from: sender.address, + to: receiver.address, + }; + + transfers.push(transfer); + } + + transfers +} diff --git a/examples/L2/crates/l2/src/lib.rs b/examples/L2/crates/l2/src/lib.rs index 5e759610ea..663ab5f6d3 100644 --- a/examples/L2/crates/l2/src/lib.rs +++ b/examples/L2/crates/l2/src/lib.rs @@ -1,165 +1,17 @@ -use std::{ - collections::HashMap, - fs::File, - io::{BufReader, BufWriter}, -}; +use aligned::{send_proof_to_be_verified_on_aligned, wait_until_proof_is_aggregated}; +use db::{generate_random_transfers, DB}; +use sp1_state_transition_program::ProgramOutput; +use zk::{prove_state_transition, PROGRAM_ELF}; -use aligned_sdk::core::{ - constants::INSTANT_MAX_FEE_BATCH_SIZE, - types::{AlignedVerificationData, Signer, SigningKey, VerificationData}, -}; -use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; -use primitive_types::{H160, U256}; -use rand::Rng; -use sp1_sdk::SP1Stdin; -use types::{Transfer, UserState}; +mod aligned; +mod db; +mod zk; -struct DB { - pub user_states: HashMap, - pub root: [u8; 32], - pub file_path: String, -} - -#[derive(Debug)] -pub enum DBError { - IO(String), -} - -impl DB { - pub fn new(file_path: String) -> Result { - let file = File::open(&file_path).map_err(|e| DBError::IO(e.to_string()))?; - let reader = BufReader::new(file); - let user_states: Vec = - serde_json::from_reader(reader).map_err(|e| DBError::IO(e.to_string()))?; - let root = MerkleTree::::build(&user_states).unwrap().root; - - let mut user_states_map: HashMap = HashMap::new(); - for state in user_states { - user_states_map.insert(state.address, state); - } - - let db = Self { - user_states: user_states_map, - root, - file_path, - }; - - Ok(db) - } - - pub fn save(&self) -> Result<(), DBError> { - let file = File::create(&self.file_path).map_err(|e| DBError::IO(e.to_string()))?; - let writer = BufWriter::new(file); - let values: Vec = self.user_states.clone().into_values().collect(); - serde_json::to_writer(writer, &values).map_err(|e| DBError::IO(e.to_string()))?; - - Ok(()) - } - - pub fn commitment(&self) -> [u8; 32] { - let values: Vec = self.user_states.clone().into_values().collect(); - let root = MerkleTree::::build(&values).unwrap().root; - root - } - - fn initial_state() -> Vec { - vec![] - } - - pub fn upsert(&mut self, address: H160, new_state: UserState) { - self.user_states.insert(address, new_state); - } -} - -fn generate_random_transfers(db: &DB, num_to_generate: usize) -> Vec { - let mut transfers = vec![]; - let mut rng = rand::thread_rng(); - - for _ in 0..num_to_generate { - let accounts: Vec<&UserState> = db.user_states.values().collect(); - - let sender = accounts - .get(rng.gen_range(0..db.user_states.len())) - .cloned() - .unwrap(); +async fn send_state_transition_to_chain() {} - let receiver = accounts - .get(rng.gen_range(0..db.user_states.len())) - .cloned() - .unwrap(); - - let transfer = Transfer { - amount: sender.balance / 2, - from: sender.address, - to: receiver.address, - }; - - transfers.push(transfer); - } - - transfers -} - -const PROGRAM_ELF: &[u8] = include_bytes!("../zkvm_programs/sp1/elf/sp1_state_transition_program"); -fn prove_state_transition( - db: &mut DB, - transfers: Vec, -) -> (sp1_sdk::SP1ProofWithPublicValues, sp1_sdk::SP1VerifyingKey) { - let mut stdin = SP1Stdin::new(); - let program_input = sp1_state_transition_program::ProgramInput { - transfers, - user_states: db.user_states.clone(), - }; - stdin.write(&program_input); - - let prover = sp1_sdk::ProverClient::from_env(); - let (pk, vk) = prover.setup(PROGRAM_ELF); - let proof = prover - .prove(&pk, &stdin) - .groth16() - .run() - .expect("Prover to run fine"); - - (proof, vk) -} - -async fn send_proof_to_be_verified_on_aligned( - proof: sp1_sdk::SP1ProofWithPublicValues, +pub async fn start_l2( network: aligned_sdk::core::types::Network, - wallet: aligned_sdk::core::types::Wallet, -) -> AlignedVerificationData { - let proof = bincode::serialize(&proof).expect("Serialize sp1 proof to binary"); - let vm_program_code = PROGRAM_ELF.to_vec(); - - let verification_data = VerificationData { - proof_generator_addr: H160::default(), - proving_system: aligned_sdk::core::types::ProvingSystemId::SP1, - proof, - vm_program_code: Some(vm_program_code), - pub_input: None, - verification_key: None, - }; - - let nonce = aligned_sdk::sdk::get_nonce_from_batcher(network.clone(), wallet.address()) - .await - .expect("Retrieve nonce from aligned batcher"); - - let aligned_verification_data = aligned_sdk::sdk::submit( - network, - &verification_data, - U256::from(INSTANT_MAX_FEE_BATCH_SIZE as u64), - wallet, - nonce, - ) - .await - .expect("Proof to be sent"); - - aligned_verification_data -} - -async fn start_l2( - network: aligned_sdk::core::types::Network, - wallet: aligned_sdk::core::types::Wallet, + wallet: aligned_sdk::core::types::Wallet, ) { // 0. Load merkle tree file, if not created, create initial state let mut db = DB::new("./db".to_string()).expect("create db"); @@ -168,19 +20,41 @@ async fn start_l2( let account_updates = generate_random_transfers(&db, 10); // 2. Call zkvm and pass (MerkleTree, Updates to perform) - let (proof, vk) = prove_state_transition(&mut db, account_updates); - - // 3. If the proving went alright, update the db and verify that the merkle root match + let (mut proof, _vk) = prove_state_transition(&mut db, account_updates.clone()); + let ProgramOutput { + initial_state_merkle_root, + post_state_merkle_root, + } = proof.public_values.read::(); + + // 3. If the proving went alright, update the db and verify that the merkle root matches + assert!(db.commitment() == initial_state_merkle_root); + for update in account_updates { + db.user_states + .get_mut(&update.from) + .expect("User should exist") + .balance -= update.amount; + + db.user_states + .get_mut(&update.to) + .expect("User should exist") + .balance += update.amount; + } + assert!(db.commitment() == post_state_merkle_root); // Fow now, in order for a proof to be aggregated, we first need to submit it via the fast mode or verification layer // Let's suppose that our L2 would run the prover once every 24hs and submit it on aligned // Once aligned aggregates the proof we will be notified and we'll send the new state commitment on chain // 4. Send the proof to aligned and wait for verification - send_proof_to_be_verified_on_aligned(proof, network, wallet).await; + let _ = + send_proof_to_be_verified_on_aligned(&proof, PROGRAM_ELF.to_vec(), network, wallet).await; // 5. Wait until proof is aggregated - // ... + wait_until_proof_is_aggregated().await; + // 6. Send updateState transaction to Ethereum // let receipt = update_state_on_chain(); + + // Finally save the db to a file to be retrieved later + db.save().unwrap(); } diff --git a/examples/L2/crates/l2/src/zk.rs b/examples/L2/crates/l2/src/zk.rs new file mode 100644 index 0000000000..76b0306118 --- /dev/null +++ b/examples/L2/crates/l2/src/zk.rs @@ -0,0 +1,28 @@ +use types::Transfer; + +use crate::db::DB; + +pub const PROGRAM_ELF: &[u8] = + include_bytes!("../zkvm_programs/sp1/elf/sp1_state_transition_program"); + +pub fn prove_state_transition( + db: &mut DB, + transfers: Vec, +) -> (sp1_sdk::SP1ProofWithPublicValues, sp1_sdk::SP1VerifyingKey) { + let mut stdin = sp1_sdk::SP1Stdin::new(); + let program_input = sp1_state_transition_program::ProgramInput { + transfers, + user_states: db.user_states.clone(), + }; + stdin.write(&program_input); + + let prover = sp1_sdk::ProverClient::from_env(); + let (pk, vk) = prover.setup(PROGRAM_ELF); + let proof = prover + .prove(&pk, &stdin) + .groth16() + .run() + .expect("Prover to run fine"); + + (proof, vk) +} diff --git a/examples/L2/crates/types/src/lib.rs b/examples/L2/crates/types/src/lib.rs index 4130512217..343aa7fdea 100644 --- a/examples/L2/crates/types/src/lib.rs +++ b/examples/L2/crates/types/src/lib.rs @@ -36,7 +36,7 @@ impl IsMerkleTreeBackend for UserState { } } -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Clone)] pub struct Transfer { pub from: H160, pub to: H160, From b7f99ff319ce57a235b7700fd7ba45979146c64c Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Sat, 10 May 2025 18:31:32 -0300 Subject: [PATCH 09/22] feat: db initial state --- examples/L2/crates/l2/src/db.rs | 90 +++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 27 deletions(-) diff --git a/examples/L2/crates/l2/src/db.rs b/examples/L2/crates/l2/src/db.rs index 090f3a0d3e..49151e6dc3 100644 --- a/examples/L2/crates/l2/src/db.rs +++ b/examples/L2/crates/l2/src/db.rs @@ -1,17 +1,17 @@ use std::{ - collections::HashMap, + collections::BTreeMap, fs::File, io::{BufReader, BufWriter}, + str::FromStr, }; use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; -use primitive_types::H160; +use primitive_types::{H160, U256}; use rand::Rng; use types::{Transfer, UserState}; pub struct DB { - pub user_states: HashMap, - pub root: [u8; 32], + pub user_states: BTreeMap, pub file_path: String, } @@ -21,21 +21,39 @@ pub enum DBError { } impl DB { - pub fn new(file_path: String) -> Result { + pub fn new(file_path: String) -> Self { + match Self::new_from_file(file_path.clone()) { + Ok(db) => db, + Err(e) => { + println!("Error when loading db from file {:?}, will start a new db with a default initial state", e); + // if db does not exists, create one with initial state + let initial_state = Self::initial_state(); + let mut user_states: BTreeMap = BTreeMap::new(); + for state in initial_state { + user_states.insert(state.address, state); + } + + DB { + user_states, + file_path, + } + } + } + } + + fn new_from_file(file_path: String) -> Result { let file = File::open(&file_path).map_err(|e| DBError::IO(e.to_string()))?; let reader = BufReader::new(file); let user_states: Vec = serde_json::from_reader(reader).map_err(|e| DBError::IO(e.to_string()))?; - let root = MerkleTree::::build(&user_states).unwrap().root; - let mut user_states_map: HashMap = HashMap::new(); + let mut user_states_map: BTreeMap = BTreeMap::new(); for state in user_states { user_states_map.insert(state.address, state); } let db = Self { user_states: user_states_map, - root, file_path, }; @@ -58,11 +76,28 @@ impl DB { } fn initial_state() -> Vec { - vec![] - } - - pub fn upsert(&mut self, address: H160, new_state: UserState) { - self.user_states.insert(address, new_state); + vec![ + UserState { + address: H160::from_str("0x742d35Cc6634C0532925a3b844Bc454e4438f44e").unwrap(), + balance: U256::from_dec_str("100000000000000000000").unwrap(), + nonce: U256::from(0), + }, + UserState { + address: H160::from_str("0x53d284357ec70cE289D6D64134DfAc8E511c8a3D").unwrap(), + balance: U256::from_dec_str("50000000000000000000").unwrap(), + nonce: U256::from(1), + }, + UserState { + address: H160::from_str("0xfe9e8709d3215310075d67e3ed32a380ccf451c8").unwrap(), + balance: U256::from_dec_str("250000000000000000000").unwrap(), + nonce: U256::from(2), + }, + UserState { + address: H160::from_str("0xab5801a7d398351b8be11c439e05c5b3259aec9b").unwrap(), + balance: U256::from_dec_str("75000000000000000000").unwrap(), + nonce: U256::from(5), + }, + ] } } @@ -70,24 +105,25 @@ pub fn generate_random_transfers(db: &DB, num_to_generate: usize) -> Vec = db.user_states.values().collect(); + let mut accounts: Vec = db.user_states.clone().into_values().collect(); - let sender = accounts - .get(rng.gen_range(0..db.user_states.len())) - .cloned() - .unwrap(); + for _ in 0..num_to_generate { + let (from, amount) = { + let user = accounts + .get_mut(rng.gen_range(0..db.user_states.len())) + .unwrap(); + let new_balance = user.balance / 2; + user.balance = new_balance; + + (user.address, new_balance) + }; - let receiver = accounts + let to = accounts .get(rng.gen_range(0..db.user_states.len())) - .cloned() - .unwrap(); + .unwrap() + .address; - let transfer = Transfer { - amount: sender.balance / 2, - from: sender.address, - to: receiver.address, - }; + let transfer = Transfer { amount, from, to }; transfers.push(transfer); } From 364d16b7f373e7d1c4207d4d7ee826c9d607616f Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Sat, 10 May 2025 18:32:22 -0300 Subject: [PATCH 10/22] fix: roots mismatch between program and backend --- examples/L2/Makefile | 5 +-- examples/L2/crates/l2/Cargo.toml | 1 - examples/L2/crates/l2/src/lib.rs | 37 ++++++++++++------ examples/L2/crates/l2/src/zk.rs | 3 +- .../sp1/elf/sp1_state_transition_program | Bin 219684 -> 195864 bytes .../L2/crates/l2/zkvm_programs/sp1/src/lib.rs | 4 +- .../crates/l2/zkvm_programs/sp1/src/main.rs | 13 +++--- examples/L2/crates/types/src/lib.rs | 4 +- 8 files changed, 38 insertions(+), 29 deletions(-) diff --git a/examples/L2/Makefile b/examples/L2/Makefile index e41c94c73f..aa88717c97 100644 --- a/examples/L2/Makefile +++ b/examples/L2/Makefile @@ -2,8 +2,5 @@ SHELL := /bin/bash -# Either sp1|risc0 -ZKVM=sp1 - run: - cargo run --release + @cd crates/l2 && cargo run --release diff --git a/examples/L2/crates/l2/Cargo.toml b/examples/L2/crates/l2/Cargo.toml index 507058d27e..a5e72d982d 100644 --- a/examples/L2/crates/l2/Cargo.toml +++ b/examples/L2/crates/l2/Cargo.toml @@ -18,7 +18,6 @@ futures-util = "0.3" tokio = "1.44" alloy = { version = "0.14", features = ["full", "providers"] } - [build-dependencies] sp1-build = { version = "4.1.3" } diff --git a/examples/L2/crates/l2/src/lib.rs b/examples/L2/crates/l2/src/lib.rs index 663ab5f6d3..97a288951c 100644 --- a/examples/L2/crates/l2/src/lib.rs +++ b/examples/L2/crates/l2/src/lib.rs @@ -1,5 +1,7 @@ use aligned::{send_proof_to_be_verified_on_aligned, wait_until_proof_is_aggregated}; +use alloy::hex; use db::{generate_random_transfers, DB}; +use primitive_types::U256; use sp1_state_transition_program::ProgramOutput; use zk::{prove_state_transition, PROGRAM_ELF}; @@ -14,13 +16,13 @@ pub async fn start_l2( wallet: aligned_sdk::core::types::Wallet, ) { // 0. Load merkle tree file, if not created, create initial state - let mut db = DB::new("./db".to_string()).expect("create db"); + let mut db = DB::new("./db".to_string()); // 1. Create random transfers - let account_updates = generate_random_transfers(&db, 10); + let transfers = generate_random_transfers(&db, 10); // 2. Call zkvm and pass (MerkleTree, Updates to perform) - let (mut proof, _vk) = prove_state_transition(&mut db, account_updates.clone()); + let (mut proof, _vk) = prove_state_transition(&db, transfers.clone()); let ProgramOutput { initial_state_merkle_root, post_state_merkle_root, @@ -28,16 +30,25 @@ pub async fn start_l2( // 3. If the proving went alright, update the db and verify that the merkle root matches assert!(db.commitment() == initial_state_merkle_root); - for update in account_updates { - db.user_states - .get_mut(&update.from) - .expect("User should exist") - .balance -= update.amount; - - db.user_states - .get_mut(&update.to) - .expect("User should exist") - .balance += update.amount; + for transfer in transfers { + let mut user_from = db + .user_states + .get(&transfer.from) + .expect("User must exist in state") + .clone(); + + let mut user_to = db + .user_states + .get(&transfer.to) + .expect("User must exist in state") + .clone(); + + user_from.balance -= transfer.amount; + user_from.nonce += U256::one(); + user_to.balance += transfer.amount; + + db.user_states.insert(transfer.from, user_from); + db.user_states.insert(transfer.to, user_to); } assert!(db.commitment() == post_state_merkle_root); diff --git a/examples/L2/crates/l2/src/zk.rs b/examples/L2/crates/l2/src/zk.rs index 76b0306118..87bfdb1a94 100644 --- a/examples/L2/crates/l2/src/zk.rs +++ b/examples/L2/crates/l2/src/zk.rs @@ -1,3 +1,4 @@ +use sp1_sdk::Prover; use types::Transfer; use crate::db::DB; @@ -6,7 +7,7 @@ pub const PROGRAM_ELF: &[u8] = include_bytes!("../zkvm_programs/sp1/elf/sp1_state_transition_program"); pub fn prove_state_transition( - db: &mut DB, + db: &DB, transfers: Vec, ) -> (sp1_sdk::SP1ProofWithPublicValues, sp1_sdk::SP1VerifyingKey) { let mut stdin = sp1_sdk::SP1Stdin::new(); diff --git a/examples/L2/crates/l2/zkvm_programs/sp1/elf/sp1_state_transition_program b/examples/L2/crates/l2/zkvm_programs/sp1/elf/sp1_state_transition_program index 5bb187b95095aa4a0691056af254d66397f652e9..e47ed73b4c1f90c5c8ad5ba04efb6d3375f5ede5 100755 GIT binary patch delta 73853 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 K!c<}%nEnshM?tp$ delta 94713 zcmd44dtg-6xi`Gl?Ad#g$vrz4E)gc#nIQ=w0-F%DRcDk5mud?KQF|2}5nJ!A(AwL~ zuruK*ic1{p>1l}&R73?gA#IPR?@T3NZEHaRwb~X0lw)lR7APW+@As^|bMw;kzTfx# z@&1wQnYEt%tYy$Od{MP4|a7KSBidZpY9FNQj z&N7cw%fF*vV2u8}gX$mu180w)sg{3Kobar9vB|UKjjd;Leen}UQ;FYbO!|$6HGZS6 zI?o7A$TMmqc}C6bJR>ka&uF?U7xlTQ&o$~ga*fc|TxC;~39rgxIexFcTxGgCf(e!R z?B*_y5n97y52_wf9%Xv@B4&EK!ovS0X6IhbV@H>>7L_G*b!~6#z!P3wjTf`@c+TEQ zgd6T)8Lg$Wnpr`$TUXU?CDg;LP>LzRC^Ob=W5&iE%-FD(8INvYfF0eU)-WZ!c9T#O zOi$&qbb=9{g|Qr!88s1Zt0};RJ-S*9;sDbQ7}-{$4#WbcgNe9*E>miAnbEKnNK^oN z0qAGxd4!A|Flwv068tqo&smJA6-qF|MV|VB67;g}R3f3TQgcN9RHjEy_L}#kxL&{& zQNY!fuJ8LqZuy*+C##vBm$${LXnKm7sg+?C%%s4VxG(wWc9 zMc|a*e^{)#{YrKyC)I1tNbx(4{rPW7FbR35paWT^gd*Hn*F#Upya%%HL>=eG#!hAh zvUy5vGS7mdD)l_is?YkBhNRzWi1?MU+;5G|<|@{;X zhV{9_SnQi!p4g2)gSHHlu(4yEjk-6?VsED=>)r&Z-DKDdx9W58?pP*Heuml2TOiyn z(jsrS$|1<|cyUX6Jg#e}{wbiF%3~Uko$R$2?qd41fA;Fvew&%!?q;U%pV0renP_ii zheoMqjT){PP1Rgi!%SZ>gT>x^@@r=59&Yv2GiB#R%-RWDyM{A^cd_*xd}I6AdUgc3 znN(Q;mDQK$ejp0sETvWA@1foCt~?-IoLF z|G?I^d*ZhGI&-MT4#) z*&WA5pQ46^`rBTj&`4~6LjD4XJJE0z(+dhdi1}~5LeE#3-Sz}idc5pVSr@zkdXTr- zW9Qw&O*Ii2>M@=G-ajAGfzw>H0G&G4Yb16+`8I**9uUiX($%Hnd9I%e-v`P+(D&`* zv0}AQtZim3b04VH)wvItU7a2~)fpE1%3;|cYHkpOo$M8J@qIxT6Zq~tqwX{1K2=WT zhZiR4XCIIg(R1^e5$fQvpA^9VT?L)E3fx-6#VYchi+b&=7C{HLM9h^=OJeR9+Pk-giC7xUPInpcNu*(rF_ zlXJNZf1&KEVAd{;DKCUzF_Rfgn~_=T!*V!$2e;qWxE+TBu}>|AhQhNg(axIM?yz|Z zcC0=0X(j{f*v`yTXe0$YN5GD~sd`1~T(5nu3!M6(m&&C@!IbS&*TA9>ErJn`-M$Z2 zwGr=Mso3f^aH3U-D=tOa)#n?i2#czO%w@_}TsyWI=72X(b zWo6!Bk&41#Hl8=58=0|*63V-|P~#t`)J6^_{SGB@sq#6F-+}0#g6InhwwNl?olnWv z%+!-`3#l`@On(xpo|{lz*D#qpy4}1El0uvB!ha!x$Kp34SMrCM+0~%f%Nvx~D7DHF zQK}a%0Dh?X5XNaHjBb^;cdF_~{j-cEH*(DQr2aSRV%D)n-C;$;EQeQ{En~czG zZav{eJ~tKY?_hCaIUEyGT;vpa#YlzcbI7yM+TgHJ_|+WpNxHv$4k@mEy6_ru?i zKZz<%2J3PJvi_tjc7Q9~M?|?C2`a%X$^S{Oo;urWe}63y|EFTAPk{QtfSDQ{*_b3O zC*OPMf&9}@HaJ0Wj^x@l6>^>1d&jY#o*K+z^KD{rmI)Y(?gJ-O7{_>-*Q|wJQNnrJ z3dWNxwkns!RzRDB5oeT;ARzV_zQcMrS76FUEwr@;N)y=e|5`y80xyZwaUnZ@DXlh- zSmkrNkxhxE$foWNg8e^c zR85jCe~G!$8SV29Ls7!SM`FUoa>145G{v4xeJ~J9;Lq2=BQI~{L z%z|(GP#(*p6`Ty!)KV~Bz@QM9SY-d)%ygJ6ZEQ>?6N}lA}>_G!WGzQY*ucSs58fMkGNX?Pssn9<^R{r zv2nD(5mOWD0Jg*-1%kGLL0>!^n0mrAD$`RhBFRf(kn}r*w*}zqW@dO6!161QH2hA= zVsLUu_3(=yz&m&bqF&~Y0+bT9)H@@fLC@ixADGn`hlBOQ!RErj7Lfi@cgW-GY5`b) zwC7lFFUFx|x{AT=u|L0{1Zj8&<@gjI+NTWSOU({DX25M78+{P?UqBS1Vbf$pnaS`* zEr>$#7Na)Of-uyAFw}xD)C_=T05ltQ9nAp3*YgImdgy)8qiS(TF`mSIw4=P6_z?c8kd0e2vRz}6h2W>1b$ zTY`y`Yz~OdF&enfXgsJHO~*A5tqC>abGf)!8JE?R5L};{tQO#KIxfdyY>pL7R#Q}f zQ(%WycTNY@)kb3n`NIe54G2i9?FOPdfU844HQpJdSUD=T`c|V7^^X>P}s7@B^80u zkom!8_~NX`ZtEQG5z7lcFjM0=+|s9br3V>#CCE~NRlqZ)xQWyQAxxum*Icw2Hkm}8 zM}vn?NsZMYHy2U#8RV4;kR7L zJ%$;aZp`59Leljr4LE85Qv(h^Rxe1S4!3EK3!KL6C7R1H2q(oE0GCKY(@?hmO0d7h;gW{1Ug0- zHCsnuHf@9v+B4$gx>5^_eyph*G@(G?@`B;wA0BG>v2oYWg1(-Wf(^$nSTPU$Yyu^q%bOc}>0a!->))7#~WQ(ma z$zr80Qf$@nVx#6@zz7@<7)^Y%(O5G2qt=9aSkG}-4~OS1sdgGqR=ehWm`q!!$A${#`b3Y2d``7gv5 zzE)K-UWtAQg)>q34HSNtiQ=k}R5}8sev~$#^kRtu-5U>*#)5=l4hc+!->tBMyg~_O z%dJqd{No-bQjYp^)R&>Y?4uq=hwUmsOx6XbA;DOR+4xyQgSiX36X4%qWv z$jQg21Be3%_Bz#Wc-HZvItn!@RT>qpPVM?u5rqG{)1jvrVp;wjq2w0vR z;b;#=NdeizZAz_^3&nCaOtk8=)lkV?A@iW*82BiUH47Fo@vfx0FO; zlz3rrz0%kb5GU|#!ZYygdL__NBd){~K~j7N&ssb;;2FYmH=cEPp8a+`^ruEwcf&_@ zAm=6j0~a6(%d}wVUhI^iF%B6p_Yo)lH$K8SThtdJI+5-Jii zB;?2_X{heh-wToR*ecYooh#o}Fq;#1Dl;qbMf>>6NEzkJndM3_iva4b!&NN8AZL3R z^Hx5}k%Wq=Bp?P3g+>ws`V(%q0@)UDxWz)=t<>`taCoxPkeqBaL?$a^d3>@pHruQq z3AY*}&B{35Y>mrK(m9_(qXS1Tdj6NAGwr_;Y6fYk)R}JLm{Z?*qFYXex4!SpDmQB6Ll(T!SuhB@(9hHC2=?s;TsQSylc&$nTlTiD-H!px7VvMj+c&lj(&iAJhlHnWjAE@5eO#>Z*ds{m7i*r_2#r;m zoGoO}f4kD4r`0vZ`EbR5{p%N$g$|tZsPlaO39)xp^<@sDx*W+*dxtuXkl+%O*#d$X z2;xML)1lOMf^mqjR)}@ShUK_l3dPm4tH(|bfP305coeKX@A0(UgkEc{lZ-liZ#d{d zvf**n@u*lgyIKzrCo{*LSY$BgwKcMfJ}^E7Vg~C<-Foku*k74orBsGm5_cBnay@LPM1WQCG`D z=JNnraL=s(T5MlIKnnnb@@bD@Aqnf=JAwSA1KKedx-u`E-{k_CmZeMV>Uf2|GwRi2}_AWGh z``!2Gg_mAyPJe;pkJ+9%%wAT(&0oI8>?ObArtc^-FZFTT`Zlwz=eho;$y|(jg_(bQ ziR*JrEE4R;0^?20eEv0NzVs_D_G683R1Ovn{>1d_u!w+#M_M;DU-$>JKmRI5<mZ6vS73ld3I=3$ep)Yv2oL2LI zz1x3Ns(E$^)RePBkyAd6@f!VG5n0O_J$0dsn z{m@|%mQ>B7_?xbA`voi}V;$DE7Baj0ANYIAlJ z5&Q#dycKBdCLqUqznX(ai8I%6^U&>B$GMJ+*M7##n}>087q~sW2iz);qt_}}62xkB zGatgPwJB~NIfB0)ZcjVST5?#K`4Z&U(}{`21z6>Nm6;X@nW95Cum-Gw15>bGqx=wh z1H#09CjK;$+lO9(E==a)ftR5l_-lQI*_R{Zn*;8SimTj?{m@yJo~v^62-b0<=;5yC zfdt4EtjBJD9_)Mp>%O3R3Kp7`1VtgPhX-&E8?_BYI7;#D8l%h4Ix7&^EM`hgDE6Jbru zG;ZdgV=1)r>`4|keMi8`YeD@muD^l?-@1W`*G{{#ggjecLj%_^@o(sjxK=hWv^PhX zz3W*J4=YOj3`ol%j%z_Qh?#gAdeehHy#F$F0Jw-i>cDGL(1D6Lw|C;j7oJ4}pVkA& zbr-aK8Q3)u$^*?Ngi;(6{|Rn&q2ak`;4}yX!PLOR!=y;;x6$BEQf64w1J^=H0ZSc( zD5w+Wf;hd{rVebHGA~!Jc@E5zEBOQ_us*mKq?1dKk#5fu8MXt*iT~U6M;Dm;#@}fcEW;y!v|ttJIO@r!;lF~POL3=C_b_ec6%)s*MX?F zE4Y4bAEjV32sL}qo1H)w-N($BAN8Lv{|isz(_c!DJyz#0tCeDK}L@NIsgdIRxt@M&qv$ ztuRa>1PxS{1VU__3cZeUG*J6Sipd^UDR$Q4$s1DUB!VVM#;(Y*P`x<3!ZM-;cg zfApoVLY>ET4GsGGvcklrm4|wJu?qPacP*zbF8tVyawAM+1)d3SVc$ZYj=`I`ViPD! zpcj3qUwAnd^U4H7F7g=Dv8ID`4P5I$k2qG3vTFAxq;o4?G@Y$wziFoRU)uj;1lD4r zGK!Qi3yy}d#Yv{MaV)@A;pHUO%2s+~%i4Tkhbl1C5WevMrbS~v@#O++jKu*DrosLk)z8xcQsriu@DUV?*Xo7&~CVIzWN*Bwx-kEb|3|!qrA$fO)*!# z8l`M9`#wfU!XJpl{$RX+0k74or_c})B0G_2qXk_`{haTtT?wh+Kr0NO9eaNuQWaS> zHYd4hq?fYo%74i8@$XKKs_8@EbjrA|7>g~D?gC|$)seMS&XF%ISeU@9`Jl>yIx8k- zRZkO3UnvpCrVSq{xvmuu*J#5g5t3%a`9xIIPX8S=fw=T5aeDeiJ}FW*SxlJ`Et2Ko zpWEIaL4`2Ue&>7jqH9L6?ufmSELN#+Bhh~#)}5&kqngM1W=Up!M$Bp+Ua2~JG-)_R zs^+c|TqqLFS)Xh_bA^~bd461e4qpN{h5m3D6__f^*k_RopEE)w@F4IaHETSy`ecEz zda8o<8ffA{Ja5P543x_i_3z^|+1B=Luzbd1qco4%zD;^AeQByUcKfcJ*pIQmgF0x8 zm)`l>p_|v971+Ty_{Bq-cGi(fd#^)G*i?d3C5)Zgj*$h7GJrJ`(s%e(vK72f!x`?_ z1$&)36e|@grqo;nv%w@z#N9yBkFxQj{fp)J3Tgc)cH{O!u@nj;{(5fYcp@(L&0W~% z)Qz4d@OiBVtMTY5Y(XmyQ~jYEcAXdAVs?mipMPLV_2?>1Guzk7j+@I)hGX+y$ca4! zgigm1l%_Oz61zm(lyPxKKT2Jmj~q&?=9VXhgVys{rGvYG#pGbiEIch7Aa>TlDpgZU!G|Id;g_OYxOaK?gq@C6702NGUd1k&nO#kDDC4u?oh%O9Lg)a7p~+|Pv%?jBA?6s=STcUxhL@r z@!J{oV-{3HsL@GK1y~UW+d4dMfZqd)^0@JKyr`NP9PMcPiIju50u7(7NZlhayg0@QPj=SVW+O$8X9s$#MjfQSsUX0aa&bcMUc8k4X%W9bCYx3d zBo0q%c*(jsSO!Zb>xKt+v^8;3iK09g)?FMNr$oyD+wm!|nfD1cRu!yQqP715E_@7d zaR+HdaEub2^e=!Df0al}gF!1g6)FnCczl>cOt5R#M=#7KQGBc6g zpzQ8JWr-QFVR1EJMcW1yhNojjca#-%b`6 zF{mtj1qd8rMfVOWW0!-#VOI1o)8qYAXTqQmg(n69CN7H&Q!A{fmk;zVd?^Slv!Z2# z%Gf0!5M{N4$}*n;fu&Y-(x9@$#UK!6Q~S%}NO3L#g~ecDe<8AhDWI?rEF4spnG6C^ zcK4vNL^BA?2L}h0g(rbPKR7t33?u9^D%&uqEHeQF#&f{JL4}F&pb%v{29<>`1c4e@ zIH-&@fj}=h~pitTY=itON zcS?AMxbm&WxPW({q$BoSB=HCrR>;d@KhY3=6Poa9?l5FQl)MNfSI+!z<~MTo9q@X) zll;i{R%jk&%v6jhD-qy(N|j(6K4Zh@O+AFKL~lQg9mn-(r&zXg=n*Y`RvAM;c%f=z zp%uc*YQ&95i7OrQldMHURK|{zSVa%&DYFUVC=Yr>gSr5QD2N0YMIejfm?p&^28V$2 zkefxlS69bl<4^~lsH^R8SAU||Oc1BSEW%5+Z->dn5LS*7OnQ*c&@K}~B1e@5HeG$P ze-7uyytFNp^5Lu;I9hbP1KUyM(T;WdKs0(R2YpEua#A5D6>`!RUf&;++M_!1R!X=j ziFQ-0`w1!bSe$Ky;JmCN9h$S1L* zgV^0ti*cA3^~ajHH8yJ~z=&lMLm7vS4&$;l=ue13tb;K)L*!!P;f>hsh(S)bAE|Pu ze~-QhyXEm2=VSK7uG0&Yo`;2P{l-ZIYzv+!j7{5p>jt|~pBSBd;EM1-+t2!FNstHEDD z{$ZsHT3NdWE1A4TdVWSkunF*kRmxX+m338hl{F($rOcdAWzC#jrS$wevwBvFvBtM1 z&aX0W+Qkh2o^jZto3OcSS`sjK0cMTYnvVEVxpd%k$ivIHHH~|%%a1E^^s z_mJ4NI5}40wPsAOM&%v_yUjFtoCGfrpf!D~*G2<+-Uq#;SVn#c4DUGfVGs1;AkM$7C1g`Vol6zoE#5#K$PPlN)JTofhau?r3a$) zK$HqZsX&wpM5+7>Q3B>Jz^qXqO63zosX&yTPY@+kXL>a%_aGVBcnx|JP`-@BgnBdcAbR!xe{cGF zqD(*Tq0@`j^b&NUTCqQau zo&*kh*5`5`^+Ze^H>Wx=RKLPSj#8wi_v_cs#`Wpf>*CFEGbTIwwMthfdEt*S39{P_ zQi+w61k#ip6b_qerNVija0(Poe7R}FNU2W)s0Z{dyjI-bbjcMTtMAjd%zci&UH_L) z*0)SmU^oqYmd;RiZ-y1E`Ykp{g^>y5yLA~;F92}rO5}xM zw=6MH03LHP*wI7jJA5va#{4xf)@uYd6oa|gGF@9@)J-Ze8m5*QjaQc#O*fVpfxC61 zrcKA$rcxv1$G^G_y3z2Uo?hqSQ?M*>!G$!-v@!Lpu~B{2*q}a3n=IVy_4Dpjat*Pq z8*s3BTQtu9wc}PY5pj0@U9O9{*uMLQ9??2lBOeP1>T1s{ zM@p^OW|Hu@^FSB4t$o3regD0E^-X?ta`tzX5sd74_6eoBZ)zVIj@*k-0s&%_fyRuG z`mFB7XreatEcS;zD;~UMQ67~CQd_VxvqhBMTCMMvv3flzq3gwFK9Dmd-a=VftM;Vs z#b_h6)oWm+5%adQJBnvr+wBGMZQfttj4RUdH5D;$3gyLLw0gWq6t)f{4W;w3u{LYL&z;+j@1~x2q*W|!!wf?X zgx9zR0U?5nYXSm9H9X6FWNOFBqhp{@$@H~BW~LsKlgvsm={40O5JNe(J8mnc!_>M@ zqXYwuZ$#s}r&*nC#fJ{7=ZuXJaT6$rC9+IJT=iDIKD-S<$t70<0enk`56h(-@qB8P=~ zABV~xED%fbk#gET zD?ONRVDiuibQBs*6MPUSxP%KU8cHxg&E_d%l6fRPg!3G%vBtT;t^iuiwQs{Yh+5oa z5zOW*MkL=<7eFC9u&l}bv@omh$BOS-z`fH0f{**HV79`#kQdmglSnqV`jueBZ})T# zz#RcxXe+kcMhZ+UUxO%GA}t((>u4N6H6?kdC^A#cK-5u)&n1HqnMVl`FH#zLu@y`f z+9{0QnzmxGH=8>I+1~(HyQc^Z(n4@0)-i#b;F3c-aHxkV4V?Bu7n|`^6x!Ya#F4@w zjs6`#@2{;F3iIC;D^& zi}_%&hVpzn^VW-#$W0O>&2x;3z}G)>6A?L4Un{Bo2T8A&3-N zp=i;4FK|pkXz<25W zhz|sm*(w^S-AXbZsQ)YK8#_>+MLmXGI6Y#8xWpgtrw~ABpxjOYppF2tFsDI1AXYZ) zAx@RsDs~PuK_SOLX9ls`eg`mh$4MNzodQhb)(UWHfRLl8$5|@WgVS_sU~3#bfz7(| zvi}nh)&W^Zu^nB|kHG%R5zM+IbCt0X&CFkkSOJzte>_lsKz1URPJ)Ar z`ARUEV*=$a&+!hSq)?DDg308q_rqN>Dd$f|Y< z*G)(VlNm?C6d(@|_j7xnkhz8x^3Jut&0E@uE9_!cvI1YXwV zz^z>na}s(4Yk^ORn>{@PmGp8`7Pgs%A_5?^wbblM^&>a$Kz-vuvR%1|1J0G1J!|{x zZ4e0JPzO`1*;)o}4DA41JQ|1oNGk%jcs#G471TqVX*KGSu=^|&5ekGT1tddcXcJ6m z4PdyVM70FNhrpN+9|);1Q(K5bh1kwE(8*i6kSin$O!YBvAl^YvCErAVp>uBXdL&0? z*q{@E+kBi5RG87VK;YJs5;c($!LyN~1)yl5Y=OBGj_I0*aQVt&W`1KokVkOa4TlTo zs=W#hEU=~sgaQr+Yh5@y{`LJtO^KO$6o}AJ>q*{MNw>E^!HAF&Q(ccnJIc(~xkKyW zv`}AarkM$ApWOYNno4;=?F*<7>d zu|6DeZr-7CYYZ=={jN|%IF00B0PJN3l7_5i)o@%Y6)CfqPeh{=O3a?04>SaVfuqP? zdI};s4yUw`3+xt@dFAaVN$GMyM4_3&WYo$W5+gXvbIoWRvg`xA<0N)!%>z(bDCt%oO!qY(h$2zmhq4+yswx!b`&3(#0CrPmz9NHarr z19uzUhYgu7K{p=(L7Y-|*gwK{BeG~DFhgK&1xx^;o6>ReGZ-HLPh1-eWCIZz0sx#0 zypCm$kzBfj*fBH`x(oIm0St(3=zzk`9jLzn^|iC%?6UdN zV`3@I4FOgVC=UR8J8Tz5(NR+<^v5K+v)%)snhe1@Qk+1e}xS0E_?;8bcyskvkp& z2sp%TBqem&k>6hVO`MbX-XKKOSVz8r*$*0^n7*ZO>j!~jA$A8va{C*E%SDi*5DyML zgWE3UoDFF*IibOn0TABHKpY24bEMMMc98$>=YmKa>!mmmYs2P(13&$Xz|yHadDo<`IBJY{T>U}<{BfnDmt;%T(Iuy`t%&a;rb+AC&qecuYcemUy) z`MH6ovFvIpW9ye~h%*bjKfrqU{ALH?N*5uX)+TR>vBE`)rxJv>gEs5eg2;Oh;|U`1 zR35`*?e16<4dphh<{VKfv5FoTdC20qeq`(vGsT=7s658 z_ZHXZ0O4{f2SPlR^*c(9Wrr30dLYD8xez|2=nxmz18yZ6x*l+N8Y^5FJTalEThHv! zZR>}mBYv}RCr51Y$IYU*@gZAi7oFnzUQl#zn@8UZg5(o~tZMTZtM2xQIjg}+dKPj+ zK3B8#tMB$0t9K}Z2u$AX6-1zXg0RHhUL$c>6|bPqLftE$O5jz)W^vR=O}N<1Ww&0Ik^TwcBxRE+M(s1&~i5S%vylgoGE< z9hVa3J{Lwl0kaw~s|hAjX=|@JFv+_$NsN2~CULiBB=%~+Q$nZ6M4TG4Tp;-b&=LSG zA)qAO?LN$UM@sCaIC~$8l-f&PrseZeQ+Wjm3z_O(O-NJStHD$?*HksBtV{8olod~- z{e&hJ6;FNN5;8|TJv(1Dfogbv_othkZN*!mS4kXB(Gj|LV9Iv@rc zjk3A6hAmjq9MOO@M|#3)R-MpblE8}&-bYV}L_UdAz`J^{ra=A*koqy&L5f8txHm`k zMn1{(_U6D0b1Z|?5UddQS2?}5TsZjz+!DYo*+7F>gy*1xE9Jt-Ct%tD(?&2^z)(tu z_Ljz7pr!N#P&;PXN#Ps| zHFmEHBcFg-1(^6M*%$^B$m0p+YgJkR!>!h&TM?vj_;9-MW21uxxuqhEgo8ZDo2yQ^;W8>{GD zG<+XD(Xf1?!POvc_0`lUdb*3tMw3_Pqft01dgA>={OWuoaUvf;x%N_=StQCV7f3$I zw*zJg!6ZTb7za_xg^^Fdv|XJKV!_E9IJlNC30g`|5G0=Nj@Q>Rd{dJj(q(ZG<+XDeXxJ|0S&L-k#DR%jKXCw!ySeCH924tJ(qz^ zI|_}2w@BZQItyj{Q750v5PH2(svU(`T0=A}!{|7vI|L;$I6aANJBvYNGS_a0+^3T#g6VS<*0G5)GiFK;Dqy^=;l+3DCX`cY=KJwfn zSZx1$%Qcfqb*+72+F8Pm7>r~2pVL-=GP(cGxmV?va>MLcAj9q*0F1{uqb{!%$d)M} z#Hx*yfw1z0pxaq%kA4H!L{x#}z(!kh4p4_OS-0|A&iBM(_xtVGFZLl2$ip^9V^Z!v z?(bFWK(7?^O2}Sq!&Nuv6+^FZ!FNj+n5jnFASpbta9-1aF$|KnI}4@~4eq9hU&&se z6Cj*}@cu(OvO`s}Lqp03cV_y~&fp}h+;I?fJCj*BxHGOweNWf6V5fyDnNazP+$WO4 z*}qZZSGVewP(LMzT?NV59j^zNzLh(1LQN2#`0^@0YR*ph0_ZlmuXRf2vx1}-=O9Z;U#QhDzZi91tc7f3~$ivhC7fmgR-DCuc& z$|qsG>v4FLdPI!BtG;N9e7CGm2IA(st{Ul-ok8Dm>jnCRohIERqYQrCVfS4#aAyf* zmpCB;-wcj)=>05hNyjNyMY<FbVJ8ykxD%}pc|Q$_JJSn8vuGPF$f4sn;}f>7W=&f z_MJKVX=jPE$sl2c^V=lqmIU2HS?`cUA#DuiKS`SEQ{wI=^^RoNL-vLxPw`4gvxW`! zIZ#8WmTWC?vADUdesrHY&~a=ni7OTFNLLa%;P?U zwVCo1uA11$%p;v-zaFwrqn5k({I+g$e8R5XP!W0X3Q+(d?M`V3pQodEbj?fmsoB?w z_WhURqH<5m(zRFWzE|J3yN}@F@>h}8yp1EQxN9JF#M52z%R5B-H`!5@zo^0_yjncRh|b zo^@oH`0OjAdAIn=E8phNr0>^w(6^pW$UMLKfxXQmrD%8VqW~zDlb1mVn2NWx6@d%AIPTr-)}Il#?w{=d zB;FJ|_OEq5XI>WbUafaO|6bhx>NvNdBVxy^S@+%7#H!b>a$$ZU4!pM7!@ei(e7(XG zzDF#3y=f+UUmyiA8aLohZiN4)ZD(SSY(Nk0XReXGM(0CurSFH%mUXt1enCdp;775= z5PSW3AKU|fxY(1}EI#{(hRfOQR_#>WpgPq>()v0OoOSagN?)Ova2f$=Z;#=avfrw0 z`w*#ui)`l`;_*K;J5;lui^G2y=l0+!G3=8bw^ z2+G{9y)2Hsu~wdu-C6!51^M;MIyc42H2kOsS#$KTSoh{PJedxW|Hn%l+id+4+*?3y z4W1_{s~7YB7#v#(@TJp688s))8?`&mw^T^q^RyA#ao(ugcHU?>ao$0hdRuJy<2O9v zb)xD|w^cgc=O`k_IbGXv&OIZ$ORW3TRej!FS1C6NBi)eu0sn!7%VPz1;Lg)FTuD0h ztWk@JN9dq~UVT^8{<+#0Cem=$^&v*ni{Xh%PVn*$Sp!itSMSx|VuL3AKXua(IHSm&BWIecdbv zTh-Ll*gJYwS9jn(*9~V|WLb0+ZWlk>g1#d8J^_ux&j(3ZCcbm1dd!gbyv}>gRNwQ} zf%j5>6PZKfMoWdu2rJn3p%R@6g$w)NNg%s%GLDx-{^5Glr4!fx_7ZK5l4f3vVZ~V5 zHz_WYCfrBIX>s#m_uO-0xp?^S*y^jPWm0*ZtT^8v>+A5@q5P~ke0ZF5dO494!;X9# z7x>(NWai|{n;m1)aGb&0E3~P-w42hs+2jIpx_wEF?&W<>-Iso?gjbb0Lh8Y35$}2D zjf^HvAGyRy(W2YMXWy=uinp`p$@N7$Kpyhm)i8-sNV(8yFziW$5)blR4_Z>lO?UT5 z1zRJ2{Pu8TCzz_Wu4&nYr*GGTLOpR#XkJ`Z0dFlCl6hCW_I9=I*vE3C4z{vUzJtxe z?<{bXu_s4-=N&ho?#mS$-kIx^r-~jp`X6q@E(Yh$yF5;dEl1rT9W5PH{-8K;^p9g@ zQ>`#fm}2eT^Zl2bNz*(G(*z09H@6NKNB_IecJf5=yRDZiKR|Dh7$zww@yaX6B$Vz? zDElSq`x7tlz0XJCs$!K7_sJKp;NoZRPV`t8rNiYs>X^k9yZb|fHf%^}kP#p;0->Qo z{Nyjs`{t4PhaYmnLow-A;vN|uWJPAx1Am?AN!%f>{A(oc^rlKzr-J!`zRUS;?Cz9; za%1UISx@m90y^g?L*j?<>7MmP+s-<$(JnU^zrcYz;li=+cat}u+){d#FjNtzYI4Io zo#^eQL$K!&0Oao}I2sqd4G3`cr3`W3H3E}*am){@u#lNV%^U|j7u)B zafXAfT`kDV^qgfEbj$qg@fv-kHV?*!yo&~|7!!$?*v zDYJwQGYkfkBMJ$UNW@<7md4t>nnW*u&klD^&@DDl2p7#RC}c4mkf8fk=s2;XjNvQ9 z!^c;T$n?;~806xuXvI^sJ)Tmu^*NKD65;n}S2_j-R?($6cvada+n+Ah_&q*JL#E5g z_bkfy6gzz&$}v;na4+L@Yqe8yqJBc z#X+ksOvCTM9q1_#E@KsoJ&a7Q27dwkX=?iS)qJ>k^Qs)N_jG;SF(eF`GEm|0ApT|6 z(bYsPGBQOM;5dd88X7j7H3H<`L3|@VH+j#xHnR{NaPt{9lDq{DnA3HMPsN7ObPJPW zUPwkeNZ-Wn_j4;r2%+|;bWA=OD~@cAwd0-{t^Fx+?EN6+AjoB&att3#B{gxF`37a1 z(g9%F2iKGai2Gh@*y=%}ZI19sLBNcsFu#*8yg<}8l_{INn90Jh-s8t{d@ORR+nmmM zH?i1{@mpT%iy#)UQ0vb|M=DVyVD;W}FdP6R{!;l-8Goxm5`5XWx?PUR#v z8lFh*2e9-D?h`VXYKWf>FEXFiFauX?__4T(Gqmm0lU#@$s?#~sxwdHI3R&j5y0(4^ zQKsQ&;1ZnRK204&hV)drc(~M?7l>6#gCp)krT+I}UE;n|xTu0V_jdM0ZzHtrtRq&4 zlEm8RmEvsqSVZ4;R%qY`vHlqO-OPUj*BRs-I8u=G8Vzf_;5<(C!(64h$P^15okv_b zBTW)#dr7GeK_}#`RG|3xIDhIGLx^f?5g-w^QJ!~xP<{wKMW-m+YQ7vkQ;pt-9=qvQ&zDhwmjamM0|F?r zP^Tg}09T;cj#Br0MT%|~5tKMe*8f9K;s!GOhKA>_AFRkS1Ar)$V9(Q1H*W319YRuh zH;dvEPkRtCGbjGd!_JDblP`JL-^JmR4;3bk5XY=w6pK7+Tr4{^;R@+_v~S7zPA86B z?l?h|k?3U^i#TPi-y3u^`!a|7sm0>#DK|M%zfI|;JLr5uginuilPQd*QSNxP_eA3K zlA7@7ehnjs<%~^7;e_Ow7NmQSSGy=aeSt1hKXoZ(8t&NTVTsl$Up9a?^9PBR!I}oS z7Kt{K|39N;OU3gBp&(O{JtK%Okoqx6#$nmvo|WRq zAK*Ce0kQjo8!ir?_;^3qKd2uxIEI#d_$gTK6}O(LcGwoZAFZ8rZ$h{Q!z`2kNbEfm zr0Gm6ggGF%0XY?k`=+`>6l_~R6lEWdlQeHspAq!qD39-ZIyO_2x~1$)JtN>wFno2s zZ;U=8+N00NA5qx^J^apx&2m~cUws+_i9n7-6a>(lA715?olLC}61aV_Ro@ZPa36|06>m#}<0lI!?0v5joW;-2*%6+Q}MHAslvgVq`5olm6Cu z&wt#p_Hnrso>j6r(coTgHBQ`m_7LAJW}O?j4i45&sf=TqnV;H;b94C^DY^Eay5rGJ zN^l2$zND|MzH&^8oIQU%Un#!Q`vu;fUiUd(CNjMSUxI>(Yb$uAFGg96^@H@Ra^CDS zY0&fhob->s$S?3YH#07vWG+X}nTOMx)+R8*nI}{5Z>(L1kxf8)?B$dM4U!}~YrN{ehxrO|?E3g+S!s&?FGHHP$(Y2{(mCha9>h$6O9Rd&3*a+;P z@^daTYiUA&@&+rk53xIecyLIZ1>_97(8-sHO7VU_9K)sXwy4{~slEJ{HK!3wFudX*!^m9z$kR%Ek% z^K%131(|XsZj`Enl|F_aW%8bno$kT;Z1_+u{dq61jOXk)FHW9RFejd~UKY~@VF@1{ z3xxbV`hIwXo3ug$aQZ{E(QzYIdo;ifyl3PRy781DdG-C+;&GE!|u!tLxygGjVlzw4@;=RBuO4^a(dsL5mYT#F?PF}hvNB>AP z9 zuDJh|;`FRx+?x)2`99xxGM2=(EP0XDJKv(} zQ6rvz=2PmAIInO1pLQR}<;~oc5=&R* zag!fT&&uP1zmYzi$7g>It^u}r61I6#33=h=w!<;u&@^>S%1HZf83tsh!pq#Ka-0;# zRhFf0BziBM$mbV~k-kR#D}2d^E+>u+Ai`XVgJ{V>8kfQ%9C`78jr+lvS)^6r z1^pbS6j7G38wcfbX9uN-aMAFj4(>m>Gr`{OV+FjN`{bL6)9L&o9thBJbh0vN)X;fM znV|Ia%6ZIy<1tej68iIQH+SIbGz^gtXjBX^i(fAv<9>GM9l!d?I@<0d9UY$jY7w90 znAO0Sl4D@LZ%{pNd<4~y8@JQLuXP1e#DX1|4P4EfuJr`qNn(w zN`93o*{oJLh_rHNBG-2TG8$He4sa60-|mQGaixh`Ri#Hs3GeVo!prSBXD zPD!dWWyGn=(~k`23mrykqtiJf_z(KOtQ!2Kc;uj(2S@U&2n_oJ#-@*sM3Ny#KH+~) zPpaa}eR3{p=bH46Dt^Y3_+~nD0bko+_?1!o=Pr3a>#iEjUsOB^yZdMjf5hv_e7(DE z3~%sw5(Vik^?ZaUlb8N&J#RMlp{>-u3?%|Iyc&g4y)CMm}y# zC$+1}-|IlOIWYCC$SiD)qxg$jx=%Fnta6z%%|3;OedO8(ZrDnk)^jnlfS+e|r{Y^M zF2eYEFiiMV_lfcRGSA$9V#h#^QJciC3-Vljnao(Q#T({y3bDFE^N5owel$tN^dy-V z)JV&rTsQ|~a9sP(b1NO{J}c{eG<|n>Z#w)1J`t;bqVN0n@qJ?3Ke5LwtoyLN#?c;( zGm#g9%e3U}PAL3oFz)pIb-YrHJvhQAZyU5mh~4j0q`zzOIRgvg8!!Sy+9Ma*FrasI z_>%N{Cco-`0J@Zb8q!N9apPY@Mk5a7-zM?P9D@mtPETs)Gy1=@HS@_H*7d;A>hvF* z`7)oB&6v^Mw@&6?;~w^4`nN57tM50^iM+9+(`{2Y)+I0P-Z6zw;Lgq*b{FMjb?L-( z{{K*RK5$lz`Qtz5HceBC{z?DjPDY}d=KmjsDN`zKr421n^XE=8nr5b%DHCzC%C>}% zPAEoVL&z=)Eg?3<#V}gEN}m5?(o7kmu`Ecbl_XbWUgq)H;~))DaWga;D}g*-K-*rV;M(*)hL+cTyK_ zmK@?lNAI=UACes_seH`?!{maC-gl1~=j|ZkPaS_!-OaMX+u7N|T8>VPrhS`#o;Ys* ztT@5uknHA_4UTcEz)Ht!wjJ`w4#gXB}1CU0JIrhA`zksogi&)1dA@RcK1gY?yb_vIX) z6^K(1d@l7f{R)|uG%2}BQ{{t9f77;ujyd03Gs-=6!nSM5K4B}&;~4oijB5w@lQWez z>G~C=W%wgq-(Qq=B|TLMV=nZ%j&_gjpd)%iN4tH_@_`sw`7zRnAs4`2lH9&DMXFym zr|dPqQUmg3ZcpOglcm(k0e`9K;w>BPex#IRXZ2VrO1@9d<>nSX!K@IJh?##>8(p&deSQx z$6|0laP7-aZhm{5d%UY=_x9W9)7|7Tq}L4U#O(g6+wNB{J1Ub4ws}1#xJz57@a75B ztY3`tws~78xVim&xX)i8{<2suWNho87KYqyUgvX|7mW3cbKHeLWI6E;o#QT5hPmX- z;VijRvA~e zdGEkvBDK5NE1Kdi?H8WiWsA7WANL7w?-cj4TN9rj9lxJN^}d(fb|+Hpes#s3@4+`f z_QEIUpDZzLE;h+ku^ucjeotO1ZNKz@KgRLF=NHvjm2=_s{<$!>RftEZc9zBX8Du?)c%Vw%+BD zmg)XCk9++wGCE($|H!$&dTg98cSddAeV*H#%f&2Z0(I&S~S@kjS=H=tL~WBPPU zN;#olm*bA@(X~V0&fSxbYTv1&H}YaPnvx(SF)Mp}E8M}uitbG1a}XNpGKV+Rmkpm= zQdN^)-{34pe++7#GU^=brPjE^yi+UOfnA!BPeAq?mfw!v?X%tCeT-=r#6vg?pXz-y zn{z;eJyG!v^j38ruTQ0WR=34#Qk_Cee1bQ(lEv!uIc_SseS3|!YNmUxmnd;Nb|1Vp z)j0>#z8su3ID^-EeM{ZGomL{3e8Ojxx~KNo0{4fHYRqm)$%2GrTU-EU+<1`w?67P z&BzO|+09?EpMiUm)b?@SsWG>r%O!U!n;P^(y?K@HN!|-Fcfj!*ke`9^5;U!}57! zVN_Mqq#CzZmlar?j+Yy_T+z?_sL4HR!d^s@rNLBcH~ucO5*jxm>U;uE;Yb=Eb=Ghc zbCh$Wact$-&9Ru{;CS!p5_e3mxv}~=)l!1$ds3Z=I4t1k6Lhw`9mrcd8@gR%f|6CA z9d%O1ssvH_LE2;g81IWxcR}B4)~Wp8*hzJ}G4=Je_2{oz=Ur9ip4w#}dgN@ws~uya-Z3-X)Z;7H zr#dHyhLFM`4!7JFb)sY>DqZC4?i(;EM%<5s>$=W{_1>$Mq`}`vm7CSRm_=%!m=<{p ztK6e{)WKu1;|ifaRGg%!cX!M^(YvI|?bowmVS|kMofw^kfsCDA5;-kiU2^%tnGKC4 zja6mCGShR@GyF-Ss;0WCCN@))63=m>EQ4eCJAgw*=H!~PShT8!i1MMbq#;^YA6rmW zJHMfNVYD}O_!e~ux zBk`hjvHFVI`nj?4Xnm|~etkpLf>`y!jW{Uqdrf{rW4WKfhJ`g{!&MT)YsrGj<$j&Z zyGSjIL&DxWq)z?$ZBvt*Mz@~wt5jzanjRd?DxO#6o*RD#;b;WXEHVTx7&Ud$_(^A< z7Co<_s%EwnRq_*y)|b?j*UpXB%%58ttB=l()x_#c8f)v*>4Z*KUiO&DUlXLau3sK? z7R1V;RSnU`+S+J!N&W0tS#3>CtgKOrULR|SHI_6qc>OMQkI#tJG*&gLx~QOImRHs` zG)Cvw)W=H7DoaYMV^uW^sJ8NGMOAgIreto+E4Y-q?rUnJ^tJku*|BItT}fHYn|`TV z9U1z7_wuFg8OJs~km|_9y_CN)&HReLuHW`D1)td|!izeNN51U=@7g);{oNmjWnO)a zzswBIB@cRMRCA^6z=Pf;)o$PJDLj%|=HhPrWtwn$Jmg(h?T+o30~f(8$kpzdZkHk+ z_b9{t3yzL{dPAk|W>OOV4a-Q+PFD-k?D>s;=X7=wL#qBWj`q@GXGQuy>{Zmbc~f%^ z2J=GnUr}cdNB^&*&LNH>j+DGqXInuk5mk_ycT!WG8GUK|Z=y~?a;meN&uRTqoty#8 zm=Akj)VP;K4nFKns&xlmF!2#psPp(MOIR6yrEoF+iZ46;MgJr(|A;zoAB8U~U*kHd z^v!@?-6_@kU9Edc_nkPAX*+Q0Me5wK-JM5M{i(soJ3s1OSm)-opN@Q(_d%W8+k3dq zJ+adYIM>gN_dfdgZaBPPE$&94s!Hoi>K6_-W2CW?j#EB-Zf!ZEqoRa9Q%)Z=eKtnN zs+u=H7FA}^@x`Y_ORF0F9u$o=RhBS;#mZ0Ll==}~`MG*`Z6w~4RbUSzdN{XD6>&`FxP+sQ<7$o@I1Zy<#ov249^%--@dC&1 zIsPBVeva=rI{${j$C1v_AHRkC9nJ9*j_DjRj(HqcaulP#={KoyXD#pm#}a267O&xXCm~bzss+A5=RjX#m1y7{J0CV zE8OX9AP*D!d~aTj+r!(m!0p^+#*=C&RHE}Yodq5B9%tE;-qZ!|8C~{aAT#o@4cZ4J8;Sv1)PHOA&fYwKHAOtue|{mF{r9h z?j!@%RdcHvql07Vv(uvu3+J*oniCbfQ`rAh$D*cG;)T6XO?j|VSJl+bZ;VIlO6pmz z8)FPJwSt$I$d*g?Ikoc}FRQO=j72Yx)z>z}VsoM-IG^oCY>w2JpY3_`Ya2_bma?|wt(1o_$k!Z%nsUtIf5}izmAqCgY)a^{7x{xCe~C(b5NF84dtouvrMt% z3K z#}tl>Ip%OI=2*_*actyxo?{ospEz1Lj(dg`h@+At&T&1*N{;>byNkb1aJvwUq}Gd|P=VQ)KnAytETbhXVo+g`_uT|XVo;G_S}C?<3-3aa)aCjsrl15ty_nM zOyiAsmDco^7ygbbX{d~<;ZRn>)>tMPGr#WDDGfibAy(fooX*Hret3ErgP?YJeQY*E zK=x8xF<~Z%HKms^8O0jXt7?bkRb=LuXJwU^mSpB;WMq!77|!`mCDYkuHEe4$bJMf@ zX!RwR>Ae@*i*2b+DH%GEV=%|w5kYa%My5JDI5v#%zPp@__KI!ZfGgaADO-snecbzQ zmfJslHzezunZn2Dv)$s+fv3*JY`-|PrvYittHu6vhKzJ@6J!J}8!eSr-~CB!WVO1E zMP52}+VkGjMeh6Yx^bz_iX$AoC!{(D#s_v?;UmTQf%+3#9i{yjr-#RTuU_d6>^|c~ zRlsJ3tc>OvFM8iy>5lHZ2DwZHkMMUOe|OUVWwbu>qIcm{?x~#)AeYgayxqI;D!17YS8)v3^o3C<*OGX@TQNzHw7Wn2oGb1zd0 ze=mlU`HS6WaqhJ+cFU1V;X3hG(%Q4#8?e~T>%J2{36_g%c^o@m+FY^N{i1!Rl?|!R zxCLxP7kQUl>-Ii%bS-`BvY*Uv^!u1ulv(kS#>%A#X**Rtc~@WS&i7Va>mKF(^ICU9 z_oCO?Y=6ZKf=YuCD5=Bz3;-fQGt#P9rdjd%( zClYDixwpH=b<6=%z%Aal*AsWeayO;@YIv}B^-ZW3p>FoA{gl^$>reLHUrx#!Pw~E6 z&i4R|hIpsm;0|cNZ%87M;hnpV3=U;<92(+Xia3%o%)3thZW`u2C}z?0M557~cZ=IE zc@t)J>E0KjUXtz|eIs6*hI?5z^3DG0Oz*-QF+Y^qnwJ^vC`MKyF;Qm?915l>Tmxo+ zISRLe#o#!Vqdj1CmiNt#Zr_fF`Md$u60hY}irAlS+c`Uts21$uO}WWU>NpbFbY#oD z%$4qOUe{H~W+B^#thaa1O>V#TTlhHGdtN?@bf}+f@-~ciW_y3S$?bdmUOrFBNhD+; zlprm6P|K#MTyhhJvltVF$vNPr9I4K}9jEcRe{Lc%OIbF8Gr$6cE5SyvSmEQ~YH+0A zK{~z-J`OJO9-~n^9s)b(oBq)$Np?c{R7V12R%bY$qxiSh#DG z2^pA!(H}y8*ks~Bv)ey;8qytSd4Iw~auc7o6wBwnerki(AlNX5UZq?{!#UiF{@@sI z(5*DUUOx9fJCT^KhD8$7>3s>mIccTn_39X(zY>Ti;do`ZU`XFN2CXe#4va*=^u0s6y}y#cqm=^d;2+;eIou}=+; z<=`H0ocEE(@Yn=8(`0D1taf{+K)rqHcDtespE89yvq|#l+*=gQf>b|OoopHw`;g^$ z^VTt$WXQzPi0m*jH9a3InOlRX>Aconol)m~bcfqJ$Ex#PSbTDRBGH6(xJyP69Y8ZY`pI2WZ)*s#E_V9baRzzD7?UD3Y$-InP-JZ#Nkv7is#;#@n zCUL5=Y?kzCH2^yfMliUfb*PL3GeEssRDwC6nzlPG1B*c2B{zUG0^9*Mfoif%-UqHJ z@h08QP)g~_fGqK9Zg&TE%;59x(l*7Kj%Zq$U#$2dJ~x-M?5HxVaIH#{>R*FCDfa#P zt>`QNhkg(Go!_I6%K6`63^FPbiA}73Qi(E*I!4(uZ>{n>KYgatP*g>T-mdcQzk{t` z9iLOGSsU7UcirO-T6HJ=c|EehwbJ!uyU}SdQFbEQSnFlo=??06h|fLibuTq@ zXuWsUo$i2cBl$c7Rk5B&tEJob>h5z5D*5Li~PWRM~+xT2L zKarRb^zTl4k*!Czubua&Rqi0KZVfr?$+_h8h0?iYkxI@1s~38AtZ@gPGK0@OFHa;o zOBSmCv*#|7)6gqS$2esT*cm*Glsfy5M%#*hA9}UxNZtb;zQVhT+M%vjWli@-$zt^s#|d(`~D6rJ}B?bWeAr`kDjy(>`jLC2BErXY)Yr#HJNtLmylHu7pIv+UkFt^mh@kM;0&<9%al#wG_Y~0s+&eWS1syEML2x8EOKsLNnwjEya(c1odhfJmrnqr@K74~$ z)65M=b$niSBRP$D-_S7!HNz`cBob?+Ekj!k>BQU6cfHyBteH-{UuMUVuijbj9MyId} zt|MnD`>g_80`ERH(3iNRzrRl)D92!h72!sB+!}T6E;aBJJPS58@(EmL@i7$SF!5zR z6#LWQ!InM-Z-rB|eno`qD%&lCXD}$R_%nDh4p}>Vhg~VDunG~U2P_#j+zW1oCm@gv z6lpg4vtX$a!(-zJB*#WD9+n&%o(M~Z3{QroMhs7drA7>&2TP3@o(`LPQzS#zXg2!z zwFsn2jNq5B)QI8bu-%Dnf`ibKxbrgArad`Dl0Ne{SekSetGw_nmc8_$m*I(nquK?p zWPb(05^iQOZTc1544XDO9>*Ij{n_xQQ(7H36X2pD0sjOp=1vvkuL+(8vwQZN*)N3~S`EaA zJ}UNcB7Cj|Cc@v~6&M&k058J!=CKsu4(Kf}_A41WeoCo=q3So(}%Ihn4shV|cJ=>tapCA_4}#@>EW@Y3J?{>9D4b^Ta5%@}EO-L!mtSfi7lGWwWgN;G z{%VUy!1g?F1{{QzM3lusI@Mu1tBm`>O{z~Fa25aha+M&P9mkDCoPWS%Fs{Zaf`Thl zg8sOLA6TS1nc?&+Ri`ricUUG8Su-R-sY;m_R%p(Er4RV?2>y1#(&i@q^u-SIMm*}& zkt1>N7X&iSGc-^CxfWQnjiaxYLc$7l=vVlO~78r z=lo@K+Bm~%v=%HxAj9Y!&CkH*CO~oUokT$2S?fprQuXQ)nwP-lUOln@9c=E|6P|OO zYT^PDpC;7p&p8Zp^LzwF*0^tidly78m*6^Az~#-s@_HX!4ErUd5B(mN+rm_Eowr19 z@jI~GS!eXSJCJ_HJ;BV@E`<#y2K}*+ne5n(icN&xu-vX^^fApwUkR^Aj~hR}r`hQ5 zfVn@A!Yci19Vx#EjKLci$jyW~+909X=p&uvqMPn?WUy4T(Z}FjR*l>Q%RPmwwZFe< zHueYN2=-!N1Yg0cM+W>)c+Kene+?g^6PYSMk!5W48G(Kfy#368Pl4s0OBEu{Pp)tsU&8?U+HP6s&^fO^;bHk;u+=gi~Bv)yKjs7NB`i$XQU~^L@{^QP8EieYp z!BT~WUx4M7O~Wt2QTmMG9kBEv!>_^iMD+$7gqFliCMv11p{@+$xa;tKGr!mG_64p} z$HXE{kfeFr^{NRD<3;9){>xPrnsGe?mQf<-rlS7}mQfJZ_E+DaMu7}l(Wl<1MuFdn z;|NwEkUp?Q8+-&y2~7e6Z&Gbqt@ZcA<~~{(*As44H6%Ab2)}8SScY|bQqCxfqLtt} zay^W@G<~A~yUtMv=T<2(bzs21|zfRpLCw*chEH|wh`!nI)=uIEE6qXxXjeahi zG%nyec)McKCj$)##!+GwBF>c(VSEsQw~9DR?oB0Wv5q(o!;P>>a5pTs=c?d3AHWCE zbCtojPwB$2wd}LuV&7iU$D{zkRt$RR2xag_E5eO%xs|}J@b4}AXJNS~SOwR45k6(T zp6ki*7qHw*Z1i8jt0lfFf5aKUc6phV;CNVWHZ~C^!O1x6i$H2%AuKl{8~s&q6g~5m zuYUkOXz3q;r=Vxw;p^Xni{QAaLb(!WH$ewDZ9-J}CrT%H#!mw70?Q50Dny*F@D_`E zz&kAN1^1+n82dhO+B(*MBj}G{q-AgdJkjETu-px8>`#KXSv(k)PHOZ+VCj^G(_y(= z+HfZPuXXW2kb@wJCNKv1@JNeKgQr+~y3^rlmc9sK@N`%@rQwTU>Gg&$fn`(}E`j6Hsf?f;fpj9nvtjAQ zhA)Ms(-@u$OQ$ki2cK_o13ca01+YCeFFYpLf8e7fF{Me(R6GXCpDO!at~y}>=Y%qK zcDhbY9J5@-kHFGIDa4kUuLYJW@2&ZIW=83BW+r_dmQHH;n3eQDnF_^$ByeD*nhE{6 z8NT2)H4_@%4$I7EHl1gzQZwCZ9sfyKX1Z;f|0Ya^OoCr|Y807WaYLM#Qf2a!%t^X%1qaaCh;TkmxOaT_b=BEV`e-UkNf-FXx;E9u?TEwRPHwbo2 zYZW+8!rRUZ_$hex1p#k`o2fCs&8fG~;Npt{{a@i_mc9p7VSb7rGw11=9Y1jXUxYv+ zs1R|^f>&5P7LHouempE0F!mGSB1=CRwtM+hI0!9?jaR4w`uh!8|L^9+L8@etId%Gl zs*yv)l1`b!21H7@Uyp*>bRwydjhcVDR%KYykt#pWN>Hl27S5O%)p_8up2hTk*SQSA zhHp%XlAOz7y98IlL1;-V7Jk#%w{xzs^pfDcaDkQJ{qV+FQSHKY9)R~#gZxqF|9{|9 z=lj%c71BoE!Z|R1$X>)5%$E~~RRo`>!b2HWDo|qB{FX%Q|*fZ-cqyGCw?gV2%~c9$w~qpO;1rKOh|c|61~z|o4RIsbB-yi`ITOL)e;b4L&S)`c4av@! zHr$dJc(<}|!p4oXcV2*T=-+-IytG+m(5wx=gC#?LpJJ4ByhjSe`ah6(GHlL4V18gE zJkCl`+OQJtSsle%g6qtIH&H{bPf5;0a5EVghro5(J14Q3?8Jpvv{f4TTQeKHa~unQSfWc%0EB8hb2RXx4?1pn_;f8;p?z;q63<{tWz~& z#`zRjYS2Y5!}wNMYQ&8D&iAS&Q}(R?lMqM~7=snCw3%`E7A!Sjc=UQa!^ZwK*!=oW z66|uH>H`Hj1CwF%n?2Fr4EsNo5PclM+X&3h^~B(~`&Ao_)($R&&9Cl6f4NmdGOWB% z4c=ktWmmn{VzGbPvZwziJHNFIB*Hd}CBg?*1hL<1>Bauf7K^=H;?c|*_EjPK>Q+7Fmk7130`}|h@=%1EEWOy@ zVzJmi8nXYjr5F1rEEfB>jJ=;eRr-!)AQ5(3ED`=;BKQ@T>>RT6V*hW8#lH7(ZJVGU z9E6s{0L^~-5@AFr!Wp3mqbwHtOG5S~mR>ScZn4;39kO4d^s4+4;TNF@>q8NKW$DHK zL5n4USKu`(qPmc-vojR`_m;iHf6Hf`zBp(JMK~CW@GpzSzF+UQRXhL=LQ5jmVzD0+ zvL7dUQ+~!)}fw^DIWNkRJ59Qx|b5z%w>x{<0K9w2+o1gYdgj&riLd2_&OX$?U4Y&XvM3PcvU&AZz3=%vH*R2gW0Uy3A;7C8VVD|*v9!^>pa0ne0!*Q`?Dn@(6VZ1@kb`N6x?=y#e$PygqOw&R0e z!i&LB&BnoSSW0X-3ziZa&V>)a$p|F=EX_t=21@}ASHSug_UioqW-TxVD`E4~dvW-j zW}|-r?m>-oKp^_RX*T);uvD?(uVC}jeX$=fK(U^GBTgy;sbUi$4YoVY$#4)_5~o`1 z57UtSI7=_X@EnW9zS`KU`JV?QSq2iJ-eQSx6D$wUP=VWO;9VBq2HP24ZN(RVcUmm| zHp6>}uhORypAI?rtrbBWY_nJ#>KR(KS~Rx zA=tVx7*4&Epv)!S^()2oYxw+_cfU z{{JBY$$&BV7`ChQQ#c4MiG3DJ36F|$o?vC@Xt?vkL4gWj^YjPFP^oa-N-!o4?hGn&QJ{;gqFlSizP#{Y;3eLbQ^5PUk%5d)<7pgV1hW<3fmE$gM-kLc)?<^ z{}U_^izvoOzP=wqS%g(^9ez03hWVv>+-b553NR2}sU1k=*!ssp%yR*pl~#Oy0q#Gw z!X)^t<~mnpXu!a>`V$9IetFD=i7*I*8CIK3f#p#cMt`2>^$4VdzX|ELg!ma)9_3-; zZ_~V0$Ip+S*w$cVh|h%OIUvSCvF0LOqL)JYS3~?dEYA=z@!!&%hCm7sKc7#w!9^jy z1eS-7Y|#1d`yzC$-VXozk`fCkD&YOo-=4SgYAMTo>Z| z;9~5J{=pDG3@@We%{QaF;gzsti1J5xT@O2&!`!)~tMoj0YpX%TS*-OYfu$k7F2py$ z)!#*(M+swIvWf3@^iBZw$oY$<$RdY<4_TVR^!d3Vcfz;u#^H30GS7 z<#5#X|k z?eJW9pVcIb;APkw{jcCH?Slk2hWN1%KMwC8e(U%DA0m(k2$2u+?>fb&Dwga?2FHhZ zBHW)&d%CZUI14oU=6F~L%S>u`5xnoP;r31(u6~&HpUtRWWe+MrYlMek8Mns4CRoO; z;orbAObtH?%P2DZ6nqe#gg~0)6U|2d7r6KlYyJNmfq6udL^yVcViTb^Y#yB?`m;0} z{aDyM49!MA3YJc7 zxES`I`=sq_hcf?&z!=nHAidh~eAqk~N)l++Z1nfS(u)n>51R)^iT#_Jjs9&|MwQ`r zhcf=`9nSk01c57`!qzvPdo8`}cn-tz{HKYS$*8FwrdauKop~W{gn2HMPQrB-#Wb343(2sK79T zw^$R;y|6qR&FJrk<(X-QAAlPz-Uu(U_)%Dz$k_iHmL?*|`o}ku2&BqXh&WqdDWTzK zU@4*DXJLETJ`V?>C9z%jO=I8AIrcHt>8cUScSwu3FmF)66o3B{NphY*u+10HiQo=T zsZlXbN4N-<68g(6U%}i3O9{K8m#<_#g3CE|OVXV7G>a4dT%VJiXP%(|_XhFr;{?Ee z+MJYM9PC429z!SmJF7%8(fk?igRKh5&S#chPPhLmY?XMwrI+|AnS4uT^@%Q;C4GYH zbVXpEbSHdlh#PXzt*|^4&*)c&c&*Q^>%Z$XBao->Euzt6oXW#Bg^h#uAx?o8lcBB{ z$YPTP%M<*JeZFQhkK7j0-ys~gBCJKQ(c*O>{#A${gyk`SCc#HT{CJ2r!@W6W-arJ& z@CerJ_%=)M0)iq+WcGCXHLC=84<9TgHvA=Qo?|EukIzwT^if#)gy9omX+pz;au|Qx zEx{=m?67z!JkGizG92D*>9gQ{7U#l;EG~c(7LS0Fcv7Lsz!^F8zn+$06b5M)7sIDo zd^Ws??|zMg3Gi_A-4I9(%-3x6O|U#x@ffYYSF_RIA4f3RGI&$7F?bu6=P`EI4icJ; zK9b9chLwR~nvFgKmghKj*6}aWZ1nL<5Zr)4M{V#+&BkCkEDwJ?O6xakHu|Swc`#%r zt^ZWB(eH!hp^;s*zDJ&7t&cms5XciHje}8|je}xXo;GP5)M_^RdieL~O$pa(Hu`2* zo>FO==rzqs&-wow2;>o#ri#DTY#bbh?tuuT1W{iO*I^wDa$$Kz`_2%PB%ziAw_ zbMAUf?FW`4mMzt^&Hj4s|A<|9DJ&a~DO&#;Ec*+?Lw@V;58}=&ZEz0)SECAEFMO`44!Bu@G2~8iP3j{L9Hdp+W#b2))M3Ik{4ONlnk3b^W8J52K-YuYWNRSxfIaocfSn!h*(LgEh|h;N^fU!@or~aUJp9)`kHEvVaRf~W{7!@5u~393L;Mu{ z2^sE924o)i1WxG{B=FY|e-Yvqc(7$3|0jYqmf+u-n_X4HQEUcn{n!wXhe!4fGB63= zN(N1V7Q#C%UfZ)Y>+FHwrioNYaz2FRxy>qY6Dxek zy3qJ3ywcL|gV)1qEnxlcafT8Y2fbkPKxnDrQJRgu7?u(mJ{y)28lC`40Sx~HmL@Yi z1wIU)kHD4n{|YTI23Nt-Neo{Nn`cT(hBj(8`bS~uLxz71+oR?QI0!9?Ey8-#(Er;x zW%PQfA~SO(|4vo0i=CVeUj*-_%GKF#k~964;8EE!6+dGoAfx16c$t-<_u=gpe*nL& znDi;pUIccI{|pDACGnZCHO|l6rX2J{EE!nA)G7&>0?d0=Wq`iy>;G!`lMJ>$)AT7x zpMlh=RiL;FyvOQv-9vm_i2K6w7=9JF$0NjPAwC(FNA>IV*L8*(f$xDwsf0KOPU{yW zP#EGfLOcr2;K|@-7*@lNTkOG=aNNv9FCeJ14E_d3j}H?3GQ|H1@i*`x;+u)-q#`at z4G7|&8sg!K<9>Oi39=B3J0XaWAL5ZAJ`>(cr}Wo<{;z}|C;miNOs2B1bcX_x#7qt)_cBDHarY=QiBX;g*ZRNr@_-L`!hp48g7bP24^E!Vev#* zo)oV_#F-2yQN@O*!aXfM50*AJ`suKFlDy0t*Jw8SYvH(b0wee(0_g*Wm&1$UOa$U! zvu2}z8kSCF__we;qTcW}SRPMr_(k}D#V?Pd|4XMa2Crbyl_oH}6Rx!Q_i&xXZ^4T# zeg~F5p+b_g8#Yg}mjbjKt=RZa9!>vy7zgIuE)xS`V~_)HwKyN%37c(psb*szgQX7{ zu7u5_@+AYeYBu^+aRk!IjNo?Io(b2$LEs)vVQVHlyjFEGPN4ifWaT4j*!6T3PkmHP zWQ(=_vrUdatc^at`AIc%Ez$=2VVRjGYVOCrT_zs?+i|u~k1@5%a_sMb;K{G4HdSi_ z&w_!allr5EsrhYKn$YNv+o_sR>*LOa2&4`DiGv7hVe@_jncF{vrI$;s2oHQ+b+Z1N zW3Y6x&YBm$q56=&ykdXn@7rd0omHbr4)^~(i{K!gM$Lpt&Y-i}4#OcKPKOU$!!$d@ z1tA^*rwues>^em@%k}@W5FD_2?O53E1LNT!aCf_~)dwb9dRg7(z!R+m>q6WB@6>ww zKi^3resQ?rC+}Ww8AtmFwZ&mi|UqUIw88zkq-zDwg@5w|^p-VHtR^ zyy3w_xC7o`@mjd+w?^OIX@>0@yB7{ZOX7ZEtH%DxsE`_3EbFhFdeuLza%_6(6R?!f zC7yJ;L$Ku7^y-WqstT(ykoZ@HxNw(AKD;5{SI1sxYc~3~b(? zA^K&odFO@jYp^PTO5g#j#L@>|g6$@IHN>yOvuILDUy^j*La@_n<9A`ZO5cZrz&E49 zR+a9g1|-3ih^0pMTK1Bm!?5k&E%sTbPX>|@tT@TEsq1tM@zEjf2J;>pohKgS0m~~u zRNzz&K4fu!*e=isu-Sj{fqSz>V3nu~Q>kRAK(}$(c2xrY_$560EtP=j6O&={4iagi zll%lQCP)p8g6#~C6^>ga7?0qP#gjsOF5GmoDWU6}AL5HbdCQK8xBt6+J{hQAuh%&OVwJy_nrag>f9e?be3!Ar2bp2H+?K(o<*1s9>IYxKJ`8~q<(dG(6nKf>}FmVOAtpL>pCqfdh6 z6)h%1!!@Iq`JX00Ag^xer5#+X**KU5%WGXsr@LOW(ccKmD_@S%@t@Lc^jl$h9gOk+ z7tJbtGVnP9c~^`Xm&Z<2Y#j84*QwZ1iJcdB=>=&(m!5jj&8ihA)Ht*ZoNO z{U*=?V{jjA-UB51U7C&l53tOHhW`l5RBZS?Sf*mbdtiI@`w*6(*I(|}7lF0<_1msi zs|>`lo`0$%NF-U!+@G|adXq!k5ti4Gso*+Chq#Agoj!HY3&E1~AVR+oM?-ufTs=In z9~|OgA}>3{HoOpA8n9+3!x_1O{RgnrkP2K^gr!Lg z{~4AhHT>Bm`riyo@K+4%VX_|%LQCTB!qzCc{S}qrCd4vIy1c4JMVhO)2$nu0i;?Iz zysm1bS?l}9-%!J3Vni8ChNaV(2rt6YL^;|)K4-HsO7>~K6qY_?>{qY}l~FNHC-5RH zz24{#!qSB6b^Q33QX(B>TpvBTZI$*2aW8m}RptFc91Zb_u)Mfb1=ktemgCM41XG?f zr{59he0T*-;%}?z*Nfqv=nX#v??9h|N0}Mlfp=N<2{?F5D(4kb+H%J>9Cw}02;MFX za@Y-)cWkK;aeBg%A;ZVP=FMJ`fl-=`z8IDa8a^AA3>uyQ?}alF_}Bj%wZIr$21|(z zUk;mBhDn0=X*T)|u)IF3GXl~7L9@~S5tbS@{2n}AGyR{RLLrd1iy4Ct;T;x#4DYh| zQ`jCQ``{q7B>qp>8YNjzs6I0kv5bPxVd)cFcv6oqIFXA^(q`tWROKI3C-i4FA{>S# z$GveNr&edYtupBM0eCSi8SJX{FTmzCX=2~*9aTVcP3Vi(3{!sT_1(@@eIUn``f#0} zYQ~?qbf$;+A~bX>t9QvMg&%s%`*mwC4;L%4sN&fa`L(+ z6#s5ZFY&jB;{Q(TRr(mb8glS@$ibH(2mi42l7T~^`2V)_l7aqHITy8RELE{ipDIp6 zkYgE~0w1PL%{c!lT)8cn2d;#hEc>5__!l9*4qk5A-vns*zgJEu{8+n_lV;a<4ljKIMLSW2h@_wm3hEPe!*3>*DpuwCVk z!$IIzu+yafSylcX6NOZql>mcL^{+#T+WeQ%k6W$qq{U={-W_*?-`f&Df|zXIN6@zZdT#h<|P zVp3DWziKu!<=NBQ>L(hO@=KDF5y)FjRp53y&2_GtDjyH&p9=9-c(0YAzrfM4fxrE* z)Q}3?$_+~msPrk}mk81jm}@xwf2P<(I02Rt8y*Nt4H-TOmKroX7&fn6l^UL^+33%M zsZpIi2GbEp35>x-a34)_L*gZH5Lyx?!d53NxAf8puZHa!xHiPUgx8O?*8dxQfysdD z+#2Fl@Zhrp{hc9h4)MM4M$3Lfh#wY?TLzmDWQ+?Ecmh6P)yNk3ON*a@`?OX`vhyq) zgqFnf!d4Bv{H}_>1F=k86}wsgB>~PoeZh9ifmGo~uw+PHJr;3XC-=g(89Xh-r^8!c zFa_X_Nx04`&^fTY8dn8=6LKN_@4)y#a2^JSExr(z_wAYpGhuljuiW3f_B8 zz%{U)p?M+wf(z+?c7%l(^qv?vxGKa~!;2;b`fEdceTZ*_cbywtqIpNN$?*H}kl@1* ze+)008YK9a5bqE1-{G$31@;F+{B?-qhY^glBDfc|xbc#}-$ORb_y3!00sI@d*^00QUOY2!@Y@i-5aO3$Ug+F9 zDqaoo>+ptIN>BgiyI)Hn{BDTfhs|54WiC&ep;)C5aXP@4QG#!?-fal+jG^I|4+F{LN9Yw_8ygl*b6tpQYYq;!d6(yd|3QNTxa_Ss*E|B z`_JHm4l=bB!hMW@)n()ivlRM5UXCUatjTk9$iYl_kFG?iv+@wnh7Vf$>JZn$ol8ue z@KEL%G=(j=41+YwU{Q$U@GdIRY*8MBS6KFshWOX;Ud#Ri_^@UFu{g8^pTa%22MKh& zn3(_v-KiMq1tT=8TI8Y(Y~DpK`YO#vUkyu!4cEf*&T_-?dIXX~BbX1HmzaygX3a)_ zFPuyUyC4w#8=8&&O;`$G_-)v3^LODOw8Rtdi@<904=e-eG~d9LrN$vQ?1wmV3H#o% zK;I$6okM&K+}LW*sYuT@0-lEpZ*4W;)gvK30iG5M5=;y6DIp#TudwVhZI-Dh2f?P< zfx|+${{x2EC&P9Xo(Tt`B{5pqs=?&TvdiLFvrqM{AI9Rz#9T){80ld5bUvP;I)DUsnm zuw>A1e^?4&_ykxotkTEfKm?1diQy!;41?o{A>(|CW{?nZemcu>E=S)H68%-0K|;j2 zdX}mIAK@kN8q5As#X5ZqevLq?NCkeL4%@wc3mk-4NHuYXop2kCVGZ9C!_A~*;wiL->Q434$*lEE@~Wn4Oe zA9%H>2rQlh@2n2=bs?S~;wJbL%l^s`FNXg`0sQ5h0zC-F%U?22W#U^M1nXhbYn@V7 zM>t9brHzNcTVb>Moez(!OI7*D;-V1G3UL{n^l}jY#!~v{)c9jL+&Vqr3MWDyOjQS7{Spx!bxR{jlp1ehPA000(T>O5F@L|h7 zJH!Pc9sw6D4Ez_hvcLZDE6rAcl#3_+!qcq?KY`!2cxs3*2=RsRk}HA)XNI`ku%A8& z&PFhOQ4paz#PdSj2=AkfRfss3!PVA8bvf+p4D?sR?JQmlw}(~wwD~m%I#>qR!ksMs zCEVHKX*5+IrV@CvJsw1oH|yyYs> z=G>SY;_pK2RXPzB!B0^3c}84f~A;uvA8N$&noWpFS>lmd0P?4>}% zVLQE?3i_Wd$j6`;88FLn30!1lup-1&Z~^w_i@IBNe3i+FvkFc_Z+6k!G#mYk74&~` zU<5B?V3+t6I0!9?ox)a$e{bofg!@DB|8D7JYX346{~vM7Kpb?R&5xz55+4`hzHpIb z*p+_~XAC^!=cWLzGaEoa)f*`acdI(!p*vrz3gHhUnij(XVTYAaB z*`fFoEWN~^uj1?U$v~53AP%kwIk?Kwi-QMXdnS7%#E-#ye_2UAs0(~}YXCMy_0`mym=K6nv5=#O-_4+;1iXa)79ddZ7 zrI!-T6}AdgXXz#WouT-5%`y8=KU+*JAqVS24t^hU@Rp^Q47?MHzuVGF2HI7(t&!wv z)Bkh^I$~g#ptGt3~=8P=#+)P_0#k0U6z43@xKE&e5JH_381 z2)rdi*ebwhm#GA2A(ke&#j=+S{nqv;>;E>(KuYvt$l=SDUL3U84v2ry(o6h*h2no> z=_US2H9>*s|H;l^1VP|dB4MjU>6Ts`{LFG7@n=|i$-vA|{8CFV@oxy?%lJ!nR#*n& z;MS0XRhC{HJRdml<8Qb0690Fh_^(=eiT{t*`2P6k&0dy)IQVzS!FQHk9Gp@cRG}1L zC>#XNbcC%M%(C|d49h?qWD8qW zm}lw5L5Xspy(T;5mR{n|4#mIJ(o6i?{P-q)GO*e*5C?aL9NcB;#lb7S15>JGXQ!o? z_`eUuf6LNK{BI?GYx-osnP;5IUsfw&s|J!Sy*S8(?TIPJ(o6jOQ2f&@y~K~fZC*uI zX&H!vIUxr%mR=m(4%-=6W9cRS-J$sF;DWrUf4bhC)7M|kqy6Rmw{KHW5j={4yh^md zRlF6Jm$9a3{Z3e3)@t}&co{rc>pz0!ZLy65RQ%6jd3md`KPbFB>iqn|MJ#` z4DFz2JtvPhMV%FzQ(<{EX_Dp)SYA!KL-Rwh++aUNa|`^yH|iQuH)3^XODFfs8~>AG zd82S=97+bxk0VH07j>fA!SqJQe@F2l%}>MffF4;@CBi>p`QmVq=2PZ#U+m3Mr(E-H zSl<4&U-QQcxEOs))S0LgoXz4iZIn7Y7Ju=FnyB)7qW(P`BIve|ORIO0L-v5ei(q;6 z*mB(@e}Uy<@+_Ue6<4V5c86-tC1>*Lvc1~=|6sW#L$0!kzsIlSl1yc5f#OciRkYzM z+NixU*apij874vlO(d@vG*#SVvAPGu=$m1=SE^ViIQ(jLKY*$7m9X4FxI|~*pRn8^ zsF?M?`RD2egFV_Ha*gBP!)PLu!0X4F2(GgYmYb<|>jaZAl)Jx74UB;0R;C>7?=P_2 zpkOjIVJS^GG1V!T8kX<>pFtq6mFlb`T)&*#a0aWVI!Kj01Iw++X<9$x25RhQ{2Z;F zspwDjNx+L*O>iF$%rpZSuj!OaqZ{gl23`_~?RVXeBTwO#kAm9V^5izbZw zo#G<|88d@%+Ws!S3$}*Q99Ukev`i=PC@gP%s?_|c=w~tRbsxIqZu$_Nbg&H z+hDl~#kA>(8`}2rYv7=lyUw3sd2v^Y_Sc>B2Dzs)K23L`a}dZa6UO1yu-ss`OGnrN z%MEp%b(?p4kZ(BFN1feT-vrB-)wHQ!pod_&MUnZ+=Rd>p4az1R|AdG9Z%E>;bN>tk zatosAboaq>pUyb#AZ24~r|}(@!*&U`!*WmMEN%ZSEZ-50)HQb6!z?~zfWGO+Z-R@z ziASBG+F&CBd09$l45Zh-3(MtK1Q zgDKEcusk)A!R2S5a1(1o{N&WuUfqO19!0WP8*GN}gnD;A5Jk=yArMypbnIM|c{6yg+B1u91Jj@@%wftzYs4 zRSKID?}X+3H;c9YT{wl+E~c7QF zhRxWmBw*>Ao~6x?CPAIST`w?E{XEs#rfVSeMR;D&$sXO_wh#4usqH9PAde!oJJEeF zQ{_B5be4Ab+V8lf!pgw6@IH%Ae1#^X&q%MAJ~QT>wrjyUSZ?Vk&>8Nq+iA15{3?#X zUR=h#$FSjM>H=MbNB@a7FA18U9F`jnO_OYa<^Dm#RUfK*K&I%BsjK$<8e- z%g&GGl$BJJROIIuq-SF6%^DUN?UsA5+#i`A&&$s!%`3^x%r48%Ez2m#A7gnd$jvV= z%q%M_$ji+t&o9l+%%~{KEH5oDEzHc!$;-@7FBIb-^&{Hnn|!uf#=p;XX7+#Bey?fH z4>!#Xna01raG4n)+y7yj`NK`y)_ zHzR|IDZ8SyA}77I&W>oAqdf-|^M`n7%Pm6Sn|Ieh`M)L=dw6Q-}&3LUzKVo`RU@*Sh+K>IO zHJJPT5&o-vzSnYTVNi4IV zv^+DXEIpH{r*)}1vb7n&ew+!@#%E^ClqoqQYDS565&!-avs;&jBPN$E3(kM|{(jdv zt#f|-h`w|FYrenVcXsRiazxkJ`408}Bl4Xs^U;s6&ygzppZ4*#t(@IDB9EMTnfU*w z@3yXUWR?35`~T7YIX|{he|X+=)UaWIdS9K%jKF+%q5PMurZKdr%s)Ls$_nxeOY?K` zOA87M3vzSw@=Nmyvhwm6C>0q6S!Ma@{uK2?jaxh5e{p+ETfZ4<3Ews{a;|su>5+|* zv~sWO>5)^sk57+$;Wa-OIX0f%u&^OB@25Ze>CCC4CKb=TVARw}<0qY+nO~Vxl2e)= zD=&=YXP0M}mB+?7GcTN!pEWaW;Z-x&o0QxFUu~C6_%E! zx9%Q~XsH{j!ZeoN7}ca7F(xy#J<%S~p2jWrJ{lPr(m}6ro4-3FlI%*SIoV$+Hy>3L zd7;xKty5%SPIfFWtFSPZTV9qEE6vF$DakC$DlIK3DakD@Eyzu8-Si#NlI?Uej&0m>*}j&8fP}v&Mci@Q4y=3SyeH!tfa1Setm4_{DxS$KLW~g3t|;H zvBJWvitO^zA6TNS)@|((vzI0F4inptDp7&=+sa6vbC2xY-x27Mb7bor@64*manp`y zm~Hyh5A~d#<+&F{PTf4MB2wylE1Kwef1e)du=%&MBU$adnb&ZRQNyN@?$^hQ&WYU9 zp0>)%@KPtT&)D=>qC{V(gd?>_T~nk#Gn zJnsiMSJs@$x6XY3k(GG3q;mT4{pSB+%~gjVVeQYWZ89GJAC;bE_wN75`F~_ZCSkLR z9NAje_z!G?7XdQj={@1JvXe$=qY`7yPgo@**S?q6FyQU}QWQMI0X#99w3 zJ>~4Hh1t2mHN(OqS?0^m zukQu^8h%9MP{ke5{{NSD?ZHu1XFU5^7^M#qy)^C6tuDV7>vtdAo zpKXNM__K|09!IZ)QTXqTFg0!FpC%NXdy^gXx zdtIyTBz%10AY704?t|+TO%cK{G)1G*F1K|r%oeTEgDO48*dodlTa~A&2MwtH(=8~xHn7V zw$xf*W~~DOIV;jHQ`y#rg$?t=6h@@|4nMutkEMM{H@(1hZNqbXQ#Vz|<-QkfP9!Ml z6((0S)#8d}P|l-pmFg4pmM~)y;iGIp=bU)LyPaVCv?));Qc0f>EzW!%P=AF9hpV<7 zlHB2EaP#lr4t#AJ)ZHSXWU3+)b6rX!)yBdJwAt;k{Bi67pOSV;(G5*!zHWNllpPx{ zip__>%*{bK8o}@F2M2%hGzlm}usF91X52N97X-*nN#jzxU9w^cv0^3twiH>S$CJd7 zjC_-)2Cn0IL7>r$ojl!cTe~Edo3ivVWuj=a<4L+Va4ko3bVt)DSXV5L_aA~e$hW~X z{PZcf8FUrdJ{X^S=@n>=+(-bX8fuvnPr50O>IL-9=H`W|w)RwK(vyVUh1p#&IUAmD z@zZfT5r4>U$)r2oOei^xuH;X~g1DcMxtpa4rcf(PGXvkU)u13c#uWM()XvZ;Z#Q&# zR1>Zc6|2=M^%g?$Gr_5ZLu)Xzn5l5VEsD{q!{F8xKupg!O;mMo41E7N;Mm;-4`Q6b zM43sMTF7lAZco5tyJ5ln>PQ`8viRhA7>^gvQ@%EPD~ziWPz*tK?_TmJQ@6o5>^cLr z_|5&$Bo!u#t^46|+kjxUE|gcd7B1A~Zaxa5Blz-mxVGy>lGh;` z;GP389dADdi?QJ}h$hvvb!xjBf$nlc<5p3B%jh1y`5wLTr@w)3;gr`Y0si|jxCLjN z1`XeM1|G&=JP*OxaypB5Ta{#Rz4@LiUha%bINFb)m^=t} zwn}2u5>EzWNyVN6FD?cBJ-{6UTtH=v;(YpJ6db0!d=7S(JE;xt^#FABjuq;Blm}H`2JP-+D>H|3@U^?K^1jI zFDSvKDibY59u*;q?7kF&5b%FFSUQ#l^cfh{;C)BnF`T!AG=tjLb(01mLt@-;09KX9 z=s6&LM>%xrZQnN(=7rs0=ACrq=?yhM;~>n%JzZc+(`rKJ2({FIup8>D#1=zY?D$t; z!L1d^D=q0|*wFP7B&%ox7ae37getX&m0P{?D^Io%z*e5f5PYtdjAAg90oI5mxe+Qx`;$ZmEXtdeplP4A*oERgS8j*4o|GDklso zCkBEG*ARinJlZQ0mP#1QqpY#rHMUsYndx9k+PA$}r^*wua-gxmqQXO<>84`SHcyJv zPmni1d>q!`!mSkhPdowb`1BbH0=l=rl-#Bh)NP~ge!h?(IyNL-kxIHgQ2mGb2jBv5?~#_}NLS18Al5jS;Kg*ytMrXY!zamL#gw$Tebq*vX|C2+QHaW17)41u^NtZbp8~e`wlb$1qFSVnH<;Wmj4B` zYi5PkSFuM-{nL}@VCop1g_WI#6^j~3X3fp<6n_3D%&E85rQ;bt7PQIQl1_@pO^s?r zc0laYqq#@V0gq%uon=&&^OG4ej!cXye-CiJqIewcKL{&$v;jfLiv-4n&;y$Z&$d*{ zv#2ImTzjMi3gp9-2KZe+7;)ZE^s^vONqy5)-@Iz>*rET7UO1rc5fLhW_ z)A8azU|JnjAq~f;!kb0Y_HB(seHLcsZu$VeHj->><3}X-?mv^8gLc4qL|XDPL~ zKLexdIMV`dQkBeA1gW_n#m~=DbHM)(Oat6>fqL<;K7zY0K>aBBr!-GK5vjRN$KT51 z@N1Mk^sm6K!%yjWr2KNx{&#UqFH9d*b3u+HHM0P}O~*jzonB}h@yOXo&1`&fPvlzc z?uFWK9H3*Ri~dFwZJq!9)p)!YCXM*pgHW?7f6u?@o{3r-YV?274TT^28bSE;f2a>7 ACjbBd diff --git a/examples/L2/crates/l2/zkvm_programs/sp1/src/lib.rs b/examples/L2/crates/l2/zkvm_programs/sp1/src/lib.rs index ec68d725d9..41fa48ad55 100644 --- a/examples/L2/crates/l2/zkvm_programs/sp1/src/lib.rs +++ b/examples/L2/crates/l2/zkvm_programs/sp1/src/lib.rs @@ -1,11 +1,11 @@ use primitive_types::H160; use serde::{Deserialize, Serialize}; -use std::collections::HashMap; +use std::collections::BTreeMap; use types::{Transfer, UserState}; #[derive(Deserialize, Serialize)] pub struct ProgramInput { - pub user_states: HashMap, + pub user_states: BTreeMap, pub transfers: Vec, } diff --git a/examples/L2/crates/l2/zkvm_programs/sp1/src/main.rs b/examples/L2/crates/l2/zkvm_programs/sp1/src/main.rs index 6b76d48405..5b2a77ed0c 100644 --- a/examples/L2/crates/l2/zkvm_programs/sp1/src/main.rs +++ b/examples/L2/crates/l2/zkvm_programs/sp1/src/main.rs @@ -2,6 +2,7 @@ sp1_zkvm::entrypoint!(main); use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; +use primitive_types::U256; use sp1_state_transition_program::{ProgramInput, ProgramOutput}; use types::UserState; @@ -26,15 +27,15 @@ pub fn main() { .clone(); if user_from.balance >= transfer.amount { - user_from.balance -= transfer.amount + user_from.balance -= transfer.amount; + user_from.nonce += U256::one(); + user_to.balance += transfer.amount; } else { - panic!("User does not have enough balance to perform the transfer"); + panic!("User does not have enough balance to perform the transfer",); } - user_to.balance += transfer.amount; - - input.user_states.insert(transfer.from, user_from.clone()); - input.user_states.insert(transfer.to, user_to.clone()); + input.user_states.insert(transfer.from, user_from); + input.user_states.insert(transfer.to, user_to); } let post_state: Vec = input.user_states.clone().into_values().collect(); diff --git a/examples/L2/crates/types/src/lib.rs b/examples/L2/crates/types/src/lib.rs index 343aa7fdea..e09b97ab02 100644 --- a/examples/L2/crates/types/src/lib.rs +++ b/examples/L2/crates/types/src/lib.rs @@ -3,7 +3,7 @@ use primitive_types::{H160, U256}; use serde::{Deserialize, Serialize}; use sha3::{Digest, Keccak256}; -#[derive(Clone, Default, Serialize, Deserialize)] +#[derive(Clone, Debug, Default, Serialize, Deserialize)] pub struct UserState { pub address: H160, pub balance: U256, @@ -36,7 +36,7 @@ impl IsMerkleTreeBackend for UserState { } } -#[derive(Serialize, Deserialize, Clone)] +#[derive(Serialize, Deserialize, Clone, Debug)] pub struct Transfer { pub from: H160, pub to: H160, From e66b833d9f3af67f14c042d2a499d10f9d35f3d4 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Mon, 12 May 2025 11:22:49 -0300 Subject: [PATCH 11/22] feat: send proof to aligned and wait for agg proof verification event --- examples/L2/crates/l2/Cargo.toml | 4 +- examples/L2/crates/l2/src/aligned.rs | 88 ++++++++++++------- examples/L2/crates/l2/src/lib.rs | 19 ++-- examples/L2/crates/l2/src/zk.rs | 2 +- .../L2/crates/l2/zkvm_programs/sp1/Cargo.toml | 2 +- 5 files changed, 75 insertions(+), 40 deletions(-) diff --git a/examples/L2/crates/l2/Cargo.toml b/examples/L2/crates/l2/Cargo.toml index a5e72d982d..22ceba2bf1 100644 --- a/examples/L2/crates/l2/Cargo.toml +++ b/examples/L2/crates/l2/Cargo.toml @@ -10,7 +10,7 @@ types = { workspace = true } lambdaworks-crypto = { workspace = true } primitive-types = { workspace = true} rand = "0.8" -sp1-sdk = "4.1.3" +sp1-sdk = "4.1.7" sp1_state_transition_program = { path = "./zkvm_programs/sp1/" } aligned-sdk = { path = "../../../../batcher/aligned-sdk" } bincode = "1.3.3" @@ -19,7 +19,7 @@ tokio = "1.44" alloy = { version = "0.14", features = ["full", "providers"] } [build-dependencies] -sp1-build = { version = "4.1.3" } +sp1-build = { version = "4.1.7" } [profile.release] opt-level = 3 diff --git a/examples/L2/crates/l2/src/aligned.rs b/examples/L2/crates/l2/src/aligned.rs index a3115e8937..0fea727ac6 100644 --- a/examples/L2/crates/l2/src/aligned.rs +++ b/examples/L2/crates/l2/src/aligned.rs @@ -1,8 +1,15 @@ -use aligned_sdk::core::{ - constants::INSTANT_MAX_FEE_BATCH_SIZE, - types::{AlignedVerificationData, Signer, SigningKey, VerificationData, Wallet}, +use aligned_sdk::{ + core::types::{AlignedVerificationData, Signer, SigningKey, VerificationData, Wallet}, + sdk::estimate_fee, }; -use primitive_types::U256; +use alloy::{ + eips::BlockNumberOrTag, + primitives::Address, + providers::{Provider, ProviderBuilder, WsConnect}, + rpc::types::Filter, +}; +use futures_util::StreamExt; +use sp1_sdk::{HashableKey, SP1VerifyingKey}; pub async fn send_proof_to_be_verified_on_aligned( proof: &sp1_sdk::SP1ProofWithPublicValues, @@ -25,41 +32,62 @@ pub async fn send_proof_to_be_verified_on_aligned( .await .expect("Retrieve nonce from aligned batcher"); - let aligned_verification_data = aligned_sdk::sdk::submit( - network, - &verification_data, - U256::from(INSTANT_MAX_FEE_BATCH_SIZE as u64), - wallet, - nonce, + let max_fee = estimate_fee( + "https://ethereum-holesky-rpc.publicnode.com".into(), + aligned_sdk::core::types::FeeEstimationType::Instant, ) .await - .expect("Proof to be sent"); + .expect("Max fee to be retrieved"); + + let aligned_verification_data = + aligned_sdk::sdk::submit(network, &verification_data, max_fee, wallet, 0.into()) + .await + .expect("Proof to be sent"); aligned_verification_data } -pub async fn wait_until_proof_is_aggregated() -> u64 { - // let rpc_url = "wss://eth-mainnet.g.alchemy.com/v2/your-api-key"; - // let ws = WsConnect::new(rpc_url); - // let provider = ProviderBuilder::new().on_ws(ws).await.unwrap(); +pub async fn wait_until_proof_is_aggregated( + network: aligned_sdk::core::types::Network, + eth_rpc_url: String, + beacon_client_url: String, + proof: &sp1_sdk::SP1ProofWithPublicValues, + vk: &SP1VerifyingKey, +) -> Option> { + let rpc_url = ""; + let ws = WsConnect::new(rpc_url); + let provider = ProviderBuilder::new().on_ws(ws).await.unwrap(); + + let aligned_proof_agg_address = + Address::from(network.get_aligned_proof_agg_service_address().0); + + let filter = Filter::new() + .address(aligned_proof_agg_address) + .event("AggregatedProofVerified(bytes32,bytes32)") + .from_block(BlockNumberOrTag::Latest); - // let uniswap_token_address = - // Address::from_str("1f9840a85d5aF5bf1D1762F925BDADdC4201F984").unwrap(); + // Subscribe to logs. + let sub = provider.subscribe_logs(&filter).await.unwrap(); + let mut stream = sub.into_stream(); - // let filter = Filter::new() - // .address(uniswap_token_address) - // // By specifying an `event` or `event_signature` we listen for a specific event of the - // // contract. In this case the `Transfer(address,address,uint256)` event. - // .event("Transfer(address,address,uint256)") - // .from_block(BlockNumberOrTag::Latest); + let verification_data = aligned_sdk::sdk::aggregation::AggregationModeVerificationData::SP1 { + vk: vk.hash_bytes(), + public_inputs: proof.public_values.to_vec(), + }; - // // Subscribe to logs. - // let sub = provider.subscribe_logs(&filter).await.unwrap(); - // let mut stream = sub.into_stream(); + let mut merkle_path = None; - // while let Some(log) = stream.next().await { - // println!("Uniswap token logs: {log:?}"); - // } + while let Some(_) = stream.next().await { + merkle_path = aligned_sdk::sdk::aggregation::get_merkle_path_for_proof( + network.clone(), + eth_rpc_url.clone(), + beacon_client_url.clone(), + None, + &verification_data, + ) + .await + .unwrap(); + } - 0 + merkle_path } diff --git a/examples/L2/crates/l2/src/lib.rs b/examples/L2/crates/l2/src/lib.rs index 97a288951c..bcd684009b 100644 --- a/examples/L2/crates/l2/src/lib.rs +++ b/examples/L2/crates/l2/src/lib.rs @@ -1,5 +1,4 @@ use aligned::{send_proof_to_be_verified_on_aligned, wait_until_proof_is_aggregated}; -use alloy::hex; use db::{generate_random_transfers, DB}; use primitive_types::U256; use sp1_state_transition_program::ProgramOutput; @@ -9,10 +8,10 @@ mod aligned; mod db; mod zk; -async fn send_state_transition_to_chain() {} - pub async fn start_l2( network: aligned_sdk::core::types::Network, + eth_rpc_url: String, + beacon_client_url: String, wallet: aligned_sdk::core::types::Wallet, ) { // 0. Load merkle tree file, if not created, create initial state @@ -22,7 +21,7 @@ pub async fn start_l2( let transfers = generate_random_transfers(&db, 10); // 2. Call zkvm and pass (MerkleTree, Updates to perform) - let (mut proof, _vk) = prove_state_transition(&db, transfers.clone()); + let (mut proof, vk) = prove_state_transition(&db, transfers.clone()); let ProgramOutput { initial_state_merkle_root, post_state_merkle_root, @@ -58,10 +57,18 @@ pub async fn start_l2( // 4. Send the proof to aligned and wait for verification let _ = - send_proof_to_be_verified_on_aligned(&proof, PROGRAM_ELF.to_vec(), network, wallet).await; + send_proof_to_be_verified_on_aligned(&proof, PROGRAM_ELF.to_vec(), network.clone(), wallet) + .await; // 5. Wait until proof is aggregated - wait_until_proof_is_aggregated().await; + let merkle_path = wait_until_proof_is_aggregated( + network.clone(), + eth_rpc_url, + beacon_client_url, + &proof, + &vk, + ) + .await; // 6. Send updateState transaction to Ethereum // let receipt = update_state_on_chain(); diff --git a/examples/L2/crates/l2/src/zk.rs b/examples/L2/crates/l2/src/zk.rs index 87bfdb1a94..3237f7eb7f 100644 --- a/examples/L2/crates/l2/src/zk.rs +++ b/examples/L2/crates/l2/src/zk.rs @@ -21,7 +21,7 @@ pub fn prove_state_transition( let (pk, vk) = prover.setup(PROGRAM_ELF); let proof = prover .prove(&pk, &stdin) - .groth16() + .compressed() .run() .expect("Prover to run fine"); diff --git a/examples/L2/crates/l2/zkvm_programs/sp1/Cargo.toml b/examples/L2/crates/l2/zkvm_programs/sp1/Cargo.toml index 1c7639c5ac..6972e67f47 100644 --- a/examples/L2/crates/l2/zkvm_programs/sp1/Cargo.toml +++ b/examples/L2/crates/l2/zkvm_programs/sp1/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" resolver = "2" [dependencies] -sp1-zkvm = { version = "4.1.3", features = ["verify"] } +sp1-zkvm = { version = "4.1.7", features = ["verify"] } serde = { version = "1.0.203", features = ["derive"] } serde_json = "1.0.117" primitive-types = { version = "0.12.0", features = ["serde"] } From 8b6391a64e815456612f37cf15bd745f5b9b79b4 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Mon, 12 May 2025 19:01:28 -0300 Subject: [PATCH 12/22] feat: write program vk_hash --- examples/L2/Cargo.lock | 2 ++ examples/L2/Makefile | 8 ++++- .../script/StateTransitionDeployer.sol | 21 -------------- examples/L2/crates/l2/Cargo.toml | 10 +++++++ examples/L2/crates/l2/programs_ids.json | 3 ++ .../L2/crates/l2/zkvm_programs/Cargo.toml | 2 ++ .../l2/zkvm_programs/bin/write_program_ids.rs | 29 +++++++++++++++++++ 7 files changed, 53 insertions(+), 22 deletions(-) delete mode 100644 examples/L2/contracts/script/StateTransitionDeployer.sol create mode 100644 examples/L2/crates/l2/programs_ids.json create mode 100644 examples/L2/crates/l2/zkvm_programs/bin/write_program_ids.rs diff --git a/examples/L2/Cargo.lock b/examples/L2/Cargo.lock index 02b68b520b..627d3ef5a2 100644 --- a/examples/L2/Cargo.lock +++ b/examples/L2/Cargo.lock @@ -3848,6 +3848,8 @@ dependencies = [ "sp1-sdk", "sp1_state_transition_program", "tokio", + "tracing", + "tracing-subscriber", "types", ] diff --git a/examples/L2/Makefile b/examples/L2/Makefile index aa88717c97..0e7c732f09 100644 --- a/examples/L2/Makefile +++ b/examples/L2/Makefile @@ -3,4 +3,10 @@ SHELL := /bin/bash run: - @cd crates/l2 && cargo run --release + @cd crates/l2 && cargo run --release --bin main + +print_program_id: + @cd crates/l2 && cargo run --release --bin write_program_id + @cat ./crates/l2/programs_ids.json + + diff --git a/examples/L2/contracts/script/StateTransitionDeployer.sol b/examples/L2/contracts/script/StateTransitionDeployer.sol deleted file mode 100644 index 227f4d854c..0000000000 --- a/examples/L2/contracts/script/StateTransitionDeployer.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import "forge-std/Script.sol"; -import {StateTransition} from "../src/StateTransition.sol"; - -contract StateTransitionDeployer is Script { - StateTransition public stateTransitionContract; - - function setUp() public {} - - function run(address _alignedProofAggregationService) public returns (address) { - vm.startBroadcast(); - - stateTransitionContract = new StateTransition(_alignedProofAggregationService); - - vm.stopBroadcast(); - - return address(stateTransitionContract); - } -} diff --git a/examples/L2/crates/l2/Cargo.toml b/examples/L2/crates/l2/Cargo.toml index 22ceba2bf1..d73f695419 100644 --- a/examples/L2/crates/l2/Cargo.toml +++ b/examples/L2/crates/l2/Cargo.toml @@ -9,6 +9,8 @@ serde_json = { workspace = true } types = { workspace = true } lambdaworks-crypto = { workspace = true } primitive-types = { workspace = true} +tracing = { version = "0.1", features = ["log"] } +tracing-subscriber = { version = "0.3.0", features = ["env-filter"] } rand = "0.8" sp1-sdk = "4.1.7" sp1_state_transition_program = { path = "./zkvm_programs/sp1/" } @@ -18,6 +20,14 @@ futures-util = "0.3" tokio = "1.44" alloy = { version = "0.14", features = ["full", "providers"] } +[[bin]] +name = "main" +path = "./src/main.rs" + +[[bin]] +name = "write_program_id" +path = "./zkvm_programs/bin/write_program_ids.rs" + [build-dependencies] sp1-build = { version = "4.1.7" } diff --git a/examples/L2/crates/l2/programs_ids.json b/examples/L2/crates/l2/programs_ids.json new file mode 100644 index 0000000000..1d32a365ea --- /dev/null +++ b/examples/L2/crates/l2/programs_ids.json @@ -0,0 +1,3 @@ +{ + "sp1_vk_hash": "0x5961f68d41b2798f4dab05184d8f9cda39637d28097819906033c2f10b365ab1" +} \ No newline at end of file diff --git a/examples/L2/crates/l2/zkvm_programs/Cargo.toml b/examples/L2/crates/l2/zkvm_programs/Cargo.toml index 06cdd25cf0..31337fd727 100644 --- a/examples/L2/crates/l2/zkvm_programs/Cargo.toml +++ b/examples/L2/crates/l2/zkvm_programs/Cargo.toml @@ -7,3 +7,5 @@ members = ["sp1"] [workspace.dependencies] types = { path = "../../types"} +tracing = { version = "0.1", features = ["log"] } +tracing-subscriber = { version = "0.3.0", features = ["env-filter"] } diff --git a/examples/L2/crates/l2/zkvm_programs/bin/write_program_ids.rs b/examples/L2/crates/l2/zkvm_programs/bin/write_program_ids.rs new file mode 100644 index 0000000000..3ad38fb350 --- /dev/null +++ b/examples/L2/crates/l2/zkvm_programs/bin/write_program_ids.rs @@ -0,0 +1,29 @@ +use alloy::hex::hex; +use serde_json::json; +use sp1_sdk::{HashableKey, Prover}; +use std::{fs, path::Path}; +use tracing::info; +use tracing_subscriber::FmtSubscriber; + +const SP1_PROGRAM_ELF: &[u8] = include_bytes!("../sp1/elf/sp1_state_transition_program"); + +fn main() { + let subscriber = FmtSubscriber::builder().finish(); + tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed"); + + info!("About to write sp1 program vk hash bytes"); + let client = sp1_sdk::ProverClient::builder().cpu().build(); + let (_pk, vk) = client.setup(SP1_PROGRAM_ELF); + let sp1_vk_hash = vk.hash_bytes(); + let sp1_vk_hash_hex = hex::encode(sp1_vk_hash); + + let dest_path = Path::new("programs_ids.json"); + let json_data = json!({ + "sp1_vk_hash": format!("0x{}", sp1_vk_hash_hex), + }); + + // Write to the file + fs::write(dest_path, serde_json::to_string_pretty(&json_data).unwrap()).unwrap(); + + info!("Program ids written to {:?}", dest_path); +} From 7ed99d7f02f2f7e983cb90fda565920a666c2a18 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Mon, 12 May 2025 19:02:19 -0300 Subject: [PATCH 13/22] feat: deploy script for contract --- examples/L2/Makefile | 2 ++ examples/L2/contracts/remappings.txt | 1 - .../script/StateTransitionDeployer.s.sol | 25 +++++++++++++++++++ examples/L2/contracts/scripts/deploy.sh | 21 ++++++++++++++++ examples/L2/contracts/src/StateTransition.sol | 24 ++++++++++++++++-- .../L2/crates/l2/abi/StateTransition.json | 1 + 6 files changed, 71 insertions(+), 3 deletions(-) delete mode 100644 examples/L2/contracts/remappings.txt create mode 100644 examples/L2/contracts/script/StateTransitionDeployer.s.sol create mode 100755 examples/L2/contracts/scripts/deploy.sh create mode 100644 examples/L2/crates/l2/abi/StateTransition.json diff --git a/examples/L2/Makefile b/examples/L2/Makefile index 0e7c732f09..f170354ab1 100644 --- a/examples/L2/Makefile +++ b/examples/L2/Makefile @@ -10,3 +10,5 @@ print_program_id: @cat ./crates/l2/programs_ids.json +deploy_contract_holesky: + @. ./contracts/.env.holesky && . ./contracts/scripts/deploy.sh diff --git a/examples/L2/contracts/remappings.txt b/examples/L2/contracts/remappings.txt deleted file mode 100644 index feaba2dd12..0000000000 --- a/examples/L2/contracts/remappings.txt +++ /dev/null @@ -1 +0,0 @@ -forge-std/=lib/forge-std/src/ diff --git a/examples/L2/contracts/script/StateTransitionDeployer.s.sol b/examples/L2/contracts/script/StateTransitionDeployer.s.sol new file mode 100644 index 0000000000..02d5e673b1 --- /dev/null +++ b/examples/L2/contracts/script/StateTransitionDeployer.s.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "../lib/forge-std/src//Script.sol"; +import {StateTransition} from "../src/StateTransition.sol"; + +contract StateTransitionDeployer is Script { + StateTransition public stateTransitionContract; + + function setUp() public {} + + function run(bytes32 programId, bytes32 initialStateRoot, address _alignedProofAggregationService, address owner) + public + returns (address) + { + vm.startBroadcast(); + + stateTransitionContract = + new StateTransition(programId, initialStateRoot, _alignedProofAggregationService, owner); + + vm.stopBroadcast(); + + return address(stateTransitionContract); + } +} diff --git a/examples/L2/contracts/scripts/deploy.sh b/examples/L2/contracts/scripts/deploy.sh new file mode 100755 index 0000000000..6742b05bda --- /dev/null +++ b/examples/L2/contracts/scripts/deploy.sh @@ -0,0 +1,21 @@ +# cd to the directory of this script so that this can be run from anywhere +parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +# At this point we are in contracts/scripts +cd "$parent_path" + +# At this point we are in contracts +cd ../ + +forge script ./script/StateTransitionDeployer.s.sol \ + $PROGRAM_ID \ + $INITIAL_STATE_ROOT \ + $ALIGNED_PROOF_AGGREGATOR_ADDRESS \ + $OWNER_ADDRESS \ + --rpc-url $RPC_URL \ + --private-key $PRIVATE_KEY \ + --broadcast \ + --verify \ + --etherscan-api-key $ETHERSCAN_API_KEY \ + --slow \ + --sig "run(bytes32,bytes32,address,address)" \ + --via-ir diff --git a/examples/L2/contracts/src/StateTransition.sol b/examples/L2/contracts/src/StateTransition.sol index e3afe463b1..6e951f3e79 100644 --- a/examples/L2/contracts/src/StateTransition.sol +++ b/examples/L2/contracts/src/StateTransition.sol @@ -3,16 +3,23 @@ pragma solidity ^0.8.13; contract StateTransition { event StateUpdated(bytes32); + event ProgramIdUpdated(bytes32); + + error OnlyOwner(address); bytes32 public PROGRAM_ID = 0x00; bytes32 public stateRoot; address public alignedProofAggregator; + address public owner; - constructor(address _alignedProofAggregator) { + constructor(bytes32 programId, bytes32 initialStateRoot, address _alignedProofAggregator, address _owner) { alignedProofAggregator = _alignedProofAggregator; + owner = _owner; + PROGRAM_ID = programId; + stateRoot = initialStateRoot; } - function updateState(bytes calldata publicInputs, bytes32[] calldata merkleProof) public { + function updateState(bytes calldata publicInputs, bytes32[] calldata merkleProof) public onlyOwner { bytes memory callData = abi.encodeWithSignature( "verifyProofInclusion(bytes32[],bytes32,bytes)", merkleProof, PROGRAM_ID, publicInputs ); @@ -29,4 +36,17 @@ contract StateTransition { emit StateUpdated(stateRoot); } + + function setProgramId(bytes32 programId) public onlyOwner { + PROGRAM_ID = programId; + + emit ProgramIdUpdated(PROGRAM_ID); + } + + modifier onlyOwner() { + if (msg.sender != owner) { + revert OnlyOwner(msg.sender); + } + _; + } } diff --git a/examples/L2/crates/l2/abi/StateTransition.json b/examples/L2/crates/l2/abi/StateTransition.json new file mode 100644 index 0000000000..4fb406d0e6 --- /dev/null +++ b/examples/L2/crates/l2/abi/StateTransition.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"_alignedProofAggregator","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"PROGRAM_ID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"alignedProofAggregator","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"stateRoot","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"updateState","inputs":[{"name":"publicInputs","type":"bytes","internalType":"bytes"},{"name":"merkleProof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"StateUpdated","inputs":[{"name":"","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false}],"bytecode":{"object":"0x608060405260008055348015601357600080fd5b506040516104fb3803806104fb8339810160408190526030916054565b600280546001600160a01b0319166001600160a01b03929092169190911790556082565b600060208284031215606557600080fd5b81516001600160a01b0381168114607b57600080fd5b9392505050565b61046a806100916000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80632f021764146100515780639588eca21461006d578063af80856414610076578063b4cf5ed3146100a1575b600080fd5b61005a60005481565b6040519081526020015b60405180910390f35b61005a60015481565b600254610089906001600160a01b031681565b6040516001600160a01b039091168152602001610064565b6100b46100af366004610275565b6100b6565b005b6000828260005487876040516024016100d3959493929190610348565b60408051601f198184030181529181526020820180516001600160e01b0316632df53d6b60e11b179052600254905191925060009182916001600160a01b03169061011f9085906103ba565b600060405180830381855afa9150503d806000811461015a576040519150601f19603f3d011682016040523d82523d6000602084013e61015f565b606091505b5091509150816101ab5760405162461bcd60e51b81526020600482015260126024820152711cdd185d1a58d7d8d85b1b0819985a5b195960721b60448201526064015b60405180910390fd5b6000818060200190518101906101c191906103e9565b9050806102105760405162461bcd60e51b815260206004820152601d60248201527f70726f6f66206e6f7420766572696669656420696e20616c69676e656400000060448201526064016101a2565b60008061021f898b018b610412565b91509150600154821461023157600080fd5b60018190556040518181527f7dec0c67bc5894b08872daeb9d5a8e7cba33c396890356a4d01ec40a71be5ce19060200160405180910390a150505050505050505050565b6000806000806040858703121561028b57600080fd5b843567ffffffffffffffff8111156102a257600080fd5b8501601f810187136102b357600080fd5b803567ffffffffffffffff8111156102ca57600080fd5b8760208284010111156102dc57600080fd5b60209182019550935085013567ffffffffffffffff8111156102fd57600080fd5b8501601f8101871361030e57600080fd5b803567ffffffffffffffff81111561032557600080fd5b8760208260051b840101111561033a57600080fd5b949793965060200194505050565b6060808252810185905260006001600160fb1b0386111561036857600080fd5b8560051b8088608085013780830190508560208401526080838203016040840152836080820152838560a0830137600060a0828601810191909152601f909401601f1916019092019695505050505050565b6000825160005b818110156103db57602081860181015185830152016103c1565b506000920191825250919050565b6000602082840312156103fb57600080fd5b8151801515811461040b57600080fd5b9392505050565b6000806040838503121561042557600080fd5b5050803592602090910135915056fea26469706673582212200e4909105440b6d95f2d5391c8c5474a570fceaf40938393bed0f5d72b31e07f64736f6c634300081c0033","sourceMap":"65:1052:16:-:0;;;158:4;130:32;;242:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;297:22;:48;;-1:-1:-1;;;;;;297:48:16;-1:-1:-1;;;;;297:48:16;;;;;;;;;;65:1052;;14:290:17;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;179:16;;-1:-1:-1;;;;;224:31:17;;214:42;;204:70;;270:1;267;260:12;204:70;293:5;14:290;-1:-1:-1;;;14:290:17:o;:::-;65:1052:16;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80632f021764146100515780639588eca21461006d578063af80856414610076578063b4cf5ed3146100a1575b600080fd5b61005a60005481565b6040519081526020015b60405180910390f35b61005a60015481565b600254610089906001600160a01b031681565b6040516001600160a01b039091168152602001610064565b6100b46100af366004610275565b6100b6565b005b6000828260005487876040516024016100d3959493929190610348565b60408051601f198184030181529181526020820180516001600160e01b0316632df53d6b60e11b179052600254905191925060009182916001600160a01b03169061011f9085906103ba565b600060405180830381855afa9150503d806000811461015a576040519150601f19603f3d011682016040523d82523d6000602084013e61015f565b606091505b5091509150816101ab5760405162461bcd60e51b81526020600482015260126024820152711cdd185d1a58d7d8d85b1b0819985a5b195960721b60448201526064015b60405180910390fd5b6000818060200190518101906101c191906103e9565b9050806102105760405162461bcd60e51b815260206004820152601d60248201527f70726f6f66206e6f7420766572696669656420696e20616c69676e656400000060448201526064016101a2565b60008061021f898b018b610412565b91509150600154821461023157600080fd5b60018190556040518181527f7dec0c67bc5894b08872daeb9d5a8e7cba33c396890356a4d01ec40a71be5ce19060200160405180910390a150505050505050505050565b6000806000806040858703121561028b57600080fd5b843567ffffffffffffffff8111156102a257600080fd5b8501601f810187136102b357600080fd5b803567ffffffffffffffff8111156102ca57600080fd5b8760208284010111156102dc57600080fd5b60209182019550935085013567ffffffffffffffff8111156102fd57600080fd5b8501601f8101871361030e57600080fd5b803567ffffffffffffffff81111561032557600080fd5b8760208260051b840101111561033a57600080fd5b949793965060200194505050565b6060808252810185905260006001600160fb1b0386111561036857600080fd5b8560051b8088608085013780830190508560208401526080838203016040840152836080820152838560a0830137600060a0828601810191909152601f909401601f1916019092019695505050505050565b6000825160005b818110156103db57602081860181015185830152016103c1565b506000920191825250919050565b6000602082840312156103fb57600080fd5b8151801515811461040b57600080fd5b9392505050565b6000806040838503121561042557600080fd5b5050803592602090910135915056fea26469706673582212200e4909105440b6d95f2d5391c8c5474a570fceaf40938393bed0f5d72b31e07f64736f6c634300081c0033","sourceMap":"65:1052:16:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;130:32;;;;;;;;;160:25:17;;;148:2;133:18;130:32:16;;;;;;;;168:24;;;;;;198:37;;;;;-1:-1:-1;;;;;198:37:16;;;;;;-1:-1:-1;;;;;360:32:17;;;342:51;;330:2;315:18;198:37:16;196:203:17;358:757:16;;;;;;:::i;:::-;;:::i;:::-;;;457:21;567:11;;580:10;;592:12;;481:133;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;481:133:16;;;;;;;;;;;;;;-1:-1:-1;;;;;481:133:16;-1:-1:-1;;;481:133:16;;;667:22;;:43;;481:133;;-1:-1:-1;;;;;;;;;;667:22:16;;:43;;481:133;;667:43;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;624:86;;;;728:10;720:41;;;;-1:-1:-1;;;720:41:16;;2992:2:17;720:41:16;;;2974:21:17;3031:2;3011:18;;;3004:30;-1:-1:-1;;;3050:18:17;;;3043:48;3108:18;;720:41:16;;;;;;;;;772:18;804:8;793:28;;;;;;;;;;;;:::i;:::-;772:49;;839:13;831:55;;;;-1:-1:-1;;;831:55:16;;3621:2:17;831:55:16;;;3603:21:17;3660:2;3640:18;;;3633:30;3699:31;3679:18;;;3672:59;3748:18;;831:55:16;3419:353:17;831:55:16;898:21;;945:44;;;;956:12;945:44;:::i;:::-;897:92;;;;1024:9;;1007:13;:26;999:35;;;;;;1045:9;:24;;;1085:23;;160:25:17;;;1085:23:16;;148:2:17;133:18;1085:23:16;;;;;;;447:668;;;;;;358:757;;;;:::o;404:1108:17:-;510:6;518;526;534;587:2;575:9;566:7;562:23;558:32;555:52;;;603:1;600;593:12;555:52;643:9;630:23;676:18;668:6;665:30;662:50;;;708:1;705;698:12;662:50;731:22;;784:4;776:13;;772:27;-1:-1:-1;762:55:17;;813:1;810;803:12;762:55;853:2;840:16;879:18;871:6;868:30;865:50;;;911:1;908;901:12;865:50;958:7;951:4;942:6;938:2;934:15;930:26;927:39;924:59;;;979:1;976;969:12;924:59;1010:4;1002:13;;;;-1:-1:-1;1034:6:17;-1:-1:-1;1078:20:17;;1065:34;1124:18;1111:32;;1108:52;;;1156:1;1153;1146:12;1108:52;1179:24;;1234:4;1226:13;;1222:27;-1:-1:-1;1212:55:17;;1263:1;1260;1253:12;1212:55;1305:2;1292:16;1333:18;1323:8;1320:32;1317:52;;;1365:1;1362;1355:12;1317:52;1422:7;1415:4;1403:8;1400:1;1396:16;1392:2;1388:25;1384:36;1381:49;1378:69;;;1443:1;1440;1433:12;1378:69;404:1108;;;;-1:-1:-1;1474:4:17;1466:13;;-1:-1:-1;;;404:1108:17:o;1517:851::-;1790:2;1772:21;;;1809:18;;1802:34;;;-1:-1:-1;;;;;;1848:31:17;;1845:51;;;1892:1;1889;1882:12;1845:51;1926:6;1923:1;1919:14;1984:6;1976;1970:3;1959:9;1955:19;1942:49;2025:6;2014:9;2010:22;2000:32;;2070:6;2063:4;2052:9;2048:20;2041:36;2137:3;2125:9;2121:2;2117:18;2113:28;2108:2;2097:9;2093:18;2086:56;2172:6;2166:3;2162:2;2158:12;2151:28;2223:6;2215;2209:3;2205:2;2201:12;2188:42;2284:1;2246:36;2254:15;;;2246:36;;2239:47;;;;2344:2;2323:15;;;-1:-1:-1;;2319:29:17;2311:38;2303:59;;;;1517:851;-1:-1:-1;;;;;;1517:851:17:o;2373:412::-;2502:3;2540:6;2534:13;2565:1;2575:129;2589:6;2586:1;2583:13;2575:129;;;2687:4;2671:14;;;2667:25;;2661:32;2648:11;;;2641:53;2604:12;2575:129;;;-1:-1:-1;2759:1:17;2723:16;;2748:13;;;-1:-1:-1;2723:16:17;2373:412;-1:-1:-1;2373:412:17:o;3137:277::-;3204:6;3257:2;3245:9;3236:7;3232:23;3228:32;3225:52;;;3273:1;3270;3263:12;3225:52;3305:9;3299:16;3358:5;3351:13;3344:21;3337:5;3334:32;3324:60;;3380:1;3377;3370:12;3324:60;3403:5;3137:277;-1:-1:-1;;;3137:277:17:o;3777:346::-;3845:6;3853;3906:2;3894:9;3885:7;3881:23;3877:32;3874:52;;;3922:1;3919;3912:12;3874:52;-1:-1:-1;;3967:23:17;;;4087:2;4072:18;;;4059:32;;-1:-1:-1;3777:346:17:o","linkReferences":{}},"methodIdentifiers":{"PROGRAM_ID()":"2f021764","alignedProofAggregator()":"af808564","stateRoot()":"9588eca2","updateState(bytes,bytes32[])":"b4cf5ed3"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_alignedProofAggregator\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"StateUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"PROGRAM_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"alignedProofAggregator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stateRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"publicInputs\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleProof\",\"type\":\"bytes32[]\"}],\"name\":\"updateState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/StateTransition.sol\":\"StateTransition\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"]},\"sources\":{\"src/StateTransition.sol\":{\"keccak256\":\"0x53d437af1fbd0693e9a818a76f83fc1c1ee467b2fa771314ea536f7070ed42d0\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://681ea84bcdffdb9c9e7c740377d0afe3fb4f732f3bfde4bc748c8a1a2de46c8f\",\"dweb:/ipfs/QmeVp5s8pjHtBmbDxpj5YKvkdqbqE9CPFux4bLV6fzgc4K\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_alignedProofAggregator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32","indexed":false}],"type":"event","name":"StateUpdated","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"PROGRAM_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"alignedProofAggregator","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"stateRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes","name":"publicInputs","type":"bytes"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"stateMutability":"nonpayable","type":"function","name":"updateState"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["forge-std/=lib/forge-std/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/StateTransition.sol":"StateTransition"},"evmVersion":"paris","libraries":{}},"sources":{"src/StateTransition.sol":{"keccak256":"0x53d437af1fbd0693e9a818a76f83fc1c1ee467b2fa771314ea536f7070ed42d0","urls":["bzz-raw://681ea84bcdffdb9c9e7c740377d0afe3fb4f732f3bfde4bc748c8a1a2de46c8f","dweb:/ipfs/QmeVp5s8pjHtBmbDxpj5YKvkdqbqE9CPFux4bLV6fzgc4K"],"license":"UNLICENSED"}},"version":1},"id":16} \ No newline at end of file From 93df5e18684d9c0a5318caa38a60956bb69da76c Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Mon, 12 May 2025 19:03:29 -0300 Subject: [PATCH 14/22] feat: send state transition transaction --- examples/L2/crates/l2/src/aligned.rs | 17 +++++++---- examples/L2/crates/l2/src/db.rs | 2 ++ examples/L2/crates/l2/src/eth.rs | 42 ++++++++++++++++++++++++++++ examples/L2/crates/l2/src/lib.rs | 27 ++++++++++++++++-- examples/L2/crates/l2/src/zk.rs | 1 - 5 files changed, 79 insertions(+), 10 deletions(-) create mode 100644 examples/L2/crates/l2/src/eth.rs diff --git a/examples/L2/crates/l2/src/aligned.rs b/examples/L2/crates/l2/src/aligned.rs index 0fea727ac6..0a836c26ef 100644 --- a/examples/L2/crates/l2/src/aligned.rs +++ b/examples/L2/crates/l2/src/aligned.rs @@ -4,6 +4,7 @@ use aligned_sdk::{ }; use alloy::{ eips::BlockNumberOrTag, + hex, primitives::Address, providers::{Provider, ProviderBuilder, WsConnect}, rpc::types::Filter, @@ -40,7 +41,7 @@ pub async fn send_proof_to_be_verified_on_aligned( .expect("Max fee to be retrieved"); let aligned_verification_data = - aligned_sdk::sdk::submit(network, &verification_data, max_fee, wallet, 0.into()) + aligned_sdk::sdk::submit(network, &verification_data, max_fee, wallet, nonce.into()) .await .expect("Proof to be sent"); @@ -54,8 +55,8 @@ pub async fn wait_until_proof_is_aggregated( proof: &sp1_sdk::SP1ProofWithPublicValues, vk: &SP1VerifyingKey, ) -> Option> { - let rpc_url = ""; - let ws = WsConnect::new(rpc_url); + let ws_rpc_url = "wss://ethereum-holesky-rpc.publicnode.com"; + let ws = WsConnect::new(ws_rpc_url); let provider = ProviderBuilder::new().on_ws(ws).await.unwrap(); let aligned_proof_agg_address = @@ -74,11 +75,11 @@ pub async fn wait_until_proof_is_aggregated( vk: vk.hash_bytes(), public_inputs: proof.public_values.to_vec(), }; - + let mut merkle_path = None; while let Some(_) = stream.next().await { - merkle_path = aligned_sdk::sdk::aggregation::get_merkle_path_for_proof( + if let Some(merkle_proof) = aligned_sdk::sdk::aggregation::get_merkle_path_for_proof( network.clone(), eth_rpc_url.clone(), beacon_client_url.clone(), @@ -86,7 +87,11 @@ pub async fn wait_until_proof_is_aggregated( &verification_data, ) .await - .unwrap(); + .unwrap() + { + merkle_path = Some(merkle_proof); + break; + }; } merkle_path diff --git a/examples/L2/crates/l2/src/db.rs b/examples/L2/crates/l2/src/db.rs index 49151e6dc3..de4a763ebf 100644 --- a/examples/L2/crates/l2/src/db.rs +++ b/examples/L2/crates/l2/src/db.rs @@ -75,6 +75,8 @@ impl DB { root } + /// Db genesis state used if a file is not provided + /// Its commitment is: 0x454691b501bc38536f4156a5b7d86502c49d13710d5e5b52b22c563fff4afee0 fn initial_state() -> Vec { vec![ UserState { diff --git a/examples/L2/crates/l2/src/eth.rs b/examples/L2/crates/l2/src/eth.rs new file mode 100644 index 0000000000..49e943cad9 --- /dev/null +++ b/examples/L2/crates/l2/src/eth.rs @@ -0,0 +1,42 @@ +use std::str::FromStr; + +use alloy::{ + network::EthereumWallet, primitives::Address, providers::ProviderBuilder, + rpc::types::TransactionReceipt, signers::local::PrivateKeySigner, sol, +}; + +sol!( + #[sol(rpc)] + StateTransition, + "abi/StateTransition.json" +); + +pub async fn send_state_transition_to_chain( + public_inputs: Vec, + merkle_proof: Vec<[u8; 32]>, + eth_rpc_url: String, + state_transition_address: String, + private_key: String, +) -> TransactionReceipt { + let rpc_url = eth_rpc_url.parse().expect("RPC URL should be valid"); + let signer = PrivateKeySigner::from_str(&private_key) + .expect("Keystore signer should be `cast wallet` compliant"); + let wallet = EthereumWallet::from(signer); + + let rpc_provider = ProviderBuilder::new().wallet(wallet).on_http(rpc_url); + let state_transition_contract = StateTransition::new( + Address::from_str(&state_transition_address) + .expect("State transition address should be valid"), + rpc_provider, + ); + + let merkle_proof = merkle_proof.iter().map(|e| e.into()).collect(); + + let res = state_transition_contract + .updateState(public_inputs.into(), merkle_proof) + .send() + .await + .expect("State transition tx to not revert"); + + res.get_receipt().await.expect("To get receipt") +} diff --git a/examples/L2/crates/l2/src/lib.rs b/examples/L2/crates/l2/src/lib.rs index bcd684009b..6f0e9ffbe0 100644 --- a/examples/L2/crates/l2/src/lib.rs +++ b/examples/L2/crates/l2/src/lib.rs @@ -1,11 +1,15 @@ use aligned::{send_proof_to_be_verified_on_aligned, wait_until_proof_is_aggregated}; +use alloy::hex::hex; use db::{generate_random_transfers, DB}; +use eth::send_state_transition_to_chain; +use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; use primitive_types::U256; use sp1_state_transition_program::ProgramOutput; use zk::{prove_state_transition, PROGRAM_ELF}; mod aligned; mod db; +mod eth; mod zk; pub async fn start_l2( @@ -21,11 +25,13 @@ pub async fn start_l2( let transfers = generate_random_transfers(&db, 10); // 2. Call zkvm and pass (MerkleTree, Updates to perform) + println!("Staring prover"); let (mut proof, vk) = prove_state_transition(&db, transfers.clone()); let ProgramOutput { initial_state_merkle_root, post_state_merkle_root, } = proof.public_values.read::(); + println!("Prover finish"); // 3. If the proving went alright, update the db and verify that the merkle root matches assert!(db.commitment() == initial_state_merkle_root); @@ -56,22 +62,37 @@ pub async fn start_l2( // Once aligned aggregates the proof we will be notified and we'll send the new state commitment on chain // 4. Send the proof to aligned and wait for verification + println!("Sending proof to aligned batcher"); let _ = send_proof_to_be_verified_on_aligned(&proof, PROGRAM_ELF.to_vec(), network.clone(), wallet) .await; + println!("Proof submitted"); + println!("Waiting until is proof is aggregated"); // 5. Wait until proof is aggregated let merkle_path = wait_until_proof_is_aggregated( network.clone(), - eth_rpc_url, + eth_rpc_url.clone(), beacon_client_url, &proof, &vk, ) - .await; + .await + .expect("To get merkle path in last aggregated proofs"); + + println!("Proof has been aggregated on aligned, about to send update to chain."); // 6. Send updateState transaction to Ethereum - // let receipt = update_state_on_chain(); + let receipt = send_state_transition_to_chain( + proof.public_values.to_vec(), + merkle_path, + eth_rpc_url.clone(), + "0xdC62Bf47Da2a2afD8Eb838C7004337613Af5C3b9".into(), + "".into(), + ) + .await; + + println!("State update in contracts tx receipt {:?}", receipt); // Finally save the db to a file to be retrieved later db.save().unwrap(); diff --git a/examples/L2/crates/l2/src/zk.rs b/examples/L2/crates/l2/src/zk.rs index 3237f7eb7f..465854b210 100644 --- a/examples/L2/crates/l2/src/zk.rs +++ b/examples/L2/crates/l2/src/zk.rs @@ -1,4 +1,3 @@ -use sp1_sdk::Prover; use types::Transfer; use crate::db::DB; From 635d5c94e235d917ec7c084bafc17e7f540fe40d Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Tue, 13 May 2025 12:33:21 -0300 Subject: [PATCH 15/22] refactor: config struct, better docs, .env examples --- examples/L2/.env.example | 8 ++++ examples/L2/Cargo.lock | 8 ++++ examples/L2/Makefile | 5 +-- examples/L2/contracts/.env.holesky | 13 ++++++ examples/L2/crates/l2/Cargo.toml | 3 +- examples/L2/crates/l2/src/aligned.rs | 58 +++++++++++++++----------- examples/L2/crates/l2/src/eth.rs | 19 +++++---- examples/L2/crates/l2/src/lib.rs | 62 +++++++++++----------------- examples/L2/crates/l2/src/main.rs | 36 ++++++++++++++++ examples/L2/crates/l2/src/zk.rs | 2 +- 10 files changed, 140 insertions(+), 74 deletions(-) create mode 100644 examples/L2/.env.example create mode 100644 examples/L2/contracts/.env.holesky create mode 100644 examples/L2/crates/l2/src/main.rs diff --git a/examples/L2/.env.example b/examples/L2/.env.example new file mode 100644 index 0000000000..0e18b6a8be --- /dev/null +++ b/examples/L2/.env.example @@ -0,0 +1,8 @@ +# .env example for holesky network +NETWORK=holesky +ETH_RPC_URL=https://ethereum-holesky-rpc.publicnode.com +WS_ETH_RPC_URL=wss://ethereum-holesky-rpc.publicnode.com +BEACON_CLIENT_URL= # This can't be a public one as we need to retrieve blobs and they don't support that method +PRIVATE_KEY_STORE_PATH= +PRIVATE_KEY_STORE_PASSWORD= +STATE_TRANSITION_CONTRACT_ADDRESS= diff --git a/examples/L2/Cargo.lock b/examples/L2/Cargo.lock index 627d3ef5a2..aeb7778729 100644 --- a/examples/L2/Cargo.lock +++ b/examples/L2/Cargo.lock @@ -650,6 +650,7 @@ dependencies = [ "alloy-primitives", "alloy-signer", "async-trait", + "eth-keystore", "k256", "rand 0.8.5", "thiserror 2.0.12", @@ -2215,6 +2216,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + [[package]] name = "downcast-rs" version = "1.2.1" @@ -3838,6 +3845,7 @@ dependencies = [ "aligned-sdk", "alloy", "bincode", + "dotenv", "futures-util", "lambdaworks-crypto", "primitive-types", diff --git a/examples/L2/Makefile b/examples/L2/Makefile index f170354ab1..a92e3e9ad5 100644 --- a/examples/L2/Makefile +++ b/examples/L2/Makefile @@ -2,13 +2,12 @@ SHELL := /bin/bash -run: +run_l2: @cd crates/l2 && cargo run --release --bin main -print_program_id: +generate_program_id: @cd crates/l2 && cargo run --release --bin write_program_id @cat ./crates/l2/programs_ids.json - deploy_contract_holesky: @. ./contracts/.env.holesky && . ./contracts/scripts/deploy.sh diff --git a/examples/L2/contracts/.env.holesky b/examples/L2/contracts/.env.holesky new file mode 100644 index 0000000000..3b6c14fdd6 --- /dev/null +++ b/examples/L2/contracts/.env.holesky @@ -0,0 +1,13 @@ +RPC_URL=https://ethereum-holesky-rpc.publicnode.com +# Initial state root of db, see in crates/l2/db.rs +INITIAL_STATE_ROOT=0x454691b501bc38536f4156a5b7d86502c49d13710d5e5b52b22c563fff4afee0 +# You can read it from crates/l2/programs_ids.json and generate it via make generate_program_id +PROGRAM_ID=0x5961f68d41b2798f4dab05184d8f9cda39637d28097819906033c2f10b365ab1 +# Address of the wallet you want to set as owner +OWNER_ADDRESS= +# Private key used to deploy the contract +PRIVATE_KEY= +# This is the aligned proof aggregator address in holesky see: +# https://docs.alignedlayer.com/guides/7_contract_addresses +ALIGNED_PROOF_AGGREGATOR_ADDRESS=0x7Eace34A8d4C4CacE633946C6F7CF4BeF3F33513 +ETHERSCAN_API_KEY= diff --git a/examples/L2/crates/l2/Cargo.toml b/examples/L2/crates/l2/Cargo.toml index d73f695419..08efc0e43a 100644 --- a/examples/L2/crates/l2/Cargo.toml +++ b/examples/L2/crates/l2/Cargo.toml @@ -18,7 +18,8 @@ aligned-sdk = { path = "../../../../batcher/aligned-sdk" } bincode = "1.3.3" futures-util = "0.3" tokio = "1.44" -alloy = { version = "0.14", features = ["full", "providers"] } +alloy = { version = "0.14", features = ["full", "signer-keystore", "providers"] } +dotenv = "0.15" [[bin]] name = "main" diff --git a/examples/L2/crates/l2/src/aligned.rs b/examples/L2/crates/l2/src/aligned.rs index 0a836c26ef..b26334fc56 100644 --- a/examples/L2/crates/l2/src/aligned.rs +++ b/examples/L2/crates/l2/src/aligned.rs @@ -1,10 +1,9 @@ use aligned_sdk::{ - core::types::{AlignedVerificationData, Signer, SigningKey, VerificationData, Wallet}, - sdk::estimate_fee, + core::types::{AlignedVerificationData, Signer, VerificationData, Wallet}, + sdk::{estimate_fee, get_chain_id}, }; use alloy::{ eips::BlockNumberOrTag, - hex, primitives::Address, providers::{Provider, ProviderBuilder, WsConnect}, rpc::types::Filter, @@ -12,13 +11,21 @@ use alloy::{ use futures_util::StreamExt; use sp1_sdk::{HashableKey, SP1VerifyingKey}; +use crate::Config; + pub async fn send_proof_to_be_verified_on_aligned( + config: &Config, proof: &sp1_sdk::SP1ProofWithPublicValues, vm_program_code: Vec, - network: aligned_sdk::core::types::Network, - wallet: Wallet, ) -> AlignedVerificationData { let proof = bincode::serialize(proof).expect("Serialize sp1 proof to binary"); + let chain_id = get_chain_id(&config.eth_rpc_url).await.unwrap(); + let wallet = Wallet::decrypt_keystore( + &config.private_key_store_path, + &config.private_key_store_password, + ) + .expect("Keystore to be `cast wallet` compliant") + .with_chain_id(chain_id); let verification_data = VerificationData { proof_generator_addr: wallet.address(), @@ -29,38 +36,41 @@ pub async fn send_proof_to_be_verified_on_aligned( verification_key: None, }; - let nonce = aligned_sdk::sdk::get_nonce_from_batcher(network.clone(), wallet.address()) + let nonce = aligned_sdk::sdk::get_nonce_from_batcher(config.network.clone(), wallet.address()) .await .expect("Retrieve nonce from aligned batcher"); let max_fee = estimate_fee( - "https://ethereum-holesky-rpc.publicnode.com".into(), + &config.eth_rpc_url, aligned_sdk::core::types::FeeEstimationType::Instant, ) .await .expect("Max fee to be retrieved"); - let aligned_verification_data = - aligned_sdk::sdk::submit(network, &verification_data, max_fee, wallet, nonce.into()) - .await - .expect("Proof to be sent"); + let aligned_verification_data = aligned_sdk::sdk::submit( + config.network.clone(), + &verification_data, + max_fee, + wallet, + nonce.into(), + ) + .await + .expect("Proof to be sent"); aligned_verification_data } pub async fn wait_until_proof_is_aggregated( - network: aligned_sdk::core::types::Network, - eth_rpc_url: String, - beacon_client_url: String, + config: &Config, proof: &sp1_sdk::SP1ProofWithPublicValues, vk: &SP1VerifyingKey, -) -> Option> { - let ws_rpc_url = "wss://ethereum-holesky-rpc.publicnode.com"; +) -> Vec<[u8; 32]> { + let ws_rpc_url = &config.ws_eth_rpc_url; let ws = WsConnect::new(ws_rpc_url); let provider = ProviderBuilder::new().on_ws(ws).await.unwrap(); let aligned_proof_agg_address = - Address::from(network.get_aligned_proof_agg_service_address().0); + Address::from(config.network.get_aligned_proof_agg_service_address().0); let filter = Filter::new() .address(aligned_proof_agg_address) @@ -75,21 +85,21 @@ pub async fn wait_until_proof_is_aggregated( vk: vk.hash_bytes(), public_inputs: proof.public_values.to_vec(), }; - - let mut merkle_path = None; + + let mut merkle_path = vec![]; while let Some(_) = stream.next().await { if let Some(merkle_proof) = aligned_sdk::sdk::aggregation::get_merkle_path_for_proof( - network.clone(), - eth_rpc_url.clone(), - beacon_client_url.clone(), + config.network.clone(), + config.eth_rpc_url.clone(), + config.beacon_client_url.clone(), None, &verification_data, ) .await - .unwrap() + .expect("Get merkle path for proof") { - merkle_path = Some(merkle_proof); + merkle_path = merkle_proof; break; }; } diff --git a/examples/L2/crates/l2/src/eth.rs b/examples/L2/crates/l2/src/eth.rs index 49e943cad9..9a92cecff1 100644 --- a/examples/L2/crates/l2/src/eth.rs +++ b/examples/L2/crates/l2/src/eth.rs @@ -2,9 +2,11 @@ use std::str::FromStr; use alloy::{ network::EthereumWallet, primitives::Address, providers::ProviderBuilder, - rpc::types::TransactionReceipt, signers::local::PrivateKeySigner, sol, + rpc::types::TransactionReceipt, signers::local::LocalSigner, sol, }; +use crate::Config; + sol!( #[sol(rpc)] StateTransition, @@ -12,20 +14,21 @@ sol!( ); pub async fn send_state_transition_to_chain( + config: &Config, public_inputs: Vec, merkle_proof: Vec<[u8; 32]>, - eth_rpc_url: String, - state_transition_address: String, - private_key: String, ) -> TransactionReceipt { - let rpc_url = eth_rpc_url.parse().expect("RPC URL should be valid"); - let signer = PrivateKeySigner::from_str(&private_key) - .expect("Keystore signer should be `cast wallet` compliant"); + let rpc_url = config.eth_rpc_url.parse().expect("RPC URL should be valid"); + let signer = LocalSigner::decrypt_keystore( + &config.private_key_store_path, + &config.private_key_store_password, + ) + .expect("Keystore signer should be `cast wallet` compliant"); let wallet = EthereumWallet::from(signer); let rpc_provider = ProviderBuilder::new().wallet(wallet).on_http(rpc_url); let state_transition_contract = StateTransition::new( - Address::from_str(&state_transition_address) + Address::from_str(&config.state_transition_contract_address) .expect("State transition address should be valid"), rpc_provider, ); diff --git a/examples/L2/crates/l2/src/lib.rs b/examples/L2/crates/l2/src/lib.rs index 6f0e9ffbe0..9ffafcddb4 100644 --- a/examples/L2/crates/l2/src/lib.rs +++ b/examples/L2/crates/l2/src/lib.rs @@ -1,10 +1,9 @@ use aligned::{send_proof_to_be_verified_on_aligned, wait_until_proof_is_aggregated}; -use alloy::hex::hex; use db::{generate_random_transfers, DB}; use eth::send_state_transition_to_chain; -use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; use primitive_types::U256; use sp1_state_transition_program::ProgramOutput; +use tracing::info; use zk::{prove_state_transition, PROGRAM_ELF}; mod aligned; @@ -12,29 +11,35 @@ mod db; mod eth; mod zk; -pub async fn start_l2( - network: aligned_sdk::core::types::Network, - eth_rpc_url: String, - beacon_client_url: String, - wallet: aligned_sdk::core::types::Wallet, -) { +pub struct Config { + pub network: aligned_sdk::core::types::Network, + pub eth_rpc_url: String, + pub ws_eth_rpc_url: String, + pub beacon_client_url: String, + pub private_key_store_path: String, + pub private_key_store_password: String, + pub state_transition_contract_address: String, +} + +pub async fn start_l2(config: Config) { // 0. Load merkle tree file, if not created, create initial state let mut db = DB::new("./db".to_string()); // 1. Create random transfers let transfers = generate_random_transfers(&db, 10); - // 2. Call zkvm and pass (MerkleTree, Updates to perform) - println!("Staring prover"); + // 2. Call zkvm and transfer to perform and verify + info!("Staring prover"); let (mut proof, vk) = prove_state_transition(&db, transfers.clone()); let ProgramOutput { initial_state_merkle_root, post_state_merkle_root, } = proof.public_values.read::(); - println!("Prover finish"); + info!("Prover finish"); // 3. If the proving went alright, update the db and verify that the merkle root matches assert!(db.commitment() == initial_state_merkle_root); + // Note: we don't have to verify that the user has enough balance, as the prover already validates it for transfer in transfers { let mut user_from = db .user_states @@ -62,37 +67,20 @@ pub async fn start_l2( // Once aligned aggregates the proof we will be notified and we'll send the new state commitment on chain // 4. Send the proof to aligned and wait for verification - println!("Sending proof to aligned batcher"); - let _ = - send_proof_to_be_verified_on_aligned(&proof, PROGRAM_ELF.to_vec(), network.clone(), wallet) - .await; - println!("Proof submitted"); + info!("Sending proof to aligned batcher"); + let _ = send_proof_to_be_verified_on_aligned(&config, &proof, PROGRAM_ELF.to_vec()).await; + info!("Proof submitted"); - println!("Waiting until is proof is aggregated"); // 5. Wait until proof is aggregated - let merkle_path = wait_until_proof_is_aggregated( - network.clone(), - eth_rpc_url.clone(), - beacon_client_url, - &proof, - &vk, - ) - .await - .expect("To get merkle path in last aggregated proofs"); - - println!("Proof has been aggregated on aligned, about to send update to chain."); + info!("Waiting until is proof is aggregated"); + let merkle_path = wait_until_proof_is_aggregated(&config, &proof, &vk).await; + info!("Proof has been aggregated on aligned, about to send update to chain."); // 6. Send updateState transaction to Ethereum - let receipt = send_state_transition_to_chain( - proof.public_values.to_vec(), - merkle_path, - eth_rpc_url.clone(), - "0xdC62Bf47Da2a2afD8Eb838C7004337613Af5C3b9".into(), - "".into(), - ) - .await; + let receipt = + send_state_transition_to_chain(&config, proof.public_values.to_vec(), merkle_path).await; - println!("State update in contracts tx receipt {:?}", receipt); + info!("State update in contracts tx receipt {:?}", receipt); // Finally save the db to a file to be retrieved later db.save().unwrap(); diff --git a/examples/L2/crates/l2/src/main.rs b/examples/L2/crates/l2/src/main.rs new file mode 100644 index 0000000000..76061203b5 --- /dev/null +++ b/examples/L2/crates/l2/src/main.rs @@ -0,0 +1,36 @@ +use std::env; + +use aligned_sdk::core::types::Network; +use dotenv::dotenv; +use l2_example::{start_l2, Config}; +use tracing_subscriber::FmtSubscriber; + +#[tokio::main] +async fn main() { + let subscriber = FmtSubscriber::builder().finish(); + tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed"); + + dotenv().ok(); + + let network = match env::var("NETWORK").expect("NETWORK not set").as_str() { + "holesky" => Network::Holesky, + "holesky-stage" => Network::HoleskyStage, + "devnet" => Network::Devnet, + _ => panic!("Invalid network, possible values are: holesky, holesky-stage, devnet"), + }; + + let config = Config { + network, + eth_rpc_url: env::var("ETH_RPC_URL").expect("ETH_RPC_URL not set"), + ws_eth_rpc_url: env::var("WS_ETH_RPC_URL").expect("WS_ETH_RPC_URL not set"), + beacon_client_url: env::var("BEACON_CLIENT_URL").expect("BEACON_CLIENT_URL not set"), + private_key_store_path: env::var("PRIVATE_KEY_STORE_PATH") + .expect("PRIVATE_KEY_STORE_PATH not set"), + private_key_store_password: env::var("PRIVATE_KEY_STORE_PASSWORD") + .expect("PRIVATE_KEY_STORE_PASSWORD not set"), + state_transition_contract_address: env::var("STATE_TRANSITION_CONTRACT_ADDRESS") + .expect("STATE_TRANSITION_CONTRACT_ADDRESS not set"), + }; + + start_l2(config).await; +} diff --git a/examples/L2/crates/l2/src/zk.rs b/examples/L2/crates/l2/src/zk.rs index 465854b210..a68ac0a4f1 100644 --- a/examples/L2/crates/l2/src/zk.rs +++ b/examples/L2/crates/l2/src/zk.rs @@ -22,7 +22,7 @@ pub fn prove_state_transition( .prove(&pk, &stdin) .compressed() .run() - .expect("Prover to run fine"); + .expect("Prover to run well"); (proof, vk) } From e2a5d63547bc90ac0c6ca9aa11ae37f6c7ce9072 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Tue, 13 May 2025 12:42:22 -0300 Subject: [PATCH 16/22] chore: gen_env target --- examples/L2/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/L2/Makefile b/examples/L2/Makefile index a92e3e9ad5..2b22c119ab 100644 --- a/examples/L2/Makefile +++ b/examples/L2/Makefile @@ -2,6 +2,9 @@ SHELL := /bin/bash +gen_env: + cp .env.example .env + run_l2: @cd crates/l2 && cargo run --release --bin main From 6b7b189ea3d0202ab548efdb5f0f3f782e096971 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Tue, 13 May 2025 15:28:00 -0300 Subject: [PATCH 17/22] refactor: proper errors in StateTransition contract --- examples/L2/contracts/src/StateTransition.sol | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/examples/L2/contracts/src/StateTransition.sol b/examples/L2/contracts/src/StateTransition.sol index 6e951f3e79..e81ec27479 100644 --- a/examples/L2/contracts/src/StateTransition.sol +++ b/examples/L2/contracts/src/StateTransition.sol @@ -6,8 +6,11 @@ contract StateTransition { event ProgramIdUpdated(bytes32); error OnlyOwner(address); + error AlignedVerifyProofInclusionCallFailed(); + error ProofVerificationFailed(); + error PrevStateRootDidNotMatch(); - bytes32 public PROGRAM_ID = 0x00; + bytes32 public PROGRAM_ID; bytes32 public stateRoot; address public alignedProofAggregator; address public owner; @@ -24,16 +27,21 @@ contract StateTransition { "verifyProofInclusion(bytes32[],bytes32,bytes)", merkleProof, PROGRAM_ID, publicInputs ); (bool callResult, bytes memory response) = alignedProofAggregator.staticcall(callData); - require(callResult, "static_call failed"); + if (!callResult) { + revert AlignedVerifyProofInclusionCallFailed(); + } bool proofVerified = abi.decode(response, (bool)); - require(proofVerified, "proof not verified in aligned"); + if (!proofVerified) { + revert ProofVerificationFailed(); + } (bytes32 prevStateRoot, bytes32 newStateRoot) = abi.decode(publicInputs, (bytes32, bytes32)); - require(prevStateRoot == stateRoot); + if (prevStateRoot != stateRoot) { + revert PrevStateRootDidNotMatch(); + } stateRoot = newStateRoot; - emit StateUpdated(stateRoot); } From 8814baf59619e10b135d1c53168449cfc6c310d3 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Tue, 13 May 2025 15:28:58 -0300 Subject: [PATCH 18/22] docs: readme and how to run --- examples/L2/{.env.example => .env.holesky} | 0 examples/L2/Makefile | 11 ++- examples/L2/README.md | 108 ++++++++++++++++++++- 3 files changed, 113 insertions(+), 6 deletions(-) rename examples/L2/{.env.example => .env.holesky} (100%) diff --git a/examples/L2/.env.example b/examples/L2/.env.holesky similarity index 100% rename from examples/L2/.env.example rename to examples/L2/.env.holesky diff --git a/examples/L2/Makefile b/examples/L2/Makefile index 2b22c119ab..e82291648c 100644 --- a/examples/L2/Makefile +++ b/examples/L2/Makefile @@ -2,8 +2,8 @@ SHELL := /bin/bash -gen_env: - cp .env.example .env +gen_env_l2_holesky: + cp .env.holesky .env run_l2: @cd crates/l2 && cargo run --release --bin main @@ -12,5 +12,8 @@ generate_program_id: @cd crates/l2 && cargo run --release --bin write_program_id @cat ./crates/l2/programs_ids.json -deploy_contract_holesky: - @. ./contracts/.env.holesky && . ./contracts/scripts/deploy.sh +gen_env_contract_holesky: + cp ./contracts/.env.holesky ./contracts/.env + +deploy_contract: + @. ./contracts/.env && . ./contracts/scripts/deploy.sh diff --git a/examples/L2/README.md b/examples/L2/README.md index 41aa66f106..7ae5ad14e6 100644 --- a/examples/L2/README.md +++ b/examples/L2/README.md @@ -1,3 +1,107 @@ -# Integrating your application with aggregation mode +# Integrating your application with Aligned Aggregation Mode -This example will guide you through how to integrate your application with aligned Proof Aggregation service. +This guide demonstrates how to build a minimal L2 application that integrates with Aligned Aggregation Mode. The L2 is private, that is: it does not post state diffs or any data to Ethereum, only commitments. This way, the prover has to prove that: + +1. The state database used in the proof must match the commitment stored in the on-chain contract. This is validated by computing the commitment of the received data in the zkvm and then exposing it as a public input. +2. The users performing the transfers have enough balance + +After processing the transfers, the vm computes the commitment of the post state, which is exposed as a public input. The smart contract then updates the on-chain state root. If a user later wants to retrieve their state, the application must return it along with a Merkle proof, so they can verify it against the contract’s state root. + +## Further improvements + +This is a very basic and minimal L2 design and can be extended. For example: + +- Block Support: Add support for batching transactions into blocks and publishing those blocks. +- Soft Finality: Use the Verification Layer or Fast Mode for faster confirmation of L2 blocks. +- Hard Finality: Use Aggregation Mode to finalize state transitions with high security. + +### How it works: Step by Step + +1. Load or initialize the database state. +2. Load user transfers. +3. Run the zkvm with db + transfers to perform. +4. Generate and submit the proof to Aligned. +5. Wait for the proof to be aggregated. +6. Call the smart contract function `updateStateTransition`, which: + 1. Calls `verifyProofInclusion` in the `AlignedProofAggregationService`, which: + - Computes the proof commitment with the provided `public_inputs` and `program_id` + - Computes the Merkle Root, using the provided Merkle Proof. + - Checks the root exists in the aggregation root. + 2. Verifies that the initial_state_root public input matches the on-chain state. + 3. If successful, updates the state root with the post_state_root public input. +7. If the contract call succeeds, updates the local database. + +### Usage + +#### Requirements + +1. [Rust](https://www.rust-lang.org/tools/install): we have tested in v1.85.1 +2. [Foundry](https://book.getfoundry.sh/getting-started/installation) +3. [Docker](https://docs.docker.com/engine/): for SP1 prover + +#### 1. Create keystore + +You can use cast to create a local keystore. If you already have one you can skip this step. + +```bash +cast wallet new-mnemonic +``` + +Then you can import your created keystore using: + +```bash +cast wallet import --interactive +``` + +Then you need to obtain some funds to pay for gas and proof verification. +You can do this by using this [faucet](https://cloud.google.com/application/web3/faucet/ethereum/holesky) + +This same wallet is used to send the proof via aligned, so you'll also need to fund it on aligned. Follow this [guide](https://docs.alignedlayer.com/guides/0_submitting_proofs#id-2.-send-funds-to-aligned). + +#### 2. Deploy the contract + +Generate the base `.env`. For `Holesky` you can run: + +```shell +make gen_env_contract_holesky +``` + +And then in `contracts/.env` you have to complete the missing variables: + +- `INITIAL_STATE_ROOT`: you can leave it as it is unless you change the initial state in `crates/l2/db.rs` +- `PROGRAM_ID`: you need to ensure it matches the one on your machine: + 1. Run `make generate_program_id` to generate it. + 2. Check `crates/l2/programs_ids.json` for the ID. +- `OWNER_ADDRESS`: you have to provide the address of the wallet created in step `1.`. +- `PRIVATE_KEY`: the private key used for the deployment, it needs to have some funds to pay for the deployment. + +Once you have completed the `.env`, you can deploy the contract: + +```shell +make deploy_contract +``` + +Save the output contract address. + +#### 3. Run L2 program + +Generate the base `.env`. For `Holesky` you can run: + +```shell +make gen_env_l2_holesky +``` + +And complete the variables: + +- `BEACON_CLIENT_URL`: A beacon client url, public node usually don't work as they don't support the endpoints to retrieve blob data +- `PRIVATE_KEY_STORE_PATH`: The path to the keystore created in `1.`. +- `PRIVATE_KEY_STORE_PASSWORD`: The password of the keystore crated in step `1.`. +- `STATE_TRANSITION_CONTRACT_ADDRESS`: The address of the contract deployed in step `2.` + +Finally, run the L2: + +```shell +make run_l2 +``` + +You should see a transaction receipt in the console and the stateRoot updated on-chain. You can run this process repeatedly, but make sure to not delete the db file, or the application will not be able to prove valid state transitions. From 1d6f53d1a5c9643faa3a1fde98c499f124c80aac Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Tue, 13 May 2025 16:48:28 -0300 Subject: [PATCH 19/22] chore: small typo fixes --- examples/L2/contracts/.env.holesky | 2 +- examples/L2/crates/l2/src/lib.rs | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/L2/contracts/.env.holesky b/examples/L2/contracts/.env.holesky index 3b6c14fdd6..75aaec4b23 100644 --- a/examples/L2/contracts/.env.holesky +++ b/examples/L2/contracts/.env.holesky @@ -9,5 +9,5 @@ OWNER_ADDRESS= PRIVATE_KEY= # This is the aligned proof aggregator address in holesky see: # https://docs.alignedlayer.com/guides/7_contract_addresses -ALIGNED_PROOF_AGGREGATOR_ADDRESS=0x7Eace34A8d4C4CacE633946C6F7CF4BeF3F33513 +ALIGNED_PROOF_AGGREGATOR_ADDRESS=0xe84CD4084d8131841CE6DC265361f81F4C59a1d4 ETHERSCAN_API_KEY= diff --git a/examples/L2/crates/l2/src/lib.rs b/examples/L2/crates/l2/src/lib.rs index 9ffafcddb4..0bd28010a6 100644 --- a/examples/L2/crates/l2/src/lib.rs +++ b/examples/L2/crates/l2/src/lib.rs @@ -29,7 +29,7 @@ pub async fn start_l2(config: Config) { let transfers = generate_random_transfers(&db, 10); // 2. Call zkvm and transfer to perform and verify - info!("Staring prover"); + info!("Starting prover"); let (mut proof, vk) = prove_state_transition(&db, transfers.clone()); let ProgramOutput { initial_state_merkle_root, @@ -80,7 +80,10 @@ pub async fn start_l2(config: Config) { let receipt = send_state_transition_to_chain(&config, proof.public_values.to_vec(), merkle_path).await; - info!("State update in contracts tx receipt {:?}", receipt); + info!( + "State update in contracts tx hash: {:?}", + receipt.transaction_hash + ); // Finally save the db to a file to be retrieved later db.save().unwrap(); From cb5e7f27afb10c7a82f788498b35fae9da05ce95 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Wed, 14 May 2025 11:55:57 -0300 Subject: [PATCH 20/22] feat: loop in start_l2, rename zk module, updated initial state and better docs --- examples/L2/contracts/.env.holesky | 2 +- examples/L2/crates/l2/src/aligned.rs | 12 +- examples/L2/crates/l2/src/db.rs | 15 ++- examples/L2/crates/l2/src/lib.rs | 127 +++++++++--------- .../L2/crates/l2/src/{zk.rs => prover.rs} | 0 examples/L2/crates/types/src/lib.rs | 4 +- 6 files changed, 81 insertions(+), 79 deletions(-) rename examples/L2/crates/l2/src/{zk.rs => prover.rs} (100%) diff --git a/examples/L2/contracts/.env.holesky b/examples/L2/contracts/.env.holesky index 75aaec4b23..c4bc3be769 100644 --- a/examples/L2/contracts/.env.holesky +++ b/examples/L2/contracts/.env.holesky @@ -1,6 +1,6 @@ RPC_URL=https://ethereum-holesky-rpc.publicnode.com # Initial state root of db, see in crates/l2/db.rs -INITIAL_STATE_ROOT=0x454691b501bc38536f4156a5b7d86502c49d13710d5e5b52b22c563fff4afee0 +INITIAL_STATE_ROOT=0x3c1d1c01f8e0a4533085bc9d8a3829c5f6872e6d6cf62e04ae71acbc803747ce # You can read it from crates/l2/programs_ids.json and generate it via make generate_program_id PROGRAM_ID=0x5961f68d41b2798f4dab05184d8f9cda39637d28097819906033c2f10b365ab1 # Address of the wallet you want to set as owner diff --git a/examples/L2/crates/l2/src/aligned.rs b/examples/L2/crates/l2/src/aligned.rs index b26334fc56..7cb163c579 100644 --- a/examples/L2/crates/l2/src/aligned.rs +++ b/examples/L2/crates/l2/src/aligned.rs @@ -19,7 +19,7 @@ pub async fn send_proof_to_be_verified_on_aligned( vm_program_code: Vec, ) -> AlignedVerificationData { let proof = bincode::serialize(proof).expect("Serialize sp1 proof to binary"); - let chain_id = get_chain_id(&config.eth_rpc_url).await.unwrap(); + let chain_id = get_chain_id(&config.eth_rpc_url).await.expect("To query chain id from rpc"); let wallet = Wallet::decrypt_keystore( &config.private_key_store_path, &config.private_key_store_password, @@ -47,17 +47,15 @@ pub async fn send_proof_to_be_verified_on_aligned( .await .expect("Max fee to be retrieved"); - let aligned_verification_data = aligned_sdk::sdk::submit( + aligned_sdk::sdk::submit( config.network.clone(), &verification_data, max_fee, wallet, - nonce.into(), + nonce, ) .await - .expect("Proof to be sent"); - - aligned_verification_data + .expect("Proof to be sent") } pub async fn wait_until_proof_is_aggregated( @@ -88,7 +86,7 @@ pub async fn wait_until_proof_is_aggregated( let mut merkle_path = vec![]; - while let Some(_) = stream.next().await { + while stream.next().await.is_some() { if let Some(merkle_proof) = aligned_sdk::sdk::aggregation::get_merkle_path_for_proof( config.network.clone(), config.eth_rpc_url.clone(), diff --git a/examples/L2/crates/l2/src/db.rs b/examples/L2/crates/l2/src/db.rs index de4a763ebf..b5e2c1473c 100644 --- a/examples/L2/crates/l2/src/db.rs +++ b/examples/L2/crates/l2/src/db.rs @@ -8,6 +8,7 @@ use std::{ use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; use primitive_types::{H160, U256}; use rand::Rng; +use tracing::warn; use types::{Transfer, UserState}; pub struct DB { @@ -17,6 +18,7 @@ pub struct DB { #[derive(Debug)] pub enum DBError { + #[allow(dead_code)] IO(String), } @@ -25,7 +27,7 @@ impl DB { match Self::new_from_file(file_path.clone()) { Ok(db) => db, Err(e) => { - println!("Error when loading db from file {:?}, will start a new db with a default initial state", e); + warn!("Error when loading db from file {:?}, will start a new db with a default initial state", e); // if db does not exists, create one with initial state let initial_state = Self::initial_state(); let mut user_states: BTreeMap = BTreeMap::new(); @@ -71,12 +73,11 @@ impl DB { pub fn commitment(&self) -> [u8; 32] { let values: Vec = self.user_states.clone().into_values().collect(); - let root = MerkleTree::::build(&values).unwrap().root; - root + MerkleTree::::build(&values).unwrap().root } /// Db genesis state used if a file is not provided - /// Its commitment is: 0x454691b501bc38536f4156a5b7d86502c49d13710d5e5b52b22c563fff4afee0 + /// Its commitment is: 0x3c1d1c01f8e0a4533085bc9d8a3829c5f6872e6d6cf62e04ae71acbc803747ce fn initial_state() -> Vec { vec![ UserState { @@ -87,17 +88,17 @@ impl DB { UserState { address: H160::from_str("0x53d284357ec70cE289D6D64134DfAc8E511c8a3D").unwrap(), balance: U256::from_dec_str("50000000000000000000").unwrap(), - nonce: U256::from(1), + nonce: U256::from(0), }, UserState { address: H160::from_str("0xfe9e8709d3215310075d67e3ed32a380ccf451c8").unwrap(), balance: U256::from_dec_str("250000000000000000000").unwrap(), - nonce: U256::from(2), + nonce: U256::from(0), }, UserState { address: H160::from_str("0xab5801a7d398351b8be11c439e05c5b3259aec9b").unwrap(), balance: U256::from_dec_str("75000000000000000000").unwrap(), - nonce: U256::from(5), + nonce: U256::from(0), }, ] } diff --git a/examples/L2/crates/l2/src/lib.rs b/examples/L2/crates/l2/src/lib.rs index 0bd28010a6..839544ba3a 100644 --- a/examples/L2/crates/l2/src/lib.rs +++ b/examples/L2/crates/l2/src/lib.rs @@ -4,12 +4,12 @@ use eth::send_state_transition_to_chain; use primitive_types::U256; use sp1_state_transition_program::ProgramOutput; use tracing::info; -use zk::{prove_state_transition, PROGRAM_ELF}; +use prover::{prove_state_transition, PROGRAM_ELF}; mod aligned; mod db; mod eth; -mod zk; +mod prover; pub struct Config { pub network: aligned_sdk::core::types::Network, @@ -25,66 +25,69 @@ pub async fn start_l2(config: Config) { // 0. Load merkle tree file, if not created, create initial state let mut db = DB::new("./db".to_string()); - // 1. Create random transfers - let transfers = generate_random_transfers(&db, 10); - - // 2. Call zkvm and transfer to perform and verify - info!("Starting prover"); - let (mut proof, vk) = prove_state_transition(&db, transfers.clone()); - let ProgramOutput { - initial_state_merkle_root, - post_state_merkle_root, - } = proof.public_values.read::(); - info!("Prover finish"); - - // 3. If the proving went alright, update the db and verify that the merkle root matches - assert!(db.commitment() == initial_state_merkle_root); - // Note: we don't have to verify that the user has enough balance, as the prover already validates it - for transfer in transfers { - let mut user_from = db - .user_states - .get(&transfer.from) - .expect("User must exist in state") - .clone(); - - let mut user_to = db - .user_states - .get(&transfer.to) - .expect("User must exist in state") - .clone(); - - user_from.balance -= transfer.amount; - user_from.nonce += U256::one(); - user_to.balance += transfer.amount; - - db.user_states.insert(transfer.from, user_from); - db.user_states.insert(transfer.to, user_to); + loop { + // 1. Create random transfers + let transfers = generate_random_transfers(&db, 10); + + // 2. Call zkvm and transfer to perform and verify + info!("Starting prover..."); + let (mut proof, vk) = prove_state_transition(&db, transfers.clone()); + let ProgramOutput { + initial_state_merkle_root, + post_state_merkle_root, + } = proof.public_values.read::(); + info!("Prover finish"); + + // 3. If the proving went alright, update the db and verify that the merkle root matches + assert!(db.commitment() == initial_state_merkle_root); + // Note: we don't have to verify that the user has enough balance, as the prover already validates it + for transfer in transfers { + let mut user_from = db + .user_states + .get(&transfer.from) + .expect("User must exist in state") + .clone(); + + let mut user_to = db + .user_states + .get(&transfer.to) + .expect("User must exist in state") + .clone(); + + user_from.balance -= transfer.amount; + user_from.nonce += U256::one(); + user_to.balance += transfer.amount; + + db.user_states.insert(transfer.from, user_from); + db.user_states.insert(transfer.to, user_to); + } + assert!(db.commitment() == post_state_merkle_root); + + // Fow now, in order for a proof to be aggregated, we first need to submit it via the fast mode or verification layer + // Let's suppose that our L2 would run the prover once every 24hs and submit it on aligned + // Once aligned aggregates the proof we will be notified and we'll send the new state commitment on chain + + // 4. Send the proof to aligned and wait for verification + info!("Sending proof to aligned batcher..."); + let _ = send_proof_to_be_verified_on_aligned(&config, &proof, PROGRAM_ELF.to_vec()).await; + info!("Proof submitted"); + + // 5. Wait until proof is aggregated + info!("Waiting until is proof is aggregated..."); + let merkle_path = wait_until_proof_is_aggregated(&config, &proof, &vk).await; + info!("Proof has been aggregated on aligned, about to send update to chain..."); + + // 6. Send updateState transaction to Ethereum + let receipt = + send_state_transition_to_chain(&config, proof.public_values.to_vec(), merkle_path).await; + + info!( + "State update in contracts tx hash: {:?}", + receipt.transaction_hash + ); + + // 7. Finally save the db to a file to be retrieved later + db.save().unwrap(); } - assert!(db.commitment() == post_state_merkle_root); - - // Fow now, in order for a proof to be aggregated, we first need to submit it via the fast mode or verification layer - // Let's suppose that our L2 would run the prover once every 24hs and submit it on aligned - // Once aligned aggregates the proof we will be notified and we'll send the new state commitment on chain - - // 4. Send the proof to aligned and wait for verification - info!("Sending proof to aligned batcher"); - let _ = send_proof_to_be_verified_on_aligned(&config, &proof, PROGRAM_ELF.to_vec()).await; - info!("Proof submitted"); - - // 5. Wait until proof is aggregated - info!("Waiting until is proof is aggregated"); - let merkle_path = wait_until_proof_is_aggregated(&config, &proof, &vk).await; - info!("Proof has been aggregated on aligned, about to send update to chain."); - - // 6. Send updateState transaction to Ethereum - let receipt = - send_state_transition_to_chain(&config, proof.public_values.to_vec(), merkle_path).await; - - info!( - "State update in contracts tx hash: {:?}", - receipt.transaction_hash - ); - // Finally save the db to a file to be retrieved later - db.save().unwrap(); } diff --git a/examples/L2/crates/l2/src/zk.rs b/examples/L2/crates/l2/src/prover.rs similarity index 100% rename from examples/L2/crates/l2/src/zk.rs rename to examples/L2/crates/l2/src/prover.rs diff --git a/examples/L2/crates/types/src/lib.rs b/examples/L2/crates/types/src/lib.rs index e09b97ab02..6eb8818c37 100644 --- a/examples/L2/crates/types/src/lib.rs +++ b/examples/L2/crates/types/src/lib.rs @@ -23,8 +23,8 @@ impl IsMerkleTreeBackend for UserState { leaf.nonce.to_little_endian(&mut nonce_bytes); hasher.update(leaf.address); - hasher.update(&balance_bytes); - hasher.update(&nonce_bytes); + hasher.update(balance_bytes); + hasher.update(nonce_bytes); hasher.finalize().into() } From 8133ea71db5d7ec4fde798ed326fe3756dd55b29 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Wed, 14 May 2025 12:02:36 -0300 Subject: [PATCH 21/22] chore: remove program ids as it vary between systems --- examples/L2/.gitignore | 2 ++ examples/L2/contracts/.env.holesky | 4 ++-- examples/L2/crates/l2/programs_ids.json | 3 --- 3 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 examples/L2/.gitignore delete mode 100644 examples/L2/crates/l2/programs_ids.json diff --git a/examples/L2/.gitignore b/examples/L2/.gitignore new file mode 100644 index 0000000000..c6640feaa2 --- /dev/null +++ b/examples/L2/.gitignore @@ -0,0 +1,2 @@ + +crates/l2/programs_ids.json diff --git a/examples/L2/contracts/.env.holesky b/examples/L2/contracts/.env.holesky index c4bc3be769..38551d36a8 100644 --- a/examples/L2/contracts/.env.holesky +++ b/examples/L2/contracts/.env.holesky @@ -1,8 +1,8 @@ RPC_URL=https://ethereum-holesky-rpc.publicnode.com # Initial state root of db, see in crates/l2/db.rs INITIAL_STATE_ROOT=0x3c1d1c01f8e0a4533085bc9d8a3829c5f6872e6d6cf62e04ae71acbc803747ce -# You can read it from crates/l2/programs_ids.json and generate it via make generate_program_id -PROGRAM_ID=0x5961f68d41b2798f4dab05184d8f9cda39637d28097819906033c2f10b365ab1 +# You can read it from crates/l2/programs_ids.json and generate it via `make generate_program_id` +PROGRAM_ID= # Address of the wallet you want to set as owner OWNER_ADDRESS= # Private key used to deploy the contract diff --git a/examples/L2/crates/l2/programs_ids.json b/examples/L2/crates/l2/programs_ids.json deleted file mode 100644 index 1d32a365ea..0000000000 --- a/examples/L2/crates/l2/programs_ids.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "sp1_vk_hash": "0x5961f68d41b2798f4dab05184d8f9cda39637d28097819906033c2f10b365ab1" -} \ No newline at end of file From 050edea85331147756ff6f5d35bbb7d2de6c67f3 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau Date: Fri, 16 May 2025 16:06:34 -0300 Subject: [PATCH 22/22] fix: sdk merge --- examples/L2/crates/l2/src/aligned.rs | 27 +++++++++++++++---------- examples/L2/crates/l2/src/lib.rs | 30 ++++++++++++++-------------- examples/L2/crates/l2/src/main.rs | 2 +- 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/examples/L2/crates/l2/src/aligned.rs b/examples/L2/crates/l2/src/aligned.rs index 7cb163c579..38d962a498 100644 --- a/examples/L2/crates/l2/src/aligned.rs +++ b/examples/L2/crates/l2/src/aligned.rs @@ -1,6 +1,6 @@ use aligned_sdk::{ - core::types::{AlignedVerificationData, Signer, VerificationData, Wallet}, - sdk::{estimate_fee, get_chain_id}, + common::types::{AlignedVerificationData, Signer, VerificationData, Wallet}, + verification_layer::{estimate_fee, get_chain_id}, }; use alloy::{ eips::BlockNumberOrTag, @@ -19,7 +19,9 @@ pub async fn send_proof_to_be_verified_on_aligned( vm_program_code: Vec, ) -> AlignedVerificationData { let proof = bincode::serialize(proof).expect("Serialize sp1 proof to binary"); - let chain_id = get_chain_id(&config.eth_rpc_url).await.expect("To query chain id from rpc"); + let chain_id = get_chain_id(&config.eth_rpc_url) + .await + .expect("To query chain id from rpc"); let wallet = Wallet::decrypt_keystore( &config.private_key_store_path, &config.private_key_store_password, @@ -29,25 +31,28 @@ pub async fn send_proof_to_be_verified_on_aligned( let verification_data = VerificationData { proof_generator_addr: wallet.address(), - proving_system: aligned_sdk::core::types::ProvingSystemId::SP1, + proving_system: aligned_sdk::common::types::ProvingSystemId::SP1, proof, vm_program_code: Some(vm_program_code), pub_input: None, verification_key: None, }; - let nonce = aligned_sdk::sdk::get_nonce_from_batcher(config.network.clone(), wallet.address()) - .await - .expect("Retrieve nonce from aligned batcher"); + let nonce = aligned_sdk::verification_layer::get_nonce_from_batcher( + config.network.clone(), + wallet.address(), + ) + .await + .expect("Retrieve nonce from aligned batcher"); let max_fee = estimate_fee( &config.eth_rpc_url, - aligned_sdk::core::types::FeeEstimationType::Instant, + aligned_sdk::common::types::FeeEstimationType::Instant, ) .await .expect("Max fee to be retrieved"); - aligned_sdk::sdk::submit( + aligned_sdk::verification_layer::submit( config.network.clone(), &verification_data, max_fee, @@ -79,7 +84,7 @@ pub async fn wait_until_proof_is_aggregated( let sub = provider.subscribe_logs(&filter).await.unwrap(); let mut stream = sub.into_stream(); - let verification_data = aligned_sdk::sdk::aggregation::AggregationModeVerificationData::SP1 { + let verification_data = aligned_sdk::aggregation_layer::AggregationModeVerificationData::SP1 { vk: vk.hash_bytes(), public_inputs: proof.public_values.to_vec(), }; @@ -87,7 +92,7 @@ pub async fn wait_until_proof_is_aggregated( let mut merkle_path = vec![]; while stream.next().await.is_some() { - if let Some(merkle_proof) = aligned_sdk::sdk::aggregation::get_merkle_path_for_proof( + if let Some(merkle_proof) = aligned_sdk::aggregation_layer::get_merkle_path_for_proof( config.network.clone(), config.eth_rpc_url.clone(), config.beacon_client_url.clone(), diff --git a/examples/L2/crates/l2/src/lib.rs b/examples/L2/crates/l2/src/lib.rs index 839544ba3a..33820145f9 100644 --- a/examples/L2/crates/l2/src/lib.rs +++ b/examples/L2/crates/l2/src/lib.rs @@ -2,9 +2,9 @@ use aligned::{send_proof_to_be_verified_on_aligned, wait_until_proof_is_aggregat use db::{generate_random_transfers, DB}; use eth::send_state_transition_to_chain; use primitive_types::U256; +use prover::{prove_state_transition, PROGRAM_ELF}; use sp1_state_transition_program::ProgramOutput; use tracing::info; -use prover::{prove_state_transition, PROGRAM_ELF}; mod aligned; mod db; @@ -12,7 +12,7 @@ mod eth; mod prover; pub struct Config { - pub network: aligned_sdk::core::types::Network, + pub network: aligned_sdk::common::types::Network, pub eth_rpc_url: String, pub ws_eth_rpc_url: String, pub beacon_client_url: String, @@ -28,7 +28,7 @@ pub async fn start_l2(config: Config) { loop { // 1. Create random transfers let transfers = generate_random_transfers(&db, 10); - + // 2. Call zkvm and transfer to perform and verify info!("Starting prover..."); let (mut proof, vk) = prove_state_transition(&db, transfers.clone()); @@ -37,7 +37,7 @@ pub async fn start_l2(config: Config) { post_state_merkle_root, } = proof.public_values.read::(); info!("Prover finish"); - + // 3. If the proving went alright, update the db and verify that the merkle root matches assert!(db.commitment() == initial_state_merkle_root); // Note: we don't have to verify that the user has enough balance, as the prover already validates it @@ -47,47 +47,47 @@ pub async fn start_l2(config: Config) { .get(&transfer.from) .expect("User must exist in state") .clone(); - + let mut user_to = db .user_states .get(&transfer.to) .expect("User must exist in state") .clone(); - + user_from.balance -= transfer.amount; user_from.nonce += U256::one(); user_to.balance += transfer.amount; - + db.user_states.insert(transfer.from, user_from); db.user_states.insert(transfer.to, user_to); } assert!(db.commitment() == post_state_merkle_root); - + // Fow now, in order for a proof to be aggregated, we first need to submit it via the fast mode or verification layer // Let's suppose that our L2 would run the prover once every 24hs and submit it on aligned // Once aligned aggregates the proof we will be notified and we'll send the new state commitment on chain - + // 4. Send the proof to aligned and wait for verification info!("Sending proof to aligned batcher..."); let _ = send_proof_to_be_verified_on_aligned(&config, &proof, PROGRAM_ELF.to_vec()).await; info!("Proof submitted"); - + // 5. Wait until proof is aggregated info!("Waiting until is proof is aggregated..."); let merkle_path = wait_until_proof_is_aggregated(&config, &proof, &vk).await; info!("Proof has been aggregated on aligned, about to send update to chain..."); - + // 6. Send updateState transaction to Ethereum let receipt = - send_state_transition_to_chain(&config, proof.public_values.to_vec(), merkle_path).await; - + send_state_transition_to_chain(&config, proof.public_values.to_vec(), merkle_path) + .await; + info!( "State update in contracts tx hash: {:?}", receipt.transaction_hash ); - + // 7. Finally save the db to a file to be retrieved later db.save().unwrap(); } - } diff --git a/examples/L2/crates/l2/src/main.rs b/examples/L2/crates/l2/src/main.rs index 76061203b5..59266450b9 100644 --- a/examples/L2/crates/l2/src/main.rs +++ b/examples/L2/crates/l2/src/main.rs @@ -1,6 +1,6 @@ use std::env; -use aligned_sdk::core::types::Network; +use aligned_sdk::common::types::Network; use dotenv::dotenv; use l2_example::{start_l2, Config}; use tracing_subscriber::FmtSubscriber;