From d551bf7ed03ddf2e208f5feed45d270a5277b903 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau <76252340+MarcosNicolau@users.noreply.github.com> Date: Thu, 3 Oct 2024 11:22:47 -0300 Subject: [PATCH 01/12] docs: clarify risc0 version and installation (#1146) Co-authored-by: Mauro Toscano <12560266+MauroToscano@users.noreply.github.com> --- docs/3_guides/0_submitting_proofs.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/3_guides/0_submitting_proofs.md b/docs/3_guides/0_submitting_proofs.md index 01967c5348..53db3c80d7 100644 --- a/docs/3_guides/0_submitting_proofs.md +++ b/docs/3_guides/0_submitting_proofs.md @@ -172,6 +172,16 @@ aligned submit \ --payment_service_addr 0x815aeCA64a974297942D2Bbf034ABEe22a38A003 ``` +**NOTE**: As said above, Aligned currently supports Risc0 proofs from `risc0-zkvm` version `v1.0.1`. For generating proofs using `cargo risc-zero` please ensure you are using `v1.0.1` or your proof will not be verified. + +If you can't install `cargo-risczero` `v1.0.1`, you can manually modify your `cargo.toml` on the host project to point to `v1.0.1`: + +```toml +risc0-zkvm = { git = "https://github.com/risc0/risc0", tag = "v1.0.1", default-features = false, features = [ + "prove", +] } +``` + **Example** ```bash From 7d04367da00550368fa55f72b0d12556bda3a3d1 Mon Sep 17 00:00:00 2001 From: "Mariano A. Nicolini" Date: Thu, 3 Oct 2024 17:17:43 -0300 Subject: [PATCH 02/12] refactor(batcher): add user state & other code quality refactors (#1106) Co-authored-by: Urix <43704209+uri-99@users.noreply.github.com> --- batcher/Cargo.lock | 184 ++- batcher/aligned-batcher/src/connection.rs | 68 + batcher/aligned-batcher/src/lib.rs | 1105 ++++++++--------- .../aligned-batcher/src/types/batch_queue.rs | 16 +- .../aligned-batcher/src/types/batch_state.rs | 158 +++ batcher/aligned-batcher/src/types/errors.rs | 9 +- batcher/aligned-batcher/src/types/mod.rs | 3 +- .../aligned-batcher/src/types/user_state.rs | 21 + .../src/communication/messaging.rs | 9 + batcher/aligned-sdk/src/core/errors.rs | 2 + batcher/aligned-sdk/src/core/types.rs | 2 + batcher/aligned/send_burst_tasks.sh | 2 +- 12 files changed, 917 insertions(+), 662 deletions(-) create mode 100644 batcher/aligned-batcher/src/connection.rs create mode 100644 batcher/aligned-batcher/src/types/batch_state.rs create mode 100644 batcher/aligned-batcher/src/types/user_state.rs diff --git a/batcher/Cargo.lock b/batcher/Cargo.lock index 5038a08431..aee59bbe70 100644 --- a/batcher/Cargo.lock +++ b/batcher/Cargo.lock @@ -38,6 +38,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "aes" version = "0.8.4" @@ -192,7 +198,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.77", ] [[package]] @@ -641,7 +647,6 @@ dependencies = [ "fastrand", "hex", "http 0.2.12", - "hyper 0.14.29", "ring 0.17.8", "time", "tokio", @@ -652,9 +657,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16838e6c9e12125face1c1eff1343c75e3ff540de98ff7ebd61874a89bcfeb9" +checksum = "60e8f6b615cb5fc60a98132268508ad104310f0cfb25a1c22eee76efdf9154da" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -664,15 +669,16 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.3.1" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87c5f920ffd1e0526ec9e70e50bf444db50b204395a0fa7016bbf9e31ea1698f" +checksum = "a10d5c055aa540164d9561a0e2e74ad30f0dcf7393c3a92f6733ddf9c5762468" dependencies = [ "aws-credential-types", "aws-sigv4", "aws-smithy-async", "aws-smithy-eventstream", "aws-smithy-http", + "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", @@ -680,6 +686,7 @@ dependencies = [ "fastrand", "http 0.2.12", "http-body 0.4.6", + "once_cell", "percent-encoding", "pin-project-lite", "tracing", @@ -790,9 +797,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5df1b0fa6be58efe9d4ccc257df0a53b89cd8909e86591a13ca54817c87517be" +checksum = "cc8db6904450bafe7473c6ca9123f88cc11089e41a025408f992db4e22d3be68" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", @@ -830,9 +837,9 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.60.11" +version = "0.60.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c4134cf3adaeacff34d588dbe814200357b0c466d730cf1c0d8054384a2de4" +checksum = "598b1689d001c4d4dc3cb386adb07d37786783aee3ac4b324bcadac116bf3d23" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -851,9 +858,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.60.4" +version = "0.60.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6363078f927f612b970edf9d1903ef5cef9a64d1e8423525ebb1f0a1633c858" +checksum = "cef7d0a272725f87e51ba2bf89f8c21e4df61b9e49ae1ac367a6d69916ef7c90" dependencies = [ "aws-smithy-types", "bytes", @@ -862,9 +869,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.60.9" +version = "0.60.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9cd0ae3d97daa0a2bf377a4d8e8e1362cae590c4a1aad0d40058ebca18eb91e" +checksum = "5c8bc3e8fdc6b8d07d976e301c02fe553f72a39b7a9fea820e023268467d7ab6" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", @@ -902,9 +909,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.6.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df4217d39fe940066174e6238310167bf466bfbebf3be0661e53cacccde6313" +checksum = "d1ce695746394772e7000b39fe073095db6d45a862d0767dd5ad0ac0d7f8eb87" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -929,9 +936,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.7.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30819352ed0a04ecf6a2f3477e344d2d1ba33d43e0f09ad9047c12e0d923616f" +checksum = "e086682a53d3aa241192aa110fa8dfce98f2f5ac2ead0de84d41582c7e8fdb96" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -972,9 +979,9 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.8" +version = "0.60.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d123fbc2a4adc3c301652ba8e149bf4bc1d1725affb9784eb20c953ace06bf55" +checksum = "ab0b0166827aa700d3dc519f72f8b3a91c35d0b8d042dc5d643a91e6f80648fc" dependencies = [ "xmlparser", ] @@ -1058,7 +1065,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.7.4", "object", "rustc-demangle", "serde", @@ -1398,6 +1405,7 @@ checksum = "45bcde016d64c21da4be18b655631e5ab6d3107607e71a73a9f53eb48aae23fb" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -1478,9 +1486,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.17" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" +checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc" dependencies = [ "clap_builder", "clap_derive", @@ -1488,9 +1496,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.17" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" +checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99" dependencies = [ "anstream", "anstyle", @@ -1864,10 +1872,23 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version 0.4.1", + "rustc_version 0.4.0", "syn 2.0.77", ] +[[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", + "zeroize", +] + [[package]] name = "digest" version = "0.9.0" @@ -2713,7 +2734,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.8.0", ] [[package]] @@ -3396,6 +3417,7 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", + "tower", "tower-service", "tracing", ] @@ -3881,6 +3903,15 @@ dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + [[package]] name = "mio" version = "0.8.11" @@ -4892,7 +4923,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit 0.22.21", + "toml_edit 0.21.1", ] [[package]] @@ -5215,7 +5246,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper 0.1.2", - "system-configuration", + "system-configuration 0.5.1", "tokio", "tokio-rustls 0.24.1", "tower-service", @@ -5224,7 +5255,7 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "webpki-roots 0.25.4", - "winreg 0.50.0", + "winreg", ] [[package]] @@ -5256,14 +5287,14 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.13", + "rustls 0.23.11", "rustls-pemfile 2.1.3", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.1", - "system-configuration", + "system-configuration 0.6.1", "tokio", "tokio-native-tls", "tokio-rustls 0.26.0", @@ -5677,6 +5708,7 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" dependencies = [ + "base64 0.22.1", "rustls-pki-types", ] @@ -5821,9 +5853,9 @@ dependencies = [ [[package]] name = "sdd" -version = "0.2.0" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84345e4c9bd703274a082fb80caaa99b7612be48dfaa1dd9266577ec412309d" +checksum = "60a7b59a5d9b0099720b417b6325d91a52cbf5b3dcb5041d864be53eefa58abc" [[package]] name = "sec1" @@ -6724,6 +6756,9 @@ name = "sync_wrapper" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] [[package]] name = "sysinfo" @@ -6748,7 +6783,18 @@ checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", "core-foundation", - "system-configuration-sys", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "system-configuration-sys 0.6.0", ] [[package]] @@ -6761,6 +6807,16 @@ dependencies = [ "libc", ] +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tap" version = "1.0.1" @@ -6775,8 +6831,9 @@ checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -7005,7 +7062,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.21", + "toml_edit 0.22.15", ] [[package]] @@ -7030,9 +7087,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.21" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ "indexmap 2.2.6", "toml_datetime", @@ -7636,6 +7693,36 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -7654,6 +7741,15 @@ 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" @@ -7803,16 +7899,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "ws_stream_wasm" version = "0.7.4" diff --git a/batcher/aligned-batcher/src/connection.rs b/batcher/aligned-batcher/src/connection.rs new file mode 100644 index 0000000000..65bbcf384e --- /dev/null +++ b/batcher/aligned-batcher/src/connection.rs @@ -0,0 +1,68 @@ +use std::sync::Arc; + +use aligned_sdk::{ + communication::serialization::cbor_serialize, + core::types::{BatchInclusionData, ResponseMessage, VerificationCommitmentBatch}, +}; +use futures_util::{stream::SplitSink, SinkExt}; +use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; +use log::{error, info}; +use serde::Serialize; +use tokio::{net::TcpStream, sync::RwLock}; +use tokio_tungstenite::{ + tungstenite::{Error, Message}, + WebSocketStream, +}; + +use crate::types::{batch_queue::BatchQueueEntry, errors::BatcherError}; + +pub(crate) type WsMessageSink = Arc, Message>>>; + +pub(crate) async fn send_batch_inclusion_data_responses( + finalized_batch: Vec, + batch_merkle_tree: &MerkleTree, +) -> Result<(), BatcherError> { + for (vd_batch_idx, entry) in finalized_batch.iter().enumerate() { + let batch_inclusion_data = BatchInclusionData::new(vd_batch_idx, batch_merkle_tree); + let response = ResponseMessage::BatchInclusionData(batch_inclusion_data); + + let serialized_response = cbor_serialize(&response) + .map_err(|e| BatcherError::SerializationError(e.to_string()))?; + + let Some(ws_sink) = entry.messaging_sink.as_ref() else { + return Err(BatcherError::WsSinkEmpty); + }; + + let sending_result = ws_sink + .write() + .await + .send(Message::binary(serialized_response)) + .await; + + match sending_result { + Err(Error::AlreadyClosed) => (), + Err(e) => error!("Error while sending batch inclusion data response: {}", e), + Ok(_) => (), + } + + info!("Response sent"); + } + + Ok(()) +} + +pub(crate) async fn send_message(ws_conn_sink: WsMessageSink, message: T) { + match cbor_serialize(&message) { + Ok(serialized_response) => { + if let Err(err) = ws_conn_sink + .write() + .await + .send(Message::binary(serialized_response)) + .await + { + error!("Error while sending message: {}", err) + } + } + Err(e) => error!("Error while serializing message: {}", e), + } +} diff --git a/batcher/aligned-batcher/src/lib.rs b/batcher/aligned-batcher/src/lib.rs index b5a24e3722..86253dcd14 100644 --- a/batcher/aligned-batcher/src/lib.rs +++ b/batcher/aligned-batcher/src/lib.rs @@ -3,51 +3,42 @@ extern crate core; use aligned_sdk::communication::serialization::{cbor_deserialize, cbor_serialize}; use aligned_sdk::eth::batcher_payment_service::SignatureData; use config::NonPayingConfig; +use connection::{send_message, WsMessageSink}; use dotenvy::dotenv; use ethers::contract::ContractError; use ethers::signers::Signer; -use serde::Serialize; +use types::batch_state::BatchState; +use types::user_state::UserState; -use std::collections::hash_map::Entry; use std::collections::HashMap; use std::env; use std::iter::repeat; use std::net::SocketAddr; use std::sync::Arc; -use aligned_sdk::core::{ - constants::{ - ADDITIONAL_SUBMISSION_GAS_COST_PER_PROOF, AGGREGATOR_GAS_COST, CONSTANT_GAS_COST, - DEFAULT_AGGREGATOR_FEE_DIVIDER, DEFAULT_AGGREGATOR_FEE_MULTIPLIER, - DEFAULT_MAX_FEE_PER_PROOF, MIN_FEE_PER_PROOF, RESPOND_TO_TASK_FEE_LIMIT_DIVIDER, - RESPOND_TO_TASK_FEE_LIMIT_MULTIPLIER, - }, - types::{ - BatchInclusionData, ClientMessage, NoncedVerificationData, ResponseMessage, - ValidityResponseMessage, VerificationCommitmentBatch, VerificationData, - VerificationDataCommitment, - }, +use aligned_sdk::core::types::{ + ClientMessage, NoncedVerificationData, ResponseMessage, ValidityResponseMessage, + VerificationCommitmentBatch, VerificationData, VerificationDataCommitment, }; use aws_sdk_s3::client::Client as S3Client; use eth::{try_create_new_task, BatcherPaymentService, CreateNewTaskFeeParams, SignerMiddlewareT}; use ethers::prelude::{Middleware, Provider}; use ethers::providers::Ws; use ethers::types::{Address, Signature, TransactionReceipt, U256}; -use futures_util::stream::SplitSink; use futures_util::{future, SinkExt, StreamExt, TryStreamExt}; use lambdaworks_crypto::merkle_tree::merkle::MerkleTree; use lambdaworks_crypto::merkle_tree::traits::IsMerkleTreeBackend; use log::{debug, error, info, warn}; use tokio::net::{TcpListener, TcpStream}; -use tokio::sync::{Mutex, RwLock}; +use tokio::sync::{Mutex, MutexGuard, RwLock}; use tokio_tungstenite::tungstenite::{Error, Message}; -use tokio_tungstenite::WebSocketStream; -use types::batch_queue::{self, BatchQueue, BatchQueueEntry, BatchQueueEntryPriority}; +use types::batch_queue::{self, BatchQueueEntry, BatchQueueEntryPriority}; use types::errors::{BatcherError, BatcherSendError}; use crate::config::{ConfigFromYaml, ContractDeploymentOutput}; mod config; +mod connection; mod eth; pub mod gnark; pub mod halo2; @@ -57,136 +48,19 @@ pub mod sp1; pub mod types; mod zk_utils; -struct BatchState { - batch_queue: BatchQueue, - user_nonces: HashMap, - /// The minimum fee of a pending proof for a user. - /// This should always be the fee of the biggest pending nonce by the user. - /// This is used to check if a user is submitting a proof with a higher nonce and higher fee, - /// which is invalid and should be rejected. - user_min_fee: HashMap, - user_proof_count_in_batch: HashMap, -} - -impl BatchState { - fn new() -> Self { - Self { - batch_queue: BatchQueue::new(), - user_nonces: HashMap::new(), - user_min_fee: HashMap::new(), - user_proof_count_in_batch: HashMap::new(), - } - } - - fn get_user_proof_count(&self, addr: &Address) -> u64 { - *self.user_proof_count_in_batch.get(addr).unwrap_or(&0) - } - - /* - Increments the user proof count in the batch, if the user is already in the hashmap. - If the user is not in the hashmap, it adds the user to the hashmap with a count of 1 to represent the first proof. - */ - fn increment_user_proof_count(&mut self, addr: &Address) { - self.user_proof_count_in_batch - .entry(*addr) - .and_modify(|count| *count += 1) - .or_insert(1); - } - - fn get_entry(&self, sender: Address, nonce: U256) -> Option<&BatchQueueEntry> { - self.batch_queue - .iter() - .map(|(entry, _)| entry) - .find(|entry| entry.sender == sender && entry.nonced_verification_data.nonce == nonce) - } - - /// Checks if the entry is valid - /// An entry is valid if there is no entry with the same sender, - /// lower nonce and a lower fee - /// If the entry is valid, it replaces the entry in the queue - /// to increment the max fee, then it updates the user min fee if necessary - /// If the entry is invalid, it returns a validity response message. - /// If the entry is valid, it returns None. - fn validate_and_increment_max_fee( - &mut self, - replacement_entry: BatchQueueEntry, - ) -> Option { - let replacement_max_fee = replacement_entry.nonced_verification_data.max_fee; - let nonce = replacement_entry.nonced_verification_data.nonce; - let sender = replacement_entry.sender; - - debug!( - "Checking validity of entry with sender: {:?}, nonce: {:?}, max_fee: {:?}", - sender, nonce, replacement_max_fee - ); - - // it is a valid entry only if there is no entry with the same sender, lower nonce and a lower fee - let is_valid = !self.batch_queue.iter().any(|(entry, _)| { - entry.sender == sender - && entry.nonced_verification_data.nonce < nonce - && entry.nonced_verification_data.max_fee < replacement_max_fee - }); - - if !is_valid { - return Some(ValidityResponseMessage::InvalidReplacementMessage); - } - - info!( - "Entry is valid, incrementing fee for sender: {:?}, nonce: {:?}, max_fee: {:?}", - sender, nonce, replacement_max_fee - ); - - // remove the old entry and insert the new one - // note that the entries are considered equal for the priority queue - // if they have the same nonce and sender, so we can remove the old entry - // by calling remove with the new entry - self.batch_queue.remove(&replacement_entry); - self.batch_queue.push( - replacement_entry.clone(), - BatchQueueEntryPriority::new(replacement_max_fee, nonce), - ); +const AGGREGATOR_GAS_COST: u128 = 400_000; +const BATCHER_SUBMISSION_BASE_GAS_COST: u128 = 125_000; +pub(crate) const ADDITIONAL_SUBMISSION_GAS_COST_PER_PROOF: u128 = 13_000; +pub(crate) const CONSTANT_GAS_COST: u128 = + ((AGGREGATOR_GAS_COST * DEFAULT_AGGREGATOR_FEE_MULTIPLIER) / DEFAULT_AGGREGATOR_FEE_DIVIDER) + + BATCHER_SUBMISSION_BASE_GAS_COST; - let user_min_fee = self - .batch_queue - .iter() - .filter(|(e, _)| e.sender == sender) - .map(|(e, _)| e.nonced_verification_data.max_fee) - .min() - .unwrap_or(U256::max_value()); - - self.user_min_fee.insert(sender, user_min_fee); - - None - } - - /// Updates: - /// * The user proof count in batch - /// * The user min fee pending in batch (which is the one with the highest nonce) - /// based on whats currenlty in the batch queue. - /// This is necessary because the whole batch may not be included in the finalized batch, - /// This caches are needed to validate user messages. - fn update_user_proofs_in_batch_and_min_fee(&mut self) { - let mut updated_user_min_fee = HashMap::new(); - let mut updated_user_proof_count_in_batch = HashMap::new(); - - for (entry, _) in self.batch_queue.iter() { - *updated_user_proof_count_in_batch - .entry(entry.sender) - .or_insert(0) += 1; - - let min_fee = updated_user_min_fee - .entry(entry.sender) - .or_insert(entry.nonced_verification_data.max_fee); - - if entry.nonced_verification_data.max_fee < *min_fee { - *min_fee = entry.nonced_verification_data.max_fee; - } - } - - self.user_proof_count_in_batch = updated_user_proof_count_in_batch; - self.user_min_fee = updated_user_min_fee; - } -} +const DEFAULT_MAX_FEE_PER_PROOF: u128 = ADDITIONAL_SUBMISSION_GAS_COST_PER_PROOF * 100_000_000_000; // gas_price = 100 Gwei = 0.0000001 ether (high gas price) +const MIN_FEE_PER_PROOF: u128 = ADDITIONAL_SUBMISSION_GAS_COST_PER_PROOF * 100_000_000; // gas_price = 0.1 Gwei = 0.0000000001 ether (low gas price) +const RESPOND_TO_TASK_FEE_LIMIT_MULTIPLIER: u128 = 5; // to set the respondToTaskFeeLimit variable higher than fee_for_aggregator +const RESPOND_TO_TASK_FEE_LIMIT_DIVIDER: u128 = 2; +const DEFAULT_AGGREGATOR_FEE_MULTIPLIER: u128 = 3; // to set the feeForAggregator variable higher than what was calculated +const DEFAULT_AGGREGATOR_FEE_DIVIDER: u128 = 2; pub struct Batcher { s3_client: S3Client, @@ -290,10 +164,27 @@ impl Batcher { .await .expect("Failed to get fallback Batcher Payment Service contract"); + let mut user_states = HashMap::new(); + let mut batch_state = BatchState::new(); let non_paying_config = if let Some(non_paying_config) = config.batcher.non_paying { warn!("Non-paying address configuration detected. Will replace non-paying address {} with configured address.", non_paying_config.address); - Some(NonPayingConfig::from_yaml_config(non_paying_config).await) + + let non_paying_config = NonPayingConfig::from_yaml_config(non_paying_config).await; + let nonpaying_nonce = payment_service + .user_nonces(non_paying_config.replacement.address()) + .call() + .await + .expect("Could not get non-paying nonce from Ethereum"); + + let non_paying_user_state = UserState::new(nonpaying_nonce); + user_states.insert( + non_paying_config.replacement.address(), + non_paying_user_state, + ); + + batch_state = BatchState::new_with_user_states(user_states); + Some(non_paying_config) } else { None }; @@ -307,7 +198,6 @@ impl Batcher { chain_id, payment_service, payment_service_fallback, - batch_state: Mutex::new(BatchState::new()), max_block_interval: config.batcher.block_interval, min_batch_len: config.batcher.batch_size_interval, max_proof_size: config.batcher.max_proof_size, @@ -316,6 +206,7 @@ impl Batcher { pre_verification_is_enabled: config.batcher.pre_verification_is_enabled, non_paying_config, posting_batch: Mutex::new(false), + batch_state: Mutex::new(batch_state), } } @@ -417,7 +308,7 @@ impl Batcher { async fn handle_message( self: Arc, message: Message, - ws_conn_sink: Arc, Message>>>, + ws_conn_sink: WsMessageSink, ) -> Result<(), Error> { // Deserialize verification data from message let client_msg: ClientMessage = match cbor_deserialize(message.into_data().as_slice()) { @@ -427,18 +318,17 @@ impl Batcher { return Ok(()); } }; + let msg_nonce = client_msg.verification_data.nonce; + debug!("Received message with nonce: {msg_nonce:?}",); - info!( - "Received message with nonce: {}", - client_msg.verification_data.nonce - ); - - if client_msg.verification_data.chain_id != self.chain_id { - warn!( - "Received message with incorrect chain id: {}", //This check does not save against "Holesky" and "HoleskyStage", since both are chain_id 17000 - client_msg.verification_data.chain_id - ); + // * ---------------------------------------------------* + // * Perform validations over the message * + // * ---------------------------------------------------* + // This check does not save against "Holesky" and "HoleskyStage", since both are chain_id 17000 + let msg_chain_id = client_msg.verification_data.chain_id; + if msg_chain_id != self.chain_id { + warn!("Received message with incorrect chain id: {msg_chain_id}"); send_message( ws_conn_sink.clone(), ValidityResponseMessage::InvalidChainId, @@ -448,16 +338,15 @@ impl Batcher { return Ok(()); } - if client_msg.verification_data.payment_service_addr != self.payment_service.address() { - warn!( - "Received message with incorrect payment service address: {}", //This checks saves against "Holesky" and "HoleskyStage", since each one has a different payment service address - client_msg.verification_data.payment_service_addr - ); + // This checks saves against "Holesky" and "HoleskyStage", since each one has a different payment service address + let msg_payment_service_addr = client_msg.verification_data.payment_service_addr; + if msg_payment_service_addr != self.payment_service.address() { + warn!("Received message with incorrect payment service address: {msg_payment_service_addr}"); send_message( ws_conn_sink.clone(), ValidityResponseMessage::InvalidPaymentServiceAddress( - client_msg.verification_data.payment_service_addr, + msg_payment_service_addr, self.payment_service.address(), ), ) @@ -467,208 +356,199 @@ impl Batcher { } info!("Verifying message signature..."); - if let Ok(addr) = client_msg.verify_signature() { - info!("Message signature verified"); - if self.is_nonpaying(&addr) { - self.handle_nonpaying_msg(ws_conn_sink.clone(), client_msg) - .await - } else { - info!("Handling paying message"); - if !self - .check_user_balance_and_increment_proof_count(&addr) - .await - { - send_message( - ws_conn_sink.clone(), - ValidityResponseMessage::InsufficientBalance(addr), - ) - .await; + let Ok(addr) = client_msg.verify_signature() else { + error!("Signature verification error"); + send_message( + ws_conn_sink.clone(), + ValidityResponseMessage::InvalidSignature, + ) + .await; + return Ok(()); + }; + info!("Message signature verified"); - return Ok(()); - } + let proof_size = client_msg.verification_data.verification_data.proof.len(); + if proof_size > self.max_proof_size { + error!("Proof size exceeds the maximum allowed size."); + send_message(ws_conn_sink.clone(), ValidityResponseMessage::ProofTooLarge).await; + return Ok(()); + } - let nonced_verification_data = client_msg.verification_data; - if nonced_verification_data.verification_data.proof.len() > self.max_proof_size { - error!("Proof size exceeds the maximum allowed size."); - send_message(ws_conn_sink.clone(), ValidityResponseMessage::ProofTooLarge) - .await; - return Ok(()); - } + let nonced_verification_data = client_msg.verification_data.clone(); - // When pre-verification is enabled, batcher will verify proofs for faster feedback with clients - if self.pre_verification_is_enabled - && !zk_utils::verify(&nonced_verification_data.verification_data).await - { - error!("Invalid proof detected. Verification failed."); - send_message(ws_conn_sink.clone(), ValidityResponseMessage::InvalidProof).await; - return Ok(()); // Send error message to the client and return - } + // When pre-verification is enabled, batcher will verify proofs for faster feedback with clients + if self.pre_verification_is_enabled + && !zk_utils::verify(&nonced_verification_data.verification_data).await + { + error!("Invalid proof detected. Verification failed."); + send_message(ws_conn_sink.clone(), ValidityResponseMessage::InvalidProof).await; + return Ok(()); + } + + if self.is_nonpaying(&addr) { + return self + .handle_nonpaying_msg(ws_conn_sink.clone(), &client_msg) + .await; + } - // Nonce and max fee verification - let nonce = nonced_verification_data.nonce; - let max_fee = nonced_verification_data.max_fee; + info!("Handling paying message"); - if max_fee < U256::from(MIN_FEE_PER_PROOF) { - error!("The max fee signed in the message is less than the accepted minimum fee to be included in the batch."); - send_message(ws_conn_sink.clone(), ValidityResponseMessage::InvalidMaxFee) - .await; + // We don't need a batch state lock here, since if the user locks its funds + // after the check, some blocks should pass until he can withdraw. + // It is safe to do just do this here. + if self.user_balance_is_unlocked(&addr).await { + send_message( + ws_conn_sink.clone(), + ValidityResponseMessage::InsufficientBalance(addr), + ) + .await; + return Ok(()); + } + + // Nonce and max fee verification + let max_fee = nonced_verification_data.max_fee; + if max_fee < U256::from(MIN_FEE_PER_PROOF) { + error!("The max fee signed in the message is less than the accepted minimum fee to be included in the batch."); + send_message(ws_conn_sink.clone(), ValidityResponseMessage::InvalidMaxFee).await; + return Ok(()); + } + + // Check that we had a user state entry for this user and insert it if not. + + // We aquire the lock first only to query if the user is already present and the lock is dropped. + // If it was not present, then the user nonce is queried to the Aligned contract. + // Lastly, we get a lock of the batch state again and insert the user state if it was still missing. + + let is_user_in_state: bool; + { + let batch_state_lock = self.batch_state.lock().await; + is_user_in_state = batch_state_lock.user_states.contains_key(&addr); + } + + if !is_user_in_state { + let ethereum_user_nonce = match self.get_user_nonce_from_ethereum(addr).await { + Ok(ethereum_user_nonce) => ethereum_user_nonce, + Err(e) => { + error!( + "Failed to get user nonce from Ethereum for address {addr:?}. Error: {e:?}" + ); + send_message(ws_conn_sink.clone(), ValidityResponseMessage::InvalidNonce).await; return Ok(()); } + }; + let user_state = UserState::new(ethereum_user_nonce); + let mut batch_state_lock = self.batch_state.lock().await; + batch_state_lock + .user_states + .entry(addr) + .or_insert(user_state); + } - let mut batch_state = self.batch_state.lock().await; - - let expected_user_nonce = match batch_state.user_nonces.get(&addr) { - Some(nonce) => *nonce, - None => { - let user_nonce = match self.get_user_nonce(addr).await { - Ok(nonce) => nonce, - Err(e) => { - error!("Failed to get user nonce for address {:?}: {:?}", addr, e); - send_message( - ws_conn_sink.clone(), - ValidityResponseMessage::InvalidNonce, - ) - .await; - - return Ok(()); - } - }; - - batch_state.user_nonces.insert(addr, user_nonce); - user_nonce - } - }; + // * ---------------------------------------------------* + // * Perform validations over user state * + // * ---------------------------------------------------* - let min_fee = match batch_state.user_min_fee.get(&addr) { - Some(fee) => *fee, - None => U256::max_value(), - }; + let Some(user_balance) = self.get_user_balance(&addr).await else { + error!("Could not get balance for address {addr:?}"); + send_message(ws_conn_sink.clone(), ValidityResponseMessage::EthRpcError).await; + return Ok(()); + }; - match expected_user_nonce.cmp(&nonce) { - std::cmp::Ordering::Less => { - // invalid, expected user nonce < nonce - warn!( - "Invalid nonce for address {addr}, had nonce {:?} < {:?}", - expected_user_nonce, nonce - ); - send_message(ws_conn_sink.clone(), ValidityResponseMessage::InvalidNonce) - .await; - return Ok(()); - } - std::cmp::Ordering::Equal => { - // if we are here nonce == expected_user_nonce - if !self - .handle_expected_nonce_message( - batch_state, - min_fee, - nonced_verification_data, - ws_conn_sink.clone(), - client_msg.signature, - addr, - ) - .await - { - // message should not be added to batch - return Ok(()); - }; - } - std::cmp::Ordering::Greater => { - // might be replacement message - // if the message is already in the batch - // we can check if we need to increment the fee - // get the entry with the same sender and nonce - if !self - .handle_replacement_message( - batch_state, - nonced_verification_data, - ws_conn_sink.clone(), - client_msg.signature, - addr, - expected_user_nonce, - ) - .await - { - // message should not be added to batch - return Ok(()); - } - } - } + // For now on until the message is fully processed, the batch state is locked + // This is needed because we need to query the user state to make validations and + // finally add the proof to the batch queue. - info!("Verification data message handled"); + let batch_state_lock = self.batch_state.lock().await; + let Some(proofs_in_batch) = batch_state_lock.get_user_proof_count(&addr).await else { + error!("Failed to get user proof count: User not found in user states, but it should have been already inserted"); + std::mem::drop(batch_state_lock); + send_message(ws_conn_sink.clone(), ValidityResponseMessage::InvalidNonce).await; + return Ok(()); + }; - send_message(ws_conn_sink, ValidityResponseMessage::Valid).await; - Ok(()) - } - } else { - error!("Signature verification error"); + if !self.check_min_balance(proofs_in_batch + 1, user_balance) { + std::mem::drop(batch_state_lock); send_message( ws_conn_sink.clone(), - ValidityResponseMessage::InvalidSignature, + ValidityResponseMessage::InsufficientBalance(addr), ) .await; - Ok(()) // Send error message to the client and return + return Ok(()); } - } - // Checks user has sufficient balance - // If user has sufficient balance, increments the user's proof count in the batch - async fn check_user_balance_and_increment_proof_count(&self, addr: &Address) -> bool { - if self.user_balance_is_unlocked(addr).await { - return false; - } - let mut batch_state = self.batch_state.lock().await; + let cached_user_nonce = batch_state_lock.get_user_nonce(&addr).await; + let Some(expected_nonce) = cached_user_nonce else { + error!("Failed to get cached user nonce: User not found in user states, but it should have been already inserted"); + std::mem::drop(batch_state_lock); + send_message(ws_conn_sink.clone(), ValidityResponseMessage::InvalidNonce).await; + return Ok(()); + }; - let user_proofs_in_batch = batch_state.get_user_proof_count(addr) + 1; + if expected_nonce < msg_nonce { + std::mem::drop(batch_state_lock); + warn!("Invalid nonce for address {addr}, had nonce {expected_nonce:?} < {msg_nonce:?}"); + send_message(ws_conn_sink.clone(), ValidityResponseMessage::InvalidNonce).await; + return Ok(()); + } - let user_balance = self.get_user_balance(addr).await; + // In this case, the message might be a replacement one. If it is valid, + // we replace the old entry with the new from the replacement message. + if expected_nonce > msg_nonce { + info!("Possible replacement message received: Expected nonce {expected_nonce:?} - message nonce: {msg_nonce:?}"); + self.handle_replacement_message( + batch_state_lock, + nonced_verification_data, + ws_conn_sink.clone(), + client_msg.signature, + addr, + ) + .await; - let min_balance = U256::from(user_proofs_in_batch) * U256::from(MIN_FEE_PER_PROOF); - if user_balance < min_balance { - return false; + return Ok(()); } - batch_state.increment_user_proof_count(addr); - true - } + let msg_max_fee = nonced_verification_data.max_fee; + let Some(user_min_fee) = batch_state_lock.get_user_min_fee(&addr).await else { + std::mem::drop(batch_state_lock); + send_message(ws_conn_sink.clone(), ValidityResponseMessage::InvalidNonce).await; + return Ok(()); + }; - /// Handles a message with an expected nonce. - /// If the max_fee is valid, it is added to the batch. - /// If the max_fee is invalid, a message is sent to the client. - /// Returns true if the message was added to the batch, false otherwise. - async fn handle_expected_nonce_message( - &self, - mut batch_state: tokio::sync::MutexGuard<'_, BatchState>, - min_fee: U256, - nonced_verification_data: NoncedVerificationData, - ws_conn_sink: Arc, Message>>>, - signature: Signature, - addr: Address, - ) -> bool { - let max_fee = nonced_verification_data.max_fee; - if max_fee > min_fee { - warn!( - "Invalid max fee for address {addr}, had fee {:?} < {:?}", - min_fee, max_fee - ); + if msg_max_fee > user_min_fee { + std::mem::drop(batch_state_lock); + warn!("Invalid max fee for address {addr}, had fee {user_min_fee:?} < {msg_max_fee:?}"); send_message(ws_conn_sink.clone(), ValidityResponseMessage::InvalidMaxFee).await; - return false; + return Ok(()); } - let nonce = nonced_verification_data.nonce; + // * ---------------------------------------------------------------------* + // * Add message data into the queue and update user state * + // * ---------------------------------------------------------------------* - batch_state.user_nonces.insert(addr, nonce + U256::one()); - batch_state.user_min_fee.insert(addr, max_fee); + if let Err(e) = self + .add_to_batch( + batch_state_lock, + nonced_verification_data, + ws_conn_sink.clone(), + client_msg.signature, + addr, + ) + .await + { + error!("Error while adding entry to batch: {e:?}"); + send_message(ws_conn_sink, ValidityResponseMessage::AddToBatchError).await; + return Ok(()); + }; - self.add_to_batch( - batch_state, - nonced_verification_data, - ws_conn_sink.clone(), - signature, - addr, - ) - .await; + info!("Verification data message handled"); + send_message(ws_conn_sink, ValidityResponseMessage::Valid).await; + Ok(()) + } - true + // Checks user has sufficient balance for paying all its the proofs in the current batch. + fn check_min_balance(&self, user_proofs_in_batch: usize, user_balance: U256) -> bool { + let min_balance = U256::from(user_proofs_in_batch) * U256::from(MIN_FEE_PER_PROOF); + user_balance >= min_balance } /// Handles a replacement message @@ -680,61 +560,50 @@ impl Batcher { /// Returns true if the message was replaced in the batch, false otherwise async fn handle_replacement_message( &self, - mut batch_state: tokio::sync::MutexGuard<'_, BatchState>, + mut batch_state_lock: MutexGuard<'_, BatchState>, nonced_verification_data: NoncedVerificationData, - ws_conn_sink: Arc, Message>>>, + ws_conn_sink: WsMessageSink, signature: Signature, addr: Address, - expected_user_nonce: U256, - ) -> bool { + ) { let replacement_max_fee = nonced_verification_data.max_fee; let nonce = nonced_verification_data.nonce; + let Some(entry) = batch_state_lock.get_entry(addr, nonce) else { + std::mem::drop(batch_state_lock); + warn!("Invalid nonce for address {addr}. Queue entry with nonce {nonce} not found"); + send_message(ws_conn_sink.clone(), ValidityResponseMessage::InvalidNonce).await; + return; + }; - let mut replacement_entry = match batch_state.get_entry(addr, nonce) { - Some(entry) => { - if entry.nonced_verification_data.max_fee < replacement_max_fee { - entry.clone() - } else { - warn!( - "Invalid replacement message for address {addr}, had fee {:?} < {:?}", - entry.nonced_verification_data.max_fee, replacement_max_fee - ); - send_message( - ws_conn_sink.clone(), - ValidityResponseMessage::InvalidReplacementMessage, - ) - .await; + let original_max_fee = entry.nonced_verification_data.max_fee; + if original_max_fee > replacement_max_fee { + std::mem::drop(batch_state_lock); + warn!("Invalid replacement message for address {addr}, had fee {original_max_fee:?} < {replacement_max_fee:?}"); + send_message( + ws_conn_sink.clone(), + ValidityResponseMessage::InvalidReplacementMessage, + ) + .await; - return false; - } - } - None => { - warn!( - "Invalid nonce for address {addr} Expected: {:?}, got: {:?}", - expected_user_nonce, nonce - ); - send_message(ws_conn_sink.clone(), ValidityResponseMessage::InvalidNonce).await; - return false; - } - }; + return; + } - info!( - "Replacing message for address {} with nonce {} and max fee {}", - addr, nonce, replacement_max_fee - ); + info!("Replacing message for address {addr} with nonce {nonce} and max fee {replacement_max_fee}"); + // The replacement entry is built from the old entry and validated for then to be replaced + let mut replacement_entry = entry.clone(); replacement_entry.signature = signature; replacement_entry.verification_data_commitment = nonced_verification_data.verification_data.clone().into(); replacement_entry.nonced_verification_data = nonced_verification_data; - // close old sink and replace with new one + // Close old sink in old entry and replace it with the new one { if let Some(messaging_sink) = replacement_entry.messaging_sink { let mut old_sink = messaging_sink.write().await; if let Err(e) = old_sink.close().await { // we dont want to exit here, just log the error - warn!("Error closing sink: {:?}", e); + warn!("Error closing sink: {e:?}"); } } else { warn!( @@ -744,16 +613,43 @@ impl Batcher { } replacement_entry.messaging_sink = Some(ws_conn_sink.clone()); - if let Some(msg) = batch_state.validate_and_increment_max_fee(replacement_entry) { - warn!("Invalid max fee"); - send_message(ws_conn_sink.clone(), msg).await; - return false; + if !batch_state_lock.replacement_entry_is_valid(&replacement_entry) { + std::mem::drop(batch_state_lock); + warn!("Invalid replacement message"); + send_message( + ws_conn_sink.clone(), + ValidityResponseMessage::InvalidReplacementMessage, + ) + .await; + return; } - true + info!( + "Replacement entry is valid, incrementing fee for sender: {:?}, nonce: {:?}, max_fee: {:?}", + replacement_entry.sender, replacement_entry.nonced_verification_data.nonce, replacement_max_fee + ); + + // remove the old entry and insert the new one + // note that the entries are considered equal for the priority queue + // if they have the same nonce and sender, so we can remove the old entry + // by calling remove with the new entry + batch_state_lock.batch_queue.remove(&replacement_entry); + batch_state_lock.batch_queue.push( + replacement_entry.clone(), + BatchQueueEntryPriority::new(replacement_max_fee, nonce), + ); + + let updated_min_fee_in_batch = batch_state_lock.get_user_min_fee_in_batch(&addr); + if batch_state_lock + .update_user_min_fee(&addr, updated_min_fee_in_batch) + .is_none() + { + std::mem::drop(batch_state_lock); + warn!("User state for address {addr:?} was not present in batcher user states, but it should be"); + }; } - async fn get_user_nonce( + async fn get_user_nonce_from_ethereum( &self, addr: Address, ) -> Result> { @@ -766,43 +662,86 @@ impl Batcher { /// Adds verification data to the current batch queue. async fn add_to_batch( &self, - mut batch_state: tokio::sync::MutexGuard<'_, BatchState>, + mut batch_state_lock: MutexGuard<'_, BatchState>, verification_data: NoncedVerificationData, - ws_conn_sink: Arc, Message>>>, + ws_conn_sink: WsMessageSink, proof_submitter_sig: Signature, - proof_submiter_addr: Address, - ) { + proof_submitter_addr: Address, + ) -> Result<(), BatcherError> { info!("Calculating verification data commitments..."); let verification_data_comm = verification_data.clone().into(); info!("Adding verification data to batch..."); let max_fee = verification_data.max_fee; let nonce = verification_data.nonce; - - batch_state.batch_queue.push( + batch_state_lock.batch_queue.push( BatchQueueEntry::new( verification_data, verification_data_comm, ws_conn_sink, proof_submitter_sig, - proof_submiter_addr, + proof_submitter_addr, ), BatchQueueEntryPriority::new(max_fee, nonce), ); + info!( "Current batch queue length: {}", - batch_state.batch_queue.len() + batch_state_lock.batch_queue.len() ); + + let mut proof_submitter_addr = proof_submitter_addr; + + // If the proof submitter is the nonpaying one, we should update the state + // of the replacement address. + proof_submitter_addr = if self.is_nonpaying(&proof_submitter_addr) { + self.get_nonpaying_replacement_addr() + .unwrap_or(proof_submitter_addr) + } else { + proof_submitter_addr + }; + + let Some(user_proof_count) = batch_state_lock + .get_user_proof_count(&proof_submitter_addr) + .await + else { + error!("User state of address {proof_submitter_addr} was not found when trying to update user state. This user state should have been present"); + std::mem::drop(batch_state_lock); + return Err(BatcherError::AddressNotFoundInUserStates( + proof_submitter_addr, + )); + }; + + // User state is updated + if batch_state_lock + .update_user_state( + &proof_submitter_addr, + nonce + U256::one(), + max_fee, + user_proof_count + 1, + ) + .is_none() + { + error!("User state of address {proof_submitter_addr} was not found when trying to update user state. This user state should have been present"); + std::mem::drop(batch_state_lock); + return Err(BatcherError::AddressNotFoundInUserStates( + proof_submitter_addr, + )); + }; + + Ok(()) } /// Given a new block number listened from the blockchain, checks if the current batch is ready to be posted. /// There are essentially two conditions to be checked: - /// * Has the current batch reached the minimum size to be posted? - /// * Has the received block number surpassed the maximum interval with respect to the last posted batch block? + /// * Has the current batch reached the minimum size to be posted? + /// * Has the received block number surpassed the maximum interval with respect to the last posted batch block? + /// /// Then the batch will be made as big as possible given this two conditions: - /// * The serialized batch size needs to be smaller than the maximum batch size - /// * The batch submission fee is less than the lowest `max fee` included the batch, - /// * And the batch submission fee is more than the highest `max fee` not included the batch. + /// * The serialized batch size needs to be smaller than the maximum batch size + /// * The batch submission fee is less than the lowest `max fee` included the batch, + /// * And the batch submission fee is more than the highest `max fee` not included the batch. + /// /// An extra sanity check is made to check if the batch size is 0, since it does not make sense to post /// an empty batch, even if the block interval has been reached. /// Once the batch meets the conditions for submission, the finalized batch is then passed to the @@ -812,9 +751,8 @@ impl Batcher { block_number: u64, gas_price: U256, ) -> Option> { - let mut batch_state = self.batch_state.lock().await; - let current_batch_len = batch_state.batch_queue.len(); - + let mut batch_state_lock = self.batch_state.lock().await; + let current_batch_len = batch_state_lock.batch_queue.len(); let last_uploaded_batch_block_lock = self.last_uploaded_batch_block.lock().await; // FIXME(marian): This condition should be changed to current_batch_size == 0 @@ -845,29 +783,44 @@ impl Batcher { // Set the batch posting flag to true *batch_posting = true; - - let batch_queue_copy = batch_state.batch_queue.clone(); - match batch_queue::try_build_batch(batch_queue_copy, gas_price, self.max_batch_size) { - Ok((resulting_batch_queue, finalized_batch)) => { - // Set the batch queue to batch queue copy - batch_state.batch_queue = resulting_batch_queue; - batch_state.update_user_proofs_in_batch_and_min_fee(); - Some(finalized_batch) - } - Err(BatcherError::BatchCostTooHigh) => { - // We cant post a batch since users are not willing to pay the needed fee, wait for more proofs - info!("No working batch found. Waiting for more proofs..."); - *batch_posting = false; - None - } - // FIXME: We should refactor this code and instead of returning None, return an error. - // See issue https://github.com/yetanotherco/aligned_layer/issues/1046. - Err(e) => { - error!("Unexpected error: {:?}", e); - *batch_posting = false; - None - } + let batch_queue_copy = batch_state_lock.batch_queue.clone(); + let (resulting_batch_queue, finalized_batch) = + batch_queue::try_build_batch(batch_queue_copy, gas_price, self.max_batch_size) + .inspect_err(|e| { + *batch_posting = false; + match e { + // We can't post a batch since users are not willing to pay the needed fee, wait for more proofs + BatcherError::BatchCostTooHigh => { + info!("No working batch found. Waiting for more proofs") + } + // FIXME: We should refactor this code and instead of returning None, return an error. + // See issue https://github.com/yetanotherco/aligned_layer/issues/1046. + e => error!("Unexpected error: {:?}", e), + } + }) + .ok()?; + + batch_state_lock.batch_queue = resulting_batch_queue; + let updated_user_proof_count_and_min_fee = + batch_state_lock.get_user_proofs_in_batch_and_min_fee(); + + let user_addresses: Vec
= batch_state_lock.user_states.keys().cloned().collect(); + for addr in user_addresses.iter() { + let (proof_count, min_fee) = updated_user_proof_count_and_min_fee + .get(addr) + .unwrap_or(&(0, U256::MAX)); + + // FIXME: The case where a the update functions return `None` can only happen when the user was not found + // in the `user_states` map should not really happen here, but doing this check so that we don't unwrap. + // Once https://github.com/yetanotherco/aligned_layer/issues/1046 is done we could return a more + // informative error. + + // Now we update the user states related to the batch (proof count in batch and min fee in batch) + batch_state_lock.update_user_proof_count(addr, *proof_count)?; + batch_state_lock.update_user_min_fee(addr, *min_fee)?; } + + Some(finalized_batch) } /// Takes the finalized batch as input and builds the merkle tree, posts verification data batch @@ -946,14 +899,13 @@ impl Batcher { return Err(e); }; - send_batch_inclusion_data_responses(finalized_batch, &batch_merkle_tree).await + connection::send_batch_inclusion_data_responses(finalized_batch, &batch_merkle_tree).await } async fn flush_queue_and_clear_nonce_cache(&self) { warn!("Resetting state... Flushing queue and nonces"); - let mut batch_state = self.batch_state.lock().await; - - for (entry, _) in batch_state.batch_queue.iter() { + let mut batch_state_lock = self.batch_state.lock().await; + for (entry, _) in batch_state_lock.batch_queue.iter() { if let Some(ws_sink) = entry.messaging_sink.as_ref() { send_message(ws_sink.clone(), ResponseMessage::BatchReset).await; } else { @@ -961,10 +913,29 @@ impl Batcher { } } - batch_state.batch_queue.clear(); - batch_state.user_nonces.clear(); - batch_state.user_proof_count_in_batch.clear(); - batch_state.user_min_fee.clear(); + let Some(nonpaying_replacement_addr) = self.get_nonpaying_replacement_addr() else { + batch_state_lock.batch_queue.clear(); + batch_state_lock.user_states.clear(); + return; + }; + + // If there is a nonpaying address configured, then fetch the correct nonce from Ethereum + // so that it is already loaded + + let Ok(nonpaying_replacement_addr_nonce) = self + .get_user_nonce_from_ethereum(nonpaying_replacement_addr) + .await + else { + batch_state_lock.batch_queue.clear(); + batch_state_lock.user_states.clear(); + return; + }; + batch_state_lock.batch_queue.clear(); + batch_state_lock.user_states.clear(); + let nonpaying_user_state = UserState::new(nonpaying_replacement_addr_nonce); + batch_state_lock + .user_states + .insert(nonpaying_replacement_addr, nonpaying_user_state); } /// Receives new block numbers, checks if conditions are met for submission and @@ -978,7 +949,7 @@ impl Batcher { } }; - while let Some(finalized_batch) = self.is_batch_ready(block_number, gas_price).await { + if let Some(finalized_batch) = self.is_batch_ready(block_number, gas_price).await { let batch_finalization_result = self .finalize_batch(block_number, finalized_batch, gas_price) .await; @@ -1115,8 +1086,7 @@ impl Batcher { { Ok(receipt) => Ok(receipt), Err(BatcherSendError::TransactionReverted(err)) => { - // dont retry with fallback - // just return the error + // Since transaction was reverted, we don't want to retry with fallback. warn!("Transaction reverted {:?}", err); Err(BatcherError::TransactionSendError) @@ -1153,204 +1123,141 @@ impl Batcher { .is_some_and(|non_paying_config| non_paying_config.address == *addr) } - /// Only relevant for testing and for users to easily use Aligned + fn get_nonpaying_replacement_addr(&self) -> Option
{ + let non_paying_conf = self.non_paying_config.as_ref()?; + Some(non_paying_conf.replacement.address()) + } + + /// Only relevant for testing and for users to easily use Aligned in testnet. async fn handle_nonpaying_msg( - self: Arc, - ws_conn_sink: Arc, Message>>>, - client_msg: ClientMessage, + &self, + ws_sink: WsMessageSink, + client_msg: &ClientMessage, ) -> Result<(), Error> { - let non_paying_config = self.non_paying_config.as_ref().unwrap(); - let addr = non_paying_config.replacement.address(); + info!("Handling nonpaying message"); + let Some(non_paying_config) = self.non_paying_config.as_ref() else { + warn!("There isn't a non-paying configuration loaded. This message will be ignored"); + send_message(ws_sink.clone(), ValidityResponseMessage::InvalidNonce).await; + return Ok(()); + }; - let user_balance = self.get_user_balance(&addr).await; + let replacement_addr = non_paying_config.replacement.address(); + let Some(replacement_user_balance) = self.get_user_balance(&replacement_addr).await else { + error!("Could not get balance for non-paying address {replacement_addr:?}"); + send_message( + ws_sink.clone(), + ValidityResponseMessage::InsufficientBalance(replacement_addr), + ) + .await; + return Ok(()); + }; - if user_balance == U256::from(0) { - error!("Insufficient funds for address {:?}", addr); + if replacement_user_balance == U256::from(0) { + error!("Insufficient funds for non-paying address {replacement_addr:?}"); send_message( - ws_conn_sink.clone(), - ValidityResponseMessage::InsufficientBalance(addr), + ws_sink.clone(), + ValidityResponseMessage::InsufficientBalance(replacement_addr), ) .await; - return Ok(()); // Send error message to the client and return + return Ok(()); } - if client_msg.verification_data.verification_data.proof.len() <= self.max_proof_size { - // When pre-verification is enabled, batcher will verify proofs for faster feedback with clients - if self.pre_verification_is_enabled - && !zk_utils::verify(&client_msg.verification_data.verification_data).await - { - error!("Invalid proof detected. Verification failed."); - send_message(ws_conn_sink.clone(), ValidityResponseMessage::InvalidProof).await; - return Ok(()); // Send error message to the client and return - } - - let nonced_verification_data = { - let mut batch_state = self.batch_state.lock().await; - - let nonpaying_nonce = match batch_state.user_nonces.entry(addr) { - Entry::Occupied(o) => o.into_mut(), - Entry::Vacant(vacant) => { - let nonce = match self.payment_service.user_nonces(addr).call().await { - Ok(nonce) => nonce, - Err(e) => { - error!("Failed to get nonce for address {:?}: {:?}", addr, e); - send_message( - ws_conn_sink.clone(), - ValidityResponseMessage::InvalidNonce, - ) - .await; - - return Ok(()); - } - }; - - vacant.insert(nonce) - } - }; - - info!("non paying nonce: {:?}", nonpaying_nonce); + let batch_state_lock = self.batch_state.lock().await; + let Some(non_paying_nonce) = batch_state_lock.get_user_nonce(&replacement_addr).await + else { + std::mem::drop(batch_state_lock); + error!("Nonce for non-paying address {replacement_addr:?} not found in cache."); + send_message(ws_sink.clone(), ValidityResponseMessage::InvalidProof).await; + return Ok(()); + }; - let nonce_value = *nonpaying_nonce; + debug!("Non-paying nonce: {:?}", non_paying_nonce); - *nonpaying_nonce += U256::one(); + let nonced_verification_data = NoncedVerificationData::new( + client_msg.verification_data.verification_data.clone(), + non_paying_nonce, + DEFAULT_MAX_FEE_PER_PROOF.into(), // 13_000 gas per proof * 100 gwei gas price (upper bound) + self.chain_id, + self.payment_service.address(), + ); - NoncedVerificationData::new( - client_msg.verification_data.verification_data.clone(), - nonce_value, - DEFAULT_MAX_FEE_PER_PROOF.into(), // 13_000 gas per proof * 100 gwei gas price (upper bound) - self.chain_id, - self.payment_service.address(), - ) - }; + let client_msg = ClientMessage::new( + nonced_verification_data.clone(), + non_paying_config.replacement.clone(), + ) + .await; - let client_msg = ClientMessage::new( - nonced_verification_data.clone(), - non_paying_config.replacement.clone(), + let signature = client_msg.signature; + let nonpaying_addr = non_paying_config.address; + if let Err(e) = self + .add_to_batch( + batch_state_lock, + nonced_verification_data, + ws_sink.clone(), + signature, + nonpaying_addr, ) - .await; - - let batch_state = self.batch_state.lock().await; - self.clone() - .add_to_batch( - batch_state, - nonced_verification_data, - ws_conn_sink.clone(), - client_msg.signature, - non_paying_config.address, - ) - .await; - } else { - error!("Proof is too large"); - send_message(ws_conn_sink.clone(), ValidityResponseMessage::ProofTooLarge).await; - return Ok(()); // Send error message to the client and return + .await + { + info!("Error while adding nonpaying address entry to batch: {e:?}"); + send_message(ws_sink, ValidityResponseMessage::AddToBatchError).await; + return Ok(()); }; - info!("Verification data message handled"); - - send_message(ws_conn_sink, ValidityResponseMessage::Valid).await; + info!("Non-paying verification data message handled"); + send_message(ws_sink, ValidityResponseMessage::Valid).await; Ok(()) } - async fn get_user_balance(&self, addr: &Address) -> U256 { - match self.payment_service.user_balances(*addr).call().await { - Ok(val) => val, - Err(_) => match self - .payment_service_fallback - .user_balances(*addr) - .call() - .await - { - Ok(balance) => balance, - Err(_) => { - warn!("Failed to get balance for address {:?}", addr); - U256::zero() - } - }, - } - } - - async fn user_balance_is_unlocked(&self, addr: &Address) -> bool { - let unlock_block = match self.payment_service.user_unlock_block(*addr).call().await { - Ok(val) => val, - Err(_) => match self - .payment_service_fallback - .user_unlock_block(*addr) - .call() - .await - { - Ok(unlock_block) => unlock_block, - Err(_) => { - warn!("Failed to get unlock block for address {:?}", addr); - U256::zero() - } - }, + /// Gets the balance of user with address `addr` from Ethereum. + /// Returns `None` if the balance couldn't be returned + /// FIXME: This should return a `Result` instead. + async fn get_user_balance(&self, addr: &Address) -> Option { + if let Ok(balance) = self.payment_service.user_balances(*addr).call().await { + return Some(balance); }; - unlock_block != U256::zero() + self.payment_service_fallback + .user_balances(*addr) + .call() + .await + .inspect_err(|_| warn!("Failed to get balance for address {:?}", addr)) + .ok() } - async fn get_gas_price(&self) -> Option { - match self.eth_ws_provider.get_gas_price().await { - Ok(gas_price) => Some(gas_price), // this is the block's max priority gas price, not the base fee - Err(_) => match self.eth_ws_provider_fallback.get_gas_price().await { - Ok(gas_price) => Some(gas_price), - Err(_) => { - warn!("Failed to get gas price"); - None - } - }, + async fn user_balance_is_unlocked(&self, addr: &Address) -> bool { + if let Ok(unlock_block) = self.payment_service.user_unlock_block(*addr).call().await { + return unlock_block != U256::zero(); } - } -} - -async fn send_batch_inclusion_data_responses( - finalized_batch: Vec, - batch_merkle_tree: &MerkleTree, -) -> Result<(), BatcherError> { - for (vd_batch_idx, entry) in finalized_batch.iter().enumerate() { - let batch_inclusion_data = BatchInclusionData::new(vd_batch_idx, batch_merkle_tree); - let response = ResponseMessage::BatchInclusionData(batch_inclusion_data); - - let serialized_response = cbor_serialize(&response) - .map_err(|e| BatcherError::SerializationError(e.to_string()))?; - - let Some(ws_sink) = entry.messaging_sink.as_ref() else { - return Err(BatcherError::WsSinkEmpty); - }; - - let sending_result = ws_sink - .write() + if let Ok(unlock_block) = self + .payment_service_fallback + .user_unlock_block(*addr) + .call() .await - .send(Message::binary(serialized_response)) - .await; - - match sending_result { - Err(Error::AlreadyClosed) => (), - Err(e) => error!("Error while sending batch inclusion data response: {}", e), - Ok(_) => (), + { + return unlock_block != U256::zero(); } - - info!("Response sent"); + warn!("Could not get user locking state"); + false } - Ok(()) -} - -async fn send_message( - ws_conn_sink: Arc, Message>>>, - message: T, -) { - match cbor_serialize(&message) { - Ok(serialized_response) => { - if let Err(err) = ws_conn_sink - .write() - .await - .send(Message::binary(serialized_response)) - .await - { - error!("Error while sending message: {}", err) - } + /// Gets the current gas price from Ethereum. + /// Returns `None` if the gas price couldn't be returned + /// FIXME: This should return a `Result` instead. + async fn get_gas_price(&self) -> Option { + if let Ok(gas_price) = self + .eth_ws_provider + .get_gas_price() + .await + .inspect_err(|e| warn!("Failed to get gas price. Trying with fallback: {e:?}")) + { + return Some(gas_price); } - Err(e) => error!("Error while serializing message: {}", e), + + self.eth_ws_provider_fallback + .get_gas_price() + .await + .inspect_err(|e| warn!("Failed to get gas price: {e:?}")) + .ok() } } diff --git a/batcher/aligned-batcher/src/types/batch_queue.rs b/batcher/aligned-batcher/src/types/batch_queue.rs index 9427cc9db7..c90219d237 100644 --- a/batcher/aligned-batcher/src/types/batch_queue.rs +++ b/batcher/aligned-batcher/src/types/batch_queue.rs @@ -1,22 +1,16 @@ +use aligned_sdk::{ + communication::serialization::cbor_serialize, + core::types::{NoncedVerificationData, VerificationDataCommitment}, +}; use ethers::types::{Address, Signature, U256}; -use futures_util::stream::SplitSink; use priority_queue::PriorityQueue; use std::{ hash::{Hash, Hasher}, ops::ControlFlow, - sync::Arc, -}; -use tokio::{net::TcpStream, sync::RwLock}; -use tokio_tungstenite::{tungstenite::Message, WebSocketStream}; - -use aligned_sdk::{ - communication::serialization::cbor_serialize, - core::types::{NoncedVerificationData, VerificationDataCommitment}, }; use super::errors::BatcherError; - -type WsMessageSink = Arc, Message>>>; +use crate::connection::WsMessageSink; #[derive(Clone)] pub(crate) struct BatchQueueEntry { diff --git a/batcher/aligned-batcher/src/types/batch_state.rs b/batcher/aligned-batcher/src/types/batch_state.rs new file mode 100644 index 0000000000..3e09377ac9 --- /dev/null +++ b/batcher/aligned-batcher/src/types/batch_state.rs @@ -0,0 +1,158 @@ +use std::collections::{hash_map::Entry, HashMap}; + +use super::{ + batch_queue::{BatchQueue, BatchQueueEntry}, + user_state::UserState, +}; +use ethers::types::{Address, U256}; +use log::debug; + +pub(crate) struct BatchState { + pub(crate) batch_queue: BatchQueue, + pub(crate) user_states: HashMap, +} + +impl BatchState { + pub(crate) fn new() -> Self { + Self { + batch_queue: BatchQueue::new(), + user_states: HashMap::new(), + } + } + + pub(crate) fn new_with_user_states(user_states: HashMap) -> Self { + Self { + batch_queue: BatchQueue::new(), + user_states, + } + } + + pub(crate) fn get_entry(&self, sender: Address, nonce: U256) -> Option<&BatchQueueEntry> { + self.batch_queue + .iter() + .map(|(entry, _)| entry) + .find(|entry| entry.sender == sender && entry.nonced_verification_data.nonce == nonce) + } + + pub(crate) fn get_user_state(&self, addr: &Address) -> Option<&UserState> { + self.user_states.get(addr) + } + + pub(crate) async fn get_user_nonce(&self, addr: &Address) -> Option { + let user_state = self.get_user_state(addr)?; + Some(user_state.nonce) + } + + pub(crate) async fn get_user_min_fee(&self, addr: &Address) -> Option { + let user_state = self.get_user_state(addr)?; + Some(user_state.min_fee) + } + + pub(crate) fn update_user_nonce(&mut self, addr: &Address, new_nonce: U256) -> Option { + if let Entry::Occupied(mut user_state) = self.user_states.entry(*addr) { + user_state.get_mut().nonce = new_nonce; + return Some(new_nonce); + } + None + } + + pub(crate) async fn get_user_proof_count(&self, addr: &Address) -> Option { + let user_state = self.get_user_state(addr)?; + Some(user_state.proofs_in_batch) + } + + /// Checks if the entry is valid + /// An entry is valid if there is no entry with the same sender, lower nonce and a lower fee + pub(crate) fn replacement_entry_is_valid( + &mut self, + replacement_entry: &BatchQueueEntry, + ) -> bool { + let replacement_max_fee = replacement_entry.nonced_verification_data.max_fee; + let nonce = replacement_entry.nonced_verification_data.nonce; + let sender = replacement_entry.sender; + + debug!( + "Checking validity of entry with sender: {:?}, nonce: {:?}, max_fee: {:?}", + sender, nonce, replacement_max_fee + ); + + // it is a valid entry only if there is no entry with the same sender, lower nonce and a lower fee + !self.batch_queue.iter().any(|(entry, _)| { + entry.sender == sender + && entry.nonced_verification_data.nonce < nonce + && entry.nonced_verification_data.max_fee < replacement_max_fee + }) + } + + pub(crate) fn get_user_min_fee_in_batch(&self, addr: &Address) -> U256 { + self.batch_queue + .iter() + .filter(|(e, _)| &e.sender == addr) + .map(|(e, _)| e.nonced_verification_data.max_fee) + .min() + .unwrap_or(U256::max_value()) + } + + pub(crate) fn update_user_min_fee( + &mut self, + addr: &Address, + new_min_fee: U256, + ) -> Option { + if let Entry::Occupied(mut user_state) = self.user_states.entry(*addr) { + user_state.get_mut().min_fee = new_min_fee; + return Some(new_min_fee); + } + None + } + + pub(crate) fn update_user_proof_count( + &mut self, + addr: &Address, + new_proof_count: usize, + ) -> Option { + if let Entry::Occupied(mut user_state) = self.user_states.entry(*addr) { + user_state.get_mut().proofs_in_batch = new_proof_count; + return Some(new_proof_count); + } + None + } + + /// Updates the user with address `addr` with the provided values of `new_nonce`, `new_min_fee` and + /// `new_proof_count`. + /// If state is updated successfully, returns the updated values inside a `Some()` + /// If the address was not found in the user states, returns `None` + pub(crate) fn update_user_state( + &mut self, + addr: &Address, + new_nonce: U256, + new_min_fee: U256, + new_proof_count: usize, + ) -> Option<(U256, U256, usize)> { + let updated_nonce = self.update_user_nonce(addr, new_nonce); + let updated_min_fee = self.update_user_min_fee(addr, new_min_fee); + let updated_proof_count = self.update_user_proof_count(addr, new_proof_count); + + if updated_nonce.is_some() && updated_min_fee.is_some() && updated_proof_count.is_some() { + return Some((new_nonce, new_min_fee, new_proof_count)); + } + None + } + + pub(crate) fn get_user_proofs_in_batch_and_min_fee(&self) -> HashMap { + let mut updated_user_states = HashMap::new(); + for (entry, _) in self.batch_queue.iter() { + let addr = entry.sender; + let user_min_fee = entry.nonced_verification_data.max_fee; + + let (proof_count, min_fee) = + updated_user_states.entry(addr).or_insert((0, user_min_fee)); + + *proof_count += 1; + if entry.nonced_verification_data.max_fee < *min_fee { + *min_fee = entry.nonced_verification_data.max_fee; + } + } + + updated_user_states + } +} diff --git a/batcher/aligned-batcher/src/types/errors.rs b/batcher/aligned-batcher/src/types/errors.rs index 4cf9ecd2a7..c62de35764 100644 --- a/batcher/aligned-batcher/src/types/errors.rs +++ b/batcher/aligned-batcher/src/types/errors.rs @@ -1,6 +1,6 @@ use std::fmt; -use ethers::types::SignatureError; +use ethers::types::{Address, SignatureError}; use tokio_tungstenite::tungstenite; pub enum BatcherError { @@ -18,6 +18,7 @@ pub enum BatcherError { GasPriceError, BatchCostTooHigh, WsSinkEmpty, + AddressNotFoundInUserStates(Address), } impl From for BatcherError { @@ -83,6 +84,12 @@ impl fmt::Debug for BatcherError { "Websocket sink was found empty. This should only happen in tests" ) } + BatcherError::AddressNotFoundInUserStates(addr) => { + write!( + f, + "User with address {addr:?} was not found in Batcher user states cache" + ) + } } } } diff --git a/batcher/aligned-batcher/src/types/mod.rs b/batcher/aligned-batcher/src/types/mod.rs index 438bf92f8f..8938827864 100644 --- a/batcher/aligned-batcher/src/types/mod.rs +++ b/batcher/aligned-batcher/src/types/mod.rs @@ -1,3 +1,4 @@ pub(crate) mod batch_queue; - +pub(crate) mod batch_state; pub mod errors; +pub(crate) mod user_state; diff --git a/batcher/aligned-batcher/src/types/user_state.rs b/batcher/aligned-batcher/src/types/user_state.rs new file mode 100644 index 0000000000..a1627b25f5 --- /dev/null +++ b/batcher/aligned-batcher/src/types/user_state.rs @@ -0,0 +1,21 @@ +use ethers::types::U256; + +pub(crate) struct UserState { + pub nonce: U256, + /// The minimum fee of a pending proof for a user. + /// This should always be the fee of the biggest pending nonce by the user. + /// This is used to check if a user is submitting a proof with a higher nonce and higher fee, + /// which is invalid and should be rejected. + pub min_fee: U256, + pub proofs_in_batch: usize, +} + +impl UserState { + pub(crate) fn new(nonce: U256) -> Self { + UserState { + nonce, + min_fee: U256::max_value(), + proofs_in_batch: 0, + } + } +} diff --git a/batcher/aligned-sdk/src/communication/messaging.rs b/batcher/aligned-sdk/src/communication/messaging.rs index 3d64370546..6c64ea961e 100644 --- a/batcher/aligned-sdk/src/communication/messaging.rs +++ b/batcher/aligned-sdk/src/communication/messaging.rs @@ -114,6 +114,15 @@ pub async fn send_messages( error!("Invalid replacement message!"); return Err(SubmitError::InvalidReplacementMessage); } + ValidityResponseMessage::AddToBatchError => { + error!("Error while pushing the entry to queue"); + return Err(SubmitError::AddToBatchError); + } + ValidityResponseMessage::EthRpcError => { + return Err(SubmitError::EthereumProviderError( + "Batcher experienced Eth RPC connection error".to_string(), + )); + } ValidityResponseMessage::InvalidPaymentServiceAddress(received_addr, expected_addr) => { error!( "Invalid payment service address, received: {}, expected: {}", diff --git a/batcher/aligned-sdk/src/core/errors.rs b/batcher/aligned-sdk/src/core/errors.rs index 78dfa83192..56327c4515 100644 --- a/batcher/aligned-sdk/src/core/errors.rs +++ b/batcher/aligned-sdk/src/core/errors.rs @@ -90,6 +90,7 @@ pub enum SubmitError { InsufficientBalance, InvalidPaymentServiceAddress(H160, H160), BatchSubmissionFailed(String), + AddToBatchError, GenericError(String), } @@ -198,6 +199,7 @@ impl fmt::Display for SubmitError { ) } SubmitError::ProofQueueFlushed => write!(f, "Batch reset"), + SubmitError::AddToBatchError => write!(f, "Error while adding entry to batch"), } } } diff --git a/batcher/aligned-sdk/src/core/types.rs b/batcher/aligned-sdk/src/core/types.rs index 5ba32a3a84..19532fb4b4 100644 --- a/batcher/aligned-sdk/src/core/types.rs +++ b/batcher/aligned-sdk/src/core/types.rs @@ -323,8 +323,10 @@ pub enum ValidityResponseMessage { InvalidProof, InvalidMaxFee, InvalidReplacementMessage, + AddToBatchError, ProofTooLarge, InsufficientBalance(Address), + EthRpcError, InvalidPaymentServiceAddress(Address, Address), } diff --git a/batcher/aligned/send_burst_tasks.sh b/batcher/aligned/send_burst_tasks.sh index 25160bf137..f46464aa6c 100755 --- a/batcher/aligned/send_burst_tasks.sh +++ b/batcher/aligned/send_burst_tasks.sh @@ -28,6 +28,6 @@ while true do # Run in backaground to be able to run onece per second, and not wait for the previous one to finish . ./batcher/aligned/generate_proof_and_send.sh $counter $burst & - sleep 1 + sleep 3 counter=$((counter + 1)) done From d814f2bbefc22c15296d1ec36927670d2e0a22d0 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau <76252340+MarcosNicolau@users.noreply.github.com> Date: Thu, 3 Oct 2024 17:50:05 -0300 Subject: [PATCH 03/12] fix: operator downtime (#1073) Co-authored-by: Urix <43704209+uri-99@users.noreply.github.com> --- .gitignore | 1 + config-files/config-operator-1.yaml | 31 ++--- config-files/config-operator-2.yaml | 31 ++--- config-files/config-operator-3.yaml | 31 ++--- config-files/config-operator.yaml | 33 ++--- config-files/config.yaml | 31 ++--- core/chainio/avs_reader.go | 56 +++++++-- core/chainio/avs_subscriber.go | 139 +++++++++------------ core/config/operator.go | 3 + operator/pkg/operator.go | 181 +++++++++++++++++++++++----- 10 files changed, 345 insertions(+), 192 deletions(-) diff --git a/.gitignore b/.gitignore index e3627c36f6..28c8fa531a 100644 --- a/.gitignore +++ b/.gitignore @@ -11,5 +11,6 @@ batcher/aligned/batch_inclusion_responses/* **/aligned_verification_data **/broadcast volume +config-files/*.last_processed_batch.json nonce_*.bin diff --git a/config-files/config-operator-1.yaml b/config-files/config-operator-1.yaml index 28e99afd47..4d484e9e24 100644 --- a/config-files/config-operator-1.yaml +++ b/config-files/config-operator-1.yaml @@ -1,23 +1,23 @@ # Common variables for all the services # 'production' only prints info and above. 'development' also prints debug -environment: "development" -aligned_layer_deployment_config_file_path: "./contracts/script/output/devnet/alignedlayer_deployment_output.json" -eigen_layer_deployment_config_file_path: "./contracts/script/output/devnet/eigenlayer_deployment_output.json" -eth_rpc_url: "http://localhost:8545" -eth_rpc_url_fallback: "http://localhost:8545" -eth_ws_url: "ws://localhost:8545" -eth_ws_url_fallback: "ws://localhost:8545" -eigen_metrics_ip_port_address: "localhost:9090" +environment: 'development' +aligned_layer_deployment_config_file_path: './contracts/script/output/devnet/alignedlayer_deployment_output.json' +eigen_layer_deployment_config_file_path: './contracts/script/output/devnet/eigenlayer_deployment_output.json' +eth_rpc_url: 'http://localhost:8545' +eth_rpc_url_fallback: 'http://localhost:8545' +eth_ws_url: 'ws://localhost:8545' +eth_ws_url_fallback: 'ws://localhost:8545' +eigen_metrics_ip_port_address: 'localhost:9090' ## ECDSA Configurations ecdsa: - private_key_store_path: "config-files/devnet/keys/operator-1.ecdsa.key.json" - private_key_store_password: "" + private_key_store_path: 'config-files/devnet/keys/operator-1.ecdsa.key.json' + private_key_store_password: '' ## BLS Configurations bls: - private_key_store_path: "config-files/devnet/keys/operator-1.bls.key.json" - private_key_store_password: "" + private_key_store_path: 'config-files/devnet/keys/operator-1.bls.key.json' + private_key_store_password: '' ## Operator Configurations operator: @@ -25,15 +25,16 @@ operator: operator_tracker_ip_port_address: http://localhost:3030 address: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 earnings_receiver_address: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 - delegation_approver_address: "0x0000000000000000000000000000000000000000" + delegation_approver_address: '0x0000000000000000000000000000000000000000' staker_opt_out_window_blocks: 0 - metadata_url: "https://yetanotherco.github.io/operator_metadata/metadata.json" + metadata_url: 'https://yetanotherco.github.io/operator_metadata/metadata.json' enable_metrics: true metrics_ip_port_address: localhost:9092 max_batch_size: 268435456 # 256 MiB + last_processed_batch_filepath: 'config-files/operator-1.last_processed_batch.json' # Operators variables needed for register it in EigenLayer -el_delegation_manager_address: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" +el_delegation_manager_address: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9' private_key_store_path: config-files/devnet/keys/operator-1.ecdsa.key.json bls_private_key_store_path: config-files/devnet/keys/operator-1.bls.key.json signer_type: local_keystore diff --git a/config-files/config-operator-2.yaml b/config-files/config-operator-2.yaml index a02304ee00..2c6e1d5a11 100644 --- a/config-files/config-operator-2.yaml +++ b/config-files/config-operator-2.yaml @@ -1,23 +1,23 @@ # Common variables for all the services # 'production' only prints info and above. 'development' also prints debug -environment: "development" -aligned_layer_deployment_config_file_path: "./contracts/script/output/devnet/alignedlayer_deployment_output.json" -eigen_layer_deployment_config_file_path: "./contracts/script/output/devnet/eigenlayer_deployment_output.json" -eth_rpc_url: "http://localhost:8545" -eth_rpc_url_fallback: "http://localhost:8545" -eth_ws_url: "ws://localhost:8545" -eth_ws_url_fallback: "ws://localhost:8545" -eigen_metrics_ip_port_address: "localhost:9090" +environment: 'development' +aligned_layer_deployment_config_file_path: './contracts/script/output/devnet/alignedlayer_deployment_output.json' +eigen_layer_deployment_config_file_path: './contracts/script/output/devnet/eigenlayer_deployment_output.json' +eth_rpc_url: 'http://localhost:8545' +eth_rpc_url_fallback: 'http://localhost:8545' +eth_ws_url: 'ws://localhost:8545' +eth_ws_url_fallback: 'ws://localhost:8545' +eigen_metrics_ip_port_address: 'localhost:9090' ## ECDSA Configurations ecdsa: - private_key_store_path: "config-files/devnet/keys/operator-2.ecdsa.key.json" - private_key_store_password: "" + private_key_store_path: 'config-files/devnet/keys/operator-2.ecdsa.key.json' + private_key_store_password: '' ## BLS Configurations bls: - private_key_store_path: "config-files/devnet/keys/operator-2.bls.key.json" - private_key_store_password: "" + private_key_store_path: 'config-files/devnet/keys/operator-2.bls.key.json' + private_key_store_password: '' ## Operator Configurations operator: @@ -25,13 +25,14 @@ operator: operator_tracker_ip_port_address: http://localhost:3030 address: 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC earnings_receiver_address: 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC - delegation_approver_address: "0x0000000000000000000000000000000000000000" + delegation_approver_address: '0x0000000000000000000000000000000000000000' staker_opt_out_window_blocks: 0 - metadata_url: "https://yetanotherco.github.io/operator_metadata/metadata.json" + metadata_url: 'https://yetanotherco.github.io/operator_metadata/metadata.json' max_batch_size: 268435456 # 256 MiB + last_processed_batch_filepath: 'config-files/operator-2.last_processed_batch.json' # Operators variables needed for register it in EigenLayer -el_delegation_manager_address: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" +el_delegation_manager_address: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9' private_key_store_path: config-files/devnet/keys/operator-2.ecdsa.key.json bls_private_key_store_path: config-files/devnet/keys/operator-2.bls.key.json signer_type: local_keystore diff --git a/config-files/config-operator-3.yaml b/config-files/config-operator-3.yaml index b8ed7fe876..94aa6b5098 100644 --- a/config-files/config-operator-3.yaml +++ b/config-files/config-operator-3.yaml @@ -1,23 +1,23 @@ # Common variables for all the services # 'production' only prints info and above. 'development' also prints debug -environment: "development" -aligned_layer_deployment_config_file_path: "./contracts/script/output/devnet/alignedlayer_deployment_output.json" -eigen_layer_deployment_config_file_path: "./contracts/script/output/devnet/eigenlayer_deployment_output.json" -eth_rpc_url: "http://localhost:8545" -eth_rpc_url_fallback: "http://localhost:8545" -eth_ws_url: "ws://localhost:8545" -eth_ws_url_fallback: "ws://localhost:8545" -eigen_metrics_ip_port_address: "localhost:9090" +environment: 'development' +aligned_layer_deployment_config_file_path: './contracts/script/output/devnet/alignedlayer_deployment_output.json' +eigen_layer_deployment_config_file_path: './contracts/script/output/devnet/eigenlayer_deployment_output.json' +eth_rpc_url: 'http://localhost:8545' +eth_rpc_url_fallback: 'http://localhost:8545' +eth_ws_url: 'ws://localhost:8545' +eth_ws_url_fallback: 'ws://localhost:8545' +eigen_metrics_ip_port_address: 'localhost:9090' ## ECDSA Configurations ecdsa: - private_key_store_path: "config-files/devnet/keys/operator-3.ecdsa.key.json" - private_key_store_password: "" + private_key_store_path: 'config-files/devnet/keys/operator-3.ecdsa.key.json' + private_key_store_password: '' ## BLS Configurations bls: - private_key_store_path: "config-files/devnet/keys/operator-3.bls.key.json" - private_key_store_password: "" + private_key_store_path: 'config-files/devnet/keys/operator-3.bls.key.json' + private_key_store_password: '' ## Operator Configurations operator: @@ -25,13 +25,14 @@ operator: operator_tracker_ip_port_address: http://localhost:3030 address: 0x90F79bf6EB2c4f870365E785982E1f101E93b906 earnings_receiver_address: 0x90F79bf6EB2c4f870365E785982E1f101E93b906 - delegation_approver_address: "0x0000000000000000000000000000000000000000" + delegation_approver_address: '0x0000000000000000000000000000000000000000' staker_opt_out_window_blocks: 0 - metadata_url: "https://yetanotherco.github.io/operator_metadata/metadata.json" + metadata_url: 'https://yetanotherco.github.io/operator_metadata/metadata.json' max_batch_size: 268435456 # 256 MiB + last_processed_batch_filepath: 'config-files/operator-3.last_processed_batch.json' # Operators variables needed for register it in EigenLayer -el_delegation_manager_address: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" +el_delegation_manager_address: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9' private_key_store_path: config-files/devnet/keys/operator-3.ecdsa.key.json bls_private_key_store_path: config-files/devnet/keys/operator-3.bls.key.json signer_type: local_keystore diff --git a/config-files/config-operator.yaml b/config-files/config-operator.yaml index 2c9ed7a020..eedcecb80e 100644 --- a/config-files/config-operator.yaml +++ b/config-files/config-operator.yaml @@ -1,33 +1,34 @@ # Common variables for all the services # 'production' only prints info and above. 'development' also prints debug -environment: "production" -aligned_layer_deployment_config_file_path: "./contracts/script/output/holesky/alignedlayer_deployment_output.json" -eigen_layer_deployment_config_file_path: "./contracts/script/output/holesky/eigenlayer_deployment_output.json" -eth_rpc_url: "https://ethereum-holesky-rpc.publicnode.com" -eth_rpc_url_fallback: "https://ethereum-holesky-rpc.publicnode.com" -eth_ws_url: "wss://ethereum-holesky-rpc.publicnode.com" -eth_ws_url_fallback: "wss://ethereum-holesky-rpc.publicnode.com" -eigen_metrics_ip_port_address: "localhost:9090" +environment: 'production' +aligned_layer_deployment_config_file_path: './contracts/script/output/holesky/alignedlayer_deployment_output.json' +eigen_layer_deployment_config_file_path: './contracts/script/output/holesky/eigenlayer_deployment_output.json' +eth_rpc_url: 'https://ethereum-holesky-rpc.publicnode.com' +eth_rpc_url_fallback: 'https://ethereum-holesky-rpc.publicnode.com' +eth_ws_url: 'wss://ethereum-holesky-rpc.publicnode.com' +eth_ws_url_fallback: 'wss://ethereum-holesky-rpc.publicnode.com' +eigen_metrics_ip_port_address: 'localhost:9090' ## ECDSA Configurations ecdsa: - private_key_store_path: "" - private_key_store_password: "" + private_key_store_path: '' + private_key_store_password: '' ## BLS Configurations bls: - private_key_store_path: "" - private_key_store_password: "" + private_key_store_path: '' + private_key_store_password: '' ## Operator Configurations operator: aggregator_rpc_server_ip_port_address: aggregator.alignedlayer.com:8090 operator_tracker_ip_port_address: https://holesky.tracker.alignedlayer.com - address: "" - earnings_receiver_address: "" #Can be the same as the operator. - delegation_approver_address: "0x0000000000000000000000000000000000000000" + address: '' + earnings_receiver_address: '' #Can be the same as the operator. + delegation_approver_address: '0x0000000000000000000000000000000000000000' staker_opt_out_window_blocks: 0 - metadata_url: "https://yetanotherco.github.io/operator_metadata/metadata.json" + metadata_url: 'https://yetanotherco.github.io/operator_metadata/metadata.json' enable_metrics: true metrics_ip_port_address: localhost:9092 max_batch_size: 268435456 # 256 MiB + last_processed_batch_filepath: 'config-files/operator.last_processed_batch.json' diff --git a/config-files/config.yaml b/config-files/config.yaml index b99bf0b6fc..f6baee7733 100644 --- a/config-files/config.yaml +++ b/config-files/config.yaml @@ -1,23 +1,23 @@ # Common variables for all the services # 'production' only prints info and above. 'development' also prints debug -environment: "production" -aligned_layer_deployment_config_file_path: "./contracts/script/output/devnet/alignedlayer_deployment_output.json" -eigen_layer_deployment_config_file_path: "./contracts/script/output/devnet/eigenlayer_deployment_output.json" -eth_rpc_url: "http://localhost:8545" -eth_rpc_url_fallback: "http://localhost:8545" -eth_ws_url: "ws://localhost:8545" -eth_ws_url_fallback: "ws://localhost:8545" -eigen_metrics_ip_port_address: "localhost:9090" +environment: 'production' +aligned_layer_deployment_config_file_path: './contracts/script/output/devnet/alignedlayer_deployment_output.json' +eigen_layer_deployment_config_file_path: './contracts/script/output/devnet/eigenlayer_deployment_output.json' +eth_rpc_url: 'http://localhost:8545' +eth_rpc_url_fallback: 'http://localhost:8545' +eth_ws_url: 'ws://localhost:8545' +eth_ws_url_fallback: 'ws://localhost:8545' +eigen_metrics_ip_port_address: 'localhost:9090' ## ECDSA Configurations ecdsa: - private_key_store_path: "config-files/anvil.ecdsa.key.json" - private_key_store_password: "" + private_key_store_path: 'config-files/anvil.ecdsa.key.json' + private_key_store_password: '' ## BLS Configurations bls: - private_key_store_path: "config-files/anvil.bls.key.json" - private_key_store_password: "" + private_key_store_path: 'config-files/anvil.bls.key.json' + private_key_store_password: '' ## Batcher configurations batcher: @@ -42,14 +42,15 @@ operator: operator_tracker_ip_port_address: http://localhost:3030 address: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 earnings_receiver_address: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 - delegation_approver_address: "0x0000000000000000000000000000000000000000" + delegation_approver_address: '0x0000000000000000000000000000000000000000' staker_opt_out_window_blocks: 0 - metadata_url: "https://yetanotherco.github.io/operator_metadata/metadata.json" + metadata_url: 'https://yetanotherco.github.io/operator_metadata/metadata.json' enable_metrics: true metrics_ip_port_address: localhost:9092 max_batch_size: 268435456 # 256 MiB + last_processed_batch_filepath: config-files/operator.last_processed_batch.json # Operators variables needed for register it in EigenLayer -el_delegation_manager_address: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" +el_delegation_manager_address: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9' private_key_store_path: config-files/anvil.ecdsa.key.json bls_private_key_store_path: config-files/anvil.bls.key.json signer_type: local_keystore diff --git a/core/chainio/avs_reader.go b/core/chainio/avs_reader.go index 60c42f137c..d23403b032 100644 --- a/core/chainio/avs_reader.go +++ b/core/chainio/avs_reader.go @@ -1,8 +1,12 @@ package chainio import ( + "context" + "github.com/ethereum/go-ethereum/accounts/abi/bind" - gethcommon "github.com/ethereum/go-ethereum/common" + ethcommon "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + servicemanager "github.com/yetanotherco/aligned_layer/contracts/bindings/AlignedLayerServiceManager" contractERC20Mock "github.com/yetanotherco/aligned_layer/contracts/bindings/ERC20Mock" "github.com/yetanotherco/aligned_layer/core/config" @@ -13,8 +17,9 @@ import ( type AvsReader struct { *sdkavsregistry.ChainReader - AvsContractBindings *AvsServiceBindings - logger logging.Logger + AvsContractBindings *AvsServiceBindings + AlignedLayerServiceManagerAddr ethcommon.Address + logger logging.Logger } func NewAvsReaderFromConfig(baseConfig *config.BaseConfig, ecdsaConfig *config.EcdsaConfig) (*AvsReader, error) { @@ -41,13 +46,14 @@ func NewAvsReaderFromConfig(baseConfig *config.BaseConfig, ecdsaConfig *config.E } return &AvsReader{ - ChainReader: chainReader, - AvsContractBindings: avsServiceBindings, - logger: baseConfig.Logger, + ChainReader: chainReader, + AvsContractBindings: avsServiceBindings, + AlignedLayerServiceManagerAddr: baseConfig.AlignedLayerDeploymentConfig.AlignedLayerServiceManagerAddr, + logger: baseConfig.Logger, }, nil } -func (r *AvsReader) GetErc20Mock(tokenAddr gethcommon.Address) (*contractERC20Mock.ContractERC20Mock, error) { +func (r *AvsReader) GetErc20Mock(tokenAddr ethcommon.Address) (*contractERC20Mock.ContractERC20Mock, error) { erc20Mock, err := contractERC20Mock.NewContractERC20Mock(tokenAddr, &r.AvsContractBindings.ethClient) if err != nil { // Retry with fallback client @@ -59,6 +65,40 @@ func (r *AvsReader) GetErc20Mock(tokenAddr gethcommon.Address) (*contractERC20Mo return erc20Mock, nil } -func (r *AvsReader) IsOperatorRegistered(address gethcommon.Address) (bool, error) { +func (r *AvsReader) IsOperatorRegistered(address ethcommon.Address) (bool, error) { return r.ChainReader.IsOperatorRegistered(&bind.CallOpts{}, address) } + +// Returns all the "NewBatchV3" logs that have not been responded starting from the given block number +func (r *AvsReader) GetNotRespondedTasksFrom(fromBlock uint64) ([]servicemanager.ContractAlignedLayerServiceManagerNewBatchV3, error) { + logs, err := r.AvsContractBindings.ServiceManager.FilterNewBatchV3(&bind.FilterOpts{Start: fromBlock, End: nil, Context: context.Background()}, nil) + + if err != nil { + return nil, err + } + + var tasks []servicemanager.ContractAlignedLayerServiceManagerNewBatchV3 + + for logs.Next() { + task, err := r.AvsContractBindings.ServiceManager.ParseNewBatchV3(logs.Event.Raw) + if err != nil { + return nil, err + } + + // now check if its finalized or not before appending + batchIdentifier := append(task.BatchMerkleRoot[:], task.SenderAddress[:]...) + batchIdentifierHash := *(*[32]byte)(crypto.Keccak256(batchIdentifier)) + state, err := r.AvsContractBindings.ServiceManager.ContractAlignedLayerServiceManagerCaller.BatchesState(nil, batchIdentifierHash) + + if err != nil { + return nil, err + } + + // append the task if not responded yet + if !state.Responded { + tasks = append(tasks, *task) + } + } + + return tasks, nil +} diff --git a/core/chainio/avs_subscriber.go b/core/chainio/avs_subscriber.go index 0c8438a2cd..29afab7dcd 100644 --- a/core/chainio/avs_subscriber.go +++ b/core/chainio/avs_subscriber.go @@ -4,14 +4,11 @@ import ( "context" "encoding/hex" "fmt" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - ethcommon "github.com/ethereum/go-ethereum/common" - "math/big" - "strings" "sync" "time" + ethcommon "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" @@ -97,12 +94,14 @@ func (s *AvsSubscriber) SubscribeToNewTasksV2(newTaskCreatedChan chan *servicema case newBatch := <-internalChannel: s.processNewBatchV2(newBatch, batchesSet, newBatchMutex, newTaskCreatedChan) case <-pollLatestBatchTicker.C: - latestBatch, err := s.getLatestTaskFromEthereumV2() + latestBatch, err := s.getLatestNotRespondedTaskFromEthereumV2() if err != nil { s.logger.Debug("Failed to get latest task from blockchain", "err", err) continue } - s.processNewBatchV2(latestBatch, batchesSet, newBatchMutex, newTaskCreatedChan) + if latestBatch != nil { + s.processNewBatchV2(latestBatch, batchesSet, newBatchMutex, newTaskCreatedChan) + } } } @@ -132,7 +131,7 @@ func (s *AvsSubscriber) SubscribeToNewTasksV2(newTaskCreatedChan chan *servicema return errorChannel, nil } - + func (s *AvsSubscriber) SubscribeToNewTasksV3(newTaskCreatedChan chan *servicemanager.ContractAlignedLayerServiceManagerNewBatchV3) (chan error, error) { // Create a new channel to receive new tasks internalChannel := make(chan *servicemanager.ContractAlignedLayerServiceManagerNewBatchV3) @@ -165,12 +164,14 @@ func (s *AvsSubscriber) SubscribeToNewTasksV3(newTaskCreatedChan chan *servicema case newBatch := <-internalChannel: s.processNewBatchV3(newBatch, batchesSet, newBatchMutex, newTaskCreatedChan) case <-pollLatestBatchTicker.C: - latestBatch, err := s.getLatestTaskFromEthereumV3() + latestBatch, err := s.getLatestNotRespondedTaskFromEthereumV3() if err != nil { s.logger.Debug("Failed to get latest task from blockchain", "err", err) continue } - s.processNewBatchV3(latestBatch, batchesSet, newBatchMutex, newTaskCreatedChan) + if latestBatch != nil { + s.processNewBatchV3(latestBatch, batchesSet, newBatchMutex, newTaskCreatedChan) + } } } @@ -254,9 +255,9 @@ func (s *AvsSubscriber) processNewBatchV2(batch *servicemanager.ContractAlignedL if _, ok := batchesSet[batchIdentifierHash]; !ok { s.logger.Info("Received new task", - "batchMerkleRoot", hex.EncodeToString(batch.BatchMerkleRoot[:]), - "senderAddress", hex.EncodeToString(batch.SenderAddress[:]), - "batchIdentifierHash", hex.EncodeToString(batchIdentifierHash[:]),) + "batchMerkleRoot", hex.EncodeToString(batch.BatchMerkleRoot[:]), + "senderAddress", hex.EncodeToString(batch.SenderAddress[:]), + "batchIdentifierHash", hex.EncodeToString(batchIdentifierHash[:])) batchesSet[batchIdentifierHash] = struct{}{} newTaskCreatedChan <- batch @@ -280,9 +281,9 @@ func (s *AvsSubscriber) processNewBatchV3(batch *servicemanager.ContractAlignedL if _, ok := batchesSet[batchIdentifierHash]; !ok { s.logger.Info("Received new task", - "batchMerkleRoot", hex.EncodeToString(batch.BatchMerkleRoot[:]), - "senderAddress", hex.EncodeToString(batch.SenderAddress[:]), - "batchIdentifierHash", hex.EncodeToString(batchIdentifierHash[:]),) + "batchMerkleRoot", hex.EncodeToString(batch.BatchMerkleRoot[:]), + "senderAddress", hex.EncodeToString(batch.SenderAddress[:]), + "batchIdentifierHash", hex.EncodeToString(batchIdentifierHash[:])) batchesSet[batchIdentifierHash] = struct{}{} newTaskCreatedChan <- batch @@ -297,15 +298,13 @@ func (s *AvsSubscriber) processNewBatchV3(batch *servicemanager.ContractAlignedL } } -// getLatestTaskFromEthereum queries the blockchain for the latest task using the FilterLogs method. -// The alternative to this is using the FilterNewBatch method from the contract's filterer, but it requires -// to iterate over all the logs, which is not efficient and not needed since we only need the latest task. -func (s *AvsSubscriber) getLatestTaskFromEthereumV2() (*servicemanager.ContractAlignedLayerServiceManagerNewBatchV2, error) { +// getLatestNotRespondedTaskFromEthereum queries the blockchain for the latest not responded task using the FilterNewBatch method. +func (s *AvsSubscriber) getLatestNotRespondedTaskFromEthereumV2() (*servicemanager.ContractAlignedLayerServiceManagerNewBatchV2, error) { latestBlock, err := s.AvsContractBindings.ethClient.BlockNumber(context.Background()) if err != nil { latestBlock, err = s.AvsContractBindings.ethClientFallback.BlockNumber(context.Background()) if err != nil { - return nil, fmt.Errorf("failed to get latest block number: %w", err) + return nil, err } } @@ -317,59 +316,48 @@ func (s *AvsSubscriber) getLatestTaskFromEthereumV2() (*servicemanager.ContractA fromBlock = latestBlock - BlockInterval } - alignedLayerServiceManagerABI, err := abi.JSON(strings.NewReader(servicemanager.ContractAlignedLayerServiceManagerMetaData.ABI)) + logs, err := s.AvsContractBindings.ServiceManager.FilterNewBatchV2(&bind.FilterOpts{Start: fromBlock, End: nil, Context: context.Background()}, nil) if err != nil { - return nil, fmt.Errorf("failed to parse ABI: %w", err) + return nil, err } - // We just care about the NewBatch event - newBatchEvent := alignedLayerServiceManagerABI.Events["NewBatchV2"] - if newBatchEvent.ID == (ethcommon.Hash{}) { - return nil, fmt.Errorf("NewBatch event not found in ABI") - } + var lastLog *servicemanager.ContractAlignedLayerServiceManagerNewBatchV2 - query := ethereum.FilterQuery{ - FromBlock: big.NewInt(int64(fromBlock)), - ToBlock: big.NewInt(int64(latestBlock)), - Addresses: []ethcommon.Address{s.AlignedLayerServiceManagerAddr}, - Topics: [][]ethcommon.Hash{{newBatchEvent.ID, {}}}, + // Iterate over the logs until the end + for logs.Next() { + lastLog = logs.Event } - logs, err := s.AvsContractBindings.ethClient.FilterLogs(context.Background(), query) - if err != nil { - logs, err = s.AvsContractBindings.ethClientFallback.FilterLogs(context.Background(), query) - if err != nil { - return nil, fmt.Errorf("failed to get logs: %w", err) - } + if err := logs.Error(); err != nil { + return nil, err } - if len(logs) == 0 { - return nil, fmt.Errorf("no logs found") + if lastLog == nil { + return nil, nil } - lastLog := logs[len(logs)-1] + batchIdentifier := append(lastLog.BatchMerkleRoot[:], lastLog.SenderAddress[:]...) + batchIdentifierHash := *(*[32]byte)(crypto.Keccak256(batchIdentifier)) + state, err := s.AvsContractBindings.ServiceManager.ContractAlignedLayerServiceManagerCaller.BatchesState(nil, batchIdentifierHash) - var latestTask servicemanager.ContractAlignedLayerServiceManagerNewBatchV2 - err = alignedLayerServiceManagerABI.UnpackIntoInterface(&latestTask, "NewBatchV2", lastLog.Data) if err != nil { - return nil, fmt.Errorf("failed to unpack log data: %w", err) + return nil, err } - // The second topic is the batch merkle root, as it is an indexed variable in the contract - latestTask.BatchMerkleRoot = lastLog.Topics[1] + if state.Responded { + return nil, nil + } - return &latestTask, nil + return lastLog, nil } -// getLatestTaskFromEthereum queries the blockchain for the latest task using the FilterLogs method. -// The alternative to this is using the FilterNewBatch method from the contract's filterer, but it requires -// to iterate over all the logs, which is not efficient and not needed since we only need the latest task. -func (s *AvsSubscriber) getLatestTaskFromEthereumV3() (*servicemanager.ContractAlignedLayerServiceManagerNewBatchV3, error) { +// getLatestNotRespondedTaskFromEthereum queries the blockchain for the latest not responded task using the FilterNewBatch method. +func (s *AvsSubscriber) getLatestNotRespondedTaskFromEthereumV3() (*servicemanager.ContractAlignedLayerServiceManagerNewBatchV3, error) { latestBlock, err := s.AvsContractBindings.ethClient.BlockNumber(context.Background()) if err != nil { latestBlock, err = s.AvsContractBindings.ethClientFallback.BlockNumber(context.Background()) if err != nil { - return nil, fmt.Errorf("failed to get latest block number: %w", err) + return nil, err } } @@ -381,48 +369,39 @@ func (s *AvsSubscriber) getLatestTaskFromEthereumV3() (*servicemanager.ContractA fromBlock = latestBlock - BlockInterval } - alignedLayerServiceManagerABI, err := abi.JSON(strings.NewReader(servicemanager.ContractAlignedLayerServiceManagerMetaData.ABI)) + logs, err := s.AvsContractBindings.ServiceManager.FilterNewBatchV3(&bind.FilterOpts{Start: fromBlock, End: nil, Context: context.Background()}, nil) if err != nil { - return nil, fmt.Errorf("failed to parse ABI: %w", err) + return nil, err } - // We just care about the NewBatch event - newBatchEvent := alignedLayerServiceManagerABI.Events["NewBatchV3"] - if newBatchEvent.ID == (ethcommon.Hash{}) { - return nil, fmt.Errorf("NewBatch event not found in ABI") - } + var lastLog *servicemanager.ContractAlignedLayerServiceManagerNewBatchV3 - query := ethereum.FilterQuery{ - FromBlock: big.NewInt(int64(fromBlock)), - ToBlock: big.NewInt(int64(latestBlock)), - Addresses: []ethcommon.Address{s.AlignedLayerServiceManagerAddr}, - Topics: [][]ethcommon.Hash{{newBatchEvent.ID, {}}}, + // Iterate over the logs until the end + for logs.Next() { + lastLog = logs.Event } - logs, err := s.AvsContractBindings.ethClient.FilterLogs(context.Background(), query) - if err != nil { - logs, err = s.AvsContractBindings.ethClientFallback.FilterLogs(context.Background(), query) - if err != nil { - return nil, fmt.Errorf("failed to get logs: %w", err) - } + if err := logs.Error(); err != nil { + return nil, err } - if len(logs) == 0 { - return nil, fmt.Errorf("no logs found") + if lastLog == nil { + return nil, nil } - lastLog := logs[len(logs)-1] + batchIdentifier := append(lastLog.BatchMerkleRoot[:], lastLog.SenderAddress[:]...) + batchIdentifierHash := *(*[32]byte)(crypto.Keccak256(batchIdentifier)) + state, err := s.AvsContractBindings.ServiceManager.ContractAlignedLayerServiceManagerCaller.BatchesState(nil, batchIdentifierHash) - var latestTask servicemanager.ContractAlignedLayerServiceManagerNewBatchV3 - err = alignedLayerServiceManagerABI.UnpackIntoInterface(&latestTask, "NewBatchV3", lastLog.Data) if err != nil { - return nil, fmt.Errorf("failed to unpack log data: %w", err) + return nil, err } - // The second topic is the batch merkle root, as it is an indexed variable in the contract - latestTask.BatchMerkleRoot = lastLog.Topics[1] + if state.Responded { + return nil, nil + } - return &latestTask, nil + return lastLog, nil } func (s *AvsSubscriber) WaitForOneBlock(startBlock uint64) error { diff --git a/core/config/operator.go b/core/config/operator.go index 8583a7f6a1..cac263f7a9 100644 --- a/core/config/operator.go +++ b/core/config/operator.go @@ -27,6 +27,7 @@ type OperatorConfig struct { EnableMetrics bool MetricsIpPortAddress string MaxBatchSize int64 + LastProcessedBatchFilePath string } } @@ -43,6 +44,7 @@ type OperatorConfigFromYaml struct { EnableMetrics bool `yaml:"enable_metrics"` MetricsIpPortAddress string `yaml:"metrics_ip_port_address"` MaxBatchSize int64 `yaml:"max_batch_size"` + LastProcessedBatchFilePath string `yaml:"last_processed_batch_filepath"` } `yaml:"operator"` EcdsaConfigFromYaml EcdsaConfigFromYaml `yaml:"ecdsa"` BlsConfigFromYaml BlsConfigFromYaml `yaml:"bls"` @@ -92,6 +94,7 @@ func NewOperatorConfig(configFilePath string) *OperatorConfig { EnableMetrics bool MetricsIpPortAddress string MaxBatchSize int64 + LastProcessedBatchFilePath string }(operatorConfigFromYaml.Operator), } } diff --git a/operator/pkg/operator.go b/operator/pkg/operator.go index 922b2c099c..b94914dc1a 100644 --- a/operator/pkg/operator.go +++ b/operator/pkg/operator.go @@ -5,8 +5,10 @@ import ( "context" "crypto/ecdsa" "encoding/hex" + "encoding/json" "fmt" "log" + "os" "sync" "time" @@ -37,20 +39,23 @@ import ( ) type Operator struct { - Config config.OperatorConfig - Address ethcommon.Address - Socket string - Timeout time.Duration - PrivKey *ecdsa.PrivateKey - KeyPair *bls.KeyPair - OperatorId eigentypes.OperatorId - avsSubscriber chainio.AvsSubscriber - NewTaskCreatedChanV2 chan *servicemanager.ContractAlignedLayerServiceManagerNewBatchV2 - NewTaskCreatedChanV3 chan *servicemanager.ContractAlignedLayerServiceManagerNewBatchV3 - Logger logging.Logger - aggRpcClient AggregatorRpcClient - metricsReg *prometheus.Registry - metrics *metrics.Metrics + Config config.OperatorConfig + Address ethcommon.Address + Socket string + Timeout time.Duration + PrivKey *ecdsa.PrivateKey + KeyPair *bls.KeyPair + OperatorId eigentypes.OperatorId + avsSubscriber chainio.AvsSubscriber + avsReader chainio.AvsReader + NewTaskCreatedChanV2 chan *servicemanager.ContractAlignedLayerServiceManagerNewBatchV2 + NewTaskCreatedChanV3 chan *servicemanager.ContractAlignedLayerServiceManagerNewBatchV3 + Logger logging.Logger + aggRpcClient AggregatorRpcClient + metricsReg *prometheus.Registry + metrics *metrics.Metrics + lastProcessedBatch OperatorLastProcessedBatch + lastProcessedBatchLogFile string //Socket string //Timeout time.Duration } @@ -59,6 +64,7 @@ const ( BatchDownloadTimeout = 1 * time.Minute BatchDownloadMaxRetries = 3 BatchDownloadRetryDelay = 5 * time.Second + UnverifiedBatchOffset = 100 ) func NewOperatorFromConfig(configuration config.OperatorConfig) (*Operator, error) { @@ -104,26 +110,36 @@ func NewOperatorFromConfig(configuration config.OperatorConfig) (*Operator, erro operatorId := eigentypes.OperatorIdFromKeyPair(configuration.BlsConfig.KeyPair) address := configuration.Operator.Address + lastProcessedBatchLogFile := configuration.Operator.LastProcessedBatchFilePath // Metrics reg := prometheus.NewRegistry() operatorMetrics := metrics.NewMetrics(configuration.Operator.MetricsIpPortAddress, reg, logger) operator := &Operator{ - Config: configuration, - Logger: logger, - avsSubscriber: *avsSubscriber, - Address: address, - NewTaskCreatedChanV2: newTaskCreatedChanV2, - NewTaskCreatedChanV3: newTaskCreatedChanV3, - aggRpcClient: *rpcClient, - OperatorId: operatorId, - metricsReg: reg, - metrics: operatorMetrics, + Config: configuration, + Logger: logger, + avsSubscriber: *avsSubscriber, + avsReader: *avsReader, + Address: address, + NewTaskCreatedChanV2: newTaskCreatedChanV2, + NewTaskCreatedChanV3: newTaskCreatedChanV3, + aggRpcClient: *rpcClient, + OperatorId: operatorId, + metricsReg: reg, + metrics: operatorMetrics, + lastProcessedBatchLogFile: lastProcessedBatchLogFile, + lastProcessedBatch: OperatorLastProcessedBatch{ + BlockNumber: 0, + batchProcessedChan: make(chan uint32), + }, + // Timeout // Socket } + _ = operator.LoadLastProcessedBatch() + return operator, nil } @@ -135,6 +151,52 @@ func (o *Operator) SubscribeToNewTasksV3() (chan error, error) { return o.avsSubscriber.SubscribeToNewTasksV3(o.NewTaskCreatedChanV3) } +type OperatorLastProcessedBatch struct { + BlockNumber uint32 `json:"block_number"` + batchProcessedChan chan uint32 `json:"-"` +} + +func (o *Operator) LoadLastProcessedBatch() error { + file, err := os.ReadFile(o.lastProcessedBatchLogFile) + + if err != nil { + return fmt.Errorf("failed read from file: %v", err) + } + + err = json.Unmarshal(file, &o.lastProcessedBatch) + + if err != nil { + return fmt.Errorf("failed to unmarshal batch: %v", err) + } + + return nil +} + +func (o *Operator) UpdateLastProcessBatch(blockNumber uint32) error { + // we want to store the latest block number + if blockNumber < o.lastProcessedBatch.BlockNumber { + return nil + } + + o.lastProcessedBatch = OperatorLastProcessedBatch{BlockNumber: blockNumber} + + // write to a file so it can be recovered in case of operator outage + json, err := json.Marshal(o.lastProcessedBatch) + + if err != nil { + return fmt.Errorf("failed to marshal batch: %v", err) + } + + err = os.WriteFile(o.lastProcessedBatchLogFile, json, os.ModePerm) + if err != nil { + return fmt.Errorf("failed to write to file: %v", err) + } + + o.Logger.Infof("Updated latest block json file, new block: %v", blockNumber) + + return nil +} + func (o *Operator) Start(ctx context.Context) error { subV2, err := o.SubscribeToNewTasksV2() if err != nil { @@ -153,13 +215,15 @@ func (o *Operator) Start(ctx context.Context) error { metricsErrChan = make(chan error, 1) } + go o.ProcessMissedBatchesWhileOffline() + for { select { case <-context.Background().Done(): o.Logger.Info("Operator shutting down...") return nil case err := <-metricsErrChan: - o.Logger.Fatal("Metrics server failed", "err", err) + o.Logger.Errorf("Metrics server failed", "err", err) case err := <-subV2: o.Logger.Infof("Error in websocket subscription", "err", err) subV2, err = o.SubscribeToNewTasksV2() @@ -176,10 +240,54 @@ func (o *Operator) Start(ctx context.Context) error { go o.handleNewBatchLogV2(newBatchLogV2) case newBatchLogV3 := <-o.NewTaskCreatedChanV3: go o.handleNewBatchLogV3(newBatchLogV3) + case blockNumber := <-o.lastProcessedBatch.batchProcessedChan: + err = o.UpdateLastProcessBatch(blockNumber) + if err != nil { + o.Logger.Errorf("Error while updating last process batch", "err", err) + } } } } +// Here we query all the batches that have not yet been verified starting from +// the latest verified batch by the operator. We also read from the previous +// `UnverifiedBatchOffset` blocks, because as batches are processed in parallel, there could be +// unverified batches slightly before the latest verified batch +func (o *Operator) ProcessMissedBatchesWhileOffline() { + // this is the default value + // and it means there was no file so no batches have been verified + if o.lastProcessedBatch.BlockNumber == 0 { + o.Logger.Info("Not continuing with missed batch processing, as operator hasn't verified anything yet...") + return + } + + o.Logger.Info("Getting missed tasks") + + // this check is necessary for overflows as go does not do saturating arithmetic + var fromBlock uint64 + if o.lastProcessedBatch.BlockNumber < UnverifiedBatchOffset { + fromBlock = 0 + } else { + fromBlock = uint64(o.lastProcessedBatch.BlockNumber - UnverifiedBatchOffset) + } + + logs, err := o.avsReader.GetNotRespondedTasksFrom(fromBlock) + if err != nil { + return + } + o.Logger.Infof(fmt.Sprintf("Missed tasks retrieved, total tasks to process: %v", len(logs))) + + if len(logs) == 0 { + return + } + + o.Logger.Infof("Starting to verify missed batches while offline") + for _, logEntry := range logs { + go o.handleNewBatchLogV3(&logEntry) + } + o.Logger.Info("Finished verifying all batches missed while offline") +} + // Currently, Operator can handle NewBatchV2 and NewBatchV3 events. // The difference between these events do not affect the operator @@ -191,8 +299,11 @@ func (o *Operator) Start(ctx context.Context) error { // Process of handling batches from V2 events: func (o *Operator) handleNewBatchLogV2(newBatchLog *servicemanager.ContractAlignedLayerServiceManagerNewBatchV2) { - o.Logger.Infof("Received new batch log V2") - err := o.ProcessNewBatchLogV2(newBatchLog) + var err error + defer func() { o.afterHandlingBatchV2(newBatchLog, err == nil) }() + + o.Logger.Info("Received new batch log V2") + err = o.ProcessNewBatchLogV2(newBatchLog) if err != nil { o.Logger.Infof("batch %x did not verify. Err: %v", newBatchLog.BatchMerkleRoot, err) return @@ -262,8 +373,10 @@ func (o *Operator) ProcessNewBatchLogV2(newBatchLog *servicemanager.ContractAlig // Process of handling batches from V3 events: func (o *Operator) handleNewBatchLogV3(newBatchLog *servicemanager.ContractAlignedLayerServiceManagerNewBatchV3) { + var err error + defer func() { o.afterHandlingBatchV3(newBatchLog, err == nil) }() o.Logger.Infof("Received new batch log V3") - err := o.ProcessNewBatchLogV3(newBatchLog) + err = o.ProcessNewBatchLogV3(newBatchLog) if err != nil { o.Logger.Infof("batch %x did not verify. Err: %v", newBatchLog.BatchMerkleRoot, err) return @@ -331,6 +444,18 @@ func (o *Operator) ProcessNewBatchLogV3(newBatchLog *servicemanager.ContractAlig return nil } +func (o *Operator) afterHandlingBatchV2(log *servicemanager.ContractAlignedLayerServiceManagerNewBatchV2, succeeded bool) { + if succeeded { + o.lastProcessedBatch.batchProcessedChan <- uint32(log.Raw.BlockNumber) + } +} + +func (o *Operator) afterHandlingBatchV3(log *servicemanager.ContractAlignedLayerServiceManagerNewBatchV3, succeeded bool) { + if succeeded { + o.lastProcessedBatch.batchProcessedChan <- uint32(log.Raw.BlockNumber) + } +} + func (o *Operator) verify(verificationData VerificationData, results chan bool) { switch verificationData.ProvingSystemId { case common.GnarkPlonkBls12_381: From 8a6340fd5836d41ee22ceff27b0553f4da6df603 Mon Sep 17 00:00:00 2001 From: PatStiles <33334338+PatStiles@users.noreply.github.com> Date: Thu, 3 Oct 2024 17:55:17 -0300 Subject: [PATCH 04/12] chore: rm halo2 from verifiers (#1128) Co-authored-by: Urix <43704209+uri-99@users.noreply.github.com> --- .github/workflows/build-go.yml | 20 +- .github/workflows/test-halo2-ipa.yml | 37 - .github/workflows/test-halo2-kzg.yml | 37 - Makefile | 111 -- batcher/Cargo.lock | 167 +-- batcher/aligned-batcher/Cargo.toml | 3 - batcher/aligned-batcher/src/halo2/ipa/mod.rs | 62 - batcher/aligned-batcher/src/halo2/kzg/mod.rs | 63 - batcher/aligned-batcher/src/halo2/mod.rs | 2 - batcher/aligned-batcher/src/lib.rs | 1 - batcher/aligned-batcher/src/zk_utils/mod.rs | 44 - batcher/aligned-sdk/src/core/types.rs | 2 - batcher/aligned/src/main.rs | 10 +- common/proving_systems.go | 16 +- docs/1_introduction/0_about_aligned.md | 25 +- docs/1_introduction/4_faq.md | 2 +- docs/3_guides/0_submitting_proofs.md | 72 -- docs/3_guides/4_generating_proofs.md | 111 +- docs/3_guides/6_setup_aligned.md | 29 - docs/about_aligned/FAQ.md | 2 +- operator/halo2ipa/.gitignore | 3 - operator/halo2ipa/halo2ipa.go | 35 - operator/halo2ipa/halo2ipa_test.go | 39 - operator/halo2ipa/lib/Cargo.lock | 1104 ------------------ operator/halo2ipa/lib/Cargo.toml | 27 - operator/halo2ipa/lib/halo2ipa.h | 8 - operator/halo2ipa/lib/rust-toolchain | 3 - operator/halo2ipa/lib/src/lib.rs | 270 ----- operator/halo2kzg/.gitignore | 3 - operator/halo2kzg/halo2kzg.go | 34 - operator/halo2kzg/halo2kzg_test.go | 39 - operator/halo2kzg/lib/Cargo.lock | 1104 ------------------ operator/halo2kzg/lib/Cargo.toml | 27 - operator/halo2kzg/lib/halo2kzg.h | 8 - operator/halo2kzg/lib/rust-toolchain | 3 - operator/halo2kzg/lib/src/lib.rs | 277 ----- operator/pkg/operator.go | 21 - operator/risc_zero/risc_zero_test.go | 6 - scripts/test_files/halo2_ipa/Cargo.lock | 1055 ----------------- scripts/test_files/halo2_ipa/Cargo.toml | 23 - scripts/test_files/halo2_ipa/params.bin | Bin 2413 -> 0 bytes scripts/test_files/halo2_ipa/proof.bin | Bin 1440 -> 0 bytes scripts/test_files/halo2_ipa/pub_input.bin | 1 - scripts/test_files/halo2_ipa/src/main.rs | 173 --- scripts/test_files/halo2_kzg/Cargo.lock | 1055 ----------------- scripts/test_files/halo2_kzg/Cargo.toml | 23 - scripts/test_files/halo2_kzg/params.bin | Bin 1453 -> 0 bytes scripts/test_files/halo2_kzg/proof.bin | Bin 992 -> 0 bytes scripts/test_files/halo2_kzg/pub_input.bin | 1 - scripts/test_files/halo2_kzg/src/main.rs | 192 --- 50 files changed, 38 insertions(+), 6312 deletions(-) delete mode 100644 .github/workflows/test-halo2-ipa.yml delete mode 100644 .github/workflows/test-halo2-kzg.yml delete mode 100644 batcher/aligned-batcher/src/halo2/ipa/mod.rs delete mode 100644 batcher/aligned-batcher/src/halo2/kzg/mod.rs delete mode 100644 batcher/aligned-batcher/src/halo2/mod.rs delete mode 100644 operator/halo2ipa/.gitignore delete mode 100644 operator/halo2ipa/halo2ipa.go delete mode 100644 operator/halo2ipa/halo2ipa_test.go delete mode 100644 operator/halo2ipa/lib/Cargo.lock delete mode 100644 operator/halo2ipa/lib/Cargo.toml delete mode 100644 operator/halo2ipa/lib/halo2ipa.h delete mode 100644 operator/halo2ipa/lib/rust-toolchain delete mode 100644 operator/halo2ipa/lib/src/lib.rs delete mode 100644 operator/halo2kzg/.gitignore delete mode 100644 operator/halo2kzg/halo2kzg.go delete mode 100644 operator/halo2kzg/halo2kzg_test.go delete mode 100644 operator/halo2kzg/lib/Cargo.lock delete mode 100644 operator/halo2kzg/lib/Cargo.toml delete mode 100644 operator/halo2kzg/lib/halo2kzg.h delete mode 100644 operator/halo2kzg/lib/rust-toolchain delete mode 100644 operator/halo2kzg/lib/src/lib.rs delete mode 100644 scripts/test_files/halo2_ipa/Cargo.lock delete mode 100644 scripts/test_files/halo2_ipa/Cargo.toml delete mode 100644 scripts/test_files/halo2_ipa/params.bin delete mode 100644 scripts/test_files/halo2_ipa/proof.bin delete mode 100644 scripts/test_files/halo2_ipa/pub_input.bin delete mode 100644 scripts/test_files/halo2_ipa/src/main.rs delete mode 100644 scripts/test_files/halo2_kzg/Cargo.lock delete mode 100644 scripts/test_files/halo2_kzg/Cargo.toml delete mode 100644 scripts/test_files/halo2_kzg/params.bin delete mode 100644 scripts/test_files/halo2_kzg/proof.bin delete mode 100644 scripts/test_files/halo2_kzg/pub_input.bin delete mode 100644 scripts/test_files/halo2_kzg/src/main.rs diff --git a/.github/workflows/build-go.yml b/.github/workflows/build-go.yml index 6a35e1be17..abce276b4c 100644 --- a/.github/workflows/build-go.yml +++ b/.github/workflows/build-go.yml @@ -7,32 +7,28 @@ on: pull_request: branches: ["*"] paths: - - 'operator/**' - - 'aggregator/**' - - 'common/**' - - 'core/**' - - 'metrics/**' - - '.github/workflows/build-go.yml' + - "operator/**" + - "aggregator/**" + - "common/**" + - "core/**" + - "metrics/**" + - ".github/workflows/build-go.yml" env: FFI_FOR_RELEASE: false jobs: build: runs-on: ubuntu-latest - + steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: '1.22' + go-version: "1.22" cache: false - name: Build SP1 bindings run: make build_sp1_linux - name: Build Risc Zero go bindings run: make build_risc_zero_linux - - name: Build Halo2-KZG bindings - run: make build_halo2_kzg_linux - - name: Build Halo2-IPA bindings - run: make build_halo2_ipa_linux - name: Build Merkle Tree bindings run: make build_merkle_tree_linux - name: Build Old Merkle Tree bindings diff --git a/.github/workflows/test-halo2-ipa.yml b/.github/workflows/test-halo2-ipa.yml deleted file mode 100644 index 6eb3f69911..0000000000 --- a/.github/workflows/test-halo2-ipa.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: test-halo2-ipa - -on: - merge_group: - push: - branches: [main] - pull_request: - branches: ["*"] - paths: - - 'operator/halo2ipa/**' - - '.github/workflows/test-halo2-ipa.yml' - -jobs: - test: - runs-on: ubuntu-latest - steps: - - name: Clear device space - run: | - sudo rm -rf "$AGENT_TOOLSDIRECTORY" - sudo rm -rf /usr/local/lib/android - sudo rm -rf /opt/ghc - sudo rm -rf /usr/local/.ghcup - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf "/usr/local/share/boost" - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: '1.22' - cache: false - - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - - name: Test Halo2-IPA Rust - run: make test_halo2_ipa_rust_ffi - - name: Test Halo2-IPA go bindings - run: make test_halo2_ipa_go_bindings_linux diff --git a/.github/workflows/test-halo2-kzg.yml b/.github/workflows/test-halo2-kzg.yml deleted file mode 100644 index 49e98ad2e2..0000000000 --- a/.github/workflows/test-halo2-kzg.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: test-halo2-kzg - -on: - merge_group: - push: - branches: [main] - pull_request: - branches: ["*"] - paths: - - 'operator/halo2kzg/**' - - '.github/workflows/test-halo2-kzg.yml' - -jobs: - test: - runs-on: ubuntu-latest - steps: - - name: Clear device space - run: | - sudo rm -rf "$AGENT_TOOLSDIRECTORY" - sudo rm -rf /usr/local/lib/android - sudo rm -rf /opt/ghc - sudo rm -rf /usr/local/.ghcup - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf "/usr/local/share/boost" - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: '1.22' - cache: false - - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - - name: Test Halo2-KZG Rust - run: make test_halo2_kzg_rust_ffi - - name: Test Halo2-KZG go bindings - run: make test_halo2_kzg_go_bindings_linux diff --git a/Makefile b/Makefile index 37f388ab9b..9a15756890 100644 --- a/Makefile +++ b/Makefile @@ -365,50 +365,6 @@ batcher_send_burst_groth16: batcher/target/release/aligned @mkdir -p scripts/test_files/gnark_groth16_bn254_infinite_script/infinite_proofs @./batcher/aligned/send_burst_tasks.sh $(BURST_SIZE) $(START_COUNTER) -batcher_send_halo2_ipa_task: batcher/target/release/aligned - @echo "Sending Halo2 IPA 1!=0 task to Batcher..." - @cd batcher/aligned/ && cargo run --release -- submit \ - --proving_system Halo2IPA \ - --proof ../../scripts/test_files/halo2_ipa/proof.bin \ - --public_input ../../scripts/test_files/halo2_ipa/pub_input.bin \ - --vk ../../scripts/test_files/halo2_ipa/params.bin \ - --rpc_url $(RPC_URL) \ - --network $(NETWORK) - -batcher_send_halo2_ipa_task_burst_5: batcher/target/release/aligned - @echo "Sending Halo2 IPA 1!=0 task to Batcher..." - @cd batcher/aligned/ && cargo run --release -- submit \ - --proving_system Halo2IPA \ - --proof ../../scripts/test_files/halo2_ipa/proof.bin \ - --public_input ../../scripts/test_files/halo2_ipa/pub_input.bin \ - --vk ../../scripts/test_files/halo2_ipa/params.bin \ - --repetitions 5 \ - --rpc_url $(RPC_URL) \ - --network $(NETWORK) - -batcher_send_halo2_kzg_task: batcher/target/release/aligned - @echo "Sending Halo2 KZG 1!=0 task to Batcher..." - @cd batcher/aligned/ && cargo run --release -- submit \ - --proving_system Halo2KZG \ - --proof ../../scripts/test_files/halo2_kzg/proof.bin \ - --public_input ../../scripts/test_files/halo2_kzg/pub_input.bin \ - --vk ../../scripts/test_files/halo2_kzg/params.bin \ - --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \ - --rpc_url $(RPC_URL) \ - --network $(NETWORK) - -batcher_send_halo2_kzg_task_burst_5: batcher/target/release/aligned - @echo "Sending Halo2 KZG 1!=0 task to Batcher..." - @cd batcher/aligned/ && cargo run --release -- submit \ - --proving_system Halo2KZG \ - --proof ../../scripts/test_files/halo2_kzg/proof.bin \ - --public_input ../../scripts/test_files/halo2_kzg/pub_input.bin \ - --vk ../../scripts/test_files/halo2_kzg/params.bin \ - --repetitions 5 \ - --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \ - --rpc_url $(RPC_URL) \ - --network $(NETWORK) - __GENERATE_PROOFS__: # TODO add a default proving system @@ -601,69 +557,6 @@ test_merkle_tree_go_bindings_linux_old: build_merkle_tree_linux_old @echo "Testing Merkle Tree Go bindings..." go test ./operator/merkle_tree_old/... -v -__HALO2_KZG_FFI__: ## -build_halo2_kzg_macos: - @cd operator/halo2kzg/lib && cargo build $(RELEASE_FLAG) - @cp operator/halo2kzg/lib/target/$(TARGET_REL_PATH)/libhalo2kzg_verifier_ffi.dylib operator/halo2kzg/lib/libhalo2kzg_verifier.dylib - @cp operator/halo2kzg/lib/target/$(TARGET_REL_PATH)/libhalo2kzg_verifier_ffi.a operator/halo2kzg/lib/libhalo2kzg_verifier.a - -build_halo2_kzg_linux: - @cd operator/halo2kzg/lib && cargo build $(RELEASE_FLAG) - @cp operator/halo2kzg/lib/target/$(TARGET_REL_PATH)/libhalo2kzg_verifier_ffi.so operator/halo2kzg/lib/libhalo2kzg_verifier.so - @cp operator/halo2kzg/lib/target/$(TARGET_REL_PATH)/libhalo2kzg_verifier_ffi.a operator/halo2kzg/lib/libhalo2kzg_verifier.a - -test_halo2_kzg_rust_ffi: - @echo "Testing Halo2-KZG Rust FFI source code..." - @cd operator/halo2kzg/lib && cargo t --release - -test_halo2_kzg_go_bindings_macos: build_halo2_kzg_macos - @echo "Testing Halo2-KZG Go bindings..." - go test ./operator/halo2kzg/... -v - -test_halo2_kzg_go_bindings_linux: build_halo2_kzg_linux - @echo "Testing Halo2-KZG Go bindings..." - go test ./operator/halo2kzg/... -v - -generate_halo2_kzg_proof: - @cd scripts/test_files/halo2_kzg && \ - cargo clean && \ - rm -f params.bin proof.bin pub_input.bin && \ - RUST_LOG=info cargo run --release && \ - echo "Generating halo2 plonk proof..." && \ - echo "Generated halo2 plonk proof!" - -__HALO2_IPA_FFI__: ## -build_halo2_ipa_macos: - @cd operator/halo2ipa/lib && cargo build $(RELEASE_FLAG) - @cp operator/halo2ipa/lib/target/$(TARGET_REL_PATH)/libhalo2ipa_verifier_ffi.dylib operator/halo2ipa/lib/libhalo2ipa_verifier.dylib - @cp operator/halo2ipa/lib/target/$(TARGET_REL_PATH)/libhalo2ipa_verifier_ffi.a operator/halo2ipa/lib/libhalo2ipa_verifier.a - -build_halo2_ipa_linux: - @cd operator/halo2ipa/lib && cargo build $(RELEASE_FLAG) - @cp operator/halo2ipa/lib/target/$(TARGET_REL_PATH)/libhalo2ipa_verifier_ffi.so operator/halo2ipa/lib/libhalo2ipa_verifier.so - @cp operator/halo2ipa/lib/target/$(TARGET_REL_PATH)/libhalo2ipa_verifier_ffi.a operator/halo2ipa/lib/libhalo2ipa_verifier.a - -test_halo2_ipa_rust_ffi: - @echo "Testing Halo2-KZG Rust FFI source code..." - @cd operator/halo2ipa/lib && cargo t --release - -test_halo2_ipa_go_bindings_macos: build_halo2_ipa_macos - @echo "Testing Halo2-KZG Go bindings..." - go test ./operator/halo2ipa/... -v - -test_halo2_ipa_go_bindings_linux: build_halo2_ipa_linux - @echo "Testing Halo2-KZG Go bindings..." - go test ./operator/halo2ipa/... -v - -generate_halo2_ipa_proof: - @cd scripts/test_files/halo2_ipa && \ - cargo clean && \ - rm -f params.bin proof.bin pub_input.bin && \ - RUST_LOG=info cargo run --release && \ - echo "Generating halo2 plonk proof..." && \ - echo "Generated halo2 plonk proof!" - - __BUILD_ALL_FFI__: build_all_ffi: ## Build all FFIs @@ -676,8 +569,6 @@ build_all_ffi_macos: ## Build all FFIs for macOS @$(MAKE) build_risc_zero_macos @$(MAKE) build_merkle_tree_macos @$(MAKE) build_merkle_tree_macos_old - @$(MAKE) build_halo2_ipa_macos - @$(MAKE) build_halo2_kzg_macos @echo "All macOS FFIs built successfully." build_all_ffi_linux: ## Build all FFIs for Linux @@ -686,8 +577,6 @@ build_all_ffi_linux: ## Build all FFIs for Linux @$(MAKE) build_risc_zero_linux @$(MAKE) build_merkle_tree_linux @$(MAKE) build_merkle_tree_linux_old - @$(MAKE) build_halo2_ipa_linux - @$(MAKE) build_halo2_kzg_linux @echo "All Linux FFIs built successfully." diff --git a/batcher/Cargo.lock b/batcher/Cargo.lock index aee59bbe70..3935d562a9 100644 --- a/batcher/Cargo.lock +++ b/batcher/Cargo.lock @@ -90,7 +90,7 @@ dependencies = [ "rpassword", "serde", "serde_json", - "sha3 0.10.8", + "sha3", "tokio", "tokio-tungstenite 0.23.1", "url", @@ -112,9 +112,6 @@ dependencies = [ "env_logger", "ethers 2.0.14 (git+https://github.com/yetanotherco/ethers-rs.git?tag=v2.0.15-fix-reconnections)", "futures-util", - "halo2_backend", - "halo2_proofs 0.3.0", - "halo2curves", "hex", "lambdaworks-crypto", "log", @@ -123,7 +120,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml", - "sha3 0.10.8", + "sha3", "sp1-sdk", "tokio", "tokio-tungstenite 0.21.0", @@ -143,7 +140,7 @@ dependencies = [ "serde", "serde_json", "serde_repr", - "sha3 0.10.8", + "sha3", "tokio", "tokio-tungstenite 0.23.1", "url", @@ -1228,16 +1225,6 @@ dependencies = [ "rayon", ] -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "block-padding", - "generic-array 0.14.7", -] - [[package]] name = "block-buffer" version = "0.10.4" @@ -1247,12 +1234,6 @@ dependencies = [ "generic-array 0.14.7", ] -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - [[package]] name = "bls12_381" version = "0.7.1" @@ -1261,7 +1242,7 @@ checksum = "a3c196a77437e7cc2fb515ce413a6401291578b5afc8ecb29a3c7ab957f05941" dependencies = [ "ff 0.12.1", "group 0.12.1", - "pairing 0.22.0", + "pairing", "rand_core", "subtle", ] @@ -1578,7 +1559,7 @@ dependencies = [ "serde", "serde_derive", "sha2", - "sha3 0.10.8", + "sha3", "thiserror", ] @@ -1904,7 +1885,7 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.4", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -2091,7 +2072,7 @@ dependencies = [ "rand", "rlp", "serde", - "sha3 0.10.8", + "sha3", "zeroize", ] @@ -2151,7 +2132,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "sha3 0.10.8", + "sha3", "thiserror", "uuid 0.8.2", ] @@ -2168,7 +2149,7 @@ dependencies = [ "regex", "serde", "serde_json", - "sha3 0.10.8", + "sha3", "thiserror", "uint", ] @@ -3053,49 +3034,7 @@ version = "0.1.0-beta.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a23c779b38253fe1538102da44ad5bd5378495a61d2c4ee18d64eaa61ae5995" dependencies = [ - "halo2_proofs 0.1.0", -] - -[[package]] -name = "halo2_backend" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=22b5d224f3cbeba917e48ba10c618a165e43cd23#22b5d224f3cbeba917e48ba10c618a165e43cd23" -dependencies = [ - "blake2b_simd", - "ff 0.13.0", - "group 0.13.0", - "halo2_middleware", - "halo2curves", - "rand_chacha", - "rand_core", - "rayon", - "serde", - "sha3 0.9.1", - "tracing", -] - -[[package]] -name = "halo2_frontend" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=22b5d224f3cbeba917e48ba10c618a165e43cd23#22b5d224f3cbeba917e48ba10c618a165e43cd23" -dependencies = [ - "blake2b_simd", - "ff 0.13.0", - "group 0.13.0", - "halo2_middleware", - "halo2curves", - "tracing", -] - -[[package]] -name = "halo2_middleware" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=22b5d224f3cbeba917e48ba10c618a165e43cd23#22b5d224f3cbeba917e48ba10c618a165e43cd23" -dependencies = [ - "ff 0.13.0", - "halo2curves", - "rayon", - "serde", + "halo2_proofs", ] [[package]] @@ -3112,47 +3051,6 @@ dependencies = [ "rayon", ] -[[package]] -name = "halo2_proofs" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=22b5d224f3cbeba917e48ba10c618a165e43cd23#22b5d224f3cbeba917e48ba10c618a165e43cd23" -dependencies = [ - "bincode", - "group 0.13.0", - "halo2_backend", - "halo2_frontend", - "halo2_middleware", - "halo2curves", - "log", - "rand_core", - "serde", -] - -[[package]] -name = "halo2curves" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db81d01d0bbfec9f624d7590fc6929ee2537a64ec1e080d8f8c9e2d2da291405" -dependencies = [ - "blake2b_simd", - "ff 0.13.0", - "group 0.13.0", - "hex", - "lazy_static", - "num-bigint 0.4.6", - "num-traits", - "pairing 0.23.0", - "pasta_curves 0.5.1", - "paste", - "rand", - "rand_core", - "rayon", - "serde", - "serde_arrays", - "static_assertions", - "subtle", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -3205,9 +3103,6 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] [[package]] name = "hex-literal" @@ -3730,7 +3625,7 @@ dependencies = [ "lambdaworks-math", "serde", "sha2", - "sha3 0.10.8", + "sha3", ] [[package]] @@ -4163,12 +4058,6 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e296cf87e61c9cfc1a61c3c63a0f7f286ed4554e0e22be84e8a38e1d264a2a29" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "open-fastrlp" version = "0.1.4" @@ -4547,15 +4436,6 @@ dependencies = [ "group 0.12.1", ] -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group 0.13.0", -] - [[package]] name = "parity-scale-codec" version = "3.6.12" @@ -4640,10 +4520,8 @@ dependencies = [ "blake2b_simd", "ff 0.13.0", "group 0.13.0", - "hex", "lazy_static", "rand", - "serde", "static_assertions", "subtle", ] @@ -5956,15 +5834,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde_arrays" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38636132857f68ec3d5f3eb121166d2af33cb55174c4d5ff645db6165cbef0fd" -dependencies = [ - "serde", -] - [[package]] name = "serde_derive" version = "1.0.204" @@ -6119,18 +5988,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "keccak", - "opaque-debug", -] - [[package]] name = "sha3" version = "0.10.8" @@ -8022,7 +7879,7 @@ dependencies = [ "rand", "serde", "sha2", - "sha3 0.10.8", + "sha3", "subtle", ] diff --git a/batcher/aligned-batcher/Cargo.toml b/batcher/aligned-batcher/Cargo.toml index 9db7796499..86c752d235 100644 --- a/batcher/aligned-batcher/Cargo.toml +++ b/batcher/aligned-batcher/Cargo.toml @@ -27,9 +27,6 @@ lambdaworks-crypto = { version = "0.7.0", features = ["serde"] } serde_yaml = "0.9.34" sp1-sdk = { git = "https://github.com/succinctlabs/sp1.git", rev = "v1.0.1" } risc0-zkvm = { git = "https://github.com/risc0/risc0", tag = "v1.0.1" } -halo2curves = { version = "0.6.0", default-features = false } -halo2_backend = { git = "https://github.com/yetanotherco/yet-another-halo2-fork.git", rev = "22b5d224f3cbeba917e48ba10c618a165e43cd23" } -halo2_proofs = { git = "https://github.com/yetanotherco/yet-another-halo2-fork.git", rev = "22b5d224f3cbeba917e48ba10c618a165e43cd23" } bincode = "1.3.3" aligned-sdk = { path = "../aligned-sdk" } ciborium = "=0.2.2" diff --git a/batcher/aligned-batcher/src/halo2/ipa/mod.rs b/batcher/aligned-batcher/src/halo2/ipa/mod.rs deleted file mode 100644 index 48f442cb04..0000000000 --- a/batcher/aligned-batcher/src/halo2/ipa/mod.rs +++ /dev/null @@ -1,62 +0,0 @@ -use halo2_proofs::{ - plonk::{read_fr, read_params, verify_proof, VerifyingKey}, - poly::{ - commitment::Params, - ipa::{commitment::IPACommitmentScheme, multiopen::VerifierIPA, strategy::SingleStrategy}, - VerificationStrategy, - }, - transcript::{Blake2bRead, Challenge255, TranscriptReadBuffer}, - SerdeFormat, -}; -use halo2curves::bn256::G1Affine; -use log::error; -use std::io::BufReader; - -pub fn verify_halo2_ipa(proof: &[u8], public_input: &[u8], verification_key: &[u8]) -> bool { - // For Halo2 the `verification_key` contains the serialized cs, vk, and params with there respective sizes serialized as u32 values (4 bytes) => 3 * 4 bytes = 12 followed by the concatenated variable length buffers: - // We therefore require that the `verification_key` is greater than 12 bytes and treat the case that buffer lengths and buffers themselves are 0 size as false. - // [ cs_len | vk_len | vk_params_len | cs_bytes | vk_bytes | vk_params_bytes ]. - if proof.is_empty() || verification_key.len() <= 12 || public_input.is_empty() { - error!("Input buffer length zero size"); - return false; - } - - let Ok((cs_bytes, vk_bytes, vk_params_bytes)) = read_params(verification_key) else { - error!("Failed to deserialize verifiation parameter buffers from parameters buffer"); - return false; - }; - - let Ok(cs) = bincode::deserialize(cs_bytes) else { - error!("Failed to deserialize constraint system"); - return false; - }; - - let Ok(vk) = - VerifyingKey::::read(&mut BufReader::new(vk_bytes), SerdeFormat::RawBytes, cs) - else { - error!("Failed to deserialize verification key"); - return false; - }; - - let Ok(params) = Params::read::<_>(&mut BufReader::new(vk_params_bytes)) else { - error!("Failed to deserialize verification parameters"); - return false; - }; - - let Ok(res) = read_fr(public_input) else { - error!("Failed to deserialize public inputs"); - return false; - }; - - let strategy = SingleStrategy::new(¶ms); - let instances = res; - let mut transcript = Blake2bRead::<&[u8], G1Affine, Challenge255<_>>::init(proof); - verify_proof::< - IPACommitmentScheme, - VerifierIPA, - Challenge255, - Blake2bRead<&[u8], G1Affine, Challenge255>, - SingleStrategy, - >(¶ms, &vk, strategy, &[vec![instances]], &mut transcript) - .is_ok() -} diff --git a/batcher/aligned-batcher/src/halo2/kzg/mod.rs b/batcher/aligned-batcher/src/halo2/kzg/mod.rs deleted file mode 100644 index 745cb46e7f..0000000000 --- a/batcher/aligned-batcher/src/halo2/kzg/mod.rs +++ /dev/null @@ -1,63 +0,0 @@ -use halo2_proofs::{ - plonk::{read_fr, read_params, verify_proof, VerifyingKey}, - poly::{ - commitment::Params, - kzg::{ - commitment::KZGCommitmentScheme, multiopen::VerifierSHPLONK, strategy::SingleStrategy, - }, - }, - transcript::{Blake2bRead, Challenge255, TranscriptReadBuffer}, - SerdeFormat, -}; -use halo2curves::bn256::{Bn256, G1Affine}; -use log::error; -use std::io::BufReader; - -pub fn verify_halo2_kzg(proof: &[u8], public_input: &[u8], verification_key: &[u8]) -> bool { - // For Halo2 the verification key contains the serialized cs, vk, and params with there respective sizes serialized as u32 values (4 bytes) => 3 * 4 bytes = 12 followed by the concatenated variable length buffers: - // We therefore require that the verification key is greater than 12 bytes and treat the case that buffer lengths and buffers themselves are 0 size as false. - // [ cs_len | vk_len | vk_params_len | cs_bytes | vk_bytes | vk_params_bytes ]. - if proof.is_empty() || verification_key.len() <= 12 || public_input.is_empty() { - error!("Input buffer length zero size"); - return false; - } - - let Ok((cs_bytes, vk_bytes, vk_params_bytes)) = read_params(verification_key) else { - error!("Failed to deserialize verifiation parameter buffers from parameters buffer"); - return false; - }; - - let Ok(cs) = bincode::deserialize(cs_bytes) else { - error!("Failed to deserialize constraint system"); - return false; - }; - - let Ok(vk) = - VerifyingKey::::read(&mut BufReader::new(vk_bytes), SerdeFormat::RawBytes, cs) - else { - error!("Failed to deserialize verification key"); - return false; - }; - - let Ok(params) = Params::read::<_>(&mut BufReader::new(vk_params_bytes)) else { - error!("Failed to deserialize verification parameters"); - return false; - }; - - let Ok(res) = read_fr(public_input) else { - error!("Failed to deserialize public inputs"); - return false; - }; - - let strategy = SingleStrategy::new(¶ms); - let instances = res; - let mut transcript = Blake2bRead::<&[u8], G1Affine, Challenge255<_>>::init(proof); - verify_proof::< - KZGCommitmentScheme, - VerifierSHPLONK, - Challenge255, - Blake2bRead<&[u8], G1Affine, Challenge255>, - SingleStrategy, - >(¶ms, &vk, strategy, &[vec![instances]], &mut transcript) - .is_ok() -} diff --git a/batcher/aligned-batcher/src/halo2/mod.rs b/batcher/aligned-batcher/src/halo2/mod.rs deleted file mode 100644 index b60366b816..0000000000 --- a/batcher/aligned-batcher/src/halo2/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod ipa; -pub mod kzg; diff --git a/batcher/aligned-batcher/src/lib.rs b/batcher/aligned-batcher/src/lib.rs index 86253dcd14..21a5e9623e 100644 --- a/batcher/aligned-batcher/src/lib.rs +++ b/batcher/aligned-batcher/src/lib.rs @@ -41,7 +41,6 @@ mod config; mod connection; mod eth; pub mod gnark; -pub mod halo2; pub mod risc_zero; pub mod s3; pub mod sp1; diff --git a/batcher/aligned-batcher/src/zk_utils/mod.rs b/batcher/aligned-batcher/src/zk_utils/mod.rs index 9dde4be3e3..089c167942 100644 --- a/batcher/aligned-batcher/src/zk_utils/mod.rs +++ b/batcher/aligned-batcher/src/zk_utils/mod.rs @@ -1,6 +1,4 @@ use crate::gnark::verify_gnark; -use crate::halo2::ipa::verify_halo2_ipa; -use crate::halo2::kzg::verify_halo2_kzg; use crate::risc_zero::verify_risc_zero_proof; use crate::sp1::verify_sp1_proof; use aligned_sdk::core::types::{ProvingSystemId, VerificationData}; @@ -22,48 +20,6 @@ fn verify_internal(verification_data: &VerificationData) -> bool { warn!("Trying to verify SP1 proof but ELF was not provided. Returning false"); false } - ProvingSystemId::Halo2KZG => { - let vk = match verification_data.verification_key.as_ref() { - Some(vk) => vk, - None => { - warn!("Halo2-KZG verification key missing"); - return false; - } - }; - - let pub_input = match verification_data.pub_input.as_ref() { - Some(pub_input) => pub_input, - None => { - warn!("Halo2-KZG public input missing"); - return false; - } - }; - - let is_valid = verify_halo2_kzg(&verification_data.proof, pub_input, vk); - debug!("Halo2-KZG proof is valid: {}", is_valid); - is_valid - } - ProvingSystemId::Halo2IPA => { - let vk = match verification_data.verification_key.as_ref() { - Some(vk) => vk, - None => { - warn!("Halo2-IPA verification key missing"); - return false; - } - }; - - let pub_input = match verification_data.pub_input.as_ref() { - Some(pub_input) => pub_input, - None => { - warn!("Halo2-IPA public input missing"); - return false; - } - }; - - let is_valid = verify_halo2_ipa(&verification_data.proof, pub_input, vk); - debug!("Halo2-IPA proof is valid: {}", is_valid); - is_valid - } ProvingSystemId::Risc0 => { if let (Some(image_id_slice), Some(pub_input)) = ( &verification_data.vm_program_code, diff --git a/batcher/aligned-sdk/src/core/types.rs b/batcher/aligned-sdk/src/core/types.rs index 19532fb4b4..b392ae6b05 100644 --- a/batcher/aligned-sdk/src/core/types.rs +++ b/batcher/aligned-sdk/src/core/types.rs @@ -29,8 +29,6 @@ pub enum ProvingSystemId { Groth16Bn254, #[default] SP1, - Halo2KZG, - Halo2IPA, Risc0, } diff --git a/batcher/aligned/src/main.rs b/batcher/aligned/src/main.rs index a9bf57ba45..f2f62f1a68 100644 --- a/batcher/aligned/src/main.rs +++ b/batcher/aligned/src/main.rs @@ -227,10 +227,6 @@ pub enum ProvingSystemArg { Groth16Bn254, #[clap(name = "SP1")] SP1, - #[clap(name = "Halo2KZG")] - Halo2KZG, - #[clap(name = "Halo2IPA")] - Halo2IPA, #[clap(name = "Risc0")] Risc0, } @@ -244,8 +240,6 @@ impl From for ProvingSystemId { ProvingSystemArg::GnarkPlonkBn254 => ProvingSystemId::GnarkPlonkBn254, ProvingSystemArg::Groth16Bn254 => ProvingSystemId::Groth16Bn254, ProvingSystemArg::SP1 => ProvingSystemId::SP1, - ProvingSystemArg::Halo2KZG => ProvingSystemId::Halo2KZG, - ProvingSystemArg::Halo2IPA => ProvingSystemId::Halo2IPA, ProvingSystemArg::Risc0 => ProvingSystemId::Risc0, } } @@ -517,9 +511,7 @@ fn verification_data_from_args(args: &SubmitArgs) -> Result { verification_key = Some(read_file_option( diff --git a/common/proving_systems.go b/common/proving_systems.go index 28a0630a3f..023aa3eae6 100644 --- a/common/proving_systems.go +++ b/common/proving_systems.go @@ -15,13 +15,11 @@ const ( GnarkPlonkBn254 Groth16Bn254 SP1 - Halo2KZG - Halo2IPA Risc0 ) func (t *ProvingSystemId) String() string { - return [...]string{"GnarkPlonkBls12_381", "GnarkPlonkBn254", "Groth16Bn254", "SP1", "Halo2IPA"}[*t] + return [...]string{"GnarkPlonkBls12_381", "GnarkPlonkBn254", "Groth16Bn254", "SP1"}[*t] } func ProvingSystemIdFromString(provingSystem string) (ProvingSystemId, error) { @@ -34,10 +32,6 @@ func ProvingSystemIdFromString(provingSystem string) (ProvingSystemId, error) { return Groth16Bn254, nil case "SP1": return SP1, nil - case "Halo2KZG": - return Halo2KZG, nil - case "Halo2IPA": - return Halo2IPA, nil case "Risc0": return Risc0, nil } @@ -55,10 +49,6 @@ func ProvingSystemIdToString(provingSystem ProvingSystemId) (string, error) { return "Groth16Bn254", nil case SP1: return "SP1", nil - case Halo2KZG: - return "Halo2KZG", nil - case Halo2IPA: - return "Halo2IPA", nil case Risc0: return "Risc0", nil } @@ -113,10 +103,6 @@ func (s *ProvingSystemId) UnmarshalCBOR(data []byte) error { *s = Groth16Bn254 case "SP1": *s = SP1 - case "Halo2KZG": - *s = Halo2KZG - case "Halo2IPA": - *s = Halo2IPA case "Risc0": *s = Risc0 } diff --git a/docs/1_introduction/0_about_aligned.md b/docs/1_introduction/0_about_aligned.md index 4a28c59576..9e5b58b21d 100644 --- a/docs/1_introduction/0_about_aligned.md +++ b/docs/1_introduction/0_about_aligned.md @@ -8,14 +8,14 @@ If you are unfamiliar with ZK and why this is useful, see [Why ZK and Aligned?]( ## Mission -Our mission is to accelerate Ethereum's roadmap and the adoption of verifiable computation by enabling fast and economical verification of ZK and validity proofs. +Our mission is to accelerate Ethereum's roadmap and the adoption of verifiable computation by enabling fast and economical verification of ZK and validity proofs. ## What real value does Aligned bring to the table? Blockchains are verifiable computers. -We live in a chaotic world where there will be a huge demand for computation that needs to be trusted. +We live in a chaotic world where there will be a huge demand for computation that needs to be trusted. -Current blockchain models are inefficient: each node must re-execute each transaction or operation, making the weakest and slowest devices the bottleneck. Unlike in Web2, where adding more hardware can increase performance, in these systems, additional hardware primarily enhances reliability rather than speed. Alternative L1s to Ethereum make trade-offs, accepting bigger hardware or changing the consensus to be faster but with fewer security guarantees. In other words, they reduce costs and increase speed at a great expense of lower security guarantees. +Current blockchain models are inefficient: each node must re-execute each transaction or operation, making the weakest and slowest devices the bottleneck. Unlike in Web2, where adding more hardware can increase performance, in these systems, additional hardware primarily enhances reliability rather than speed. Alternative L1s to Ethereum make trade-offs, accepting bigger hardware or changing the consensus to be faster but with fewer security guarantees. In other words, they reduce costs and increase speed at a great expense of lower security guarantees. On the other hand, Zero-knowledge/validity proofs (ZK) provide a new framework where we do not have to make such compromises. The basic premise is that a party can generate a very short proof of a computation, and the nodes can quickly verify that proof instead of re-executing the computation. The computation can be quite large, comprising many different transactions. This enables the delegation of execution off-chain with the same guarantees, leading to increased throughput and lower operational costs. This led to the rollup-centric roadmap of Ethereum, featuring multiple L2s, but at the expense of fragmented liquidity and complex user experience. Many of these problems could be solved by ZK bridges, but they remain expensive, and the go-to-market time is high. @@ -63,25 +63,24 @@ Other solutions focus on building a separate L1 for proof verification (which se The following table contains costs estimates for Aligned, assuming a batch size of 20 proofs. -| Proof system | Ethereum | Aligned - Fast mode | Aligned - Aggregation | -| -------- | -------- | -------- | ---------- | -| Groth16 | 250,000 | 40,000 | TBD | -| STARKs | >1,000,000 | 40,000 | TBD | -| Kimchi-IPA | ?????? | 40,000 | TBD | -| Halo2-KZG | 350,000 | 40,000 | TBD | -| Binius. | ?????? | 40,000 | TBD | +| Proof system | Ethereum | Aligned - Fast mode | Aligned - Aggregation | +| ------------ | ---------- | ------------------- | --------------------- | +| Groth16 | 250,000 | 40,000 | TBD | +| STARKs | >1,000,000 | 40,000 | TBD | +| Kimchi-IPA | ?????? | 40,000 | TBD | +| Binius. | ?????? | 40,000 | TBD | ## Why are we building Aligned? In recent months, we have witnessed the development and enhancement of general proving virtual machines such as Risc0, Valida, Jolt, and SP1. These innovations allow users to write ordinary code in languages like Rust or C and generate proofs demonstrating the integrity of computations. This evolution is poised to transform application development, provided we have verification networks with high throughput and low cost. This is the core vision of Aligned and the reason we are building it: the future belongs to provable applications. -Currently, proof verification in Ethereum is expensive and throughput is limited to around 10 proofs per second. The cost depends on the proof system used, and the availability of precompiles. Groth16 costs around 250,000 gas, STARKs, over 1,000,000, and other proof systems are too expensive to be used in Ethereum. +Currently, proof verification in Ethereum is expensive and throughput is limited to around 10 proofs per second. The cost depends on the proof system used, and the availability of precompiles. Groth16 costs around 250,000 gas, STARKs, over 1,000,000, and other proof systems are too expensive to be used in Ethereum. Proof technology has been evolving over the last decade, with new arguments, fields, commitments and other tools appearing every day. It is hard to try new ideas if verification costs are high, and there is a considerable go-to-market time, as a consequence of development time of new, gas-optimized smart contracts, or the inclusion of new precompiles to make them affordable. -Aligned provides an alternative to reduce costs and increase throughput significantly. This is achieved by two different modes: **fast mode** and **aggregation mode**. +Aligned provides an alternative to reduce costs and increase throughput significantly. This is achieved by two different modes: **fast mode** and **aggregation mode**. -The fast mode works with a subset of Ethereum’s validators via restaking. Validators (also known as Operators) receive proofs, verify them using the verification code written in Rust or any other higher-level language, and then sign messages with BLS signatures. If a two-thirds (2/3) majority agrees, the results are posted in Ethereum. +The fast mode works with a subset of Ethereum’s validators via restaking. Validators (also known as Operators) receive proofs, verify them using the verification code written in Rust or any other higher-level language, and then sign messages with BLS signatures. If a two-thirds (2/3) majority agrees, the results are posted in Ethereum. Since Aligned’s operators only need to run the verification code on bare metal, we have several advantages compared to running it on top of the EVM: diff --git a/docs/1_introduction/4_faq.md b/docs/1_introduction/4_faq.md index 920bb59268..fec8f4a103 100644 --- a/docs/1_introduction/4_faq.md +++ b/docs/1_introduction/4_faq.md @@ -100,7 +100,7 @@ Aligned provides recursive proof aggregation as part of its aggregation mode, a ### What proof systems do you support? -Aligned is designed to support any proof system. We [currently support](../2_architecture/0_supported_verifiers.md) Groth16 and Plonk (gnark), SP1, Risc0, and Halo 2 (IPA and KZG). +Aligned is designed to support any proof system. We [currently support](../2_architecture/0_supported_verifiers.md) Groth16 and Plonk (gnark), SP1 and Risc0. ### How easy is it to add new proof systems? diff --git a/docs/3_guides/0_submitting_proofs.md b/docs/3_guides/0_submitting_proofs.md index bda034968c..1f30a44b53 100644 --- a/docs/3_guides/0_submitting_proofs.md +++ b/docs/3_guides/0_submitting_proofs.md @@ -12,8 +12,6 @@ The following is the list of the verifiers currently supported by Aligned: - :white_check_mark: gnark - Plonk (with BN254 and BLS12-381) - :white_check_mark: SP1 [(v1.0.1)](https://github.com/succinctlabs/sp1/releases/tag/v1.0.1) - :white_check_mark: Risc0 [(v1.0.1)](https://github.com/risc0/risc0/releases/tag/v1.0.1) -- :white_check_mark: Halo2 - Plonk/KZG -- :white_check_mark: Halo2 - Plonk/IPA Learn more about future verifiers [here](../2_architecture/0_supported_verifiers.md). @@ -252,73 +250,3 @@ aligned submit \ --network holesky \ --rpc_url https://ethereum-holesky-rpc.publicnode.com ``` - -### Halo2 KZG and Halo2 IPA - -The Halo2PlonkKzg and Halo2PlonkIpa proofs need the proof file, the public input file and the verification key file. - -If you are using the Halo2PlonkKzg proving system, you need to specify the `--proving_system Halo2KZG` flag. - -```bash -rm -rf ./aligned_verification_data/ && -aligned submit \ - --proving_system Halo2KZG \ - --proof \ - --vk \ - --public_input \ - --batcher_url wss://batcher.alignedlayer.com \ - --keystore_path \ - --proof_generator_addr \ - --network holesky \ - --rpc_url https://ethereum-holesky-rpc.publicnode.com \ - --payment_service_addr 0x815aeCA64a974297942D2Bbf034ABEe22a38A003 \ -``` - -If you are using the Halo2PlonkIpa proving system, you need to specify the `--proving_system Halo2IPA` flag. - -```bash -rm -rf ./aligned_verification_data/ && -aligned submit \ - --proving_system Halo2IPA \ - --proof \ - --vk \ - --public_input \ - --batcher_url wss://batcher.alignedlayer.com \ - --keystore_path \ - --proof_generator_addr \ - --network holesky \ - --rpc_url https://ethereum-holesky-rpc.publicnode.com \ - --payment_service_addr 0x815aeCA64a974297942D2Bbf034ABEe22a38A003 -``` - -**Examples**: - -```bash -rm -rf ./aligned_verification_data/ && -aligned submit \ - --proving_system Halo2KZG \ - --proof ./scripts/test_files/halo2_kzg/proof.bin \ - --vk ./scripts/test_files/halo2_kzg/params.bin \ - --public_input ./scripts/test_files/halo2_kzg/pub_input.bin \ - --batcher_url wss://batcher.alignedlayer.com \ - --keystore_path ~/.aligned_keystore/keystore0 \ - --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \ - --network holesky \ - --rpc_url https://ethereum-holesky-rpc.publicnode.com \ - --payment_service_addr 0x815aeCA64a974297942D2Bbf034ABEe22a38A003 -``` - -```bash -rm -rf ./aligned_verification_data/ && -aligned submit \ - --proving_system Halo2IPA \ - --proof ./scripts/test_files/halo2_ipa/proof.bin \ - --vk ./scripts/test_files/halo2_ipa/params.bin \ - --public_input ./scripts/test_files/halo2_ipa/pub_input.bin \ - --batcher_url wss://batcher.alignedlayer.com \ - --keystore_path ~/.aligned_keystore/keystore0 \ - --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \ - --network holesky \ - --rpc_url https://ethereum-holesky-rpc.publicnode.com \ - --payment_service_addr 0x815aeCA64a974297942D2Bbf034ABEe22a38A003 -``` diff --git a/docs/3_guides/4_generating_proofs.md b/docs/3_guides/4_generating_proofs.md index f06ea301c7..bf35937399 100644 --- a/docs/3_guides/4_generating_proofs.md +++ b/docs/3_guides/4_generating_proofs.md @@ -174,113 +174,6 @@ aligned submit \ For more instructions on how to submit proofs, check the [Submitting proofs guide](../3_guides/0_submitting_proofs.md). -## Halo2 - -### Dependencies - -This guide assumes that: - -- You are using PSE fork of the Halo2 [proof system](https://github.com/privacy-scaling-explorations/halo2). -- You have a strong understanding of Halo2 circuit development and are familiar with the Halo2 proof system. -- Aligned installed (instructions [here](../1_introduction/1_getting_started.md#quickstart)). - -### Import the Halo2 fork library - -Aligned supports verification of Halo2 proofs using the IPA and KZG backends. To verify Halo2 proofs on Aligned a description of your Halo2 circuits [constraint system](https://github.com/privacy-scaling-explorations/halo2/blob/main/halo2_backend/src/plonk/circuit.rs#L63) must be serialized and sent over the wire to Aligned in addition to the ciruits verification parameters, verification key, and public inputs. - -Aligned maintains its own fork of the PSE's Halo2 repository that provides helper methods to serialize and send Halo2 proofs to Aligned. - -```rust -halo2_backend = { git = "https://github.com/yetanotherco/yet-another-halo2-fork.git", branch = "feat/serde_constraint_system" } -halo2_proofs = { git = "https://github.com/yetanotherco/yet-another-halo2-fork.git", branch = "feat/serde_constraint_system" } -``` - -### How to generate a proof - -Once you have developed your circuit and generated its respective, prover key, verifier key, and public input. - -You can add `prove_and_serialize_kzg_circuit` or `prove_and_serialize_ipa_circuit` from Aligned's Halo2 fork to generate a proof for your cicuit and serialize the circuit and its public inputs to be sent to Aligned. - -```rust -fn main() { - - // your code here - pub struct YourCircuit (pub Fr); - - impl Circuit for YourCircuit { - type Config = YourCircuitConfig; - type FloorPlanner = YourCircuitPlanner; - - fn without_witnesses(&self) -> Self { - // ... // - } - - fn configure(meta: &mut ConstraintSystem) -> Self::Config { - YourCircuitConfig::configure(meta) - } - - fn synthesize( - &self, - config: Self::Config, - mut layouter: impl Layouter, - ) -> Result<(), ErrorFront> { - // ... // - } - } - - let circuit = YourCircuit(Fr::random(OsRng)); - let params = ParamsKZG::setup(4, OsRng); - let compress_selectors = true; - let vk = keygen_vk_custom(¶ms, &circuit, compress_selectors).expect("vk should not fail"); - let pk = keygen_pk(¶ms, vk.clone(), &circuit).expect("pk should not fail"); - let input: Vec> = vec![vec![circuit.0]]; - prove_and_serialize_kzg_circuit(¶ms, &pk, &vk, circuit.clone(), &vec![input.clone()]) - .unwrap(); -} -``` - -Then run the following command to generate the proof, parameters, and public inputs: - -```bash -cargo run --release -``` - -The files will be saved within a `proof_files/` directory containing: -- `proof.bin` -- `params.bin` -- `public_input.bin` - -### How to get the proof verified by Aligned - -After generating the proof, you can send the proof for the respective proof systems of Halo2 to the Aligned network by running one of the following commands: - -```bash -aligned submit \ - --proving_system Halo2KZG \ - --proof \ - --vk \ - --public_input \ - --conn wss://batcher.alignedlayer.com \ - --proof_generator_addr \ - --rpc https://ethereum-holesky-rpc.publicnode.com \ - --batcher_addr 0x815aeCA64a974297942D2Bbf034ABEe22a38A003 -``` - -```bash -aligned submit \ - --proving_system Halo2IPA \ - --proof \ - --vk \ - --public_input \ - --conn wss://batcher.alignedlayer.com \ - --proof_generator_addr \ - --network holesky \ - --rpc https://ethereum-holesky-rpc.publicnode.com \ - --batcher_addr 0x815aeCA64a974297942D2Bbf034ABEe22a38A003 -``` - -For more instructions on how to submit proofs, check the [Submitting proofs guide](../3_guides/0_submitting_proofs.md). - ## ZkRust `zkRust` is a CLI tool maintained by Aligned that aims to simplify the developing applications in Rust using zkVM's such as SP1 or Risc0. @@ -330,7 +223,7 @@ The user may also define a `input()` and `output()` functions in addition to `ma - Within the `main()` (guest) function the user may write information from the computation performed in the zkVM to an output buffer to be used after proof generation. - The `output()` defines code that allows the user to read the information written to that buffer of the and perform post-processing of that data. -The user may specify inputs into the VM (guest) code using `zk_rust_io::write()` as long on the type of rust object they are writing implements `Serializable`. +The user may specify inputs into the VM (guest) code using `zk_rust_io::write()` as long on the type of rust object they are writing implements `Serializable`. Within the `main()` function (guest) the user may read in the inputs by specifying `zk_rust_io::read()` and output data computed during the execution phase of the code within the VM (guest) program by specifying `zk_rust_io::commit()`. @@ -357,7 +250,7 @@ pub fn input() { zk_rust_io::write(&pattern); zk_rust_io::write(&target_string); } -```` +``` ### main.rs diff --git a/docs/3_guides/6_setup_aligned.md b/docs/3_guides/6_setup_aligned.md index aaaed6092c..48af08f2b3 100644 --- a/docs/3_guides/6_setup_aligned.md +++ b/docs/3_guides/6_setup_aligned.md @@ -464,35 +464,6 @@ make batcher_send_burst_groth16 -
-Halo2 - -Send an individual IPA proof: - -```bash -make batcher_send_halo2_ipa_task -``` - -Send a burst of five IPA proofs: - -```bash -make batcher_send_halo2_ipa_task_burst_5 -``` - -Send an individual KZG proof: - -```bash -make batcher_send_halo2_kzg_task -``` - -Send a burst of 5 KZG proofs: - -```bash -make batcher_send_halo2_kzg_task_burst_5 -``` - -
-
Send a specific proof: diff --git a/docs/about_aligned/FAQ.md b/docs/about_aligned/FAQ.md index 1a0d20963a..7e02f539d4 100644 --- a/docs/about_aligned/FAQ.md +++ b/docs/about_aligned/FAQ.md @@ -117,7 +117,7 @@ aggregation as one of its tools. ### What proof systems do you support? Aligned is designed to support any proof system. -Currently supported ones are Groth 16 and Plonk (gnark), SP1, Risc0, Halo 2 (IPA and KZG) +Currently supported ones are Groth 16 and Plonk (gnark), SP1 and Risc0. ### How hard is it to add new proof systems? diff --git a/operator/halo2ipa/.gitignore b/operator/halo2ipa/.gitignore deleted file mode 100644 index 9599ee3f1c..0000000000 --- a/operator/halo2ipa/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -lib/libhalo2ipa_verifier.so -lib/libhalo2ipa_verifier.a -lib/libhalo2ipa_verifier.dylib diff --git a/operator/halo2ipa/halo2ipa.go b/operator/halo2ipa/halo2ipa.go deleted file mode 100644 index 6df49b0514..0000000000 --- a/operator/halo2ipa/halo2ipa.go +++ /dev/null @@ -1,35 +0,0 @@ -package halo2ipa - -/* -#cgo linux LDFLAGS: ${SRCDIR}/lib/libhalo2ipa_verifier.a -ldl -lrt -lm -lssl -lcrypto -Wl,--allow-multiple-definition -#cgo darwin LDFLAGS: -L./lib -lhalo2ipa_verifier - -#include "lib/halo2ipa.h" -*/ -import "C" -import "unsafe" - -func VerifyHalo2IpaProof( - proofBuffer []byte, - paramsBuffer []byte, - publicInputBuffer []byte, -) bool { - /* - For Halo2 the `paramsBuffer` contains the serialized cs, vk, and params with there respective sizes serialized as u32 values (4 bytes) => 3 * 4 bytes = 12 followed by the concatenated variable length buffers: - We therefore require that the `paramsBuffer` is greater than 12 bytes and treat the case that buffer lengths and buffers themselves are 0 size as false. - [ cs_len | vk_len | vk_params_len | cs_bytes | vk_bytes | vk_params_bytes ]. - */ - if len(proofBuffer) == 0 || len(paramsBuffer) <= 12 || len(publicInputBuffer) == 0 { - return false - } - - proofPtr := (*C.uchar)(unsafe.Pointer(&proofBuffer[0])) - paramsPtr := (*C.uchar)(unsafe.Pointer(¶msBuffer[0])) - publicInputPtr := (*C.uchar)(unsafe.Pointer(&publicInputBuffer[0])) - - return (bool)(C.verify_halo2_ipa_proof_ffi( - proofPtr, (C.uint32_t)(len(proofBuffer)), - paramsPtr, (C.uint32_t)(len(paramsBuffer)), - publicInputPtr, (C.uint32_t)(len(publicInputBuffer)), - )) -} diff --git a/operator/halo2ipa/halo2ipa_test.go b/operator/halo2ipa/halo2ipa_test.go deleted file mode 100644 index 68044505ac..0000000000 --- a/operator/halo2ipa/halo2ipa_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package halo2ipa_test - -import ( - "os" - "testing" - - "github.com/yetanotherco/aligned_layer/operator/halo2ipa" -) - -const ProofFilePath = "../../scripts/test_files/halo2_ipa/proof.bin" - -const PublicInputPath = "../../scripts/test_files/halo2_ipa/pub_input.bin" - -const ParamsFilePath = "../../scripts/test_files/halo2_ipa/params.bin" - -func TestHalo2IpaProofVerifies(t *testing.T) { - proofBytes, err := os.ReadFile(ProofFilePath) - if err != nil { - t.Errorf("could not open proof file: %s", err) - } - - paramsBytes, err := os.ReadFile(ParamsFilePath) - if err != nil { - t.Errorf("could not open params file: %s", err) - } - - publicInputBytes, err := os.ReadFile(PublicInputPath) - if err != nil { - t.Errorf("could not open public input file: %s", err) - } - - if !halo2ipa.VerifyHalo2IpaProof( - ([]byte)(proofBytes), - ([]byte)(paramsBytes), - ([]byte)(publicInputBytes), - ) { - t.Errorf("proof did not verify") - } -} diff --git a/operator/halo2ipa/lib/Cargo.lock b/operator/halo2ipa/lib/Cargo.lock deleted file mode 100644 index 85e2113aab..0000000000 --- a/operator/halo2ipa/lib/Cargo.lock +++ /dev/null @@ -1,1104 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "arrayref" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "assert_matches" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "backtrace" -version = "0.3.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[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 = "blake2b_simd" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "cc" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504bdec147f2cc13c8b57ed9401fd8a147cc66b67ad5cb241394244f2c947549" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "constant_time_eq" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "dhat" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cd11d84628e233de0ce467de10b8633f4ddaecafadefc86e13b84b8739b827" -dependencies = [ - "backtrace", - "lazy_static", - "mintex", - "parking_lot", - "rustc-hash", - "serde", - "serde_json", - "thousands", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "bitvec", - "rand_core", - "subtle", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[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.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "gumdrop" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc700f989d2f6f0248546222d9b4258f5b02a171a431f8285a81c08142629e3" -dependencies = [ - "gumdrop_derive", -] - -[[package]] -name = "gumdrop_derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729f9bd3449d77e7831a18abfb7ba2f99ee813dfd15b8c2167c9a54ba20aa99d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "halo2_backend" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=22b5d224f3cbeba917e48ba10c618a165e43cd23#22b5d224f3cbeba917e48ba10c618a165e43cd23" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "halo2_middleware", - "halo2curves", - "rand_chacha", - "rand_core", - "rayon", - "serde", - "sha3", - "tracing", -] - -[[package]] -name = "halo2_frontend" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=22b5d224f3cbeba917e48ba10c618a165e43cd23#22b5d224f3cbeba917e48ba10c618a165e43cd23" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "halo2_middleware", - "halo2curves", - "tracing", -] - -[[package]] -name = "halo2_middleware" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=22b5d224f3cbeba917e48ba10c618a165e43cd23#22b5d224f3cbeba917e48ba10c618a165e43cd23" -dependencies = [ - "ff", - "halo2curves", - "rayon", - "serde", -] - -[[package]] -name = "halo2_proofs" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=22b5d224f3cbeba917e48ba10c618a165e43cd23#22b5d224f3cbeba917e48ba10c618a165e43cd23" -dependencies = [ - "bincode", - "group", - "halo2_backend", - "halo2_frontend", - "halo2_middleware", - "halo2curves", - "log", - "rand_core", - "serde", -] - -[[package]] -name = "halo2curves" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db81d01d0bbfec9f624d7590fc6929ee2537a64ec1e080d8f8c9e2d2da291405" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "hex", - "lazy_static", - "num-bigint", - "num-traits", - "pairing", - "pasta_curves", - "paste", - "rand", - "rand_core", - "rayon", - "serde", - "serde_arrays", - "static_assertions", - "subtle", -] - -[[package]] -name = "halo2ipa-verifier-ffi" -version = "0.1.0" -dependencies = [ - "assert_matches", - "bincode", - "dhat", - "ff", - "group", - "gumdrop", - "halo2_backend", - "halo2_proofs", - "halo2curves", - "log", - "proptest", - "rand_chacha", - "rand_core", - "rayon", - "serde_json", - "tracing", -] - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[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.155" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[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.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - -[[package]] -name = "mintex" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bec4598fddb13cc7b528819e697852653252b760f1228b7642679bf2ff2cd07" - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "object" -version = "0.36.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", -] - -[[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", -] - -[[package]] -name = "pasta_curves" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "hex", - "lazy_static", - "rand", - "serde", - "static_assertions", - "subtle", -] - -[[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.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags", - "lazy_static", - "num-traits", - "rand", - "rand_chacha", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex-syntax" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" - -[[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 = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[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.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "serde" -version = "1.0.205" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_arrays" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38636132857f68ec3d5f3eb121166d2af33cb55174c4d5ff645db6165cbef0fd" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.205" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "serde_json" -version = "1.0.122" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer", - "digest", - "keccak", - "opaque-debug", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[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" -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.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" -dependencies = [ - "cfg-if", - "fastrand", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "thousands" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "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.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] diff --git a/operator/halo2ipa/lib/Cargo.toml b/operator/halo2ipa/lib/Cargo.toml deleted file mode 100644 index 9df223624a..0000000000 --- a/operator/halo2ipa/lib/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -name = "halo2ipa-verifier-ffi" -version = "0.1.0" -edition = "2021" - -[dependencies] -bincode = "1.3.3" -halo2curves = { version = "0.6.0", default-features = false } -rand_core = { version = "0.6", default-features = false, features = ["getrandom"] } -halo2_backend = { git = "https://github.com/yetanotherco/yet-another-halo2-fork.git", rev = "22b5d224f3cbeba917e48ba10c618a165e43cd23" } -halo2_proofs = { git = "https://github.com/yetanotherco/yet-another-halo2-fork.git", rev = "22b5d224f3cbeba917e48ba10c618a165e43cd23" } -ff = "0.13" -log = "0.4.21" - -[dev-dependencies] -group = "0.13" -tracing = "0.1" -rand_chacha = "0.3" -rayon = "1.8" -assert_matches = "1.5" -gumdrop = "0.8" -proptest = "1" -dhat = "0.3.2" -serde_json = "1" - -[lib] -crate-type = ["cdylib", "staticlib", "lib"] diff --git a/operator/halo2ipa/lib/halo2ipa.h b/operator/halo2ipa/lib/halo2ipa.h deleted file mode 100644 index c0325c59b8..0000000000 --- a/operator/halo2ipa/lib/halo2ipa.h +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include - -bool verify_halo2_ipa_proof_ffi(unsigned char *proof_bytes, uint32_t proof_len, - unsigned char *params_bytes, - uint32_t params_len, - unsigned char *public_input_bytes, - uint32_t public_input_len); diff --git a/operator/halo2ipa/lib/rust-toolchain b/operator/halo2ipa/lib/rust-toolchain deleted file mode 100644 index 989860f406..0000000000 --- a/operator/halo2ipa/lib/rust-toolchain +++ /dev/null @@ -1,3 +0,0 @@ -[toolchain] -channel = "nightly-2024-04-17" -components = ["llvm-tools", "rustc-dev"] diff --git a/operator/halo2ipa/lib/src/lib.rs b/operator/halo2ipa/lib/src/lib.rs deleted file mode 100644 index c3747367bd..0000000000 --- a/operator/halo2ipa/lib/src/lib.rs +++ /dev/null @@ -1,270 +0,0 @@ -use halo2_proofs::{ - plonk::{read_fr, read_params, verify_proof, VerifyingKey}, - poly::{ - commitment::Params, - ipa::{commitment::IPACommitmentScheme, multiopen::VerifierIPA, strategy::SingleStrategy}, - VerificationStrategy, - }, - transcript::{Blake2bRead, Challenge255, TranscriptReadBuffer}, - SerdeFormat, -}; -use halo2curves::bn256::G1Affine; -use log::error; -use std::{io::BufReader, slice}; - -#[no_mangle] -pub extern "C" fn verify_halo2_ipa_proof_ffi( - proof_buf: *const u8, - proof_len: u32, - params_buf: *const u8, - params_len: u32, - public_input_buf: *const u8, - public_input_len: u32, -) -> bool { - if proof_buf.is_null() || params_buf.is_null() || public_input_buf.is_null() { - error!("Halo2 IPA input buffer length null"); - return false; - } - - // For Halo2 the `params_buf` contains the serialized cs, vk, and params with there respective sizes serialized as u32 values (4 bytes) => 3 * 4 bytes = 12 by the concatenated variable length buffers: - // We therefore require that the `params_buf` is greater than 12 bytes and treat the case that buffer lengths and buffers themselves are 0 size as false. - // [ cs_len | vk_len | vk_params_len | cs_bytes | vk_bytes | vk_params_bytes ]. - if proof_len == 0 || params_len <= 12 || public_input_len == 0 { - error!("Halo2 IPA input buffer length zero size"); - return false; - } - - let proof_bytes = unsafe { slice::from_raw_parts(proof_buf, proof_len as usize) }; - - let params_bytes = unsafe { slice::from_raw_parts(params_buf, params_len as usize) }; - - let public_input_bytes = - unsafe { slice::from_raw_parts(public_input_buf, public_input_len as usize) }; - - // Deserialize bytes - let Ok((cs_bytes, vk_bytes, vk_params_bytes)) = read_params(params_bytes) else { - error!("Failed to deserialize verifiation parameter buffers from parameters buffer"); - return false; - }; - - let Ok(cs) = bincode::deserialize(cs_bytes) else { - error!("Failed to deserialize constraint system"); - return false; - }; - - let Ok(vk) = - VerifyingKey::::read(&mut BufReader::new(vk_bytes), SerdeFormat::RawBytes, cs) - else { - error!("Failed to deserialize verification key"); - return false; - }; - - let Ok(params) = Params::read::<_>(&mut BufReader::new(vk_params_bytes)) else { - error!("Failed to deserialize verification parameters"); - return false; - }; - - let Ok(res) = read_fr(public_input_bytes) else { - error!("Failed to deserialize public inputs"); - return false; - }; - let strategy = SingleStrategy::new(¶ms); - let instances = res; - let mut transcript = Blake2bRead::<&[u8], G1Affine, Challenge255<_>>::init(proof_bytes); - verify_proof::< - IPACommitmentScheme, - VerifierIPA, - Challenge255, - Blake2bRead<&[u8], G1Affine, Challenge255>, - SingleStrategy, - >(¶ms, &vk, strategy, &[vec![instances]], &mut transcript) - .is_ok() -} - -#[cfg(test)] -mod tests { - use super::*; - - use ff::{Field, PrimeField}; - use halo2_backend::poly::commitment::ParamsProver; - use halo2_proofs::{ - plonk::{ - create_proof, keygen_pk, keygen_vk_custom, verify_proof, write_params, StandardPlonk, - }, - poly::ipa::{ - commitment::{IPACommitmentScheme, ParamsIPA}, - multiopen::ProverIPA, - }, - transcript::{ - Blake2bRead, Blake2bWrite, Challenge255, TranscriptReadBuffer, TranscriptWriterBuffer, - }, - }; - use halo2curves::bn256::Fr; - use rand_core::OsRng; - use std::{ - fs::File, - io::{BufWriter, Read, Write}, - }; - - const PROOF: &[u8] = include_bytes!("../../../../scripts/test_files/halo2_ipa/proof.bin"); - - const PUB_INPUT: &[u8] = - include_bytes!("../../../../scripts/test_files/halo2_ipa/pub_input.bin"); - - const PARAMS: &[u8] = include_bytes!("../../../../scripts/test_files/halo2_ipa/params.bin"); - - #[test] - fn halo2_serialization_works() { - let k = 4; - let circuit = StandardPlonk(Fr::random(OsRng)); - let params = ParamsIPA::::new(k); - let compress_selectors = true; - let vk = - keygen_vk_custom(¶ms, &circuit, compress_selectors).expect("vk should not fail"); - let cs = vk.clone().cs; - let instances = vec![vec![circuit.0]]; - let pk = keygen_pk(¶ms, vk.clone(), &circuit).expect("pk should not fail"); - - let mut transcript = Blake2bWrite::<_, _, Challenge255<_>>::init(vec![]); - create_proof::< - IPACommitmentScheme, - ProverIPA, - Challenge255, - _, - Blake2bWrite, G1Affine, Challenge255<_>>, - _, - >( - ¶ms, - &pk, - &[circuit.clone()], - &[instances.clone()], - OsRng, - &mut transcript, - ) - .expect("prover should not fail"); - - let proof = transcript.finalize(); - let strategy = SingleStrategy::new(¶ms); - let mut transcript = Blake2bRead::<_, _, Challenge255<_>>::init(&proof[..]); - - verify_proof::< - IPACommitmentScheme, - VerifierIPA, - Challenge255, - Blake2bRead<&[u8], G1Affine, Challenge255>, - SingleStrategy, - >( - ¶ms, - &vk, - strategy, - &[instances.clone()], - &mut transcript, - ) - .expect("verifier shoud not fail"); - - //write proof - std::fs::write("proof.bin", &proof[..]).expect("should succeed to write new proof"); - - //write public input - let f = File::create("pub_input.bin").unwrap(); - let mut writer = BufWriter::new(f); - instances.to_vec().into_iter().flatten().for_each(|fp| { - writer.write(&fp.to_repr()).unwrap(); - }); - writer.flush().unwrap(); - - let mut vk_buf = Vec::new(); - vk.write(&mut vk_buf, SerdeFormat::RawBytes).unwrap(); - - let mut params_buf = Vec::new(); - params.write(&mut params_buf).unwrap(); - - //Write everything to parameters file - File::create("params.bin").unwrap(); - write_params(¶ms_buf, cs, &vk_buf, "params.bin").unwrap(); - - //read proof - let proof = std::fs::read("proof.bin").expect("should succeed to read proof"); - - //read instances - let mut f = File::open("pub_input.bin").unwrap(); - let mut buf = Vec::new(); - f.read_to_end(&mut buf).unwrap(); - let res = read_fr(&buf).unwrap(); - let instances = res; - - let mut f = File::open("params.bin").unwrap(); - let mut params_buf = Vec::new(); - f.read_to_end(&mut params_buf).unwrap(); - - let (cs_bytes, vk_bytes, vk_params_bytes) = read_params(¶ms_buf).unwrap(); - - let cs = bincode::deserialize(cs_bytes).unwrap(); - let vk = VerifyingKey::::read( - &mut BufReader::new(vk_bytes), - SerdeFormat::RawBytes, - cs, - ) - .unwrap(); - let params = Params::read::<_>(&mut BufReader::new(vk_params_bytes)).unwrap(); - - let strategy = SingleStrategy::new(¶ms); - let mut transcript = Blake2bRead::<_, _, Challenge255<_>>::init(&proof[..]); - assert!(verify_proof::< - IPACommitmentScheme, - VerifierIPA, - Challenge255, - Blake2bRead<&[u8], G1Affine, Challenge255>, - SingleStrategy, - >(¶ms, &vk, strategy, &[vec![instances]], &mut transcript) - .is_ok()); - std::fs::remove_file("proof.bin").unwrap(); - std::fs::remove_file("pub_input.bin").unwrap(); - std::fs::remove_file("params.bin").unwrap(); - } - - #[test] - fn verify_halo2_plonk_proof() { - let proof_len = PROOF.len(); - let proof_bytes = PROOF.as_ptr(); - - let params_len = PARAMS.len(); - let params_bytes = PARAMS.as_ptr(); - - let public_input_len = PUB_INPUT.len(); - let public_input_bytes = PUB_INPUT.as_ptr(); - - let result = verify_halo2_ipa_proof_ffi( - proof_bytes, - proof_len as u32, - params_bytes, - params_len as u32, - public_input_bytes, - public_input_len as u32, - ); - assert!(result) - } - - #[test] - fn verify_halo2_plonk_proof_aborts_with_bad_proof() { - // Select Proof Bytes - let proof_len = PROOF.len(); - let proof_bytes = PROOF.as_ptr(); - - let params_len = PARAMS.len(); - let params_bytes = PARAMS.as_ptr(); - - let public_input_len = PUB_INPUT.len(); - let public_input_bytes = PUB_INPUT.as_ptr(); - - let result = verify_halo2_ipa_proof_ffi( - proof_bytes, - (proof_len - 1) as u32, - params_bytes, - params_len as u32, - public_input_bytes, - public_input_len as u32, - ); - assert!(!result) - } -} diff --git a/operator/halo2kzg/.gitignore b/operator/halo2kzg/.gitignore deleted file mode 100644 index aaf0a8549d..0000000000 --- a/operator/halo2kzg/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -lib/libhalo2kzg_verifier.so -lib/libhalo2kzg_verifier.a -lib/libhalo2kzg_verifier.dylib diff --git a/operator/halo2kzg/halo2kzg.go b/operator/halo2kzg/halo2kzg.go deleted file mode 100644 index 0f2f83a327..0000000000 --- a/operator/halo2kzg/halo2kzg.go +++ /dev/null @@ -1,34 +0,0 @@ -package halo2kzg - -/* -#cgo linux LDFLAGS: ${SRCDIR}/lib/libhalo2kzg_verifier.a -ldl -lrt -lm -lssl -lcrypto -Wl,--allow-multiple-definition -#cgo darwin LDFLAGS: -L./lib -lhalo2kzg_verifier -#include "lib/halo2kzg.h" -*/ -import "C" -import "unsafe" - -func VerifyHalo2KzgProof( - proofBuffer []byte, - paramsBuffer []byte, - publicInputBuffer []byte, -) bool { - /* - For Halo2 the `paramsBuffer` contains the serialized cs, vk, and params with there respective sizes serialized as u32 values (4 bytes) => 3 * 4 bytes = 12 followed by the concatenated variable length buffers: - We therefore require that the `paramsBuffer` is greater than 12 bytes and treat the case that buffer lengths and buffers themselves are 0 size as false. - [ cs_len | vk_len | vk_params_len | cs_bytes | vk_bytes | vk_params_bytes ]. - */ - if len(proofBuffer) == 0 || len(paramsBuffer) <= 12 || len(publicInputBuffer) == 0 { - return false - } - - proofPtr := (*C.uchar)(unsafe.Pointer(&proofBuffer[0])) - paramsPtr := (*C.uchar)(unsafe.Pointer(¶msBuffer[0])) - publicInputPtr := (*C.uchar)(unsafe.Pointer(&publicInputBuffer[0])) - - return (bool)(C.verify_halo2_kzg_proof_ffi( - proofPtr, (C.uint32_t)(len(proofBuffer)), - paramsPtr, (C.uint32_t)(len(paramsBuffer)), - publicInputPtr, (C.uint32_t)(len(publicInputBuffer)), - )) -} diff --git a/operator/halo2kzg/halo2kzg_test.go b/operator/halo2kzg/halo2kzg_test.go deleted file mode 100644 index a1ad8c1a02..0000000000 --- a/operator/halo2kzg/halo2kzg_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package halo2kzg_test - -import ( - "os" - "testing" - - "github.com/yetanotherco/aligned_layer/operator/halo2kzg" -) - -const ProofFilePath = "../../scripts/test_files/halo2_kzg/proof.bin" - -const PublicInputPath = "../../scripts/test_files/halo2_kzg/pub_input.bin" - -const ParamsFilePath = "../../scripts/test_files/halo2_kzg/params.bin" - -func TestHalo2KzgProofVerifies(t *testing.T) { - proofBytes, err := os.ReadFile(ProofFilePath) - if err != nil { - t.Errorf("could not open proof file: %s", err) - } - - paramsBytes, err := os.ReadFile(ParamsFilePath) - if err != nil { - t.Errorf("could not open params file: %s", err) - } - - publicInputBytes, err := os.ReadFile(PublicInputPath) - if err != nil { - t.Errorf("could not open public input file: %s", err) - } - - if !halo2kzg.VerifyHalo2KzgProof( - ([]byte)(proofBytes), - ([]byte)(paramsBytes), - ([]byte)(publicInputBytes), - ) { - t.Errorf("proof did not verify") - } -} diff --git a/operator/halo2kzg/lib/Cargo.lock b/operator/halo2kzg/lib/Cargo.lock deleted file mode 100644 index 92ad6ac9a6..0000000000 --- a/operator/halo2kzg/lib/Cargo.lock +++ /dev/null @@ -1,1104 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "arrayref" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "assert_matches" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "backtrace" -version = "0.3.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[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 = "blake2b_simd" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "cc" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9e8aabfac534be767c909e0690571677d49f41bd8465ae876fe043d52ba5292" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "constant_time_eq" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "dhat" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cd11d84628e233de0ce467de10b8633f4ddaecafadefc86e13b84b8739b827" -dependencies = [ - "backtrace", - "lazy_static", - "mintex", - "parking_lot", - "rustc-hash", - "serde", - "serde_json", - "thousands", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "bitvec", - "rand_core", - "subtle", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[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.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "gumdrop" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc700f989d2f6f0248546222d9b4258f5b02a171a431f8285a81c08142629e3" -dependencies = [ - "gumdrop_derive", -] - -[[package]] -name = "gumdrop_derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729f9bd3449d77e7831a18abfb7ba2f99ee813dfd15b8c2167c9a54ba20aa99d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "halo2_backend" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=22b5d224f3cbeba917e48ba10c618a165e43cd23#22b5d224f3cbeba917e48ba10c618a165e43cd23" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "halo2_middleware", - "halo2curves", - "rand_chacha", - "rand_core", - "rayon", - "serde", - "sha3", - "tracing", -] - -[[package]] -name = "halo2_frontend" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=22b5d224f3cbeba917e48ba10c618a165e43cd23#22b5d224f3cbeba917e48ba10c618a165e43cd23" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "halo2_middleware", - "halo2curves", - "tracing", -] - -[[package]] -name = "halo2_middleware" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=22b5d224f3cbeba917e48ba10c618a165e43cd23#22b5d224f3cbeba917e48ba10c618a165e43cd23" -dependencies = [ - "ff", - "halo2curves", - "rayon", - "serde", -] - -[[package]] -name = "halo2_proofs" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=22b5d224f3cbeba917e48ba10c618a165e43cd23#22b5d224f3cbeba917e48ba10c618a165e43cd23" -dependencies = [ - "bincode", - "group", - "halo2_backend", - "halo2_frontend", - "halo2_middleware", - "halo2curves", - "log", - "rand_core", - "serde", -] - -[[package]] -name = "halo2curves" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db81d01d0bbfec9f624d7590fc6929ee2537a64ec1e080d8f8c9e2d2da291405" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "hex", - "lazy_static", - "num-bigint", - "num-traits", - "pairing", - "pasta_curves", - "paste", - "rand", - "rand_core", - "rayon", - "serde", - "serde_arrays", - "static_assertions", - "subtle", -] - -[[package]] -name = "halo2kzg-verifier-ffi" -version = "0.1.0" -dependencies = [ - "assert_matches", - "bincode", - "dhat", - "ff", - "group", - "gumdrop", - "halo2_backend", - "halo2_proofs", - "halo2curves", - "log", - "proptest", - "rand_chacha", - "rand_core", - "rayon", - "serde_json", - "tracing", -] - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[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.155" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[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.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - -[[package]] -name = "mintex" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bec4598fddb13cc7b528819e697852653252b760f1228b7642679bf2ff2cd07" - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "object" -version = "0.36.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", -] - -[[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", -] - -[[package]] -name = "pasta_curves" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "hex", - "lazy_static", - "rand", - "serde", - "static_assertions", - "subtle", -] - -[[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.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags", - "lazy_static", - "num-traits", - "rand", - "rand_chacha", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex-syntax" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" - -[[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 = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[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.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "serde" -version = "1.0.206" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3e4cd94123dd520a128bcd11e34d9e9e423e7e3e50425cb1b4b1e3549d0284" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_arrays" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38636132857f68ec3d5f3eb121166d2af33cb55174c4d5ff645db6165cbef0fd" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.206" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabfb6138d2383ea8208cf98ccf69cdfb1aff4088460681d84189aa259762f97" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.74", -] - -[[package]] -name = "serde_json" -version = "1.0.123" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a11b3b6ce5cfd25b9759a24c3ed4bf24e23893866863547de4655518c951bcd4" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer", - "digest", - "keccak", - "opaque-debug", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[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" -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.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" -dependencies = [ - "cfg-if", - "fastrand", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "thousands" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.74", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "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.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.74", -] diff --git a/operator/halo2kzg/lib/Cargo.toml b/operator/halo2kzg/lib/Cargo.toml deleted file mode 100644 index f9756f8a3e..0000000000 --- a/operator/halo2kzg/lib/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -name = "halo2kzg-verifier-ffi" -version = "0.1.0" -edition = "2021" - -[dependencies] -bincode = "1.3.3" -halo2curves = { version = "0.6.0", default-features = false } -rand_core = { version = "0.6", default-features = false, features = ["getrandom"] } -halo2_backend = { git = "https://github.com/yetanotherco/yet-another-halo2-fork.git", rev = "22b5d224f3cbeba917e48ba10c618a165e43cd23" } -halo2_proofs = { git = "https://github.com/yetanotherco/yet-another-halo2-fork.git", rev = "22b5d224f3cbeba917e48ba10c618a165e43cd23" } -ff = "0.13" -log = "0.4.21" - -[dev-dependencies] -group = "0.13" -tracing = "0.1" -rand_chacha = "0.3" -rayon = "1.8" -assert_matches = "1.5" -gumdrop = "0.8" -proptest = "1" -dhat = "0.3.2" -serde_json = "1" - -[lib] -crate-type = ["cdylib", "staticlib", "lib"] \ No newline at end of file diff --git a/operator/halo2kzg/lib/halo2kzg.h b/operator/halo2kzg/lib/halo2kzg.h deleted file mode 100644 index 2943a4009f..0000000000 --- a/operator/halo2kzg/lib/halo2kzg.h +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include - -bool verify_halo2_kzg_proof_ffi(unsigned char *proof_bytes, uint32_t proof_len, - unsigned char *params_bytes, - uint32_t params_len, - unsigned char *public_input_bytes, - uint32_t public_input_len); diff --git a/operator/halo2kzg/lib/rust-toolchain b/operator/halo2kzg/lib/rust-toolchain deleted file mode 100644 index 3a306210c9..0000000000 --- a/operator/halo2kzg/lib/rust-toolchain +++ /dev/null @@ -1,3 +0,0 @@ -[toolchain] -channel = "nightly-2024-04-17" -components = ["llvm-tools", "rustc-dev"] \ No newline at end of file diff --git a/operator/halo2kzg/lib/src/lib.rs b/operator/halo2kzg/lib/src/lib.rs deleted file mode 100644 index 025d91630f..0000000000 --- a/operator/halo2kzg/lib/src/lib.rs +++ /dev/null @@ -1,277 +0,0 @@ -use halo2_proofs::{ - plonk::{read_fr, read_params, verify_proof, VerifyingKey}, - poly::{ - commitment::Params, - kzg::{ - commitment::KZGCommitmentScheme, multiopen::VerifierSHPLONK, strategy::SingleStrategy, - }, - }, - transcript::{Blake2bRead, Challenge255, TranscriptReadBuffer}, - SerdeFormat, -}; -use halo2curves::bn256::{Bn256, G1Affine}; -use log::error; -use std::{io::BufReader, slice}; - -#[no_mangle] -pub extern "C" fn verify_halo2_kzg_proof_ffi( - proof_buf: *const u8, - proof_len: u32, - params_buf: *const u8, - params_len: u32, - public_input_buf: *const u8, - public_input_len: u32, -) -> bool { - if proof_buf.is_null() || params_buf.is_null() || public_input_buf.is_null() { - error!("Input buffer length null"); - return false; - } - - // For Halo2 the `params_buf` contains the serialized cs, vk, and params with there respective sizes serialized as u32 values (4 bytes) => 3 * 4 bytes = 12 by the concatenated variable length buffers: - // We therefore require that the `params_buf` is greater than 12 bytes and treat the case that buffer lengths and buffers themselves are 0 size as false. - // [ cs_len | vk_len | vk_params_len | cs_bytes | vk_bytes | vk_params_bytes ]. - if proof_len == 0 || params_len <= 12 || public_input_len == 0 { - error!("Input buffer length zero size"); - return false; - } - - let proof_bytes = unsafe { slice::from_raw_parts(proof_buf, proof_len as usize) }; - - let params_bytes = unsafe { slice::from_raw_parts(params_buf, params_len as usize) }; - - let public_input_bytes = - unsafe { slice::from_raw_parts(public_input_buf, public_input_len as usize) }; - - let Ok((cs_bytes, vk_bytes, vk_params_bytes)) = read_params(params_bytes) else { - error!("Failed to deserialize verifiation parameter buffers from parameters buffer"); - return false; - }; - - let Ok(cs) = bincode::deserialize(cs_bytes) else { - error!("Failed to deserialize verifiation parameter buffers from parameters buffer"); - return false; - }; - - let Ok(vk) = - VerifyingKey::::read(&mut BufReader::new(vk_bytes), SerdeFormat::RawBytes, cs) - else { - error!("Failed to deserialize verification key"); - return false; - }; - - let Ok(params) = Params::read::<_>(&mut BufReader::new(vk_params_bytes)) else { - error!("Failed to deserialize verification parameters"); - return false; - }; - - let Ok(res) = read_fr(public_input_bytes) else { - error!("Failed to deserialize public inputs"); - return false; - }; - let strategy = SingleStrategy::new(¶ms); - let instances = res; - let mut transcript = Blake2bRead::<&[u8], G1Affine, Challenge255<_>>::init(proof_bytes); - verify_proof::< - KZGCommitmentScheme, - VerifierSHPLONK, - Challenge255, - Blake2bRead<&[u8], G1Affine, Challenge255>, - SingleStrategy, - >(¶ms, &vk, strategy, &[vec![instances]], &mut transcript) - .is_ok() -} - -#[cfg(test)] -mod tests { - use super::*; - - use ff::{Field, PrimeField}; - use halo2_proofs::{ - plonk::{ - create_proof, keygen_pk, keygen_vk_custom, verify_proof, write_params, StandardPlonk, - }, - poly::kzg::{ - commitment::{KZGCommitmentScheme, ParamsKZG}, - multiopen::ProverSHPLONK, - }, - transcript::{ - Blake2bRead, Blake2bWrite, Challenge255, TranscriptReadBuffer, TranscriptWriterBuffer, - }, - }; - use halo2curves::bn256::Fr; - use rand_core::OsRng; - use std::{ - fs::File, - io::{BufWriter, Read, Write}, - }; - - const PROOF: &[u8] = include_bytes!("../../../../scripts/test_files/halo2_kzg/proof.bin"); - - const PUB_INPUT: &[u8] = - include_bytes!("../../../../scripts/test_files/halo2_kzg/pub_input.bin"); - - const PARAMS: &[u8] = include_bytes!("../../../../scripts/test_files/halo2_kzg/params.bin"); - - #[test] - fn halo2_serialization_works() { - // Setup Proof Params - let circuit = StandardPlonk(Fr::random(OsRng)); - let params = ParamsKZG::::setup(4, OsRng); - let compress_selectors = true; - let vk = - keygen_vk_custom(¶ms, &circuit, compress_selectors).expect("vk should not fail"); - let instances = vec![vec![circuit.0]]; - let cs = vk.clone().cs; - let pk = keygen_pk(¶ms, vk.clone(), &circuit).expect("pk should not fail"); - - // Create Proof - let mut transcript = Blake2bWrite::<_, _, Challenge255<_>>::init(vec![]); - create_proof::< - KZGCommitmentScheme, - ProverSHPLONK<'_, Bn256>, - Challenge255, - _, - Blake2bWrite, G1Affine, Challenge255<_>>, - _, - >( - ¶ms, - &pk, - &[circuit], - &[instances.clone()], - OsRng, - &mut transcript, - ) - .expect("prover should not fail"); - - let proof = transcript.finalize(); - let vk_params = params.verifier_params(); - let strategy = SingleStrategy::new(&vk_params); - let mut transcript = Blake2bRead::<_, _, Challenge255<_>>::init(&proof[..]); - - // Verify Proof - verify_proof::< - KZGCommitmentScheme, - VerifierSHPLONK, - Challenge255, - Blake2bRead<&[u8], G1Affine, Challenge255>, - SingleStrategy, - >( - &vk_params, - &vk, - strategy, - &[instances.clone()], - &mut transcript, - ) - .expect("verifier should not fail"); - - //write proof - std::fs::write("proof.bin", &proof[..]).expect("should succeed to write new proof"); - - //write public inputs - let f = File::create("pub_input.bin").unwrap(); - let mut writer = BufWriter::new(f); - instances.to_vec().into_iter().flatten().for_each(|fp| { - writer.write(&fp.to_repr()).unwrap(); - }); - writer.flush().unwrap(); - - let mut vk_buf = Vec::new(); - vk.write(&mut vk_buf, SerdeFormat::RawBytes).unwrap(); - - let mut params_buf = Vec::new(); - vk_params.write(&mut params_buf).unwrap(); - - write_params(¶ms_buf, cs, &vk_buf, "params.bin").unwrap(); - - //read proof - let proof = std::fs::read("proof.bin").expect("should succeed to read proof"); - - //read instances - let mut f = File::open("pub_input.bin").unwrap(); - let mut buf = Vec::new(); - f.read_to_end(&mut buf).unwrap(); - let res = read_fr(&buf).unwrap(); - let instances = res; - - let mut f = File::open("params.bin").unwrap(); - let mut params_buf = Vec::new(); - f.read_to_end(&mut params_buf).unwrap(); - - let (cs_bytes, vk_bytes, vk_params_bytes) = read_params(¶ms_buf).unwrap(); - - let cs = bincode::deserialize(cs_bytes).unwrap(); - let vk = VerifyingKey::::read( - &mut BufReader::new(vk_bytes), - SerdeFormat::RawBytes, - cs, - ) - .unwrap(); - let params = Params::read::<_>(&mut BufReader::new(vk_params_bytes)).unwrap(); - - let strategy = SingleStrategy::new(¶ms); - let mut transcript = Blake2bRead::<_, _, Challenge255<_>>::init(&proof[..]); - assert!(verify_proof::< - KZGCommitmentScheme, - VerifierSHPLONK, - Challenge255, - Blake2bRead<&[u8], G1Affine, Challenge255>, - SingleStrategy, - >( - &vk_params, - &vk, - strategy, - &[vec![instances]], - &mut transcript - ) - .is_ok()); - std::fs::remove_file("proof.bin").unwrap(); - std::fs::remove_file("pub_input.bin").unwrap(); - std::fs::remove_file("params.bin").unwrap(); - } - - #[test] - fn verify_halo2_plonk_proof() { - let proof_len = PROOF.len(); - let proof_buffer = PROOF.as_ptr(); - - let params_len = PARAMS.len(); - let params_bytes = PARAMS.as_ptr(); - - let public_input_len = PUB_INPUT.len(); - let public_input_buffer = PUB_INPUT.as_ptr(); - - let result = verify_halo2_kzg_proof_ffi( - proof_buffer, - proof_len as u32, - params_bytes, - params_len as u32, - public_input_buffer, - public_input_len as u32, - ); - assert!(result) - } - - #[test] - fn verify_halo2_plonk_proof_aborts_with_bad_proof() { - // Select Proof Bytes - let proof_len = PROOF.len(); - let proof_buffer = PROOF.as_ptr(); - - let params_len = PARAMS.len(); - let params_bytes = PARAMS.as_ptr(); - - // Select Public Input Bytes - let public_input_len = PUB_INPUT.len(); - let public_input_buffer = PUB_INPUT.as_ptr(); - - let result = verify_halo2_kzg_proof_ffi( - proof_buffer, - (proof_len - 1) as u32, - params_bytes, - params_len as u32, - public_input_buffer, - public_input_len as u32, - ); - assert!(!result) - } -} diff --git a/operator/pkg/operator.go b/operator/pkg/operator.go index b94914dc1a..58cec3a6a4 100644 --- a/operator/pkg/operator.go +++ b/operator/pkg/operator.go @@ -18,8 +18,6 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/yetanotherco/aligned_layer/metrics" - "github.com/yetanotherco/aligned_layer/operator/halo2ipa" - "github.com/yetanotherco/aligned_layer/operator/halo2kzg" "github.com/yetanotherco/aligned_layer/operator/sp1" "github.com/Layr-Labs/eigensdk-go/crypto/bls" @@ -477,30 +475,11 @@ func (o *Operator) verify(verificationData VerificationData, results chan bool) results <- verificationResult case common.SP1: - verificationResult := sp1.VerifySp1Proof(verificationData.Proof, verificationData.VmProgramCode) o.Logger.Infof("SP1 proof verification result: %t", verificationResult) results <- verificationResult - case common.Halo2IPA: - - verificationResult := halo2ipa.VerifyHalo2IpaProof( - verificationData.Proof, - verificationData.VerificationKey, - verificationData.PubInput) - - o.Logger.Infof("Halo2-IPA proof verification result: %t", verificationResult) - results <- verificationResult - case common.Halo2KZG: - verificationResult := halo2kzg.VerifyHalo2KzgProof( - verificationData.Proof, - verificationData.VerificationKey, - verificationData.PubInput) - - o.Logger.Infof("Halo2-KZG proof verification result: %t", verificationResult) - results <- verificationResult case common.Risc0: - verificationResult := risc_zero.VerifyRiscZeroReceipt(verificationData.Proof, verificationData.VmProgramCode, verificationData.PubInput) diff --git a/operator/risc_zero/risc_zero_test.go b/operator/risc_zero/risc_zero_test.go index 454cc00448..cb83a06f50 100644 --- a/operator/risc_zero/risc_zero_test.go +++ b/operator/risc_zero/risc_zero_test.go @@ -7,12 +7,6 @@ import ( "github.com/yetanotherco/aligned_layer/operator/risc_zero" ) -const ProofFilePath = "../../scripts/test_files/halo2_kzg/proof.bin" - -const PublicInputPath = "../../scripts/test_files/halo2_kzg/pub_input.bin" - -const ParamsFilePath = "../../scripts/test_files/halo2_kzg/params.bin" - func TestFibonacciRiscZeroProofVerifies(t *testing.T) { innerReceiptBytes, err := os.ReadFile("../../scripts/test_files/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof") if err != nil { diff --git a/scripts/test_files/halo2_ipa/Cargo.lock b/scripts/test_files/halo2_ipa/Cargo.lock deleted file mode 100644 index 2e824dc0c0..0000000000 --- a/scripts/test_files/halo2_ipa/Cargo.lock +++ /dev/null @@ -1,1055 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "assert_matches" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "backtrace" -version = "0.3.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake2b_simd" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "cc" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "constant_time_eq" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "dhat" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cd11d84628e233de0ce467de10b8633f4ddaecafadefc86e13b84b8739b827" -dependencies = [ - "backtrace", - "lazy_static", - "mintex", - "parking_lot", - "rustc-hash", - "serde", - "serde_json", - "thousands", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "either" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "bitvec", - "rand_core", - "subtle", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[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.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "gumdrop" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc700f989d2f6f0248546222d9b4258f5b02a171a431f8285a81c08142629e3" -dependencies = [ - "gumdrop_derive", -] - -[[package]] -name = "gumdrop_derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729f9bd3449d77e7831a18abfb7ba2f99ee813dfd15b8c2167c9a54ba20aa99d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "halo2_backend" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=a3a56819d9183ac0b11c8d0543c7673c4a4c71a6#a3a56819d9183ac0b11c8d0543c7673c4a4c71a6" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "halo2_middleware", - "halo2curves", - "rand_chacha", - "rand_core", - "rayon", - "serde", - "sha3", - "tracing", -] - -[[package]] -name = "halo2_frontend" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=a3a56819d9183ac0b11c8d0543c7673c4a4c71a6#a3a56819d9183ac0b11c8d0543c7673c4a4c71a6" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "halo2_middleware", - "halo2curves", - "tracing", -] - -[[package]] -name = "halo2_ipa" -version = "0.1.0" -dependencies = [ - "assert_matches", - "bincode", - "dhat", - "ff", - "group", - "gumdrop", - "halo2_backend", - "halo2_proofs", - "halo2curves", - "proptest", - "rand_chacha", - "rand_core", - "rayon", - "serde_json", - "tracing", -] - -[[package]] -name = "halo2_middleware" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=a3a56819d9183ac0b11c8d0543c7673c4a4c71a6#a3a56819d9183ac0b11c8d0543c7673c4a4c71a6" -dependencies = [ - "ff", - "halo2curves", - "rayon", - "serde", -] - -[[package]] -name = "halo2_proofs" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=a3a56819d9183ac0b11c8d0543c7673c4a4c71a6#a3a56819d9183ac0b11c8d0543c7673c4a4c71a6" -dependencies = [ - "bincode", - "group", - "halo2_backend", - "halo2_frontend", - "halo2_middleware", - "halo2curves", - "rand_core", - "serde", -] - -[[package]] -name = "halo2curves" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db81d01d0bbfec9f624d7590fc6929ee2537a64ec1e080d8f8c9e2d2da291405" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "hex", - "lazy_static", - "num-bigint", - "num-traits", - "pairing", - "pasta_curves", - "paste", - "rand", - "rand_core", - "rayon", - "serde", - "serde_arrays", - "static_assertions", - "subtle", -] - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[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.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin", -] - -[[package]] -name = "libc" -version = "0.2.155" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[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 = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "miniz_oxide" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" -dependencies = [ - "adler", -] - -[[package]] -name = "mintex" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bec4598fddb13cc7b528819e697852653252b760f1228b7642679bf2ff2cd07" - -[[package]] -name = "num-bigint" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", -] - -[[package]] -name = "parking_lot" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" -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", -] - -[[package]] -name = "pasta_curves" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "hex", - "lazy_static", - "rand", - "serde", - "static_assertions", - "subtle", -] - -[[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.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags", - "lazy_static", - "num-traits", - "rand", - "rand_chacha", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex-syntax" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" - -[[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 = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[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.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "serde" -version = "1.0.202" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_arrays" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38636132857f68ec3d5f3eb121166d2af33cb55174c4d5ff645db6165cbef0fd" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.202" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.65", -] - -[[package]] -name = "serde_json" -version = "1.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer", - "digest", - "keccak", - "opaque-debug", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[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.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys", -] - -[[package]] -name = "thousands" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.65", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] diff --git a/scripts/test_files/halo2_ipa/Cargo.toml b/scripts/test_files/halo2_ipa/Cargo.toml deleted file mode 100644 index 1e4503fbdc..0000000000 --- a/scripts/test_files/halo2_ipa/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -[package] -name = "halo2_ipa" -version = "0.1.0" -edition = "2021" - -[dependencies] -bincode = "1.3.3" -halo2curves = { version = "0.6.0", default-features = false } -rand_core = { version = "0.6", default-features = false, features = ["getrandom"] } -halo2_backend = { git = "https://github.com/yetanotherco/yet-another-halo2-fork.git", rev = "a3a56819d9183ac0b11c8d0543c7673c4a4c71a6"} -halo2_proofs = { git = "https://github.com/yetanotherco/yet-another-halo2-fork.git", rev = "a3a56819d9183ac0b11c8d0543c7673c4a4c71a6"} -ff = "0.13" - -[dev-dependencies] -group = "0.13" -tracing = "0.1" -rand_chacha = "0.3" -rayon = "1.8" -assert_matches = "1.5" -gumdrop = "0.8" -proptest = "1" -dhat = "0.3.2" -serde_json = "1" \ No newline at end of file diff --git a/scripts/test_files/halo2_ipa/params.bin b/scripts/test_files/halo2_ipa/params.bin deleted file mode 100644 index 8a5ea17b6ca4ed064d9b2f2e079aeb130cfb01c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2413 zcma)52T)Uq77bMiL{NHBLW$I+vr+;QL=!<25YQk+lF)lI5=<0Cr3)^DQbLgyjS3nd zBDg@LC?KFTm4G0wAWg&45&VSRH)fdsXa1c@&bjBFTk_^bk_QCh=LUhSctIdO&_A&y zZ3oxCxD$XnhYnZ||Eq<0crxgoPz`992Zlk%Y!fVlj@>4nThdmUtztuhBO*P6Be$sE zHp6;B&7eB$4Ld(u2ZDe#9GkZ(paZzG4&Skc5cyaFYsI0IcJTX1Hn0ya~@FNMqXa_SpGPg+Sc^|^hk)(Oow<{%ltL#pQEol$tI4i)&a34oP)85S!G5-@ z!1&ED=x2Pk;pw6FtxKD{*9?yGL+9P~7jH0{1>i}09vTmW;siE~@j{oXD^7pa4eImG z{ku8^U7}ANNFFepR63h`@tj^`=Qs0Z$k}XkqR{|^7fjU zQMmnlx<*i%ZbwQ4;}=ksj_zLcX#Xg?HN=-y*V=Ge#3{XpvBpTD69zkf`87UuGn5DUd;hSC-r9z#RCTtD9AaX9X!k18 z(+^bvoBc#sYeypjD<2870y~S*h%~2iko>7d^cl=x>~qXU{ag;N(RE@{*H<>3cb>~h zQ(dyf)Iyh)c049{toFkFy5t! z;!?`*lKLK|9OliPs}?YJs@9|O=glWL^RcAS9IEa8!BCTq5-DOo_~mR29Ix3;Fz6gL zoj;y(reR;+U$d+E?41eRYgDqZERm#c2tSwEWh>9b zTo{TW(~&kOsD0L8oMnhQa`L0@pL_!!(WZ?>Sw+zh$t8OK6==Nua~(qe?nuO3vP#A(SZ2L#0 zrD5{x0`huT>W+NJ<`BWr1(TA`#FH+kOgP8VAa4S0%%lJ)C&=aReb=(4XtPTO>AB_b1-`R$CGXkQI=APb%tg3MuwQU zHf;D2-4|p}l`cv<+b%c$<)JaHPo_q%uG?%zBOR}IPvoQ8VFQC^a%YC)A;OwY-|6nY z=A6O3S(!$5j3(Kpb|A=)@;u6Z^&NLScH3{uenwu*g3wcPH(s9k_>fW-Pa-t;zPqJvOcOjgFvVno zPA&C#)g}zzZ3Hig-*V4un{J&Z1X#ww3R2-pbyD?<+OEc@J!P@<+beK~8%~1GFB|JO zzHr-3R*@dQ$Z{(Qpj+V3qSDJz7j~7H+KKTn3n49WcFz*jKd%w(7xq1_8Bw$ji7AhY zX;BpoEzF&YJQ<}GAN|^Gr0elMOV3{@HzE-^&+OL2)e+O_5)TJwsunXlcltTC1R)=i-% fiyLIiDaT+gcSR41;Ezj@x?OSgWP$U{I=TMt>d+_(%|nmTx>RN5 zr|Z8*!9$T--x;l3rZ2A{6j;%(0Z!Ic zF$eslnio8%)?oBeQa0ONWo^5icnk;ma&x0$8mBt$Lft_`qRmGoF8KA=0xJrj`7{`y;#F8K zx&g@*W)$OYUV0qqIcFahF%a#izDfq<2_^?}(zW+(3Z@ITZ8N`bvJwuZ052C4ApME! zD1-wbvir$fe%|D>RCSLoXysB5t4zOl2;UqFjQEat;lI%Hu=sG0Wm^Q*k!T<{XNx48 z)ElHSi60yR0VM_b&ej1BW&C~s+*ff`FM~w?1HcHGawI0LdU+Bx?DLFiWFwNK9ADYw zZ z*ykD3$VMbdIli*V$>nn+Z!w3|`6t{2Z#CtXlt~hjluqU#%X~d41J8}c;oZmq zGO!4>@A7W1zT09^-?JgaRS1gJHCc>4P7UxH|6mCBESJI@3)V>=iEwJmlZ3eN{XoM62tByI8jLb zw^)79ss%1xrGKndkLWZR)Rle7Xze@lOJ&eZf;|0Fj)-REcx3?r0=K??h0R>-v##pG zEF0F*g$^9q>XJe-E3*~V?C%UTwi%St-FXPHUao!+6eUF5F&!w-$@3fJYzjZH3>W`wwhgsSBj|NoPvQ4bPmdL#N#$;%@P zg%|{3gr;*x=g@TOVRSb|(&wrPueR>B9K#Q+9GC4zGz2GEsJiFtE#&G-4GqRmO$U?43A3dO&~Kg`BMORGts zxBw5`O^@aKDb#Wh!a7W(WK!^K>7tYPYC!>X!A(BcSl<>W>e17?ql znHl_N_ZF{(OQ5WQP@xIJM@d2p9@<(4S+w$72BvI zg&)|u9q3#{p17YKeEPPW5eb1Itz~C2|71L>`NzG{8Q_z&@X91{C!D?4<%;HeqjgX9 ze#`tvGG?ZvlY77=sbMi<|U@0Xr3+2P4C1g1?p*u0lTNiV=E~*tn0^ys|AE z>e_VdtFUY|g#^&j9j7emefQkXd0t^zTSv6p%-kAC6#STX+f;gJF^X-D%!P_{r`#1W uNkm~Il*?yOQtA-&;4_Od&h%Y?Hhxmcl>L)5d&*}&|9>|lbvrF1i!vj*d%a)) diff --git a/scripts/test_files/halo2_ipa/pub_input.bin b/scripts/test_files/halo2_ipa/pub_input.bin deleted file mode 100644 index 47873949f5..0000000000 --- a/scripts/test_files/halo2_ipa/pub_input.bin +++ /dev/null @@ -1 +0,0 @@ -ÛáÛIÍ?’º;dÔ#º! ê4”à˜Õ×¢ùº} / \ No newline at end of file diff --git a/scripts/test_files/halo2_ipa/src/main.rs b/scripts/test_files/halo2_ipa/src/main.rs deleted file mode 100644 index b5c81ea677..0000000000 --- a/scripts/test_files/halo2_ipa/src/main.rs +++ /dev/null @@ -1,173 +0,0 @@ -use std::{fs::File, io::{BufWriter, Write}}; -use halo2_proofs::{ - circuit::{Layouter, SimpleFloorPlanner, Value}, - plonk::{ - create_proof, keygen_pk, keygen_vk_custom, Advice, Circuit, Column, - ConstraintSystem, ErrorFront, Fixed, Instance, write_params - }, - poly::{ - commitment::ParamsProver, - ipa::{ - commitment::{IPACommitmentScheme, ParamsIPA}, - multiopen::ProverIPA, - }, - commitment::Params, - Rotation, - }, - transcript::{ - Blake2bWrite, Challenge255, TranscriptWriterBuffer - }, - SerdeFormat, -}; -use halo2curves::bn256::{Fr, G1Affine}; -use rand_core::OsRng; -use ff::{Field, PrimeField}; - -// HALO2 Circuit Example -#[derive(Clone, Copy)] -struct StandardPlonkConfig { - a: Column, - b: Column, - c: Column, - q_a: Column, - q_b: Column, - q_c: Column, - q_ab: Column, - constant: Column, - #[allow(dead_code)] - instance: Column, -} - -impl StandardPlonkConfig { - fn configure(meta: &mut ConstraintSystem) -> Self { - let [a, b, c] = [(); 3].map(|_| meta.advice_column()); - let [q_a, q_b, q_c, q_ab, constant] = [(); 5].map(|_| meta.fixed_column()); - let instance = meta.instance_column(); - - [a, b, c].map(|column| meta.enable_equality(column)); - - meta.create_gate( - "q_a·a + q_b·b + q_c·c + q_ab·a·b + constant + instance = 0", - |meta| { - let [a, b, c] = [a, b, c].map(|column| meta.query_advice(column, Rotation::cur())); - let [q_a, q_b, q_c, q_ab, constant] = [q_a, q_b, q_c, q_ab, constant] - .map(|column| meta.query_fixed(column, Rotation::cur())); - let instance = meta.query_instance(instance, Rotation::cur()); - Some( - q_a * a.clone() - + q_b * b.clone() - + q_c * c - + q_ab * a * b - + constant - + instance, - ) - }, - ); - - StandardPlonkConfig { - a, - b, - c, - q_a, - q_b, - q_c, - q_ab, - constant, - instance, - } - } -} - -#[derive(Clone, Default)] -struct StandardPlonk(Fr); - -impl Circuit for StandardPlonk { - type Config = StandardPlonkConfig; - type FloorPlanner = SimpleFloorPlanner; - - fn without_witnesses(&self) -> Self { - Self::default() - } - - fn configure(meta: &mut ConstraintSystem) -> Self::Config { - StandardPlonkConfig::configure(meta) - } - - fn synthesize( - &self, - config: Self::Config, - mut layouter: impl Layouter, - ) -> Result<(), ErrorFront> { - layouter.assign_region( - || "", - |mut region| { - region.assign_advice(|| "", config.a, 0, || Value::known(self.0))?; - region.assign_fixed(|| "", config.q_a, 0, || Value::known(-Fr::one()))?; - - region.assign_advice(|| "", config.a, 1, || Value::known(-Fr::from(5u64)))?; - for (idx, column) in (1..).zip([ - config.q_a, - config.q_b, - config.q_c, - config.q_ab, - config.constant, - ]) { - region.assign_fixed(|| "", column, 1, || Value::known(Fr::from(idx as u64)))?; - } - - let a = region.assign_advice(|| "", config.a, 2, || Value::known(Fr::one()))?; - a.copy_advice(|| "", &mut region, config.b, 3)?; - a.copy_advice(|| "", &mut region, config.c, 4)?; - Ok(()) - }, - ) - } -} - -fn main() { - let k = 4; - let circuit = StandardPlonk(Fr::random(OsRng)); - let params = ParamsIPA::::new(k); - let compress_selectors = true; - let vk = keygen_vk_custom(¶ms, &circuit, compress_selectors).expect("vk should not fail"); - let cs = vk.clone().cs; - let pk = keygen_pk(¶ms, vk.clone(), &circuit).expect("pk should not fail"); - - let instances = vec![vec![circuit.0]]; - let mut transcript = Blake2bWrite::<_, _, Challenge255<_>>::init(vec![]); - create_proof::< - IPACommitmentScheme, - ProverIPA, - Challenge255, - _, - Blake2bWrite, G1Affine, Challenge255<_>>, - _, - >( - ¶ms, - &pk, - &[circuit.clone()], - &[instances.clone()], - OsRng, - &mut transcript, - ) - .expect("prover should not fail"); - let proof = transcript.finalize(); - - //write proof - std::fs::write("proof.bin", &proof[..]) - .expect("should succeed to write new proof"); - - //write public inputs - let f = File::create("pub_input.bin").unwrap(); - let mut writer = BufWriter::new(f); - instances.to_vec().into_iter().flatten().for_each(|fp| { writer.write(&fp.to_repr()).unwrap(); }); - writer.flush().unwrap(); - - let mut vk_buf = Vec::new(); - vk.write(&mut vk_buf, SerdeFormat::RawBytes).unwrap(); - - let mut ipa_params_buf = Vec::new(); - params.write(&mut ipa_params_buf).unwrap(); - - write_params(&ipa_params_buf, cs, &vk_buf, "params.bin").unwrap(); -} diff --git a/scripts/test_files/halo2_kzg/Cargo.lock b/scripts/test_files/halo2_kzg/Cargo.lock deleted file mode 100644 index 6f1e87c5ca..0000000000 --- a/scripts/test_files/halo2_kzg/Cargo.lock +++ /dev/null @@ -1,1055 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "assert_matches" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "backtrace" -version = "0.3.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[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 = "blake2b_simd" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "cc" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaff6f8ce506b9773fa786672d63fc7a191ffea1be33f72bbd4aeacefca9ffc8" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "constant_time_eq" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "dhat" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cd11d84628e233de0ce467de10b8633f4ddaecafadefc86e13b84b8739b827" -dependencies = [ - "backtrace", - "lazy_static", - "mintex", - "parking_lot", - "rustc-hash", - "serde", - "serde_json", - "thousands", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "bitvec", - "rand_core", - "subtle", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[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.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "gumdrop" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc700f989d2f6f0248546222d9b4258f5b02a171a431f8285a81c08142629e3" -dependencies = [ - "gumdrop_derive", -] - -[[package]] -name = "gumdrop_derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729f9bd3449d77e7831a18abfb7ba2f99ee813dfd15b8c2167c9a54ba20aa99d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "halo2_backend" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=a3a56819d9183ac0b11c8d0543c7673c4a4c71a6#a3a56819d9183ac0b11c8d0543c7673c4a4c71a6" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "halo2_middleware", - "halo2curves", - "rand_chacha", - "rand_core", - "rayon", - "serde", - "sha3", - "tracing", -] - -[[package]] -name = "halo2_frontend" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=a3a56819d9183ac0b11c8d0543c7673c4a4c71a6#a3a56819d9183ac0b11c8d0543c7673c4a4c71a6" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "halo2_middleware", - "halo2curves", - "tracing", -] - -[[package]] -name = "halo2_kzg" -version = "0.1.0" -dependencies = [ - "assert_matches", - "bincode", - "dhat", - "ff", - "group", - "gumdrop", - "halo2_backend", - "halo2_proofs", - "halo2curves", - "proptest", - "rand_chacha", - "rand_core", - "rayon", - "serde_json", - "tracing", -] - -[[package]] -name = "halo2_middleware" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=a3a56819d9183ac0b11c8d0543c7673c4a4c71a6#a3a56819d9183ac0b11c8d0543c7673c4a4c71a6" -dependencies = [ - "ff", - "halo2curves", - "rayon", - "serde", -] - -[[package]] -name = "halo2_proofs" -version = "0.3.0" -source = "git+https://github.com/yetanotherco/yet-another-halo2-fork.git?rev=a3a56819d9183ac0b11c8d0543c7673c4a4c71a6#a3a56819d9183ac0b11c8d0543c7673c4a4c71a6" -dependencies = [ - "bincode", - "group", - "halo2_backend", - "halo2_frontend", - "halo2_middleware", - "halo2curves", - "rand_core", - "serde", -] - -[[package]] -name = "halo2curves" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db81d01d0bbfec9f624d7590fc6929ee2537a64ec1e080d8f8c9e2d2da291405" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "hex", - "lazy_static", - "num-bigint", - "num-traits", - "pairing", - "pasta_curves", - "paste", - "rand", - "rand_core", - "rayon", - "serde", - "serde_arrays", - "static_assertions", - "subtle", -] - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[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.155" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[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 = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - -[[package]] -name = "mintex" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bec4598fddb13cc7b528819e697852653252b760f1228b7642679bf2ff2cd07" - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "object" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", -] - -[[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", -] - -[[package]] -name = "pasta_curves" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "hex", - "lazy_static", - "rand", - "serde", - "static_assertions", - "subtle", -] - -[[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.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags", - "lazy_static", - "num-traits", - "rand", - "rand_chacha", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex-syntax" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" - -[[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 = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[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.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "serde" -version = "1.0.204" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_arrays" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38636132857f68ec3d5f3eb121166d2af33cb55174c4d5ff645db6165cbef0fd" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.204" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.70", -] - -[[package]] -name = "serde_json" -version = "1.0.120" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer", - "digest", - "keccak", - "opaque-debug", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[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" -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.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys", -] - -[[package]] -name = "thousands" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.70", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] diff --git a/scripts/test_files/halo2_kzg/Cargo.toml b/scripts/test_files/halo2_kzg/Cargo.toml deleted file mode 100644 index 973e5164cf..0000000000 --- a/scripts/test_files/halo2_kzg/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -[package] -name = "halo2_kzg" -version = "0.1.0" -edition = "2021" - -[dependencies] -bincode = "1.3.3" -halo2curves = { version = "0.6.0", default-features = false } -rand_core = { version = "0.6", default-features = false, features = ["getrandom"] } -halo2_backend = { git = "https://github.com/yetanotherco/yet-another-halo2-fork.git", rev = "a3a56819d9183ac0b11c8d0543c7673c4a4c71a6"} -halo2_proofs = { git = "https://github.com/yetanotherco/yet-another-halo2-fork.git", rev = "a3a56819d9183ac0b11c8d0543c7673c4a4c71a6"} -ff = "0.13" - -[dev-dependencies] -group = "0.13" -tracing = "0.1" -rand_chacha = "0.3" -rayon = "1.8" -assert_matches = "1.5" -gumdrop = "0.8" -proptest = "1" -dhat = "0.3.2" -serde_json = "1" \ No newline at end of file diff --git a/scripts/test_files/halo2_kzg/params.bin b/scripts/test_files/halo2_kzg/params.bin deleted file mode 100644 index 2f8b17b538fa184176e75ae293e91f28c7f070ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1453 zcmWeKrxs#NH&9+FmV`-E)U}) zn*mcxERD?!V8DR^j7B#LCJv*K%|LbwEJR^6x;Zd?=rp=I7$2q%#s}F20x%jT4x=Hm z2omOAn0pX12o}0tm>!S{m_C>qTr{#CkUm%ngsBIKfdGh)ECymD>jm*)b^@7TwJ^Ve z_{ee~J`5n6iEJKB9!#^afSh&x(#u`yK35CpCa5jzJoJI<@UoAdMNvJ8N(tNZ>Q;Md zr!l(+_TSpj6K5i0WA1#SV{NUB1Z&oc;}KJfOx@mRNX_=%Z13|c%X{s$)2@32bXELC zPE53QyqKl1x%cTS-`%=ua!pxZd-L7mLU((*$w^8`a(P{pm2WJ5ee6rFT6w?p`B#&i zI^I+k)+}B2UOE3*Tc8bJ^s%jL<;;wx{dZ7aqUgBp*wpFvzRCM^tsf=5<~V$7bJCpX z#k2WrYP#!IDF$nQy6j*kThDIfC0KE$j%8)@5;m6SR}@yMth7yCvM8^LW5SP=2a2xO zriPa-JgS7-(xbB zyZ(VSPkIfEIx_VR&#D#ar3$kW7G0ihSbniMW@A`xiO`b>QRN8&K^42*w)#7R?$GkMK*1D7k9w1(thI$ zf+ExO|0|s8PrclC%7{rxh({?_&h_Ebhjxu+D}CFzQxtc0T#q?=Ak)?;eKKd|+sU1g zd18AH3h`K%+HcipxDs#vo<_ESXC?%}G?2tgC;G&!mEmSC6^01@DFp8?kjaA*F;g^epB( zUN9}ixmnZTFisp(0Rfxow=+sHN>z08lWt+QoqdJXTTn&iU zN?-;dnAskD$`J)TjEZg1HZ!>nhR$@_vHuUji_6>i$J@#y4bMN&h@+$@?_B}GLWws^Ut@SG!r63T*h_EjLsO))i1jhZueO|OAhQ29EzHf~j~j<68N(yb zI1w$k(O52dmUmQ)I?Ec%#Reto?x^||PZoI00?qu7j+74XI`jx1CA74NMSSgt_4Rm@ z0(5E|5p4y`AcycI5fUcUD+C}y(x&xy!fLly%WBTQ&5;7CnkeSsk`vTqwq*?%31noC zzbzx~9NND=8Ykq;UIU)^7@WbvE;}ATU``J`D`{|~|2^*Od~V*7LC&Le?+G)l(}kOZ z`!4#`(a0qLryFGnGDk~6-M-FtZpCH5E(+*&4NYDo(DYSEpg5ge@Yg5nI2B& zGN9bH3W-0x*pB!08FK9FFPSG!-G;BlU2S-KFxpZ}xTNFOl>X5#lx`*MtK%@dK$r)j z0qf2+`2=MqMACCc6?zQZmFwE3E_Fj^`mAb{9DifeFVgRuZJXs_7`urhU;-@nx)r)W OBIA;gWUkG?Etw7iVBHx2 diff --git a/scripts/test_files/halo2_kzg/pub_input.bin b/scripts/test_files/halo2_kzg/pub_input.bin deleted file mode 100644 index 304717c779..0000000000 --- a/scripts/test_files/halo2_kzg/pub_input.bin +++ /dev/null @@ -1 +0,0 @@ -œ»/žé^É\sx+¾ÐDÒÁ*Jo¾ÒRo€ôœªs \ No newline at end of file diff --git a/scripts/test_files/halo2_kzg/src/main.rs b/scripts/test_files/halo2_kzg/src/main.rs deleted file mode 100644 index 2aa1547d5f..0000000000 --- a/scripts/test_files/halo2_kzg/src/main.rs +++ /dev/null @@ -1,192 +0,0 @@ -use std::{fs::File, io::{BufWriter, Write}}; -use halo2_proofs::{ - circuit::{Layouter, SimpleFloorPlanner, Value}, - plonk::{ - create_proof, keygen_pk, keygen_vk_custom, Advice, Circuit, Column, - ConstraintSystem, ErrorFront, Fixed, Instance, write_params - }, - poly::{ - kzg::{ - commitment::{KZGCommitmentScheme, ParamsKZG}, - multiopen::ProverSHPLONK, - }, - commitment::Params, - Rotation, - }, - transcript::{ - Blake2bWrite, Challenge255, TranscriptWriterBuffer - }, - SerdeFormat, -}; -use halo2curves::bn256::{Bn256, Fr, G1Affine}; -use rand_core::OsRng; -use ff::{Field, PrimeField}; - -// HALO2 Circuit Example -#[derive(Clone, Copy)] -struct StandardPlonkConfig { - a: Column, - b: Column, - c: Column, - q_a: Column, - q_b: Column, - q_c: Column, - q_ab: Column, - constant: Column, - #[allow(dead_code)] - instance: Column, -} - -impl StandardPlonkConfig { - fn configure(meta: &mut ConstraintSystem) -> Self { - let [a, b, c] = [(); 3].map(|_| meta.advice_column()); - let [q_a, q_b, q_c, q_ab, constant] = [(); 5].map(|_| meta.fixed_column()); - let instance = meta.instance_column(); - - [a, b, c].map(|column| meta.enable_equality(column)); - - meta.create_gate( - "q_a·a + q_b·b + q_c·c + q_ab·a·b + constant + instance = 0", - |meta| { - let [a, b, c] = [a, b, c].map(|column| meta.query_advice(column, Rotation::cur())); - let [q_a, q_b, q_c, q_ab, constant] = [q_a, q_b, q_c, q_ab, constant] - .map(|column| meta.query_fixed(column, Rotation::cur())); - let instance = meta.query_instance(instance, Rotation::cur()); - Some( - q_a * a.clone() - + q_b * b.clone() - + q_c * c - + q_ab * a * b - + constant - + instance, - ) - }, - ); - - StandardPlonkConfig { - a, - b, - c, - q_a, - q_b, - q_c, - q_ab, - constant, - instance, - } - } -} - -#[derive(Clone, Default)] -struct StandardPlonk(Fr); - -impl Circuit for StandardPlonk { - type Config = StandardPlonkConfig; - type FloorPlanner = SimpleFloorPlanner; - - fn without_witnesses(&self) -> Self { - Self::default() - } - - fn configure(meta: &mut ConstraintSystem) -> Self::Config { - StandardPlonkConfig::configure(meta) - } - - fn synthesize( - &self, - config: Self::Config, - mut layouter: impl Layouter, - ) -> Result<(), ErrorFront> { - layouter.assign_region( - || "", - |mut region| { - region.assign_advice(|| "", config.a, 0, || Value::known(self.0))?; - region.assign_fixed(|| "", config.q_a, 0, || Value::known(-Fr::one()))?; - - region.assign_advice(|| "", config.a, 1, || Value::known(-Fr::from(5u64)))?; - for (idx, column) in (1..).zip([ - config.q_a, - config.q_b, - config.q_c, - config.q_ab, - config.constant, - ]) { - region.assign_fixed(|| "", column, 1, || Value::known(Fr::from(idx as u64)))?; - } - - let a = region.assign_advice(|| "", config.a, 2, || Value::known(Fr::one()))?; - a.copy_advice(|| "", &mut region, config.b, 3)?; - a.copy_advice(|| "", &mut region, config.c, 4)?; - Ok(()) - }, - ) - } -} - -use halo2_proofs::poly::kzg::strategy::SingleStrategy; -use halo2_proofs::poly::kzg::multiopen::VerifierSHPLONK; -use halo2_proofs::transcript::Blake2bRead; -use halo2_proofs::plonk::verify_proof; -use halo2_proofs::transcript::TranscriptReadBuffer; -fn main() { - let k = 4; - let circuit = StandardPlonk(Fr::random(OsRng)); - let params = ParamsKZG::::setup(k, OsRng); - let compress_selectors = true; - let vk = keygen_vk_custom(¶ms, &circuit, compress_selectors).expect("vk should not fail"); - let pk = keygen_pk(¶ms, vk.clone(), &circuit).expect("pk should not fail"); - let instances = vec![vec![circuit.0]]; - let cs = vk.clone().cs; - - let mut transcript = Blake2bWrite::<_, _, Challenge255>::init(Vec::new()); - create_proof::< - KZGCommitmentScheme, - ProverSHPLONK<'_, Bn256>, - Challenge255, - _, - Blake2bWrite, G1Affine, Challenge255>, - _, - >( - ¶ms, - &pk, - &[circuit], - &[instances.clone()], - OsRng, - &mut transcript, - ) - .expect("prover should not fail"); - - let proof = transcript.finalize(); - let vk_params = params.verifier_params(); - let strategy = SingleStrategy::new(&vk_params); - let mut transcript = Blake2bRead::<_, _, Challenge255<_>>::init(&proof[..]); - - verify_proof::< - KZGCommitmentScheme, - VerifierSHPLONK, - Challenge255, - Blake2bRead<&[u8], G1Affine, Challenge255>, - SingleStrategy, - >( - &vk_params, &vk, strategy, &[instances.clone()], &mut transcript - ) - .expect("verifier should not fail"); - - //write proof - std::fs::write("proof.bin", &proof[..]) - .expect("should succeed to write new proof"); - - //write public inputs - let f = File::create("pub_input.bin").unwrap(); - let mut writer = BufWriter::new(f); - instances.to_vec().into_iter().flatten().for_each(|fp| { writer.write(&fp.to_repr()).unwrap(); }); - writer.flush().unwrap(); - - let mut vk_buf = Vec::new(); - vk.write(&mut vk_buf, SerdeFormat::RawBytes).unwrap(); - - let mut kzg_params_buf = Vec::new(); - vk_params.write(&mut kzg_params_buf).unwrap(); - - write_params(&kzg_params_buf, cs, &vk_buf, "params.bin").unwrap(); -} From 08f91d1d27133f2b471cc34b581bf968dd2268c9 Mon Sep 17 00:00:00 2001 From: Julian Arce <52429267+JuArce@users.noreply.github.com> Date: Thu, 3 Oct 2024 18:40:57 -0300 Subject: [PATCH 05/12] docs: add warning to use safe password for keystore (#1173) --- docs/1_introduction/2_zkquiz.md | 4 ++++ docs/3_guides/0_submitting_proofs.md | 4 ++++ docs/3_guides/5_using_zkrust.md | 4 ++++ docs/3_guides/6_setup_aligned.md | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/docs/1_introduction/2_zkquiz.md b/docs/1_introduction/2_zkquiz.md index 142590e3ae..c7b287b798 100644 --- a/docs/1_introduction/2_zkquiz.md +++ b/docs/1_introduction/2_zkquiz.md @@ -26,6 +26,10 @@ Next, we will see how to execute ZKQuiz to get your own ZKQuiz NFT! ### 1 - Create Keystore +{% hint style="warning" %} +When creating a new wallet keystore and private key please use strong passwords for your own protection. +{% endhint %} + You can use cast to create a local keystore. If you already have one, you can skip this step. diff --git a/docs/3_guides/0_submitting_proofs.md b/docs/3_guides/0_submitting_proofs.md index 1f30a44b53..06de1d7e23 100644 --- a/docs/3_guides/0_submitting_proofs.md +++ b/docs/3_guides/0_submitting_proofs.md @@ -23,6 +23,10 @@ If you already have a keystore file, you can ignore this section and start sendi You need to have installed [Foundry](https://book.getfoundry.sh/getting-started/installation). +{% hint style="warning" %} +When creating a new wallet keystore and private key please use strong passwords for your own protection. +{% endhint %} + - If you are creating a new account, create a private key with: ```bash diff --git a/docs/3_guides/5_using_zkrust.md b/docs/3_guides/5_using_zkrust.md index c75e15409e..87829bf928 100644 --- a/docs/3_guides/5_using_zkrust.md +++ b/docs/3_guides/5_using_zkrust.md @@ -41,6 +41,10 @@ make install ### 2. Generate a keystore: +{% hint style="warning" %} +When creating a new wallet keystore and private key please use strong passwords for your own protection. +{% endhint %} + You can use cast to create a local keystore. If you already have one, you can skip this step. diff --git a/docs/3_guides/6_setup_aligned.md b/docs/3_guides/6_setup_aligned.md index 48af08f2b3..813d32a176 100644 --- a/docs/3_guides/6_setup_aligned.md +++ b/docs/3_guides/6_setup_aligned.md @@ -284,6 +284,10 @@ Changing operator keys: Operator keys can be changed if needed. +{% hint style="warning" %} +When creating a new wallet keystore and private key please use strong passwords for your own protection. +{% endhint %} + To create a keystore, run: ```bash From 1048b78a944423b61d30c7ca5cd095c552462cb4 Mon Sep 17 00:00:00 2001 From: Julian Arce <52429267+JuArce@users.noreply.github.com> Date: Fri, 4 Oct 2024 15:34:17 -0300 Subject: [PATCH 06/12] refactor(tracker): rewrite operator tracker in elixir (#1000) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Avila Gastón <72628438+avilagaston9@users.noreply.github.com> Co-authored-by: Julian Ventura <43799596+JulianVentura@users.noreply.github.com> Co-authored-by: Julian Ventura Co-authored-by: avilagaston9 Co-authored-by: Urix <43704209+uri-99@users.noreply.github.com> --- Makefile | 38 ++++ config-files/config-operator-1.yaml | 2 +- config-files/config-operator-2.yaml | 2 +- config-files/config-operator-3.yaml | 2 +- config-files/config.yaml | 2 +- telemetry_api/.env.dev | 2 + telemetry_api/.formatter.exs | 5 + telemetry_api/.gitignore | 29 +++ telemetry_api/Dockerfile | 10 ++ telemetry_api/README.md | 63 +++++++ telemetry_api/config/config.exs | 35 ++++ telemetry_api/config/dev.exs | 67 +++++++ telemetry_api/config/prod.exs | 7 + telemetry_api/config/runtime.exs | 117 ++++++++++++ telemetry_api/config/test.exs | 27 +++ telemetry_api/ecto_setup_db.sh | 20 +++ telemetry_api/lib/telemetry_api.ex | 9 + .../lib/telemetry_api/application.ex | 39 ++++ .../contract_managers/delegation_manager.ex | 55 ++++++ .../operator_state_retriever.ex | 88 +++++++++ telemetry_api/lib/telemetry_api/operators.ex | 169 ++++++++++++++++++ .../lib/telemetry_api/operators/operator.ex | 25 +++ telemetry_api/lib/telemetry_api/repo.ex | 5 + .../lib/telemetry_api/signature_verifier.ex | 59 ++++++ telemetry_api/lib/telemetry_api/utils.ex | 53 ++++++ telemetry_api/lib/telemetry_api_web.ex | 65 +++++++ .../controllers/changeset_json.ex | 25 +++ .../controllers/error_json.ex | 21 +++ .../controllers/fallback_controller.ex | 24 +++ .../controllers/operator_controller.ex | 46 +++++ .../controllers/operator_json.ex | 27 +++ .../lib/telemetry_api_web/endpoint.ex | 51 ++++++ telemetry_api/lib/telemetry_api_web/router.ex | 39 ++++ .../lib/telemetry_api_web/telemetry.ex | 92 ++++++++++ telemetry_api/mix.exs | 66 +++++++ telemetry_api/mix.lock | 49 +++++ telemetry_api/priv/abi/DelegationManager.json | 1 + .../priv/abi/IRegistryCoordinator.json | 1 + .../priv/abi/OperatorStateRetriever.json | 1 + .../priv/repo/migrations/.formatter.exs | 4 + .../20240917212329_create_operators.exs | 17 ++ telemetry_api/priv/repo/seeds.exs | 11 ++ telemetry_api/priv/static/favicon.ico | Bin 0 -> 152 bytes telemetry_api/priv/static/robots.txt | 5 + telemetry_api/start.sh | 17 ++ telemetry_api/test/support/conn_case.ex | 38 ++++ telemetry_api/test/support/data_case.ex | 58 ++++++ .../test/support/fixtures/urls_fixtures.ex | 21 +++ .../test/telemetry_api/urls_test.exs | 61 +++++++ .../controllers/error_json_test.exs | 12 ++ .../controllers/operator_controller_test.exs | 88 +++++++++ telemetry_api/test/test_helper.exs | 2 + 52 files changed, 1768 insertions(+), 4 deletions(-) create mode 100644 telemetry_api/.env.dev create mode 100644 telemetry_api/.formatter.exs create mode 100644 telemetry_api/.gitignore create mode 100644 telemetry_api/Dockerfile create mode 100644 telemetry_api/README.md create mode 100644 telemetry_api/config/config.exs create mode 100644 telemetry_api/config/dev.exs create mode 100644 telemetry_api/config/prod.exs create mode 100644 telemetry_api/config/runtime.exs create mode 100644 telemetry_api/config/test.exs create mode 100755 telemetry_api/ecto_setup_db.sh create mode 100644 telemetry_api/lib/telemetry_api.ex create mode 100644 telemetry_api/lib/telemetry_api/application.ex create mode 100644 telemetry_api/lib/telemetry_api/contract_managers/delegation_manager.ex create mode 100644 telemetry_api/lib/telemetry_api/contract_managers/operator_state_retriever.ex create mode 100644 telemetry_api/lib/telemetry_api/operators.ex create mode 100644 telemetry_api/lib/telemetry_api/operators/operator.ex create mode 100644 telemetry_api/lib/telemetry_api/repo.ex create mode 100644 telemetry_api/lib/telemetry_api/signature_verifier.ex create mode 100644 telemetry_api/lib/telemetry_api/utils.ex create mode 100644 telemetry_api/lib/telemetry_api_web.ex create mode 100644 telemetry_api/lib/telemetry_api_web/controllers/changeset_json.ex create mode 100644 telemetry_api/lib/telemetry_api_web/controllers/error_json.ex create mode 100644 telemetry_api/lib/telemetry_api_web/controllers/fallback_controller.ex create mode 100644 telemetry_api/lib/telemetry_api_web/controllers/operator_controller.ex create mode 100644 telemetry_api/lib/telemetry_api_web/controllers/operator_json.ex create mode 100644 telemetry_api/lib/telemetry_api_web/endpoint.ex create mode 100644 telemetry_api/lib/telemetry_api_web/router.ex create mode 100644 telemetry_api/lib/telemetry_api_web/telemetry.ex create mode 100644 telemetry_api/mix.exs create mode 100644 telemetry_api/mix.lock create mode 100644 telemetry_api/priv/abi/DelegationManager.json create mode 100644 telemetry_api/priv/abi/IRegistryCoordinator.json create mode 100644 telemetry_api/priv/abi/OperatorStateRetriever.json create mode 100644 telemetry_api/priv/repo/migrations/.formatter.exs create mode 100644 telemetry_api/priv/repo/migrations/20240917212329_create_operators.exs create mode 100644 telemetry_api/priv/repo/seeds.exs create mode 100644 telemetry_api/priv/static/favicon.ico create mode 100644 telemetry_api/priv/static/robots.txt create mode 100755 telemetry_api/start.sh create mode 100644 telemetry_api/test/support/conn_case.ex create mode 100644 telemetry_api/test/support/data_case.ex create mode 100644 telemetry_api/test/support/fixtures/urls_fixtures.ex create mode 100644 telemetry_api/test/telemetry_api/urls_test.exs create mode 100644 telemetry_api/test/telemetry_api_web/controllers/error_json_test.exs create mode 100644 telemetry_api/test/telemetry_api_web/controllers/operator_controller_test.exs create mode 100644 telemetry_api/test/test_helper.exs diff --git a/Makefile b/Makefile index 9a15756890..d30540750e 100644 --- a/Makefile +++ b/Makefile @@ -656,3 +656,41 @@ tracker_dump_db: @cd operator_tracker && \ docker exec -t tracker-postgres-container pg_dumpall -c -U tracker_user > dump.$$(date +\%Y\%m\%d_\%H\%M\%S).sql @echo "Dumped database successfully to /operator_tracker" + +__TELEMETRY__: +open_telemetry_start: ## Run open telemetry services using telemetry-docker-compose.yaml + ## TODO(juarce) ADD DOCKER COMPOSE + @echo "Running telemetry..." + @docker compose -f telemetry-docker-compose.yaml up -d + +telemetry_start: telemetry_run_db telemetry_ecto_migrate ## Run Telemetry API + @cd telemetry_api && \ + ./start.sh + +telemetry_ecto_migrate: ## + @cd telemetry_api && \ + ./ecto_setup_db.sh + +telemetry_build_db: + @cd telemetry_api && \ + docker build -t telemetry-postgres-image . + +telemetry_run_db: telemetry_build_db telemetry_remove_db_container + @cd telemetry_api && \ + docker run -d --name telemetry-postgres-container -p 5434:5432 -v telemetry-postgres-data:/var/lib/postgresql/data telemetry-postgres-image + +telemetry_remove_db_container: + @docker stop telemetry-postgres-container || true && \ + docker rm telemetry-postgres-container || true + +telemetry_clean_db: telemetry_remove_db_container + @docker volume rm telemetry-postgres-data || true + +telemetry_dump_db: + @cd telemetry_api && \ + docker exec -t telemetry-postgres-container pg_dumpall -c -U telemetry_user > dump.$$(date +\%Y\%m\%d_\%H\%M\%S).sql + @echo "Dumped database successfully to /telemetry_api" + +telemetry_create_env: + @cd telemetry_api && \ + cp .env.dev .env diff --git a/config-files/config-operator-1.yaml b/config-files/config-operator-1.yaml index 4d484e9e24..0a1b1d552d 100644 --- a/config-files/config-operator-1.yaml +++ b/config-files/config-operator-1.yaml @@ -22,7 +22,7 @@ bls: ## Operator Configurations operator: aggregator_rpc_server_ip_port_address: localhost:8090 - operator_tracker_ip_port_address: http://localhost:3030 + operator_tracker_ip_port_address: http://localhost:4001 address: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 earnings_receiver_address: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 delegation_approver_address: '0x0000000000000000000000000000000000000000' diff --git a/config-files/config-operator-2.yaml b/config-files/config-operator-2.yaml index 2c6e1d5a11..8a7c6d8015 100644 --- a/config-files/config-operator-2.yaml +++ b/config-files/config-operator-2.yaml @@ -22,7 +22,7 @@ bls: ## Operator Configurations operator: aggregator_rpc_server_ip_port_address: localhost:8090 - operator_tracker_ip_port_address: http://localhost:3030 + operator_tracker_ip_port_address: http://localhost:4001 address: 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC earnings_receiver_address: 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC delegation_approver_address: '0x0000000000000000000000000000000000000000' diff --git a/config-files/config-operator-3.yaml b/config-files/config-operator-3.yaml index 94aa6b5098..a844e96367 100644 --- a/config-files/config-operator-3.yaml +++ b/config-files/config-operator-3.yaml @@ -22,7 +22,7 @@ bls: ## Operator Configurations operator: aggregator_rpc_server_ip_port_address: localhost:8090 - operator_tracker_ip_port_address: http://localhost:3030 + operator_tracker_ip_port_address: http://localhost:4001 address: 0x90F79bf6EB2c4f870365E785982E1f101E93b906 earnings_receiver_address: 0x90F79bf6EB2c4f870365E785982E1f101E93b906 delegation_approver_address: '0x0000000000000000000000000000000000000000' diff --git a/config-files/config.yaml b/config-files/config.yaml index f6baee7733..f9f3be1e76 100644 --- a/config-files/config.yaml +++ b/config-files/config.yaml @@ -39,7 +39,7 @@ aggregator: ## Operator Configurations operator: aggregator_rpc_server_ip_port_address: localhost:8090 - operator_tracker_ip_port_address: http://localhost:3030 + operator_tracker_ip_port_address: http://localhost:4001 address: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 earnings_receiver_address: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 delegation_approver_address: '0x0000000000000000000000000000000000000000' diff --git a/telemetry_api/.env.dev b/telemetry_api/.env.dev new file mode 100644 index 0000000000..b2a7e87be6 --- /dev/null +++ b/telemetry_api/.env.dev @@ -0,0 +1,2 @@ +ALIGNED_CONFIG_FILE="../contracts/script/output/devnet/alignedlayer_deployment_output.json" +ENVIRONMENT=devnet diff --git a/telemetry_api/.formatter.exs b/telemetry_api/.formatter.exs new file mode 100644 index 0000000000..5971023f6b --- /dev/null +++ b/telemetry_api/.formatter.exs @@ -0,0 +1,5 @@ +[ + import_deps: [:ecto, :ecto_sql, :phoenix], + subdirectories: ["priv/*/migrations"], + inputs: ["*.{ex,exs}", "{config,lib,test}/**/*.{ex,exs}", "priv/*/seeds.exs"] +] diff --git a/telemetry_api/.gitignore b/telemetry_api/.gitignore new file mode 100644 index 0000000000..930813079e --- /dev/null +++ b/telemetry_api/.gitignore @@ -0,0 +1,29 @@ +# The directory Mix will write compiled artifacts to. +/_build/ + +# If you run "mix test --cover", coverage assets end up here. +/cover/ + +# The directory Mix downloads your dependencies sources to. +/deps/ + +# Where 3rd-party dependencies like ExDoc output generated docs. +/doc/ + +# Ignore .fetch files in case you like to edit your project deps locally. +/.fetch + +# If the VM crashes, it generates a dump, let's ignore it too. +erl_crash.dump + +# Also ignore archive artifacts (built via "mix archive.build"). +*.ez + +# Temporary files, for example, from tests. +/tmp/ + +# Ignore package tarball (built via "mix hex.build"). +telemetry_api-*.tar + +# Elixir lsp server +.elixir_ls diff --git a/telemetry_api/Dockerfile b/telemetry_api/Dockerfile new file mode 100644 index 0000000000..0cf033f725 --- /dev/null +++ b/telemetry_api/Dockerfile @@ -0,0 +1,10 @@ +# https://hub.docker.com/_/postgres +FROM postgres:16.3 + +# Environment variables +ENV POSTGRES_USER=telemetry_user +ENV POSTGRES_PASSWORD=telemetry_pass +ENV POSTGRES_DB=telemetry_db + +# Expose the default PostgreSQL port +EXPOSE 5432 diff --git a/telemetry_api/README.md b/telemetry_api/README.md new file mode 100644 index 0000000000..3640c501e0 --- /dev/null +++ b/telemetry_api/README.md @@ -0,0 +1,63 @@ +# TelemetryApi + +## Database Setup + +To create a Postgres container and run it: + +```shell +make telemetry_run_db +``` + +This will create and run the container using the credentials set in `Dockerfile` + +> [!CAUTION] +> Do not use default credentials in Production environments. + +### Delete database + +If you want to delete the container: + +```shell +make telemetry_remove_db_container +``` + +This will remove the container but will keep the storage + +If you also want to delete the storage run: + +```shell +make telemetry_clean_db +``` + +## Run Server + +First you need to manually set the `telemetry_api/.env` file. + +To use `telemetry_api/.env.dev`, run: + +```shell +make telemetry_create_env +``` + +To start your Phoenix server: + +```shell +make telemetry_start +``` + +On startup, it will run ecto migrations. + + * Run `mix setup` to install and setup dependencies + * Start Phoenix endpoint with `mix phx.server` or inside IEx with `iex -S mix phx.server` + +Now you can visit [`localhost:4000`](http://localhost:4000) from your browser. + +## Database Migrations + +This API uses Ecto for migrations. To apply migrations, run: + +```shell +make telemetry_ecto_migrate +``` + + diff --git a/telemetry_api/config/config.exs b/telemetry_api/config/config.exs new file mode 100644 index 0000000000..46bf3bd9cf --- /dev/null +++ b/telemetry_api/config/config.exs @@ -0,0 +1,35 @@ +# This file is responsible for configuring your application +# and its dependencies with the aid of the Config module. +# +# This configuration file is loaded before any dependency and +# is restricted to this project. + +# General application configuration +import Config + +config :telemetry_api, + ecto_repos: [TelemetryApi.Repo], + generators: [timestamp_type: :utc_datetime] + +# Configures the endpoint +config :telemetry_api, TelemetryApiWeb.Endpoint, + url: [host: "localhost"], + adapter: Bandit.PhoenixAdapter, + render_errors: [ + formats: [json: TelemetryApiWeb.ErrorJSON], + layout: false + ], + pubsub_server: TelemetryApi.PubSub, + live_view: [signing_salt: "eQaI7lMW"] + +# Configures Elixir's Logger +config :logger, :console, + format: "$time $metadata[$level] $message\n", + metadata: [:request_id] + +# Use Jason for JSON parsing in Phoenix +config :phoenix, :json_library, Jason + +# Import environment specific config. This must remain at the bottom +# of this file so it overrides the configuration defined above. +import_config "#{config_env()}.exs" diff --git a/telemetry_api/config/dev.exs b/telemetry_api/config/dev.exs new file mode 100644 index 0000000000..59f51fd6ac --- /dev/null +++ b/telemetry_api/config/dev.exs @@ -0,0 +1,67 @@ +import Config + +# Configure your database +config :telemetry_api, TelemetryApi.Repo, + username: "telemetry_user", + password: "telemetry_pass", + database: "telemetry_db", + hostname: "localhost", + port: 5434, + stacktrace: true, + show_sensitive_data_on_connection_error: true, + pool_size: 10 + +# For development, we disable any cache and enable +# debugging and code reloading. +# +# The watchers configuration can be used to run external +# watchers to your application. For example, we can use it +# to bundle .js and .css sources. +config :telemetry_api, TelemetryApiWeb.Endpoint, + # Binding to loopback ipv4 address prevents access from other machines. + # Change to `ip: {0, 0, 0, 0}` to allow access from other machines. + http: [ip: {127, 0, 0, 1}, port: 4001], + check_origin: false, + code_reloader: true, + debug_errors: true, + secret_key_base: "SKxKWZhd8cfUXMUqskUHvegw8P46kkfwIYWTW86tsqn+t6M2S1HUFjTqgVWAkvX0", + watchers: [] + +# ## SSL Support +# +# In order to use HTTPS in development, a self-signed +# certificate can be generated by running the following +# Mix task: +# +# mix phx.gen.cert +# +# Run `mix help phx.gen.cert` for more information. +# +# The `http:` config above can be replaced with: +# +# https: [ +# port: 4001, +# cipher_suite: :strong, +# keyfile: "priv/cert/selfsigned_key.pem", +# certfile: "priv/cert/selfsigned.pem" +# ], +# +# If desired, both `http:` and `https:` keys can be +# configured to run both http and https servers on +# different ports. + +# Enable dev routes for dashboard and mailbox +# config :telemetry_api, dev_routes: true + +# Do not include metadata nor timestamps in development logs +config :logger, :console, format: "[$level] $message\n" + +# Set a higher stacktrace during development. Avoid configuring such +# in production as building large stacktraces may be expensive. +config :phoenix, :stacktrace_depth, 20 + +# Initialize plugs at runtime for faster development compilation +config :phoenix, :plug_init_mode, :runtime + +# Configure ethereumex url +config :ethereumex, url: "http://localhost:8545" diff --git a/telemetry_api/config/prod.exs b/telemetry_api/config/prod.exs new file mode 100644 index 0000000000..1fe2d9e854 --- /dev/null +++ b/telemetry_api/config/prod.exs @@ -0,0 +1,7 @@ +import Config + +# Do not print debug messages in production +config :logger, level: :info + +# Runtime production configuration, including reading +# of environment variables, is done on config/runtime.exs. diff --git a/telemetry_api/config/runtime.exs b/telemetry_api/config/runtime.exs new file mode 100644 index 0000000000..005e68aad6 --- /dev/null +++ b/telemetry_api/config/runtime.exs @@ -0,0 +1,117 @@ +import Config + +# config/runtime.exs is executed for all environments, including +# during releases. It is executed after compilation and before the +# system starts, so it is typically used to load production configuration +# and secrets from environment variables or elsewhere. Do not define +# any compile-time configuration in here, as it won't be applied. +# The block below contains prod specific runtime configuration. + +# ## Using releases +# +# If you use `mix release`, you need to explicitly enable the server +# by passing the PHX_SERVER=true when you start it: +# +# PHX_SERVER=true bin/telemetry_api start +# +# Alternatively, you can use `mix phx.gen.release` to generate a `bin/server` +# script that automatically sets the env var above. +if System.get_env("PHX_SERVER") do + config :telemetry_api, TelemetryApiWeb.Endpoint, server: true +end + +if config_env() == :prod do + database_url = + System.get_env("DATABASE_URL") || + raise """ + environment variable DATABASE_URL is missing. + For example: ecto://USER:PASS@HOST/DATABASE + """ + + maybe_ipv6 = if System.get_env("ECTO_IPV6") in ~w(true 1), do: [:inet6], else: [] + + config :telemetry_api, TelemetryApi.Repo, + # ssl: true, + url: database_url, + pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"), + socket_options: maybe_ipv6 + + # The secret key base is used to sign/encrypt cookies and other secrets. + # A default value is used in config/dev.exs and config/test.exs but you + # want to use a different value for prod and you most likely don't want + # to check this value into version control, so we use an environment + # variable instead. + secret_key_base = + System.get_env("SECRET_KEY_BASE") || + raise """ + environment variable SECRET_KEY_BASE is missing. + You can generate one by calling: mix phx.gen.secret + """ + + host = System.get_env("PHX_HOST") || "example.com" + port = String.to_integer(System.get_env("PORT") || "4001") + + config :telemetry_api, :dns_cluster_query, System.get_env("DNS_CLUSTER_QUERY") + + config :telemetry_api, TelemetryApiWeb.Endpoint, + url: [host: host, port: 443, scheme: "https"], + http: [ + # Enable IPv6 and bind on all interfaces. + # Set it to {0, 0, 0, 0, 0, 0, 0, 1} for local network only access. + # See the documentation on https://hexdocs.pm/bandit/Bandit.html#t:options/0 + # for details about using IPv6 vs IPv4 and loopback vs public addresses. + ip: {0, 0, 0, 0, 0, 0, 0, 0}, + port: port + ], + secret_key_base: secret_key_base + + # ## Ethereum RPC calls configuration + + # Node RPC URL + rpc_url = System.get_env("RPC_URL") || + raise """ + environment variable RPC_URL is missing. + """ + + # Configure ethereumex url + config :ethereumex, url: rpc_url + + # Aligned configuration file path + System.get_env("ALIGNED_CONFIG_FILE") || + raise """ + environment variable ALIGNED_CONFIG_FILE is missing. + """ + + + # ## SSL Support + # + # To get SSL working, you will need to add the `https` key + # to your endpoint configuration: + # + # config :telemetry_api, TelemetryApiWeb.Endpoint, + # https: [ + # ..., + # port: 443, + # cipher_suite: :strong, + # keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"), + # certfile: System.get_env("SOME_APP_SSL_CERT_PATH") + # ] + # + # The `cipher_suite` is set to `:strong` to support only the + # latest and more secure SSL ciphers. This means old browsers + # and clients may not be supported. You can set it to + # `:compatible` for wider support. + # + # `:keyfile` and `:certfile` expect an absolute path to the key + # and cert in disk or a relative path inside priv, for example + # "priv/ssl/server.key". For all supported SSL configuration + # options, see https://hexdocs.pm/plug/Plug.SSL.html#configure/1 + # + # We also recommend setting `force_ssl` in your config/prod.exs, + # ensuring no data is ever sent via http, always redirecting to https: + # + # config :telemetry_api, TelemetryApiWeb.Endpoint, + # force_ssl: [hsts: true] + # + # Check `Plug.SSL` for all available options in `force_ssl`. +end diff --git a/telemetry_api/config/test.exs b/telemetry_api/config/test.exs new file mode 100644 index 0000000000..5916d25d5d --- /dev/null +++ b/telemetry_api/config/test.exs @@ -0,0 +1,27 @@ +import Config + +# Configure your database +# +# The MIX_TEST_PARTITION environment variable can be used +# to provide built-in test partitioning in CI environment. +# Run `mix help test` for more information. +config :telemetry_api, TelemetryApi.Repo, + username: "postgres", + password: "postgres", + hostname: "localhost", + database: "telemetry_api_test#{System.get_env("MIX_TEST_PARTITION")}", + pool: Ecto.Adapters.SQL.Sandbox, + pool_size: System.schedulers_online() * 2 + +# We don't run a server during test. If one is required, +# you can enable the server option below. +config :telemetry_api, TelemetryApiWeb.Endpoint, + http: [ip: {127, 0, 0, 1}, port: 4002], + secret_key_base: "oxlWGXR4lI6jsDZfizxmFwhPFn9vjc6rWqsdAnu5rlTmluTstw3/6YBkB5OGKi5m", + server: false + +# Print only warnings and errors during test +config :logger, level: :warning + +# Initialize plugs at runtime for faster test compilation +config :phoenix, :plug_init_mode, :runtime diff --git a/telemetry_api/ecto_setup_db.sh b/telemetry_api/ecto_setup_db.sh new file mode 100755 index 0000000000..4a225ed24a --- /dev/null +++ b/telemetry_api/ecto_setup_db.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +source .env + +# Add new environment variables here +env_vars=( + "ENVIRONMENT" + "ALIGNED_CONFIG_FILE" +) + +for var in "${env_vars[@]}"; do + export "$var=${!var}" +done + +mix deps.get + +mix compile --force #force recompile to get the latest .env values + +mix ecto.create +mix ecto.migrate diff --git a/telemetry_api/lib/telemetry_api.ex b/telemetry_api/lib/telemetry_api.ex new file mode 100644 index 0000000000..6d8157c74b --- /dev/null +++ b/telemetry_api/lib/telemetry_api.ex @@ -0,0 +1,9 @@ +defmodule TelemetryApi do + @moduledoc """ + TelemetryApi keeps the contexts that define your domain + and business logic. + + Contexts are also responsible for managing your data, regardless + if it comes from the database, an external API or others. + """ +end diff --git a/telemetry_api/lib/telemetry_api/application.ex b/telemetry_api/lib/telemetry_api/application.ex new file mode 100644 index 0000000000..ebf12b5cfb --- /dev/null +++ b/telemetry_api/lib/telemetry_api/application.ex @@ -0,0 +1,39 @@ +defmodule TelemetryApi.Application do + # See https://hexdocs.pm/elixir/Application.html + # for more information on OTP Applications + @moduledoc false + + use Application + + @impl true + def start(_type, _args) do + children = [ + TelemetryApiWeb.Telemetry, + TelemetryApi.Repo, + {DNSCluster, query: Application.get_env(:telemetry_api, :dns_cluster_query) || :ignore}, + {Phoenix.PubSub, name: TelemetryApi.PubSub}, + # Start a worker by calling: TelemetryApi.Worker.start_link(arg) + # {TelemetryApi.Worker, arg}, + # Start to serve requests, typically the last entry + TelemetryApiWeb.Endpoint + ] + + # See https://hexdocs.pm/elixir/Supervisor.html + # for other strategies and supported options + opts = [strategy: :one_for_one, name: TelemetryApi.Supervisor] + + # Now we fetch operators data from smart contract to fill db + with {:ok, pid} <- Supervisor.start_link(children, opts), + {:ok, _} <- TelemetryApi.Operators.fetch_all_operators() do + {:ok, pid} + end + end + + # Tell Phoenix to update the endpoint configuration + # whenever the application is updated. + @impl true + def config_change(changed, _new, removed) do + TelemetryApiWeb.Endpoint.config_change(changed, removed) + :ok + end +end diff --git a/telemetry_api/lib/telemetry_api/contract_managers/delegation_manager.ex b/telemetry_api/lib/telemetry_api/contract_managers/delegation_manager.ex new file mode 100644 index 0000000000..920c7a8f56 --- /dev/null +++ b/telemetry_api/lib/telemetry_api/contract_managers/delegation_manager.ex @@ -0,0 +1,55 @@ +defmodule TelemetryApi.ContractManagers.DelegationManager do + alias TelemetryApi.ContractManagers.DelegationManager + require Logger + + @environment System.get_env("ENVIRONMENT") + + @first_block (case @environment do + "devnet" -> 0 + "holesky" -> 1_210_000 + "mainnet" -> 20_020_000 + _ -> raise("Invalid environment") + end) + + eigenlayer_output_file_path = + "../contracts/script/output/#{@environment}/eigenlayer_deployment_output.json" + + {status, config_json_string} = File.read(eigenlayer_output_file_path) + + case status do + :ok -> + Logger.debug("Eigenlayer deployment file read successfully") + + :error -> + raise("Config file not read successfully") + end + + @contract_address Jason.decode!(config_json_string) + |> Map.get("addresses") + |> Map.get("delegationManager") + + use Ethers.Contract, + abi_file: "priv/abi/DelegationManager.json", + default_address: @contract_address + + def get_contract_address() do + @contract_address + end + + def get_operator_url(operator_address) do + DelegationManager.EventFilters.operator_metadata_uri_updated(operator_address) + |> Ethers.get_logs(fromBlock: @first_block) + |> case do + {:ok, data} -> + # The head (hd) is the most recent entry + url = List.last(data).data |> hd() + {:ok, url} + + {:error, reason} -> + {:error, reason} + + other -> + {:error, "Unexpected response getting operator url: #{inspect(other)}"} + end + end +end diff --git a/telemetry_api/lib/telemetry_api/contract_managers/operator_state_retriever.ex b/telemetry_api/lib/telemetry_api/contract_managers/operator_state_retriever.ex new file mode 100644 index 0000000000..a7ed9fbd6f --- /dev/null +++ b/telemetry_api/lib/telemetry_api/contract_managers/operator_state_retriever.ex @@ -0,0 +1,88 @@ +defmodule TelemetryApi.ContractManagers.OperatorStateRetriever do + require Logger + alias TelemetryApi.ContractManagers.OperatorStateRetriever + + @aligned_config_file System.get_env("ALIGNED_CONFIG_FILE") + + config_file_path = + case @aligned_config_file do + nil -> raise("ALIGNED_CONFIG_FILE not set in .env") + file -> file + end + + {status, config_json_string} = File.read(config_file_path) + + case status do + :ok -> + Logger.debug("Aligned deployment file read successfully") + + :error -> + raise("Config file not read successfully") + end + + @contract_address Jason.decode!(config_json_string) + |> Map.get("addresses") + |> Map.get("operatorStateRetriever") + + @registry_coordinator_address Jason.decode!(config_json_string) + |> Map.get("addresses") + |> Map.get("registryCoordinator") + |> String.trim_leading("0x") + |> Base.decode16!(case: :mixed) + + use Ethers.Contract, + abi_file: "priv/abi/OperatorStateRetriever.json", + default_address: @contract_address + + # -------- PUBLIC FUNCTIONS -------- + + def get_contract_address() do + @contract_address + end + + def get_operators() do + with {:ok, block_number} <- Ethers.current_block_number(), + {:ok, operators_state} <- fetch_operators_state(block_number) do + parse_operators(operators_state) + else + {:error, %{reason: :econnrefused}} -> {:error, "Blockchain is not reachable"} + end + end + + # -------- PRIVATE FUNCTIONS -------- + + defp parse_operators(operators_state) do + operators = + operators_state + |> Enum.map(fn {address, id, stake} -> + id = "0x" <> Base.encode16(id, case: :lower) + address = address |> String.downcase() + + %{ + id: id, + address: address, + stake: Integer.to_string(stake) + } + end) + + {:ok, operators} + end + + defp fetch_operators_state(block_number) do + quorum_numbers = <<0>> + + response = + OperatorStateRetriever.get_operator_state( + @registry_coordinator_address, + quorum_numbers, + block_number + ) + |> Ethers.call() + + case response do + {:ok, [operators | _]} -> {:ok, operators} + {:error, message} -> {:error, message} + _ -> {:error, "Bad formated data received from OperatorStateRetriever::getOperatorState"} + end + end +end diff --git a/telemetry_api/lib/telemetry_api/operators.ex b/telemetry_api/lib/telemetry_api/operators.ex new file mode 100644 index 0000000000..5b16154c8a --- /dev/null +++ b/telemetry_api/lib/telemetry_api/operators.ex @@ -0,0 +1,169 @@ +defmodule TelemetryApi.Operators do + @moduledoc """ + The Operators context. + """ + + import Ecto.Query, warn: false + alias TelemetryApi.Repo + + alias TelemetryApi.Operators.Operator + alias TelemetryApi.ContractManagers.OperatorStateRetriever + alias TelemetryApi.ContractManagers.DelegationManager + + @doc """ + Returns the list of operators. + + ## Examples + + iex> list_operators() + [%Operator{}, ...] + + """ + def list_operators do + Repo.all(Operator) + end + + @doc """ + Gets a single operator. + + ## Examples + + iex> get_operator("some_address"}) + %Operator{} + + iex> get_operator("non_existent_address") + nil + + """ + def get_operator(address) do + Repo.get(Operator, address) + end + + @doc """ + - Fetches the state of all operators from the RegistryCoordinator ({address, id, stake}). + - Fetches the metadata of all operators from the DelegationManager. + - Stores all data in the database. + + ## Examples + + iex> fetch_all_operators() + {:ok, %Ecto.Changeset{}} + + iex> fetch_all_operators() + {:error, string} + + """ + def fetch_all_operators() do + with {:ok, operators} <- OperatorStateRetriever.get_operators() do + Enum.map(operators, fn op_data -> + with {:ok, full_operator_data} <- add_operator_metadata(op_data) do + case Repo.get(Operator, op_data.address) do + nil -> %Operator{} + operator -> operator + end + |> Operator.changeset(full_operator_data) + |> Repo.insert_or_update() + end + end) + |> TelemetryApi.Utils.check_list_status("Error fetching operators metadata") + end + end + + # Adds operator metadata to received operator. + + ### Examples + + # iex> add_operator_metadata(operator) + # {:ok, operator_with_metadata} + # + # iex> add_operator_metadata(operator) + # {:error, string} + # + defp add_operator_metadata(op_data) do + with {:ok, url} <- DelegationManager.get_operator_url(op_data.address), + {:ok, metadata} <- TelemetryApi.Utils.fetch_json_data(url) do + operator = %{ + id: op_data.id, + address: op_data.address, + stake: op_data.stake, + name: Map.get(metadata, "name") + } + + {:ok, operator} + end + end + + @doc """ + Updates an operator's version. + + ## Examples + + iex> update_operator_version(%{field: value}) + {:ok, %Ecto.Changeset{}} + + iex> update_operator_version(%{field: bad_value}) + {:error, string} + + """ + def update_operator_version(%{"version" => version, "signature" => signature}) do + with {:ok, address} <- SignatureVerifier.recover_address(version, signature) do + address = "0x" <> address + # We only want to allow changes on version + changes = %{ + version: version + } + + case Repo.get(Operator, address) do + nil -> {:error, "Provided address does not correspond to any registered operator"} + operator -> operator |> Operator.changeset(changes) |> Repo.insert_or_update() + end + end + end + + @doc """ + Updates a operator. + + ## Examples + + iex> update_operator(operator, %{field: new_value}) + {:ok, %Operator{}} + + iex> update_operator(operator, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_operator(%Operator{} = operator, attrs) do + operator + |> Operator.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a operator. + + ## Examples + + iex> delete_operator(operator) + {:ok, %Operator{}} + + iex> delete_operator(operator) + {:error, %Ecto.Changeset{}} + + """ + def delete_operator(%Operator{} = operator) do + Repo.delete(operator) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking operator changes. + + ## Examples + + iex> change_operator(operator) + %Ecto.Changeset{data: %Operator{}} + + """ + def change_operator(%Operator{} = operator, attrs \\ %{}) do + Operator.changeset(operator, attrs) + end +end diff --git a/telemetry_api/lib/telemetry_api/operators/operator.ex b/telemetry_api/lib/telemetry_api/operators/operator.ex new file mode 100644 index 0000000000..6c2892d742 --- /dev/null +++ b/telemetry_api/lib/telemetry_api/operators/operator.ex @@ -0,0 +1,25 @@ +defmodule TelemetryApi.Operators.Operator do + use Ecto.Schema + import Ecto.Changeset + + @primary_key {:address, :string, []} + schema "operators" do + field :id, :string + field :stake, :string + field :name, :string + field :version, :string + + timestamps(type: :utc_datetime) + end + + @doc false + def changeset(operator, attrs) do + operator + |> cast(attrs, [:address, :id, :stake, :name, :version]) + |> validate_required([:address, :id, :name, :stake]) + end +end + +defimpl Phoenix.Param, for: TelemetryApi.Operators.Operator do + def to_param(%TelemetryApi.Operators.Operator{address: address}), do: address +end diff --git a/telemetry_api/lib/telemetry_api/repo.ex b/telemetry_api/lib/telemetry_api/repo.ex new file mode 100644 index 0000000000..8f57bf72eb --- /dev/null +++ b/telemetry_api/lib/telemetry_api/repo.ex @@ -0,0 +1,5 @@ +defmodule TelemetryApi.Repo do + use Ecto.Repo, + otp_app: :telemetry_api, + adapter: Ecto.Adapters.Postgres +end diff --git a/telemetry_api/lib/telemetry_api/signature_verifier.ex b/telemetry_api/lib/telemetry_api/signature_verifier.ex new file mode 100644 index 0000000000..c8646801cb --- /dev/null +++ b/telemetry_api/lib/telemetry_api/signature_verifier.ex @@ -0,0 +1,59 @@ +defmodule SignatureVerifier do + alias ExSecp256k1 + alias ExKeccak + alias :binary, as: Binary + + # Hash the version string using Keccak256 + defp hash_version(version) do + ExKeccak.hash_256(version) + end + + # Recover the public key from the signature and hashed version + defp recover_public_key(hash, signature, recovery_id) do + case ExSecp256k1.recover_compact(hash, signature, recovery_id) do + {:ok, public_key} -> {:ok, public_key} + _error -> {:error, "Failed to recover public key"} + end + end + + # Convert public key to Ethereum-like address + def public_key_to_address(public_key) do + # Remove the first byte (which is 0x04 for uncompressed public keys) + public_key = binary_part(public_key, 1, 64) + + # Hash the public key with Keccak256 + public_key_hash = ExKeccak.hash_256(public_key) + + # Get the last 20 bytes (Ethereum address format) + <<_::binary-size(12), address::binary-size(20)>> = public_key_hash + address + end + + @doc """ + Get the address from the version and signature + + Examples + iex> version = "v0.7.0" + iex> signature = N1UJOvjJT1W39MdQUYAOsKZj4aQ1Sjkwp31NJgafpjoUniGt24tSaLw6TlTKP68AkLtsIFoVEaJcJDj7TyvhLQA= + iex> recover_address(version, signature) + "0x..." + """ + def recover_address(version, signature) do + version_hash = hash_version(version) + # Signature contains r, s and v (recovery_id) + # r<>s is 64 bytes. + # v is the last byte of the signature and have to be converted to integer + {:ok, binary_signature} = Base.decode64(signature) + signature_len = byte_size(binary_signature) + rs = binary_part(binary_signature, 0, signature_len - 1) + recovery_id = Binary.decode_unsigned(binary_part(binary_signature, signature_len - 1, 1)) + + with {:ok, address} <- recover_public_key(version_hash, rs, recovery_id) do + addr = + public_key_to_address(address) + |> Base.encode16(case: :lower) + + {:ok, addr} + end + end +end diff --git a/telemetry_api/lib/telemetry_api/utils.ex b/telemetry_api/lib/telemetry_api/utils.ex new file mode 100644 index 0000000000..073a7a7df9 --- /dev/null +++ b/telemetry_api/lib/telemetry_api/utils.ex @@ -0,0 +1,53 @@ +defmodule TelemetryApi.Utils do + @moduledoc """ + Some utility functions + """ + + @doc """ + Fetches the provided url and returns a json decoded map + + ## Examples + + iex> fetch_json_data(url) + {:ok, data} + + iex> fetch_json_data(url) + {:error, message} + """ + def fetch_json_data(url) do + case HTTPoison.get(url) do + {:ok, %HTTPoison.Response{status_code: 200, body: body}} -> + {:ok, Jason.decode!(body)} + + {:ok, %HTTPoison.Response{status_code: status_code}} -> + {:error, "Request failed with status #{status_code}"} + + {:error, %HTTPoison.Error{reason: reason}} -> + {:error, "HTTP request failed: #{reason}"} + end + end + + @doc """ + Unwraps inner element status + + ## Examples + + iex> error_message = "Error found on list" + iex> list = [{:ok, 2}, {:ok, 3}] + iex> check_list_status(list, error_message) + {:ok, list} + + iex> list = [{:ok, 2}, {:ok, 3}, {:error, "this is an error"}] + iex> check_list_status(list, error_message) + {:error, "Error found on list"} + """ + def check_list_status(list, error_message) do + case Enum.find(list, fn {status, _} -> status == :error end) do + nil -> + {:ok, Enum.map(list, fn {:ok, value} -> value end)} + + {:error, _} -> + {:error, error_message} + end + end +end diff --git a/telemetry_api/lib/telemetry_api_web.ex b/telemetry_api/lib/telemetry_api_web.ex new file mode 100644 index 0000000000..90b61b6032 --- /dev/null +++ b/telemetry_api/lib/telemetry_api_web.ex @@ -0,0 +1,65 @@ +defmodule TelemetryApiWeb do + @moduledoc """ + The entrypoint for defining your web interface, such + as controllers, components, channels, and so on. + + This can be used in your application as: + + use TelemetryApiWeb, :controller + use TelemetryApiWeb, :html + + The definitions below will be executed for every controller, + component, etc, so keep them short and clean, focused + on imports, uses and aliases. + + Do NOT define functions inside the quoted expressions + below. Instead, define additional modules and import + those modules here. + """ + + def static_paths, do: ~w(assets fonts images favicon.ico robots.txt) + + def router do + quote do + use Phoenix.Router, helpers: false + + # Import common connection and controller functions to use in pipelines + import Plug.Conn + import Phoenix.Controller + end + end + + def channel do + quote do + use Phoenix.Channel + end + end + + def controller do + quote do + use Phoenix.Controller, + formats: [:html, :json], + layouts: [html: TelemetryApiWeb.Layouts] + + import Plug.Conn + + unquote(verified_routes()) + end + end + + def verified_routes do + quote do + use Phoenix.VerifiedRoutes, + endpoint: TelemetryApiWeb.Endpoint, + router: TelemetryApiWeb.Router, + statics: TelemetryApiWeb.static_paths() + end + end + + @doc """ + When used, dispatch to the appropriate controller/live_view/etc. + """ + defmacro __using__(which) when is_atom(which) do + apply(__MODULE__, which, []) + end +end diff --git a/telemetry_api/lib/telemetry_api_web/controllers/changeset_json.ex b/telemetry_api/lib/telemetry_api_web/controllers/changeset_json.ex new file mode 100644 index 0000000000..5085846f90 --- /dev/null +++ b/telemetry_api/lib/telemetry_api_web/controllers/changeset_json.ex @@ -0,0 +1,25 @@ +defmodule TelemetryApiWeb.ChangesetJSON do + @doc """ + Renders changeset errors. + """ + def error(%{changeset: changeset}) do + # When encoded, the changeset returns its errors + # as a JSON object. So we just pass it forward. + %{errors: Ecto.Changeset.traverse_errors(changeset, &translate_error/1)} + end + + defp translate_error({msg, opts}) do + # You can make use of gettext to translate error messages by + # uncommenting and adjusting the following code: + + # if count = opts[:count] do + # Gettext.dngettext(TelemetryApiWeb.Gettext, "errors", msg, msg, count, opts) + # else + # Gettext.dgettext(TelemetryApiWeb.Gettext, "errors", msg, opts) + # end + + Enum.reduce(opts, msg, fn {key, value}, acc -> + String.replace(acc, "%{#{key}}", fn _ -> to_string(value) end) + end) + end +end diff --git a/telemetry_api/lib/telemetry_api_web/controllers/error_json.ex b/telemetry_api/lib/telemetry_api_web/controllers/error_json.ex new file mode 100644 index 0000000000..6c619a972e --- /dev/null +++ b/telemetry_api/lib/telemetry_api_web/controllers/error_json.ex @@ -0,0 +1,21 @@ +defmodule TelemetryApiWeb.ErrorJSON do + @moduledoc """ + This module is invoked by your endpoint in case of errors on JSON requests. + + See config/config.exs. + """ + + # If you want to customize a particular status code, + # you may add your own clauses, such as: + # + # def render("500.json", _assigns) do + # %{errors: %{detail: "Internal Server Error"}} + # end + + # By default, Phoenix returns the status message from + # the template name. For example, "404.json" becomes + # "Not Found". + def render(template, _assigns) do + %{errors: %{detail: Phoenix.Controller.status_message_from_template(template)}} + end +end diff --git a/telemetry_api/lib/telemetry_api_web/controllers/fallback_controller.ex b/telemetry_api/lib/telemetry_api_web/controllers/fallback_controller.ex new file mode 100644 index 0000000000..2b396181fb --- /dev/null +++ b/telemetry_api/lib/telemetry_api_web/controllers/fallback_controller.ex @@ -0,0 +1,24 @@ +defmodule TelemetryApiWeb.FallbackController do + @moduledoc """ + Translates controller action results into valid `Plug.Conn` responses. + + See `Phoenix.Controller.action_fallback/1` for more details. + """ + use TelemetryApiWeb, :controller + + # This clause handles errors returned by Ecto's insert/update/delete. + def call(conn, {:error, %Ecto.Changeset{} = changeset}) do + conn + |> put_status(:unprocessable_entity) + |> put_view(json: TelemetryApiWeb.ChangesetJSON) + |> render(:error, changeset: changeset) + end + + # This clause is an example of how to handle resources that cannot be found. + def call(conn, {:error, :not_found}) do + conn + |> put_status(:not_found) + |> put_view(html: TelemetryApiWeb.ErrorHTML, json: TelemetryApiWeb.ErrorJSON) + |> render(:"404") + end +end diff --git a/telemetry_api/lib/telemetry_api_web/controllers/operator_controller.ex b/telemetry_api/lib/telemetry_api_web/controllers/operator_controller.ex new file mode 100644 index 0000000000..3103136b06 --- /dev/null +++ b/telemetry_api/lib/telemetry_api_web/controllers/operator_controller.ex @@ -0,0 +1,46 @@ +defmodule TelemetryApiWeb.OperatorController do + use TelemetryApiWeb, :controller + + alias TelemetryApi.Operators + alias TelemetryApi.Operators.Operator + + action_fallback TelemetryApiWeb.FallbackController + + defp return_error(conn, message) do + conn + |> put_status(:bad_request) + |> put_resp_content_type("application/json") + |> send_resp(:bad_request, Jason.encode!(%{error: message})) + end + + def index(conn, _params) do + operators = Operators.list_operators() + render(conn, :index, operators: operators) + end + + def create_or_update(conn, operator_params) do + case Operators.update_operator_version(operator_params) do + {:ok, %Operator{} = operator} -> + conn + |> put_status(:created) + |> put_resp_header("location", ~p"/api/operators/#{operator}") + |> render(:show, operator: operator) + + {:error, message} -> + return_error(conn, message) + end + end + + def show(conn, %{"id" => address}) do + case Operators.get_operator(address) do + %Operator{} = operator -> + render(conn, :show, operator: operator) + + nil -> + conn + |> put_status(:not_found) + |> put_view(TelemetryApiWeb.ErrorJSON) + |> render("404.json", %{}) + end + end +end diff --git a/telemetry_api/lib/telemetry_api_web/controllers/operator_json.ex b/telemetry_api/lib/telemetry_api_web/controllers/operator_json.ex new file mode 100644 index 0000000000..f267d1788e --- /dev/null +++ b/telemetry_api/lib/telemetry_api_web/controllers/operator_json.ex @@ -0,0 +1,27 @@ +defmodule TelemetryApiWeb.OperatorJSON do + alias TelemetryApi.Operators.Operator + + @doc """ + Renders a list of operators. + """ + def index(%{operators: operators}) do + for(operator <- operators, do: data(operator)) + end + + @doc """ + Renders a single operator. + """ + def show(%{operator: operator}) do + data(operator) + end + + defp data(%Operator{} = operator) do + %{ + address: operator.address, + id: operator.id, + stake: operator.stake, + name: operator.name, + version: operator.version + } + end +end diff --git a/telemetry_api/lib/telemetry_api_web/endpoint.ex b/telemetry_api/lib/telemetry_api_web/endpoint.ex new file mode 100644 index 0000000000..897e4939d0 --- /dev/null +++ b/telemetry_api/lib/telemetry_api_web/endpoint.ex @@ -0,0 +1,51 @@ +defmodule TelemetryApiWeb.Endpoint do + use Phoenix.Endpoint, otp_app: :telemetry_api + + # The session will be stored in the cookie and signed, + # this means its contents can be read but not tampered with. + # Set :encryption_salt if you would also like to encrypt it. + @session_options [ + store: :cookie, + key: "_telemetry_api_key", + signing_salt: "3K5HyxYk", + same_site: "Lax" + ] + + socket "/live", Phoenix.LiveView.Socket, + websocket: [connect_info: [session: @session_options]], + longpoll: [connect_info: [session: @session_options]] + + # Serve at "/" the static files from "priv/static" directory. + # + # You should set gzip to true if you are running phx.digest + # when deploying your static files in production. + plug Plug.Static, + at: "/", + from: :telemetry_api, + gzip: false, + only: TelemetryApiWeb.static_paths() + + # Code reloading can be explicitly enabled under the + # :code_reloader configuration of your endpoint. + if code_reloading? do + plug Phoenix.CodeReloader + plug Phoenix.Ecto.CheckRepoStatus, otp_app: :telemetry_api + end + + # plug Phoenix.LiveDashboard.RequestLogger, + # param_key: "request_logger", + # cookie_key: "request_logger" + + plug Plug.RequestId + plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint] + + plug Plug.Parsers, + parsers: [:urlencoded, :multipart, :json], + pass: ["*/*"], + json_decoder: Phoenix.json_library() + + plug Plug.MethodOverride + plug Plug.Head + plug Plug.Session, @session_options + plug TelemetryApiWeb.Router +end diff --git a/telemetry_api/lib/telemetry_api_web/router.ex b/telemetry_api/lib/telemetry_api_web/router.ex new file mode 100644 index 0000000000..aac9c9804a --- /dev/null +++ b/telemetry_api/lib/telemetry_api_web/router.ex @@ -0,0 +1,39 @@ +defmodule TelemetryApiWeb.Router do + use TelemetryApiWeb, :router + + pipeline :api do + plug :accepts, ["json"] + end + + scope "/api", TelemetryApiWeb do + pipe_through :api + + get "/operators", OperatorController, :index + get "/operators/:id", OperatorController, :show + post "/operators", OperatorController, :create_or_update + end + + scope "/versions", TelemetryApiWeb do + pipe_through :api + + get "/", OperatorController, :index + get "/:id", OperatorController, :show + post "/", OperatorController, :create_or_update + end + + # Enable LiveDashboard in development + # if Application.compile_env(:telemetry_api, :dev_routes) do + # # If you want to use the LiveDashboard in production, you should put + # # it behind authentication and allow only admins to access it. + # # If your application does not have an admins-only section yet, + # # you can use Plug.BasicAuth to set up some basic authentication + # # as long as you are also using SSL (which you should anyway). + # import Phoenix.LiveDashboard.Router + + # scope "/dev" do + # pipe_through [:fetch_session, :protect_from_forgery] + + # live_dashboard "/dashboard", metrics: TelemetryApiWeb.Telemetry + # end + # end +end diff --git a/telemetry_api/lib/telemetry_api_web/telemetry.ex b/telemetry_api/lib/telemetry_api_web/telemetry.ex new file mode 100644 index 0000000000..b19a5a70ca --- /dev/null +++ b/telemetry_api/lib/telemetry_api_web/telemetry.ex @@ -0,0 +1,92 @@ +defmodule TelemetryApiWeb.Telemetry do + use Supervisor + import Telemetry.Metrics + + def start_link(arg) do + Supervisor.start_link(__MODULE__, arg, name: __MODULE__) + end + + @impl true + def init(_arg) do + children = [ + # Telemetry poller will execute the given period measurements + # every 10_000ms. Learn more here: https://hexdocs.pm/telemetry_metrics + {:telemetry_poller, measurements: periodic_measurements(), period: 10_000} + # Add reporters as children of your supervision tree. + # {Telemetry.Metrics.ConsoleReporter, metrics: metrics()} + ] + + Supervisor.init(children, strategy: :one_for_one) + end + + def metrics do + [ + # Phoenix Metrics + summary("phoenix.endpoint.start.system_time", + unit: {:native, :millisecond} + ), + summary("phoenix.endpoint.stop.duration", + unit: {:native, :millisecond} + ), + summary("phoenix.router_dispatch.start.system_time", + tags: [:route], + unit: {:native, :millisecond} + ), + summary("phoenix.router_dispatch.exception.duration", + tags: [:route], + unit: {:native, :millisecond} + ), + summary("phoenix.router_dispatch.stop.duration", + tags: [:route], + unit: {:native, :millisecond} + ), + summary("phoenix.socket_connected.duration", + unit: {:native, :millisecond} + ), + summary("phoenix.channel_joined.duration", + unit: {:native, :millisecond} + ), + summary("phoenix.channel_handled_in.duration", + tags: [:event], + unit: {:native, :millisecond} + ), + + # Database Metrics + summary("telemetry_api.repo.query.total_time", + unit: {:native, :millisecond}, + description: "The sum of the other measurements" + ), + summary("telemetry_api.repo.query.decode_time", + unit: {:native, :millisecond}, + description: "The time spent decoding the data received from the database" + ), + summary("telemetry_api.repo.query.query_time", + unit: {:native, :millisecond}, + description: "The time spent executing the query" + ), + summary("telemetry_api.repo.query.queue_time", + unit: {:native, :millisecond}, + description: "The time spent waiting for a database connection" + ), + summary("telemetry_api.repo.query.idle_time", + unit: {:native, :millisecond}, + description: + "The time the connection spent waiting before being checked out for the query" + ), + + # VM Metrics + summary("vm.memory.total", unit: {:byte, :kilobyte}), + summary("vm.total_run_queue_lengths.total"), + summary("vm.total_run_queue_lengths.cpu"), + summary("vm.total_run_queue_lengths.io") + ] + end + + defp periodic_measurements do + [ + # A module, function and arguments to be invoked periodically. + # This function must call :telemetry.execute/3 and a metric must be added above. + # {TelemetryApiWeb, :count_users, []} + ] + end +end diff --git a/telemetry_api/mix.exs b/telemetry_api/mix.exs new file mode 100644 index 0000000000..db6fcecde2 --- /dev/null +++ b/telemetry_api/mix.exs @@ -0,0 +1,66 @@ +defmodule TelemetryApi.MixProject do + use Mix.Project + + def project do + [ + app: :telemetry_api, + version: "0.1.0", + elixir: "~> 1.14", + elixirc_paths: elixirc_paths(Mix.env()), + start_permanent: Mix.env() == :prod, + aliases: aliases(), + deps: deps() + ] + end + + # Configuration for the OTP application. + # + # Type `mix help compile.app` for more information. + def application do + [ + mod: {TelemetryApi.Application, []}, + extra_applications: [:logger, :runtime_tools] + ] + end + + # Specifies which paths to compile per environment. + defp elixirc_paths(:test), do: ["lib", "test/support"] + defp elixirc_paths(_), do: ["lib"] + + # Specifies your project dependencies. + # + # Type `mix help deps` for examples and options. + defp deps do + [ + {:phoenix, "~> 1.7.14"}, + {:phoenix_ecto, "~> 4.5"}, + {:ecto_sql, "~> 3.10"}, + {:postgrex, ">= 0.0.0"}, + {:phoenix_live_dashboard, "~> 0.8.3"}, + {:telemetry_metrics, "~> 1.0"}, + {:telemetry_poller, "~> 1.0"}, + {:httpoison, "~> 2.0"}, + {:jason, "~> 1.2"}, + {:dns_cluster, "~> 0.1.1"}, + {:bandit, "~> 1.5"}, + {:ex_keccak, "~> 0.7.5"}, + {:ex_secp256k1, "~> 0.7"}, + {:ethers, "~> 0.4.4"} + ] + end + + # Aliases are shortcuts or tasks specific to the current project. + # For example, to install project dependencies and perform other setup tasks, run: + # + # $ mix setup + # + # See the documentation for `Mix` for more info on aliases. + defp aliases do + [ + setup: ["deps.get", "ecto.setup"], + "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"], + "ecto.reset": ["ecto.drop", "ecto.setup"], + test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"] + ] + end +end diff --git a/telemetry_api/mix.lock b/telemetry_api/mix.lock new file mode 100644 index 0000000000..3c3f2e69d9 --- /dev/null +++ b/telemetry_api/mix.lock @@ -0,0 +1,49 @@ +%{ + "bandit": {:hex, :bandit, "1.5.7", "6856b1e1df4f2b0cb3df1377eab7891bec2da6a7fd69dc78594ad3e152363a50", [:mix], [{:hpax, "~> 1.0.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "f2dd92ae87d2cbea2fa9aa1652db157b6cba6c405cb44d4f6dd87abba41371cd"}, + "castore": {:hex, :castore, "1.0.8", "dedcf20ea746694647f883590b82d9e96014057aff1d44d03ec90f36a5c0dc6e", [:mix], [], "hexpm", "0b2b66d2ee742cb1d9cb8c8be3b43c3a70ee8651f37b75a8b982e036752983f1"}, + "certifi": {:hex, :certifi, "2.12.0", "2d1cca2ec95f59643862af91f001478c9863c2ac9cb6e2f89780bfd8de987329", [:rebar3], [], "hexpm", "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c"}, + "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, + "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, + "dns_cluster": {:hex, :dns_cluster, "0.1.3", "0bc20a2c88ed6cc494f2964075c359f8c2d00e1bf25518a6a6c7fd277c9b0c66", [:mix], [], "hexpm", "46cb7c4a1b3e52c7ad4cbe33ca5079fbde4840dedeafca2baf77996c2da1bc33"}, + "ecto": {:hex, :ecto, "3.12.3", "1a9111560731f6c3606924c81c870a68a34c819f6d4f03822f370ea31a582208", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9efd91506ae722f95e48dc49e70d0cb632ede3b7a23896252a60a14ac6d59165"}, + "ecto_sql": {:hex, :ecto_sql, "3.12.0", "73cea17edfa54bde76ee8561b30d29ea08f630959685006d9c6e7d1e59113b7d", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dc9e4d206f274f3947e96142a8fdc5f69a2a6a9abb4649ef5c882323b6d512f0"}, + "ethereumex": {:hex, :ethereumex, "0.10.6", "6d75cac39b5b7a720b064fe48563f205d3d9784e5bde25f983dd07cf306c2a6d", [:make, :mix], [{:finch, "~> 0.16", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "58cf926239dabf8bd1fc6cf50a37b926274240b7f58ba5b235a20b5500a9a7e1"}, + "ethers": {:hex, :ethers, "0.4.5", "5af10678317ff183617072fc5970ee25d7145846e600db769f2e7a53641e6131", [:mix], [{:ethereumex, "~> 0.10.6", [hex: :ethereumex, repo: "hexpm", optional: false]}, {:ex_abi, "~> 0.7.0", [hex: :ex_abi, repo: "hexpm", optional: false]}, {:ex_rlp, "~> 0.6.0", [hex: :ex_rlp, repo: "hexpm", optional: false]}, {:ex_secp256k1, "~> 0.7.2", [hex: :ex_secp256k1, repo: "hexpm", optional: true]}, {:idna, "~> 6.1", [hex: :idna, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "885de526ae5a37bb0cefc882caac2e3b5dd06eff35a9fee43a58523556dda009"}, + "ex_abi": {:hex, :ex_abi, "0.7.3", "5c30551af740d11a10817cb253a7b1d0315f9c02f7bc95f7434885bcff5d9dc5", [:mix], [{:ex_keccak, "~> 0.7.5", [hex: :ex_keccak, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "756e3d2211053ca7e4217eae4193c588f3a310066b86171f03131e2400827bae"}, + "ex_keccak": {:hex, :ex_keccak, "0.7.5", "f3b733173510d48ae9a1ea1de415e694b2651f35c787e63f33b5ed0013fbfd35", [:mix], [{:rustler, ">= 0.0.0", [hex: :rustler, repo: "hexpm", optional: true]}, {:rustler_precompiled, "~> 0.7", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "8a5e1cb7f96fff5e480ff6a121477b90c4fd8c150984086dffd98819f5d83763"}, + "ex_rlp": {:hex, :ex_rlp, "0.6.0", "985391d2356a7cb8712a4a9a2deb93f19f2fbca0323f5c1203fcaf64d077e31e", [:mix], [], "hexpm", "7135db93b861d9e76821039b60b00a6a22d2c4e751bf8c444bffe7a042f1abaf"}, + "ex_secp256k1": {:hex, :ex_secp256k1, "0.7.3", "489b6fd57fab5a7259ace927d8cb5171aad835e9c7279c2a859a0483cb069415", [:mix], [{:rustler, ">= 0.0.0", [hex: :rustler, repo: "hexpm", optional: true]}, {:rustler_precompiled, "~> 0.7", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "ea63159442f4d8143166cd1507da03edc43216d6e7c6bac4b416bdce04f0daa8"}, + "finch": {:hex, :finch, "0.19.0", "c644641491ea854fc5c1bbaef36bfc764e3f08e7185e1f084e35e0672241b76d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fc5324ce209125d1e2fa0fcd2634601c52a787aff1cd33ee833664a5af4ea2b6"}, + "hackney": {:hex, :hackney, "1.20.1", "8d97aec62ddddd757d128bfd1df6c5861093419f8f7a4223823537bad5d064e2", [:rebar3], [{:certifi, "~> 2.12.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"}, + "hpax": {:hex, :hpax, "1.0.0", "28dcf54509fe2152a3d040e4e3df5b265dcb6cb532029ecbacf4ce52caea3fd2", [:mix], [], "hexpm", "7f1314731d711e2ca5fdc7fd361296593fc2542570b3105595bb0bc6d0fad601"}, + "httpoison": {:hex, :httpoison, "2.2.1", "87b7ed6d95db0389f7df02779644171d7319d319178f6680438167d7b69b1f3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "51364e6d2f429d80e14fe4b5f8e39719cacd03eb3f9a9286e61e216feac2d2df"}, + "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, + "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, + "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, + "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, + "mimerl": {:hex, :mimerl, "1.3.0", "d0cd9fc04b9061f82490f6581e0128379830e78535e017f7780f37fea7545726", [:rebar3], [], "hexpm", "a1e15a50d1887217de95f0b9b0793e32853f7c258a5cd227650889b38839fe9d"}, + "mint": {:hex, :mint, "1.6.2", "af6d97a4051eee4f05b5500671d47c3a67dac7386045d87a904126fd4bbcea2e", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "5ee441dffc1892f1ae59127f74afe8fd82fda6587794278d924e4d90ea3d63f9"}, + "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, + "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, + "parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"}, + "phoenix": {:hex, :phoenix, "1.7.14", "a7d0b3f1bc95987044ddada111e77bd7f75646a08518942c72a8440278ae7825", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "c7859bc56cc5dfef19ecfc240775dae358cbaa530231118a9e014df392ace61a"}, + "phoenix_ecto": {:hex, :phoenix_ecto, "4.6.2", "3b83b24ab5a2eb071a20372f740d7118767c272db386831b2e77638c4dcc606d", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "3f94d025f59de86be00f5f8c5dd7b5965a3298458d21ab1c328488be3b5fcd59"}, + "phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"}, + "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.4", "4508e481f791ce62ec6a096e13b061387158cbeefacca68c6c1928e1305e23ed", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "2984aae96994fbc5c61795a73b8fb58153b41ff934019cfb522343d2d3817d59"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.17", "f396bbdaf4ba227b82251eb75ac0afa6b3da5e509bc0d030206374237dfc9450", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a61d741ffb78c85fdbca0de084da6a48f8ceb5261a79165b5a0b59e5f65ce98b"}, + "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, + "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, + "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"}, + "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"}, + "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, + "postgrex": {:hex, :postgrex, "0.19.1", "73b498508b69aded53907fe48a1fee811be34cc720e69ef4ccd568c8715495ea", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "8bac7885a18f381e091ec6caf41bda7bb8c77912bb0e9285212829afe5d8a8f8"}, + "rustler_precompiled": {:hex, :rustler_precompiled, "0.8.1", "8afe0b6f3a9a677ada046cdd23e3f4c6399618b91a6122289324774961281e1e", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "90b8c2297bf7959cfa1c927b2881faad7bb0707183124955369991b76177a166"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, + "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, + "telemetry_metrics": {:hex, :telemetry_metrics, "1.0.0", "29f5f84991ca98b8eb02fc208b2e6de7c95f8bb2294ef244a176675adc7775df", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f23713b3847286a534e005126d4c959ebcca68ae9582118ce436b521d1d47d5d"}, + "telemetry_poller": {:hex, :telemetry_poller, "1.1.0", "58fa7c216257291caaf8d05678c8d01bd45f4bdbc1286838a28c4bb62ef32999", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"}, + "thousand_island": {:hex, :thousand_island, "1.3.5", "6022b6338f1635b3d32406ff98d68b843ba73b3aa95cfc27154223244f3a6ca5", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2be6954916fdfe4756af3239fb6b6d75d0b8063b5df03ba76fd8a4c87849e180"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, + "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, + "websock_adapter": {:hex, :websock_adapter, "0.5.7", "65fa74042530064ef0570b75b43f5c49bb8b235d6515671b3d250022cb8a1f9e", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "d0f478ee64deddfec64b800673fd6e0c8888b079d9f3444dd96d2a98383bdbd1"}, +} diff --git a/telemetry_api/priv/abi/DelegationManager.json b/telemetry_api/priv/abi/DelegationManager.json new file mode 100644 index 0000000000..8bbe761be2 --- /dev/null +++ b/telemetry_api/priv/abi/DelegationManager.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"_strategyManager","type":"address","internalType":"contract IStrategyManager"},{"name":"_slasher","type":"address","internalType":"contract ISlasher"},{"name":"_eigenPodManager","type":"address","internalType":"contract IEigenPodManager"}],"stateMutability":"nonpayable"},{"type":"function","name":"DELEGATION_APPROVAL_TYPEHASH","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"DOMAIN_TYPEHASH","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MAX_STAKER_OPT_OUT_WINDOW_BLOCKS","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_WITHDRAWAL_DELAY_BLOCKS","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"STAKER_DELEGATION_TYPEHASH","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"beaconChainETHStrategy","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IStrategy"}],"stateMutability":"view"},{"type":"function","name":"calculateCurrentStakerDelegationDigestHash","inputs":[{"name":"staker","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"},{"name":"expiry","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"calculateDelegationApprovalDigestHash","inputs":[{"name":"staker","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"},{"name":"_delegationApprover","type":"address","internalType":"address"},{"name":"approverSalt","type":"bytes32","internalType":"bytes32"},{"name":"expiry","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"calculateStakerDelegationDigestHash","inputs":[{"name":"staker","type":"address","internalType":"address"},{"name":"_stakerNonce","type":"uint256","internalType":"uint256"},{"name":"operator","type":"address","internalType":"address"},{"name":"expiry","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"calculateWithdrawalRoot","inputs":[{"name":"withdrawal","type":"tuple","internalType":"struct IDelegationManager.Withdrawal","components":[{"name":"staker","type":"address","internalType":"address"},{"name":"delegatedTo","type":"address","internalType":"address"},{"name":"withdrawer","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"startBlock","type":"uint32","internalType":"uint32"},{"name":"strategies","type":"address[]","internalType":"contract IStrategy[]"},{"name":"shares","type":"uint256[]","internalType":"uint256[]"}]}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"pure"},{"type":"function","name":"completeQueuedWithdrawal","inputs":[{"name":"withdrawal","type":"tuple","internalType":"struct IDelegationManager.Withdrawal","components":[{"name":"staker","type":"address","internalType":"address"},{"name":"delegatedTo","type":"address","internalType":"address"},{"name":"withdrawer","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"startBlock","type":"uint32","internalType":"uint32"},{"name":"strategies","type":"address[]","internalType":"contract IStrategy[]"},{"name":"shares","type":"uint256[]","internalType":"uint256[]"}]},{"name":"tokens","type":"address[]","internalType":"contract IERC20[]"},{"name":"middlewareTimesIndex","type":"uint256","internalType":"uint256"},{"name":"receiveAsTokens","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"completeQueuedWithdrawals","inputs":[{"name":"withdrawals","type":"tuple[]","internalType":"struct IDelegationManager.Withdrawal[]","components":[{"name":"staker","type":"address","internalType":"address"},{"name":"delegatedTo","type":"address","internalType":"address"},{"name":"withdrawer","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"startBlock","type":"uint32","internalType":"uint32"},{"name":"strategies","type":"address[]","internalType":"contract IStrategy[]"},{"name":"shares","type":"uint256[]","internalType":"uint256[]"}]},{"name":"tokens","type":"address[][]","internalType":"contract IERC20[][]"},{"name":"middlewareTimesIndexes","type":"uint256[]","internalType":"uint256[]"},{"name":"receiveAsTokens","type":"bool[]","internalType":"bool[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"cumulativeWithdrawalsQueued","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"decreaseDelegatedShares","inputs":[{"name":"staker","type":"address","internalType":"address"},{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"delegateTo","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approverSignatureAndExpiry","type":"tuple","internalType":"struct ISignatureUtils.SignatureWithExpiry","components":[{"name":"signature","type":"bytes","internalType":"bytes"},{"name":"expiry","type":"uint256","internalType":"uint256"}]},{"name":"approverSalt","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"delegateToBySignature","inputs":[{"name":"staker","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"},{"name":"stakerSignatureAndExpiry","type":"tuple","internalType":"struct ISignatureUtils.SignatureWithExpiry","components":[{"name":"signature","type":"bytes","internalType":"bytes"},{"name":"expiry","type":"uint256","internalType":"uint256"}]},{"name":"approverSignatureAndExpiry","type":"tuple","internalType":"struct ISignatureUtils.SignatureWithExpiry","components":[{"name":"signature","type":"bytes","internalType":"bytes"},{"name":"expiry","type":"uint256","internalType":"uint256"}]},{"name":"approverSalt","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"delegatedTo","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"delegationApprover","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"delegationApproverSaltIsSpent","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"domainSeparator","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"eigenPodManager","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IEigenPodManager"}],"stateMutability":"view"},{"type":"function","name":"getDelegatableShares","inputs":[{"name":"staker","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address[]","internalType":"contract IStrategy[]"},{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getOperatorShares","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"strategies","type":"address[]","internalType":"contract IStrategy[]"}],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getWithdrawalDelay","inputs":[{"name":"strategies","type":"address[]","internalType":"contract IStrategy[]"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"increaseDelegatedShares","inputs":[{"name":"staker","type":"address","internalType":"address"},{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"initialize","inputs":[{"name":"initialOwner","type":"address","internalType":"address"},{"name":"_pauserRegistry","type":"address","internalType":"contract IPauserRegistry"},{"name":"initialPausedStatus","type":"uint256","internalType":"uint256"},{"name":"_minWithdrawalDelayBlocks","type":"uint256","internalType":"uint256"},{"name":"_strategies","type":"address[]","internalType":"contract IStrategy[]"},{"name":"_withdrawalDelayBlocks","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isDelegated","inputs":[{"name":"staker","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"minWithdrawalDelayBlocks","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"modifyOperatorDetails","inputs":[{"name":"newOperatorDetails","type":"tuple","internalType":"struct IDelegationManager.OperatorDetails","components":[{"name":"__deprecated_earningsReceiver","type":"address","internalType":"address"},{"name":"delegationApprover","type":"address","internalType":"address"},{"name":"stakerOptOutWindowBlocks","type":"uint32","internalType":"uint32"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"operatorDetails","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IDelegationManager.OperatorDetails","components":[{"name":"__deprecated_earningsReceiver","type":"address","internalType":"address"},{"name":"delegationApprover","type":"address","internalType":"address"},{"name":"stakerOptOutWindowBlocks","type":"uint32","internalType":"uint32"}]}],"stateMutability":"view"},{"type":"function","name":"operatorShares","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"contract IStrategy"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"pause","inputs":[{"name":"newPausedStatus","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"pauseAll","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"paused","inputs":[{"name":"index","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"pauserRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IPauserRegistry"}],"stateMutability":"view"},{"type":"function","name":"pendingWithdrawals","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"queueWithdrawals","inputs":[{"name":"queuedWithdrawalParams","type":"tuple[]","internalType":"struct IDelegationManager.QueuedWithdrawalParams[]","components":[{"name":"strategies","type":"address[]","internalType":"contract IStrategy[]"},{"name":"shares","type":"uint256[]","internalType":"uint256[]"},{"name":"withdrawer","type":"address","internalType":"address"}]}],"outputs":[{"name":"","type":"bytes32[]","internalType":"bytes32[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"registerAsOperator","inputs":[{"name":"registeringOperatorDetails","type":"tuple","internalType":"struct IDelegationManager.OperatorDetails","components":[{"name":"__deprecated_earningsReceiver","type":"address","internalType":"address"},{"name":"delegationApprover","type":"address","internalType":"address"},{"name":"stakerOptOutWindowBlocks","type":"uint32","internalType":"uint32"}]},{"name":"metadataURI","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMinWithdrawalDelayBlocks","inputs":[{"name":"newMinWithdrawalDelayBlocks","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setPauserRegistry","inputs":[{"name":"newPauserRegistry","type":"address","internalType":"contract IPauserRegistry"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setStrategyWithdrawalDelayBlocks","inputs":[{"name":"strategies","type":"address[]","internalType":"contract IStrategy[]"},{"name":"withdrawalDelayBlocks","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"slasher","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ISlasher"}],"stateMutability":"view"},{"type":"function","name":"stakerNonce","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"stakerOptOutWindowBlocks","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"strategyManager","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IStrategyManager"}],"stateMutability":"view"},{"type":"function","name":"strategyWithdrawalDelayBlocks","inputs":[{"name":"","type":"address","internalType":"contract IStrategy"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"undelegate","inputs":[{"name":"staker","type":"address","internalType":"address"}],"outputs":[{"name":"withdrawalRoots","type":"bytes32[]","internalType":"bytes32[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"unpause","inputs":[{"name":"newPausedStatus","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateOperatorMetadataURI","inputs":[{"name":"metadataURI","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"MinWithdrawalDelayBlocksSet","inputs":[{"name":"previousValue","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newValue","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OperatorDetailsModified","inputs":[{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"newOperatorDetails","type":"tuple","indexed":false,"internalType":"struct IDelegationManager.OperatorDetails","components":[{"name":"__deprecated_earningsReceiver","type":"address","internalType":"address"},{"name":"delegationApprover","type":"address","internalType":"address"},{"name":"stakerOptOutWindowBlocks","type":"uint32","internalType":"uint32"}]}],"anonymous":false},{"type":"event","name":"OperatorMetadataURIUpdated","inputs":[{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"metadataURI","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"OperatorRegistered","inputs":[{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"operatorDetails","type":"tuple","indexed":false,"internalType":"struct IDelegationManager.OperatorDetails","components":[{"name":"__deprecated_earningsReceiver","type":"address","internalType":"address"},{"name":"delegationApprover","type":"address","internalType":"address"},{"name":"stakerOptOutWindowBlocks","type":"uint32","internalType":"uint32"}]}],"anonymous":false},{"type":"event","name":"OperatorSharesDecreased","inputs":[{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"staker","type":"address","indexed":false,"internalType":"address"},{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OperatorSharesIncreased","inputs":[{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"staker","type":"address","indexed":false,"internalType":"address"},{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"newPausedStatus","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"PauserRegistrySet","inputs":[{"name":"pauserRegistry","type":"address","indexed":false,"internalType":"contract IPauserRegistry"},{"name":"newPauserRegistry","type":"address","indexed":false,"internalType":"contract IPauserRegistry"}],"anonymous":false},{"type":"event","name":"StakerDelegated","inputs":[{"name":"staker","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StakerForceUndelegated","inputs":[{"name":"staker","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StakerUndelegated","inputs":[{"name":"staker","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StrategyWithdrawalDelayBlocksSet","inputs":[{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"},{"name":"previousValue","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newValue","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"newPausedStatus","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"WithdrawalCompleted","inputs":[{"name":"withdrawalRoot","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"WithdrawalQueued","inputs":[{"name":"withdrawalRoot","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"withdrawal","type":"tuple","indexed":false,"internalType":"struct IDelegationManager.Withdrawal","components":[{"name":"staker","type":"address","internalType":"address"},{"name":"delegatedTo","type":"address","internalType":"address"},{"name":"withdrawer","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"startBlock","type":"uint32","internalType":"uint32"},{"name":"strategies","type":"address[]","internalType":"contract IStrategy[]"},{"name":"shares","type":"uint256[]","internalType":"uint256[]"}]}],"anonymous":false}],"bytecode":{"object":"0x6101006040523480156200001257600080fd5b5060405162005c3338038062005c33833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a0a6200022960003960006126870152600081816105b10152818161102e015281816113aa01528181611c0a015281816129e001528181613e93015261437f015260006107620152600081816104f901528181610ffc0152818161137801528181611c9e01528181612aad01528181612c3001528181613fb901526144250152615a0a6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004614835565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a236600461489b565b6109ce565b6103ba6103b5366004614835565b610a90565b60405161036491906148f6565b6103da6103d5366004614993565b610df9565b005b6103da6103ea3660046149e6565b610f3e565b6103da6103fd366004614a0a565b610ff1565b6103da610410366004614a4b565b6110a8565b6103da610423366004614a64565b6111e7565b61035a6104363660046149e6565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a0a565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614acf565b611229565b6103da6104bc366004614a0a565b61136d565b61035a6104cf3660046149e6565b609b6020526000908152604090205481565b6103da6104ef366004614b76565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149e6565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149e6565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e73565b611641565b610575610606366004614eaf565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ee0565b611671565b6103da610644366004614a4b565b61170c565b61051b6106573660046149e6565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149e6565b61171d565b6103da61173e565b61035a61069b366004614f6f565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615050565b611752565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150e0565b61197e565b604051610364919061516a565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da61073836600461517d565b611a58565b61035a61074b3660046149e6565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a4b565b609e6020526000908152604090205460ff1681565b6105756107b53660046151b2565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149e6565b60a16020526000908152604090205481565b61086e61080c3660046149e6565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151de565b611b2a565b61035a62034bc081565b6108d46108cf3660046149e6565b611be3565b60405161036492919061525f565b6103ba6108f03660046149e6565b611f9b565b6103da610903366004615284565b61245f565b6103da6109163660046152dc565b61257c565b6103da6109293660046149e6565b61260d565b61035a612683565b6103da610944366004614a4b565b6126c1565b609d54600090815b838110156109c657600060a16000878785818110610971576109716152f8565b905060200201602081019061098691906149e6565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf81615324565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc9061533f565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c18565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b436152f8565b9050602002810190610b559190615376565b610b63906020810190615396565b9050878783818110610b7757610b776152f8565b9050602002810190610b899190615376565b610b939080615396565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b6152f8565b9050602002810190610c2d9190615376565b610c3e9060608101906040016149e6565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd16152f8565b9050602002810190610ce39190615376565b610cf49060608101906040016149e6565b8a8a86818110610d0657610d066152f8565b9050602002810190610d189190615376565b610d229080615396565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d686152f8565b9050602002810190610d7a9190615376565b610d88906020810190615396565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061281d92505050565b838281518110610dd157610dd16152f8565b602090810291909101015280610de681615324565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612ddd565b604080518082019091526060815260006020820152610eb43380836000612fd0565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153df565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f30929190615431565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615460565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc9061547d565b610fee81613266565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154c7565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561335d565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615524565b6111305760405162461bcd60e51b8152600401610abc90615541565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133d8565b6110a184848484613432565b6001600160a01b0383166000908152609b602052604081205461122085828686611b2a565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613658565b6112fb613742565b609755611307896137d9565b6113108661382b565b61131c85858585613432565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154c7565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613925565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be6152f8565b90506020028101906114d09190615589565b8989848181106114e2576114e26152f8565b90506020028101906114f49190615396565b898986818110611506576115066152f8565b9050602002013588888781811061151f5761151f6152f8565b9050602002016020810190611534919061559f565b6139a0565b61154281615324565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e69190615524565b6116025760405162461bcd60e51b8152600401610abc90615541565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615630565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139a0565b5050600160c95550505050565b6117146133d8565b610fee8161382b565b6001600160a01b039081166000818152609a60205260409020549091161490565b6117466133d8565b61175060006137d9565b565b42836020015110156117d65760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117df8561155a565b156118685760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b6118718461171d565b6118fd5760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119398783888860200151611b2a565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611969908890839061418a565b61197587878686612fd0565b50505050505050565b6060600082516001600160401b0381111561199b5761199b614c18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a0257611a026152f8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a3d57611a3d6152f8565b6020908102919091010152611a5181615324565b90506119ca565b611a613361171d565b611ae35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b1e929190615431565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611ba0612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190615643565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f91908101906156b7565b9150915060008313611d2657909590945092505050565b606080835160001415611de0576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611d9b57611d9b6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611dcf57611dcf6152f8565b602002602001018181525050611f8e565b8351611ded906001615771565b6001600160401b03811115611e0457611e04614c18565b604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50915081516001600160401b03811115611e4957611e49614c18565b604051908082528060200260200182016040528015611e72578160200160208202803683370190505b50905060005b8451811015611f0c57848181518110611e9357611e936152f8565b6020026020010151838281518110611ead57611ead6152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611edf57611edf6152f8565b6020026020010151828281518110611ef957611ef96152f8565b6020908102919091010152600101611e78565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f319190615789565b81518110611f4157611f416152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f719190615789565b81518110611f8157611f816152f8565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fc75760405162461bcd60e51b8152600401610abc9061533f565b611fd08361155a565b6120505760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120598361171d565b156120cc5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121485760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a60205260409020549091169033148061217b5750336001600160a01b038216145b806121a257506001600160a01b038181166000908152609960205260409020600101541633145b6122145760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061222086611be3565b9092509050336001600160a01b0387161461227657826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516122f8576040805160008152602081019091529450612456565b81516001600160401b0381111561231157612311614c18565b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50945060005b8251811015612454576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123a0576123a06152f8565b6020026020010151826000815181106123bb576123bb6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106123ed576123ed6152f8565b602002602001015181600081518110612408576124086152f8565b60200260200101818152505061242189878b858561281d565b888481518110612433576124336152f8565b6020026020010181815250505050808061244c90615324565b915050612340565b505b50505050919050565b6124683361155a565b156124e65760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6124ef8361171d565b6125705760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fd0565b6125853361171d565b6126035760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612ddd565b6126156133d8565b6001600160a01b03811661267a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137d9565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126b4575060975490565b6126bc613742565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190615460565b6001600160a01b0316336001600160a01b0316146127685760405162461bcd60e51b8152600401610abc9061547d565b6066541981196066541916146127e65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128b45760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b825161293e5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612ceb576001600160a01b03861615612997576129978688868481518110612970576129706152f8565b602002602001015186858151811061298a5761298a6152f8565b602002602001015161335d565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129c7576129c76152f8565b60200260200101516001600160a01b03161415612a90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a2057612a206152f8565b60200260200101516040518363ffffffff1660e01b8152600401612a599291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b50505050612ce3565b846001600160a01b0316876001600160a01b03161480612b6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612aec57612aec6152f8565b60200260200101516040518263ffffffff1660e01b8152600401612b1f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190615524565b155b612c2e5760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c7057612c706152f8565b6020026020010151868581518110612c8a57612c8a6152f8565b60200260200101516040518463ffffffff1660e01b8152600401612cb0939291906157a0565b600060405180830381600087803b158015612cca57600080fd5b505af1158015612cde573d6000803e3d6000fd5b505050505b600101612941565b506001600160a01b0386166000908152609f60205260408120805491829190612d1383615324565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d7b82611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612dc990839085906157c4565b60405180910390a198975050505050505050565b6213c680612df160608301604084016157dd565b63ffffffff161115612ea65760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612ee290606084019084016157dd565b63ffffffff161015612f785760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612f9c828261581a565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b1e9084906153df565b60665460009060019081161415612ff95760405162461bcd60e51b8152600401610abc9061533f565b6001600160a01b0380851660009081526099602052604090206001015416801580159061302f5750336001600160a01b03821614155b80156130445750336001600160a01b03861614155b156131b15742846020015110156130c35760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561315d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff1916600117905585015161319e9088908890859088906109ce565b90506131af8282876000015161418a565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061321088611be3565b9150915060005b82518110156113625761325e888a858481518110613237576132376152f8565b6020026020010151858581518110613251576132516152f8565b6020026020010151613925565b600101613217565b6001600160a01b0381166132f45760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613394908490615789565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157a0565b6033546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134ba5760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136505760008686838181106134da576134da6152f8565b90506020020160208101906134ef91906149e6565b6001600160a01b038116600090815260a1602052604081205491925086868581811061351d5761351d6152f8565b90506020020135905062034bc08111156135e15760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a15050508061364990615324565b90506134be565b505050505050565b6065546001600160a01b031615801561367957506001600160a01b03821615155b6136fb5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261373e82613266565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138e45760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061395c908490615771565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157a0565b60006139ae6105f38761587d565b6000818152609e602052604090205490915060ff16613a2f5760405162461bcd60e51b815260206004820152604360248201526000805160206159b583398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a4460a0890160808a016157dd565b63ffffffff16613a549190615771565b1115613adc5760405162461bcd60e51b815260206004820152605f60248201526000805160206159b583398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613aec60608701604088016149e6565b6001600160a01b0316336001600160a01b031614613b795760405162461bcd60e51b815260206004820152605060248201526000805160206159b583398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613bfb57613b8c60a0870187615396565b85149050613bfb5760405162461bcd60e51b815260206004820152604260248201526000805160206159b583398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d605760005b613c2760a0880188615396565b9050811015613d5a574360a16000613c4260a08b018b615396565b85818110613c5257613c526152f8565b9050602002016020810190613c6791906149e6565b6001600160a01b03168152602081019190915260400160002054613c9160a08a0160808b016157dd565b63ffffffff16613ca19190615771565b1115613cbf5760405162461bcd60e51b8152600401610abc9061588f565b613d52613ccf60208901896149e6565b33613cdd60a08b018b615396565b85818110613ced57613ced6152f8565b9050602002016020810190613d0291906149e6565b613d0f60c08c018c615396565b86818110613d1f57613d1f6152f8565b905060200201358a8a87818110613d3857613d386152f8565b9050602002016020810190613d4d91906149e6565b614344565b600101613c1a565b5061414f565b336000908152609a60205260408120546001600160a01b0316905b613d8860a0890189615396565b905081101561414c574360a16000613da360a08c018c615396565b85818110613db357613db36152f8565b9050602002016020810190613dc891906149e6565b6001600160a01b03168152602081019190915260400160002054613df260a08b0160808c016157dd565b63ffffffff16613e029190615771565b1115613e205760405162461bcd60e51b8152600401610abc9061588f565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e4260a08a018a615396565b83818110613e5257613e526152f8565b9050602002016020810190613e6791906149e6565b6001600160a01b03161415613fb7576000613e8560208a018a6149e6565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613ec660c08e018e615396565b87818110613ed657613ed66152f8565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4e9190615643565b6001600160a01b038084166000908152609a6020526040902054919250168015613faf57613faf8184613f8460a08f018f615396565b88818110613f9457613f946152f8565b9050602002016020810190613fa991906149e6565b85613925565b505050614144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea133898985818110613ff957613ff96152f8565b905060200201602081019061400e91906149e6565b61401b60a08d018d615396565b8681811061402b5761402b6152f8565b905060200201602081019061404091906149e6565b61404d60c08e018e615396565b8781811061405d5761405d6152f8565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b505050506001600160a01b038216156141445761414482336140f660a08c018c615396565b85818110614106576141066152f8565b905060200201602081019061411b91906149e6565b61412860c08d018d615396565b86818110614138576141386152f8565b90506020020135613925565b600101613d7b565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142a457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141ca9086908690600401615917565b602060405180830381865afa1580156141e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420b9190615974565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142b88383614484565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156143ef5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143b8908890889087906004016157a0565b600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b5050505061447d565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561446957600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b600080600061449385856144a0565b915091506109c681614510565b6000808251604114156144d75760208301516040840151606085015160001a6144cb878285856146cb565b94509450505050614509565b82516040141561450157602083015160408401516144f68683836147b8565b935093505050614509565b506000905060025b9250929050565b60008160048111156145245761452461599e565b141561452d5750565b60018160048111156145415761454161599e565b141561458f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145a3576145a361599e565b14156145f15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b60038160048111156146055761460561599e565b141561465e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b60048160048111156146725761467261599e565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470257506000905060036147af565b8460ff16601b1415801561471a57508460ff16601c14155b1561472b57506000905060046147af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561477f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147a8576000600192509250506147af565b9150600090505b94509492505050565b6000806001600160ff1b038316816147d560ff86901c601b615771565b90506147e3878288856146cb565b935093505050935093915050565b60008083601f84011261480357600080fd5b5081356001600160401b0381111561481a57600080fd5b6020830191508360208260051b850101111561450957600080fd5b6000806020838503121561484857600080fd5b82356001600160401b0381111561485e57600080fd5b61486a858286016147f1565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b803561489681614876565b919050565b600080600080600060a086880312156148b357600080fd5b85356148be81614876565b945060208601356148ce81614876565b935060408601356148de81614876565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b8181101561492e57835183529284019291840191600101614912565b50909695505050505050565b60006060828403121561494c57600080fd5b50919050565b60008083601f84011261496457600080fd5b5081356001600160401b0381111561497b57600080fd5b60208301915083602082850101111561450957600080fd5b6000806000608084860312156149a857600080fd5b6149b2858561493a565b925060608401356001600160401b038111156149cd57600080fd5b6149d986828701614952565b9497909650939450505050565b6000602082840312156149f857600080fd5b8135614a0381614876565b9392505050565b600080600060608486031215614a1f57600080fd5b8335614a2a81614876565b92506020840135614a3a81614876565b929592945050506040919091013590565b600060208284031215614a5d57600080fd5b5035919050565b60008060008060408587031215614a7a57600080fd5b84356001600160401b0380821115614a9157600080fd5b614a9d888389016147f1565b90965094506020870135915080821115614ab657600080fd5b50614ac3878288016147f1565b95989497509550505050565b60008060008060008060008060c0898b031215614aeb57600080fd5b8835614af681614876565b97506020890135614b0681614876565b9650604089013595506060890135945060808901356001600160401b0380821115614b3057600080fd5b614b3c8c838d016147f1565b909650945060a08b0135915080821115614b5557600080fd5b50614b628b828c016147f1565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614b9257600080fd5b88356001600160401b0380821115614ba957600080fd5b614bb58c838d016147f1565b909a50985060208b0135915080821115614bce57600080fd5b614bda8c838d016147f1565b909850965060408b0135915080821115614bf357600080fd5b614bff8c838d016147f1565b909650945060608b0135915080821115614b5557600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c5057614c50614c18565b60405290565b604080519081016001600160401b0381118282101715614c5057614c50614c18565b604051601f8201601f191681016001600160401b0381118282101715614ca057614ca0614c18565b604052919050565b63ffffffff81168114610fee57600080fd5b803561489681614ca8565b60006001600160401b03821115614cde57614cde614c18565b5060051b60200190565b600082601f830112614cf957600080fd5b81356020614d0e614d0983614cc5565b614c78565b82815260059290921b84018101918181019086841115614d2d57600080fd5b8286015b84811015614d51578035614d4481614876565b8352918301918301614d31565b509695505050505050565b600082601f830112614d6d57600080fd5b81356020614d7d614d0983614cc5565b82815260059290921b84018101918181019086841115614d9c57600080fd5b8286015b84811015614d515780358352918301918301614da0565b600060e08284031215614dc957600080fd5b614dd1614c2e565b9050614ddc8261488b565b8152614dea6020830161488b565b6020820152614dfb6040830161488b565b604082015260608201356060820152614e1660808301614cba565b608082015260a08201356001600160401b0380821115614e3557600080fd5b614e4185838601614ce8565b60a084015260c0840135915080821115614e5a57600080fd5b50614e6784828501614d5c565b60c08301525092915050565b600060208284031215614e8557600080fd5b81356001600160401b03811115614e9b57600080fd5b614ea784828501614db7565b949350505050565b600060208284031215614ec157600080fd5b813560ff81168114614a0357600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614ef857600080fd5b85356001600160401b0380821115614f0f57600080fd5b9087019060e0828a031215614f2357600080fd5b90955060208701359080821115614f3957600080fd5b50614f46888289016147f1565b909550935050604086013591506060860135614f6181614ed2565b809150509295509295909350565b60008060408385031215614f8257600080fd5b8235614f8d81614876565b91506020830135614f9d81614876565b809150509250929050565b600060408284031215614fba57600080fd5b614fc2614c56565b905081356001600160401b0380821115614fdb57600080fd5b818401915084601f830112614fef57600080fd5b813560208282111561500357615003614c18565b615015601f8301601f19168201614c78565b9250818352868183860101111561502b57600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561506857600080fd5b853561507381614876565b9450602086013561508381614876565b935060408601356001600160401b038082111561509f57600080fd5b6150ab89838a01614fa8565b945060608801359150808211156150c157600080fd5b506150ce88828901614fa8565b95989497509295608001359392505050565b600080604083850312156150f357600080fd5b82356150fe81614876565b915060208301356001600160401b0381111561511957600080fd5b61512585828601614ce8565b9150509250929050565b600081518084526020808501945080840160005b8381101561515f57815187529582019590820190600101615143565b509495945050505050565b602081526000614a03602083018461512f565b6000806020838503121561519057600080fd5b82356001600160401b038111156151a657600080fd5b61486a85828601614952565b600080604083850312156151c557600080fd5b82356151d081614876565b946020939093013593505050565b600080600080608085870312156151f457600080fd5b84356151ff81614876565b935060208501359250604085013561521681614876565b9396929550929360600135925050565b600081518084526020808501945080840160005b8381101561515f5781516001600160a01b03168752958201959082019060010161523a565b6040815260006152726040830185615226565b8281036020840152611220818561512f565b60008060006060848603121561529957600080fd5b83356152a481614876565b925060208401356001600160401b038111156152bf57600080fd5b6152cb86828701614fa8565b925050604084013590509250925092565b6000606082840312156152ee57600080fd5b614a03838361493a565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156153385761533861530e565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e1983360301811261538c57600080fd5b9190910192915050565b6000808335601e198436030181126153ad57600080fd5b8301803591506001600160401b038211156153c757600080fd5b6020019150600581901b360382131561450957600080fd5b6060810182356153ee81614876565b6001600160a01b03908116835260208401359061540a82614876565b166020830152604083013561541e81614ca8565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561547257600080fd5b8151614a0381614876565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561553657600080fd5b8151614a0381614ed2565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261538c57600080fd5b6000602082840312156155b157600080fd5b8135614a0381614ed2565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261561760e0850182615226565b905060c083015184820360c0860152611220828261512f565b602081526000614a0360208301846155bc565b60006020828403121561565557600080fd5b5051919050565b600082601f83011261566d57600080fd5b8151602061567d614d0983614cc5565b82815260059290921b8401810191818101908684111561569c57600080fd5b8286015b84811015614d5157805183529183019183016156a0565b600080604083850312156156ca57600080fd5b82516001600160401b03808211156156e157600080fd5b818501915085601f8301126156f557600080fd5b81516020615705614d0983614cc5565b82815260059290921b8401810191818101908984111561572457600080fd5b948201945b8386101561574b57855161573c81614876565b82529482019490820190615729565b9188015191965090935050508082111561576457600080fd5b506151258582860161565c565b600082198211156157845761578461530e565b500190565b60008282101561579b5761579b61530e565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ea760408301846155bc565b6000602082840312156157ef57600080fd5b8135614a0381614ca8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561582581614876565b61582f81836157fa565b5060018101602083013561584281614876565b61584c81836157fa565b50604083013561585b81614ca8565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006158893683614db7565b92915050565b6020808252606e908201526000805160206159b583398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561594b5785810183015185820160600152820161592f565b8181111561595d576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561598657600080fd5b81516001600160e01b031981168114614a0357600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a26469706673582212203a9863b190b0abcf799891a42203a11c6933a165f6897ec6ac670f95b48c927b64736f6c634300080c0033","sourceMap":"1137:46343:2:-:0;;;2862:284;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5650:34:3;;;;;5694;;;;;5738:18;;;;3074:22:2::1;:20;:22::i;:::-;-1:-1:-1::0;;3126:13:2::1;3106:33;::::0;-1:-1:-1;1137:46343:2;;5388:279:46;5456:13;;;;;;;5455:14;5447:66;;;;-1:-1:-1;;;5447:66:46;;1015:2:184;5447:66:46;;;997:21:184;1054:2;1034:18;;;1027:30;1093:34;1073:18;;;1066:62;-1:-1:-1;;;1144:18:184;;;1137:37;1191:19;;5447:66:46;;;;;;;;5527:12;;5542:15;5527:12;;;:30;5523:138;;;5573:12;:30;;-1:-1:-1;;5573:30:46;5588:15;5573:30;;;;;;5622:28;;1363:36:184;;;5622:28:46;;1351:2:184;1336:18;5622:28:46;;;;;;;5523:138;5388:279::o;14:149:184:-;-1:-1:-1;;;;;107:31:184;;97:42;;87:70;;153:1;150;143:12;87:70;14:149;:::o;168:640::-;323:6;331;339;392:2;380:9;371:7;367:23;363:32;360:52;;;408:1;405;398:12;360:52;440:9;434:16;459:49;502:5;459:49;:::i;:::-;577:2;562:18;;556:25;527:5;;-1:-1:-1;590:51:184;556:25;590:51;:::i;:::-;712:2;697:18;;691:25;660:7;;-1:-1:-1;725:51:184;691:25;725:51;:::i;:::-;795:7;785:17;;;168:640;;;;;:::o;1221:184::-;1137:46343:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004614835565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a236600461489b565b6109ce565b6103ba6103b5366004614835565b610a90565b60405161036491906148f6565b6103da6103d5366004614993565b610df9565b005b6103da6103ea3660046149e6565b610f3e565b6103da6103fd366004614a0a565b610ff1565b6103da610410366004614a4b565b6110a8565b6103da610423366004614a64565b6111e7565b61035a6104363660046149e6565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a0a565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614acf565b611229565b6103da6104bc366004614a0a565b61136d565b61035a6104cf3660046149e6565b609b6020526000908152604090205481565b6103da6104ef366004614b76565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149e6565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149e6565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e73565b611641565b610575610606366004614eaf565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ee0565b611671565b6103da610644366004614a4b565b61170c565b61051b6106573660046149e6565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149e6565b61171d565b6103da61173e565b61035a61069b366004614f6f565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615050565b611752565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150e0565b61197e565b604051610364919061516a565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da61073836600461517d565b611a58565b61035a61074b3660046149e6565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a4b565b609e6020526000908152604090205460ff1681565b6105756107b53660046151b2565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149e6565b60a16020526000908152604090205481565b61086e61080c3660046149e6565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151de565b611b2a565b61035a62034bc081565b6108d46108cf3660046149e6565b611be3565b60405161036492919061525f565b6103ba6108f03660046149e6565b611f9b565b6103da610903366004615284565b61245f565b6103da6109163660046152dc565b61257c565b6103da6109293660046149e6565b61260d565b61035a612683565b6103da610944366004614a4b565b6126c1565b609d54600090815b838110156109c657600060a16000878785818110610971576109716152f8565b905060200201602081019061098691906149e6565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf81615324565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc9061533f565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c18565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b436152f8565b9050602002810190610b559190615376565b610b63906020810190615396565b9050878783818110610b7757610b776152f8565b9050602002810190610b899190615376565b610b939080615396565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b6152f8565b9050602002810190610c2d9190615376565b610c3e9060608101906040016149e6565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd16152f8565b9050602002810190610ce39190615376565b610cf49060608101906040016149e6565b8a8a86818110610d0657610d066152f8565b9050602002810190610d189190615376565b610d229080615396565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d686152f8565b9050602002810190610d7a9190615376565b610d88906020810190615396565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061281d92505050565b838281518110610dd157610dd16152f8565b602090810291909101015280610de681615324565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612ddd565b604080518082019091526060815260006020820152610eb43380836000612fd0565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153df565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f30929190615431565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615460565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc9061547d565b610fee81613266565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154c7565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561335d565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615524565b6111305760405162461bcd60e51b8152600401610abc90615541565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133d8565b6110a184848484613432565b6001600160a01b0383166000908152609b602052604081205461122085828686611b2a565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613658565b6112fb613742565b609755611307896137d9565b6113108661382b565b61131c85858585613432565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154c7565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613925565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be6152f8565b90506020028101906114d09190615589565b8989848181106114e2576114e26152f8565b90506020028101906114f49190615396565b898986818110611506576115066152f8565b9050602002013588888781811061151f5761151f6152f8565b9050602002016020810190611534919061559f565b6139a0565b61154281615324565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e69190615524565b6116025760405162461bcd60e51b8152600401610abc90615541565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615630565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139a0565b5050600160c95550505050565b6117146133d8565b610fee8161382b565b6001600160a01b039081166000818152609a60205260409020549091161490565b6117466133d8565b61175060006137d9565b565b42836020015110156117d65760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117df8561155a565b156118685760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b6118718461171d565b6118fd5760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119398783888860200151611b2a565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611969908890839061418a565b61197587878686612fd0565b50505050505050565b6060600082516001600160401b0381111561199b5761199b614c18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a0257611a026152f8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a3d57611a3d6152f8565b6020908102919091010152611a5181615324565b90506119ca565b611a613361171d565b611ae35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b1e929190615431565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611ba0612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190615643565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f91908101906156b7565b9150915060008313611d2657909590945092505050565b606080835160001415611de0576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611d9b57611d9b6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611dcf57611dcf6152f8565b602002602001018181525050611f8e565b8351611ded906001615771565b6001600160401b03811115611e0457611e04614c18565b604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50915081516001600160401b03811115611e4957611e49614c18565b604051908082528060200260200182016040528015611e72578160200160208202803683370190505b50905060005b8451811015611f0c57848181518110611e9357611e936152f8565b6020026020010151838281518110611ead57611ead6152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611edf57611edf6152f8565b6020026020010151828281518110611ef957611ef96152f8565b6020908102919091010152600101611e78565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f319190615789565b81518110611f4157611f416152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f719190615789565b81518110611f8157611f816152f8565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fc75760405162461bcd60e51b8152600401610abc9061533f565b611fd08361155a565b6120505760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120598361171d565b156120cc5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121485760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a60205260409020549091169033148061217b5750336001600160a01b038216145b806121a257506001600160a01b038181166000908152609960205260409020600101541633145b6122145760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061222086611be3565b9092509050336001600160a01b0387161461227657826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516122f8576040805160008152602081019091529450612456565b81516001600160401b0381111561231157612311614c18565b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50945060005b8251811015612454576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123a0576123a06152f8565b6020026020010151826000815181106123bb576123bb6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106123ed576123ed6152f8565b602002602001015181600081518110612408576124086152f8565b60200260200101818152505061242189878b858561281d565b888481518110612433576124336152f8565b6020026020010181815250505050808061244c90615324565b915050612340565b505b50505050919050565b6124683361155a565b156124e65760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6124ef8361171d565b6125705760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fd0565b6125853361171d565b6126035760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612ddd565b6126156133d8565b6001600160a01b03811661267a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137d9565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126b4575060975490565b6126bc613742565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190615460565b6001600160a01b0316336001600160a01b0316146127685760405162461bcd60e51b8152600401610abc9061547d565b6066541981196066541916146127e65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128b45760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b825161293e5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612ceb576001600160a01b03861615612997576129978688868481518110612970576129706152f8565b602002602001015186858151811061298a5761298a6152f8565b602002602001015161335d565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129c7576129c76152f8565b60200260200101516001600160a01b03161415612a90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a2057612a206152f8565b60200260200101516040518363ffffffff1660e01b8152600401612a599291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b50505050612ce3565b846001600160a01b0316876001600160a01b03161480612b6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612aec57612aec6152f8565b60200260200101516040518263ffffffff1660e01b8152600401612b1f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190615524565b155b612c2e5760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c7057612c706152f8565b6020026020010151868581518110612c8a57612c8a6152f8565b60200260200101516040518463ffffffff1660e01b8152600401612cb0939291906157a0565b600060405180830381600087803b158015612cca57600080fd5b505af1158015612cde573d6000803e3d6000fd5b505050505b600101612941565b506001600160a01b0386166000908152609f60205260408120805491829190612d1383615324565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d7b82611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612dc990839085906157c4565b60405180910390a198975050505050505050565b6213c680612df160608301604084016157dd565b63ffffffff161115612ea65760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612ee290606084019084016157dd565b63ffffffff161015612f785760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612f9c828261581a565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b1e9084906153df565b60665460009060019081161415612ff95760405162461bcd60e51b8152600401610abc9061533f565b6001600160a01b0380851660009081526099602052604090206001015416801580159061302f5750336001600160a01b03821614155b80156130445750336001600160a01b03861614155b156131b15742846020015110156130c35760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561315d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff1916600117905585015161319e9088908890859088906109ce565b90506131af8282876000015161418a565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061321088611be3565b9150915060005b82518110156113625761325e888a858481518110613237576132376152f8565b6020026020010151858581518110613251576132516152f8565b6020026020010151613925565b600101613217565b6001600160a01b0381166132f45760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613394908490615789565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157a0565b6033546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134ba5760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136505760008686838181106134da576134da6152f8565b90506020020160208101906134ef91906149e6565b6001600160a01b038116600090815260a1602052604081205491925086868581811061351d5761351d6152f8565b90506020020135905062034bc08111156135e15760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a15050508061364990615324565b90506134be565b505050505050565b6065546001600160a01b031615801561367957506001600160a01b03821615155b6136fb5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261373e82613266565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138e45760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061395c908490615771565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157a0565b60006139ae6105f38761587d565b6000818152609e602052604090205490915060ff16613a2f5760405162461bcd60e51b815260206004820152604360248201526000805160206159b583398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a4460a0890160808a016157dd565b63ffffffff16613a549190615771565b1115613adc5760405162461bcd60e51b815260206004820152605f60248201526000805160206159b583398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613aec60608701604088016149e6565b6001600160a01b0316336001600160a01b031614613b795760405162461bcd60e51b815260206004820152605060248201526000805160206159b583398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613bfb57613b8c60a0870187615396565b85149050613bfb5760405162461bcd60e51b815260206004820152604260248201526000805160206159b583398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d605760005b613c2760a0880188615396565b9050811015613d5a574360a16000613c4260a08b018b615396565b85818110613c5257613c526152f8565b9050602002016020810190613c6791906149e6565b6001600160a01b03168152602081019190915260400160002054613c9160a08a0160808b016157dd565b63ffffffff16613ca19190615771565b1115613cbf5760405162461bcd60e51b8152600401610abc9061588f565b613d52613ccf60208901896149e6565b33613cdd60a08b018b615396565b85818110613ced57613ced6152f8565b9050602002016020810190613d0291906149e6565b613d0f60c08c018c615396565b86818110613d1f57613d1f6152f8565b905060200201358a8a87818110613d3857613d386152f8565b9050602002016020810190613d4d91906149e6565b614344565b600101613c1a565b5061414f565b336000908152609a60205260408120546001600160a01b0316905b613d8860a0890189615396565b905081101561414c574360a16000613da360a08c018c615396565b85818110613db357613db36152f8565b9050602002016020810190613dc891906149e6565b6001600160a01b03168152602081019190915260400160002054613df260a08b0160808c016157dd565b63ffffffff16613e029190615771565b1115613e205760405162461bcd60e51b8152600401610abc9061588f565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e4260a08a018a615396565b83818110613e5257613e526152f8565b9050602002016020810190613e6791906149e6565b6001600160a01b03161415613fb7576000613e8560208a018a6149e6565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613ec660c08e018e615396565b87818110613ed657613ed66152f8565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4e9190615643565b6001600160a01b038084166000908152609a6020526040902054919250168015613faf57613faf8184613f8460a08f018f615396565b88818110613f9457613f946152f8565b9050602002016020810190613fa991906149e6565b85613925565b505050614144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea133898985818110613ff957613ff96152f8565b905060200201602081019061400e91906149e6565b61401b60a08d018d615396565b8681811061402b5761402b6152f8565b905060200201602081019061404091906149e6565b61404d60c08e018e615396565b8781811061405d5761405d6152f8565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b505050506001600160a01b038216156141445761414482336140f660a08c018c615396565b85818110614106576141066152f8565b905060200201602081019061411b91906149e6565b61412860c08d018d615396565b86818110614138576141386152f8565b90506020020135613925565b600101613d7b565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142a457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141ca9086908690600401615917565b602060405180830381865afa1580156141e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420b9190615974565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142b88383614484565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156143ef5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143b8908890889087906004016157a0565b600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b5050505061447d565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561446957600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b600080600061449385856144a0565b915091506109c681614510565b6000808251604114156144d75760208301516040840151606085015160001a6144cb878285856146cb565b94509450505050614509565b82516040141561450157602083015160408401516144f68683836147b8565b935093505050614509565b506000905060025b9250929050565b60008160048111156145245761452461599e565b141561452d5750565b60018160048111156145415761454161599e565b141561458f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145a3576145a361599e565b14156145f15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b60038160048111156146055761460561599e565b141561465e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b60048160048111156146725761467261599e565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470257506000905060036147af565b8460ff16601b1415801561471a57508460ff16601c14155b1561472b57506000905060046147af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561477f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147a8576000600192509250506147af565b9150600090505b94509492505050565b6000806001600160ff1b038316816147d560ff86901c601b615771565b90506147e3878288856146cb565b935093505050935093915050565b60008083601f84011261480357600080fd5b5081356001600160401b0381111561481a57600080fd5b6020830191508360208260051b850101111561450957600080fd5b6000806020838503121561484857600080fd5b82356001600160401b0381111561485e57600080fd5b61486a858286016147f1565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b803561489681614876565b919050565b600080600080600060a086880312156148b357600080fd5b85356148be81614876565b945060208601356148ce81614876565b935060408601356148de81614876565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b8181101561492e57835183529284019291840191600101614912565b50909695505050505050565b60006060828403121561494c57600080fd5b50919050565b60008083601f84011261496457600080fd5b5081356001600160401b0381111561497b57600080fd5b60208301915083602082850101111561450957600080fd5b6000806000608084860312156149a857600080fd5b6149b2858561493a565b925060608401356001600160401b038111156149cd57600080fd5b6149d986828701614952565b9497909650939450505050565b6000602082840312156149f857600080fd5b8135614a0381614876565b9392505050565b600080600060608486031215614a1f57600080fd5b8335614a2a81614876565b92506020840135614a3a81614876565b929592945050506040919091013590565b600060208284031215614a5d57600080fd5b5035919050565b60008060008060408587031215614a7a57600080fd5b84356001600160401b0380821115614a9157600080fd5b614a9d888389016147f1565b90965094506020870135915080821115614ab657600080fd5b50614ac3878288016147f1565b95989497509550505050565b60008060008060008060008060c0898b031215614aeb57600080fd5b8835614af681614876565b97506020890135614b0681614876565b9650604089013595506060890135945060808901356001600160401b0380821115614b3057600080fd5b614b3c8c838d016147f1565b909650945060a08b0135915080821115614b5557600080fd5b50614b628b828c016147f1565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614b9257600080fd5b88356001600160401b0380821115614ba957600080fd5b614bb58c838d016147f1565b909a50985060208b0135915080821115614bce57600080fd5b614bda8c838d016147f1565b909850965060408b0135915080821115614bf357600080fd5b614bff8c838d016147f1565b909650945060608b0135915080821115614b5557600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c5057614c50614c18565b60405290565b604080519081016001600160401b0381118282101715614c5057614c50614c18565b604051601f8201601f191681016001600160401b0381118282101715614ca057614ca0614c18565b604052919050565b63ffffffff81168114610fee57600080fd5b803561489681614ca8565b60006001600160401b03821115614cde57614cde614c18565b5060051b60200190565b600082601f830112614cf957600080fd5b81356020614d0e614d0983614cc5565b614c78565b82815260059290921b84018101918181019086841115614d2d57600080fd5b8286015b84811015614d51578035614d4481614876565b8352918301918301614d31565b509695505050505050565b600082601f830112614d6d57600080fd5b81356020614d7d614d0983614cc5565b82815260059290921b84018101918181019086841115614d9c57600080fd5b8286015b84811015614d515780358352918301918301614da0565b600060e08284031215614dc957600080fd5b614dd1614c2e565b9050614ddc8261488b565b8152614dea6020830161488b565b6020820152614dfb6040830161488b565b604082015260608201356060820152614e1660808301614cba565b608082015260a08201356001600160401b0380821115614e3557600080fd5b614e4185838601614ce8565b60a084015260c0840135915080821115614e5a57600080fd5b50614e6784828501614d5c565b60c08301525092915050565b600060208284031215614e8557600080fd5b81356001600160401b03811115614e9b57600080fd5b614ea784828501614db7565b949350505050565b600060208284031215614ec157600080fd5b813560ff81168114614a0357600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614ef857600080fd5b85356001600160401b0380821115614f0f57600080fd5b9087019060e0828a031215614f2357600080fd5b90955060208701359080821115614f3957600080fd5b50614f46888289016147f1565b909550935050604086013591506060860135614f6181614ed2565b809150509295509295909350565b60008060408385031215614f8257600080fd5b8235614f8d81614876565b91506020830135614f9d81614876565b809150509250929050565b600060408284031215614fba57600080fd5b614fc2614c56565b905081356001600160401b0380821115614fdb57600080fd5b818401915084601f830112614fef57600080fd5b813560208282111561500357615003614c18565b615015601f8301601f19168201614c78565b9250818352868183860101111561502b57600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561506857600080fd5b853561507381614876565b9450602086013561508381614876565b935060408601356001600160401b038082111561509f57600080fd5b6150ab89838a01614fa8565b945060608801359150808211156150c157600080fd5b506150ce88828901614fa8565b95989497509295608001359392505050565b600080604083850312156150f357600080fd5b82356150fe81614876565b915060208301356001600160401b0381111561511957600080fd5b61512585828601614ce8565b9150509250929050565b600081518084526020808501945080840160005b8381101561515f57815187529582019590820190600101615143565b509495945050505050565b602081526000614a03602083018461512f565b6000806020838503121561519057600080fd5b82356001600160401b038111156151a657600080fd5b61486a85828601614952565b600080604083850312156151c557600080fd5b82356151d081614876565b946020939093013593505050565b600080600080608085870312156151f457600080fd5b84356151ff81614876565b935060208501359250604085013561521681614876565b9396929550929360600135925050565b600081518084526020808501945080840160005b8381101561515f5781516001600160a01b03168752958201959082019060010161523a565b6040815260006152726040830185615226565b8281036020840152611220818561512f565b60008060006060848603121561529957600080fd5b83356152a481614876565b925060208401356001600160401b038111156152bf57600080fd5b6152cb86828701614fa8565b925050604084013590509250925092565b6000606082840312156152ee57600080fd5b614a03838361493a565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156153385761533861530e565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e1983360301811261538c57600080fd5b9190910192915050565b6000808335601e198436030181126153ad57600080fd5b8301803591506001600160401b038211156153c757600080fd5b6020019150600581901b360382131561450957600080fd5b6060810182356153ee81614876565b6001600160a01b03908116835260208401359061540a82614876565b166020830152604083013561541e81614ca8565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561547257600080fd5b8151614a0381614876565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561553657600080fd5b8151614a0381614ed2565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261538c57600080fd5b6000602082840312156155b157600080fd5b8135614a0381614ed2565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261561760e0850182615226565b905060c083015184820360c0860152611220828261512f565b602081526000614a0360208301846155bc565b60006020828403121561565557600080fd5b5051919050565b600082601f83011261566d57600080fd5b8151602061567d614d0983614cc5565b82815260059290921b8401810191818101908684111561569c57600080fd5b8286015b84811015614d5157805183529183019183016156a0565b600080604083850312156156ca57600080fd5b82516001600160401b03808211156156e157600080fd5b818501915085601f8301126156f557600080fd5b81516020615705614d0983614cc5565b82815260059290921b8401810191818101908984111561572457600080fd5b948201945b8386101561574b57855161573c81614876565b82529482019490820190615729565b9188015191965090935050508082111561576457600080fd5b506151258582860161565c565b600082198211156157845761578461530e565b500190565b60008282101561579b5761579b61530e565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ea760408301846155bc565b6000602082840312156157ef57600080fd5b8135614a0381614ca8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561582581614876565b61582f81836157fa565b5060018101602083013561584281614876565b61584c81836157fa565b50604083013561585b81614ca8565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006158893683614db7565b92915050565b6020808252606e908201526000805160206159b583398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561594b5785810183015185820160600152820161592f565b8181111561595d576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561598657600080fd5b81516001600160e01b031981168114614a0357600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a26469706673582212203a9863b190b0abcf799891a42203a11c6933a165f6897ec6ac670f95b48c927b64736f6c634300080c0033","sourceMap":"1137:46343:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43577:472;;;;;;:::i;:::-;;:::i;:::-;;;1014:25:184;;;1002:2;987:18;43577:472:2;;;;;;;;1131:182:3;;1194:119;1131:182;;46547:630:2;;;;;;:::i;:::-;;:::i;14140:1400::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4795:692::-;;;;;;:::i;:::-;;:::i;:::-;;5826:138:29;;;;;;:::i;:::-;;:::i;20110:571:2:-;;;;;;:::i;:::-;;:::i;3832:392:29:-;;;;;;:::i;:::-;;:::i;21527:243:2:-;;;;;;:::i;:::-;;:::i;40642:159::-;;;;;;:::i;:::-;-1:-1:-1;;;;;40743:26:2;40717:7;40743:26;;;:16;:26;;;;;:51;;;-1:-1:-1;;;40743:51:2;;;;;40642:159;44553:408;;;;;;:::i;:::-;;:::i;649:130:3:-;;699:80;649:130;;3318:607:2;;;;;;:::i;:::-;;:::i;19082:486::-;;;;;;:::i;:::-;;:::i;3363:46:3:-;;;;;;:::i;:::-;;;;;;;;;;;;;;18069:471:2;;;;;;:::i;:::-;;:::i;1703:49:3:-;;;;;;;;-1:-1:-1;;;;;9831:32:184;;;9813:51;;9801:2;9786:18;1703:49:3;9642:228:184;40405:147:2;;;;;;:::i;:::-;-1:-1:-1;;;;;40500:26:2;;;40474:7;40500:26;;;:16;:26;;;;;:45;;;;;40405:147;39718:123;;;;;;:::i;:::-;;:::i;:::-;;;10248:14:184;;10241:22;10223:41;;10211:2;10196:18;39718:123:2;10083:187:184;878:152:3;;939:91;878:152;;1911:49;;;;;1885:74:2;;1944:15;1885:74;;4299:136:29;;;:::i;44115:150:2:-;;;;;;:::i;:::-;;:::i;5606:149:29:-;;;;;;:::i;:::-;5724:7;;5695:1;:10;;;;;;;;5724:14;;;5723:24;;5606:149;5418:87;5491:7;;5418:87;;16982:353:2;;;;;;:::i;:::-;;:::i;20889:167::-;;;;;;:::i;:::-;;:::i;3159:46:3:-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3159:46:3;;;39948:122:2;;;;;;:::i;:::-;;:::i;2071:101:42:-;;;:::i;2612:71:3:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;9720:1488:2;;;;;;:::i;:::-;;:::i;1825:37:29:-;;;;;-1:-1:-1;;;;;1825:37:29;;;1441:85:42;1513:6;;-1:-1:-1;;;;;1513:6:42;1441:85;;40891:368:2;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2027:104::-;;2088:42;2027:104;;6276:262;;;;;;:::i;:::-;;:::i;4904:62:3:-;;;;;;:::i;:::-;;;;;;;;;;;;;;1811:33;;;;;4607:50;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3852:81;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;4451:39;;;;;;5466:66;;;;;;:::i;:::-;;;;;;;;;;;;;;40173:140:2;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40280:26:2;;;;;:16;:26;;;;;40273:33;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40273:33:2;;;;;;;;;;40173:140;;;;;21632:13:184;;-1:-1:-1;;;;;21628:22:184;;;21610:41;;21711:4;21699:17;;;21693:24;21689:33;;;21667:20;;;21660:63;21771:17;;;21765:24;21791:10;21761:41;21739:20;;;21732:71;21560:2;21545:18;40173:140:2;21360:449:184;45391:560:2;;;;;;:::i;:::-;;:::i;2051:60:3:-;;2105:6;2051:60;;41484:1765:2;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;11533:2250::-;;;;;;:::i;:::-;;:::i;7541:578::-;;;;;;:::i;:::-;;:::i;5791:265::-;;;;;;:::i;:::-;;:::i;2321:198:42:-;;;;;;:::i;:::-;;:::i;39379:227:2:-;;;:::i;4911:437:29:-;;;;;;:::i;:::-;;:::i;43577:472:2:-;43704:24;;43659:7;;;43738:273;43758:21;;;43738:273;;;43800:27;43830:29;:44;43860:10;;43871:1;43860:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43830:44:2;-1:-1:-1;;;;;43830:44:2;;;;;;;;;;;;;43800:74;;43914:15;43892:19;:37;43888:113;;;43967:19;43949:37;;43888:113;-1:-1:-1;43781:3:2;;;:::i;:::-;;;43738:273;;;-1:-1:-1;44027:15:2;43577:472;-1:-1:-1;;;43577:472:2:o;46547:630::-;46870:101;;;1194:119:3;46870:101:2;;;;24847:25:184;;;;-1:-1:-1;;;;;24946:15:184;;;24926:18;;;24919:43;24998:15;;;24978:18;;;24971:43;25050:15;;25030:18;;;25023:43;25082:19;;;25075:35;;;25126:19;;;;25119:35;;;46870:101:2;;;;;;;;;;24819:19:184;;;;46870:101:2;;;46847:134;;;;;-1:-1:-1;;;47096:17:2;:15;:17::i;:::-;47067:67;;-1:-1:-1;;;47067:67:2;;;25423:27:184;25466:11;;;25459:27;;;;25502:12;;;25495:28;;;25539:12;;47067:67:2;;;;;;-1:-1:-1;;47067:67:2;;;;;;47057:78;;47067:67;47057:78;;;;;46547:630;-1:-1:-1;;;;;;;;46547:630:2:o;14140:1400::-;5724:7:29;;14305:16:2;;1520:1;;5695:10:29;5724:14;;;5723:24;2767:14;2759:52;;;;-1:-1:-1;;;2759:52:29;;;;;;;:::i;:::-;;;;;;;;;14333:32:2::1;14382:22:::0;-1:-1:-1;;;;;14368:44:2;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;14368:44:2::1;-1:-1:-1::0;14453:10:2::1;14422:16;14441:23:::0;;;:11:::1;:23;::::0;;;;;14333:79;;-1:-1:-1;;;;;;14441:23:2;;::::1;::::0;14475:1027:::1;14495:33:::0;;::::1;14475:1027;;;14604:22;;14627:1;14604:25;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:32;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;:39;;14557:22;;14580:1;14557:25;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:36;::::0;;::::1;:::i;:::-;:43;;:86;14549:155;;;::::0;-1:-1:-1;;;14549:155:2;;27580:2:184;14549:155:2::1;::::0;::::1;27562:21:184::0;27619:2;27599:18;;;27592:30;27658:34;27638:18;;;27631:62;27729:26;27709:18;;;27702:54;27773:19;;14549:155:2::1;27378:420:184::0;14549:155:2::1;14766:10;14726:22:::0;;14749:1;14726:25;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:36;::::0;;;;;::::1;;;:::i;:::-;-1:-1:-1::0;;;;;14726:50:2::1;;14718:123;;;::::0;-1:-1:-1;;;14718:123:2;;28005:2:184;14718:123:2::1;::::0;::::1;27987:21:184::0;28044:2;28024:18;;;28017:30;28083:34;28063:18;;;28056:62;28154:30;28134:18;;;28127:58;28202:19;;14718:123:2::1;27803:424:184::0;14718:123:2::1;15182:309;15240:10;15278:8;15316:22;;15339:1;15316:25;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:36;::::0;;;;;::::1;;;:::i;:::-;15382:22;;15405:1;15382:25;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:36;::::0;;::::1;:::i;:::-;15182:309;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;15444:22:2;;-1:-1:-1;15444:22:2;;-1:-1:-1;15467:1:2;;-1:-1:-1;15444:25:2;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:32;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;15182:309;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;15182:31:2::1;::::0;-1:-1:-1;;;15182:309:2:i:1;:::-;15161:15;15177:1;15161:18;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:330;14530:3;::::1;::::0;::::1;:::i;:::-;;;;14475:1027;;;-1:-1:-1::0;15518:15:2;;14140:1400;-1:-1:-1;;;;;14140:1400:2:o;4795:692::-;4955:23;4967:10;4955:11;:23::i;:::-;4954:24;4946:111;;;;-1:-1:-1;;;4946:111:2;;28434:2:184;4946:111:2;;;28416:21:184;28473:2;28453:18;;;28446:30;28512:34;28492:18;;;28485:62;28583:34;28563:18;;;28556:62;-1:-1:-1;;;28634:19:184;;;28627:41;28685:19;;4946:111:2;28232:478:184;4946:111:2;5067:59;5087:10;5099:26;5067:19;:59::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;5248:70:2;5258:10;;5282:23;5315:1;5248:9;:70::i;:::-;5375:10;-1:-1:-1;;;;;5356:58:2;;5387:26;5356:58;;;;;;:::i;:::-;;;;;;;;5456:10;-1:-1:-1;;;;;5429:51:2;;5468:11;;5429:51;;;;;;;:::i;:::-;;;;;;;;4936:551;4795:692;;;:::o;5826:138:29:-;2285:14;;;;;;;;;-1:-1:-1;;;;;2285:14:29;-1:-1:-1;;;;;2285:23:29;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2271:39:29;:10;-1:-1:-1;;;;;2271:39:29;;2263:94;;;;-1:-1:-1;;;2263:94:29;;;;;;;:::i;:::-;5920:37:::1;5939:17;5920:18;:37::i;:::-;5826:138:::0;:::o;20110:571:2:-;2353:10;-1:-1:-1;;;;;2375:15:2;2353:38;;;:80;;-1:-1:-1;2395:10:2;-1:-1:-1;;;;;2417:15:2;2395:38;;2353:80;2332:182;;;;-1:-1:-1;;;2332:182:2;;;;;;;:::i;:::-;20338:19:::1;20350:6;20338:11;:19::i;:::-;20334:341;;;-1:-1:-1::0;;;;;20392:19:2;;::::1;20373:16;20392:19:::0;;;:11:::1;:19;::::0;;;;;::::1;20489:175;20392:19:::0;20404:6;20609:8;20643:6;20489:23:::1;:175::i;:::-;20359:316;20334:341;20110:571:::0;;;:::o;3832:392:29:-;2125:14;;:35;;-1:-1:-1;;;2125:35:29;;2149:10;2125:35;;;9813:51:184;-1:-1:-1;;;;;2125:14:29;;;;:23;;9786:18:184;;2125:35:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2117:88;;;;-1:-1:-1;;;2117:88:29;;;;;;;:::i;:::-;4064:7:::1;::::0;4034:25;;::::1;4033:38;4025:107;;;::::0;-1:-1:-1;;;4025:107:29;;31751:2:184;4025:107:29::1;::::0;::::1;31733:21:184::0;31790:2;31770:18;;;31763:30;31829:34;31809:18;;;31802:62;31900:26;31880:18;;;31873:54;31944:19;;4025:107:29::1;31549:420:184::0;4025:107:29::1;4142:7;:25:::0;;;4182:35:::1;::::0;1014:25:184;;;4189:10:29::1;::::0;4182:35:::1;::::0;1002:2:184;987:18;4182:35:29::1;;;;;;;;3832:392:::0;:::o;21527:243:2:-;1334:13:42;:11;:13::i;:::-;21695:68:2::1;21729:10;;21741:21;;21695:33;:68::i;44553:408::-:0;-1:-1:-1;;;;;44800:19:2;;44708:7;44800:19;;;:11;:19;;;;;;44873:81;44812:6;44800:19;44937:8;44947:6;44873:35;:81::i;:::-;44866:88;44553:408;-1:-1:-1;;;;;44553:408:2:o;3318:607::-;3111:19:46;3134:13;;;;;;3133:14;;3179:34;;;;-1:-1:-1;3197:12:46;;3212:1;3197:12;;;;:16;3179:34;3178:108;;;-1:-1:-1;3258:4:46;1476:19:50;:23;;;3219:66:46;;-1:-1:-1;3268:12:46;;;;;:17;3219:66;3157:201;;;;-1:-1:-1;;;3157:201:46;;32176:2:184;3157:201:46;;;32158:21:184;32215:2;32195:18;;;32188:30;32254:34;32234:18;;;32227:62;-1:-1:-1;;;32305:18:184;;;32298:44;32359:19;;3157:201:46;31974:410:184;3157:201:46;3368:12;:16;;-1:-1:-1;;3368:16:46;3383:1;3368:16;;;3394:65;;;;3428:13;:20;;-1:-1:-1;;3428:20:46;;;;;3394:65;3619:55:2::1;3637:15;3654:19;3619:17;:55::i;:::-;3704:27;:25;:27::i;:::-;3684:17;:47:::0;3741:32:::1;3760:12:::0;3741:18:::1;:32::i;:::-;3783:55;3812:25;3783:28;:55::i;:::-;3848:70;3882:11;;3895:22;;3848:33;:70::i;:::-;3483:14:46::0;3479:99;;;3529:5;3513:21;;-1:-1:-1;;3513:21:46;;;3553:14;;-1:-1:-1;32541:36:184;;3553:14:46;;32529:2:184;32514:18;3553:14:46;;;;;;;3479:99;3101:483;3318:607:2;;;;;;;;:::o;19082:486::-;2353:10;-1:-1:-1;;;;;2375:15:2;2353:38;;;:80;;-1:-1:-1;2395:10:2;-1:-1:-1;;;;;2417:15:2;2395:38;;2353:80;2332:182;;;;-1:-1:-1;;;2332:182:2;;;;;;;:::i;:::-;19310:19:::1;19322:6;19310:11;:19::i;:::-;19306:256;;;-1:-1:-1::0;;;;;19364:19:2;;::::1;19345:16;19364:19:::0;;;:11:::1;:19;::::0;;;;;::::1;19454:97;19364:19:::0;19376:6;19525:8;19543:6;19454:23:::1;:97::i;18069:471::-:0;5724:7:29;;1664:1:2;;5695:10:29;5724:14;;;5723:24;2767:14;2759:52;;;;-1:-1:-1;;;2759:52:29;;;;;;;:::i;:::-;1815:1:49::1;2569:7;;:19;;2561:63;;;::::0;-1:-1:-1;;;2561:63:49;;32790:2:184;2561:63:49::1;::::0;::::1;32772:21:184::0;32829:2;32809:18;;;32802:30;32868:33;32848:18;;;32841:61;32919:18;;2561:63:49::1;32588:355:184::0;2561:63:49::1;1815:1;2699:7;:18:::0;18366:9:2::2;18361:173;18381:22:::0;;::::2;18361:173;;;18424:99;18450:11;;18462:1;18450:14;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;18466:6;;18473:1;18466:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;18477:22;;18500:1;18477:25;;;;;;;:::i;:::-;;;;;;;18504:15;;18520:1;18504:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;18424:25;:99::i;:::-;18405:3;::::0;::::2;:::i;:::-;;;18361:173;;;-1:-1:-1::0;;1772:1:49::1;2872:7;:22:::0;-1:-1:-1;;;;;;;;18069:471:2:o;39718:123::-;-1:-1:-1;;;;;39800:19:2;;;39776:4;39800:19;;;:11;:19;;;;;;;:33;;;39718:123::o;4299:136:29:-;2125:14;;:35;;-1:-1:-1;;;2125:35:29;;2149:10;2125:35;;;9813:51:184;-1:-1:-1;;;;;2125:14:29;;;;:23;;9786:18:184;;2125:35:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2117:88;;;;-1:-1:-1;;;2117:88:29;;;;;;;:::i;:::-;-1:-1:-1;;4349:7:29::1;:27:::0;;;4391:37:::1;::::0;1014:25:184;;;4398:10:29::1;::::0;4391:37:::1;::::0;1002:2:184;987:18;4391:37:29::1;;;;;;;4299:136::o:0;44115:150:2:-;44199:7;44246:10;44235:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;44225:33;;;;;;44218:40;;44115:150;;;:::o;16982:353::-;5724:7:29;;1664:1:2;;5695:10:29;5724:14;;;5723:24;2767:14;2759:52;;;;-1:-1:-1;;;2759:52:29;;;;;;;:::i;:::-;1815:1:49::1;2569:7;;:19;;2561:63;;;::::0;-1:-1:-1;;;2561:63:49;;32790:2:184;2561:63:49::1;::::0;::::1;32772:21:184::0;32829:2;32809:18;;;32802:30;32868:33;32848:18;;;32841:61;32919:18;;2561:63:49::1;32588:355:184::0;2561:63:49::1;1815:1;2699:7;:18:::0;17244:84:2::2;17270:10:::0;17282:6;;17290:20;17312:15;17244:25:::2;:84::i;:::-;-1:-1:-1::0;;1772:1:49::1;2872:7;:22:::0;-1:-1:-1;;;;16982:353:2:o;20889:167::-;1334:13:42;:11;:13::i;:::-;20992:57:2::1;21021:27;20992:28;:57::i;39948:122::-:0;-1:-1:-1;;;;;40030:33:2;;;40007:4;40030:21;;;:11;:21;;;;;;;;;:33;;39948:122::o;2071:101:42:-;1334:13;:11;:13::i;:::-;2135:30:::1;2162:1;2135:18;:30::i;:::-;2071:101::o:0;9720:1488:2:-;10074:15;10039:24;:31;;;:50;;10018:162;;;;-1:-1:-1;;;10018:162:2;;35326:2:184;10018:162:2;;;35308:21:184;35365:2;35345:18;;;35338:30;35404:34;35384:18;;;35377:62;35475:34;35455:18;;;35448:62;-1:-1:-1;;;35526:19:184;;;35519:32;35568:19;;10018:162:2;35124:469:184;10018:162:2;10199:19;10211:6;10199:11;:19::i;:::-;10198:20;10190:110;;;;-1:-1:-1;;;10190:110:2;;35800:2:184;10190:110:2;;;35782:21:184;35839:2;35819:18;;;35812:30;35878:34;35858:18;;;35851:62;35949:34;35929:18;;;35922:62;-1:-1:-1;;;36000:19:184;;;35993:44;36054:19;;10190:110:2;35598:481:184;10190:110:2;10318:20;10329:8;10318:10;:20::i;:::-;10310:114;;;;-1:-1:-1;;;10310:114:2;;36286:2:184;10310:114:2;;;36268:21:184;36325:2;36305:18;;;36298:30;36364:34;36344:18;;;36337:62;36435:34;36415:18;;;36408:62;-1:-1:-1;;;36486:19:184;;;36479:48;36544:19;;10310:114:2;36084:485:184;10310:114:2;10505:26;10534:11;:19;10546:6;-1:-1:-1;;;;;10534:19:2;-1:-1:-1;;;;;10534:19:2;;;;;;;;;;;;;10505:48;;10563:24;10590:164;10639:6;10659:18;10691:8;10713:24;:31;;;10590:35;:164::i;:::-;-1:-1:-1;;;;;10788:19:2;;;;;;:11;:19;;;;;10831:1;10810:22;;10788:44;;10978:34;;10563:191;;-1:-1:-1;10907:106:2;;10800:6;;10563:191;;10907:44;:106::i;:::-;11132:69;11142:6;11150:8;11160:26;11188:12;11132:9;:69::i;:::-;9970:1238;;9720:1488;;;;;:::o;40891:368::-;41010:16;41038:23;41078:10;:17;-1:-1:-1;;;;;41064:32:2;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41064:32:2;;41038:58;;41111:9;41106:124;41130:10;:17;41126:1;:21;41106:124;;;-1:-1:-1;;;;;41180:24:2;;;;;;:14;:24;;;;;41205:13;;41180:24;;;41205:10;;41216:1;;41205:13;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;41180:39:2;-1:-1:-1;;;;;41180:39:2;;;;;;;;;;;;;41168:6;41175:1;41168:9;;;;;;;;:::i;:::-;;;;;;;;;;:51;41149:3;;;:::i;:::-;;;41106:124;;6276:262;6367:22;6378:10;6367;:22::i;:::-;6359:106;;;;-1:-1:-1;;;6359:106:2;;36776:2:184;6359:106:2;;;36758:21:184;36815:2;36795:18;;;36788:30;36854:34;36834:18;;;36827:62;36925:34;36905:18;;;36898:62;-1:-1:-1;;;36976:19:184;;;36969:38;37024:19;;6359:106:2;36574:475:184;6359:106:2;6507:10;-1:-1:-1;;;;;6480:51:2;;6519:11;;6480:51;;;;;;;:::i;:::-;;;;;;;;6276:262;;:::o;45391:560::-;45673:78;;;939:91:3;45673:78:2;;;;37313:25:184;;;;-1:-1:-1;;;;;37412:15:184;;;37392:18;;;37385:43;37464:15;;37444:18;;;37437:43;37496:18;;;37489:34;;;37539:19;;;;37532:35;;;45673:78:2;;;;;;;;;;37285:19:184;;;;45673:78:2;;;45650:111;;;;;-1:-1:-1;;;45874:17:2;:15;:17::i;:::-;45845:65;;-1:-1:-1;;;45845:65:2;;;25423:27:184;25466:11;;;25459:27;;;;25502:12;;;25495:28;;;25539:12;;45845:65:2;;;;;;-1:-1:-1;;45845:65:2;;;;;;45835:76;;45845:65;45835:76;;;;;45391:560;-1:-1:-1;;;;;;;45391:560:2:o;41484:1765::-;41685:38;;-1:-1:-1;;;41685:38:2;;-1:-1:-1;;;;;9831:32:184;;;41685:38:2;;;9813:51:184;41551:18:2;;;;-1:-1:-1;;41685:15:2;:30;;;;;;9786:18:184;;41685:38:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41831:35;;-1:-1:-1;;;41831:35:2;;-1:-1:-1;;;;;9831:32:184;;;41831:35:2;;;9813:51:184;41666:57:2;;-1:-1:-1;;;;;41831:15:2;:27;;;;;;9786:18:184;;41831:35:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41831:35:2;;;;;;;;;;;;:::i;:::-;41733:133;;;;41979:1;41966:9;:14;41962:98;;42004:21;;42027;;-1:-1:-1;41484:1765:2;-1:-1:-1;;;41484:1765:2:o;41962:98::-;42070:29;42109:23;42147:21;:28;42179:1;42147:33;42143:1062;;;42282:18;;;42298:1;42282:18;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42323:16:2;;;42337:1;42323:16;;;;;;;;;42269:31;;-1:-1:-1;42337:1:2;-1:-1:-1;42323:16:2;;;;;;;;;;;-1:-1:-1;42323:16:2;42314:25;;2088:42;42353:10;42364:1;42353:13;;;;;;;;:::i;:::-;;;;;;:38;-1:-1:-1;;;;;42353:38:2;;;-1:-1:-1;;;;;42353:38:2;;;;;42425:9;42405:6;42412:1;42405:9;;;;;;;;:::i;:::-;;;;;;:30;;;;;42143:1062;;;42583:28;;:32;;42614:1;42583:32;:::i;:::-;-1:-1:-1;;;;;42567:49:2;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42567:49:2;;42554:62;;42653:10;:17;-1:-1:-1;;;;;42639:32:2;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42639:32:2;;42630:41;;42774:9;42769:219;42793:21;:28;42789:1;:32;42769:219;;;42859:21;42881:1;42859:24;;;;;;;;:::i;:::-;;;;;;;42843:10;42854:1;42843:13;;;;;;;;:::i;:::-;;;;;;:40;-1:-1:-1;;;;;42843:40:2;;;-1:-1:-1;;;;;42843:40:2;;;;;42913:21;42935:1;42913:24;;;;;;;;:::i;:::-;;;;;;;42901:6;42908:1;42901:9;;;;;;;;:::i;:::-;;;;;;;;;;:36;42968:3;;42769:219;;;;2088:42;43072:10;43103:1;43083:10;:17;:21;;;;:::i;:::-;43072:33;;;;;;;;:::i;:::-;;;;;;:58;-1:-1:-1;;;;;43072:58:2;;;-1:-1:-1;;;;;43072:58:2;;;;;43184:9;43144:6;43171:1;43151:10;:17;:21;;;;:::i;:::-;43144:29;;;;;;;;:::i;:::-;;;;;;:50;;;;;42143:1062;43223:10;;43235:6;;-1:-1:-1;41484:1765:2;-1:-1:-1;;;;;41484:1765:2:o;11533:2250::-;5724:7:29;;11636:32:2;;1520:1;;5695:10:29;5724:14;;;5723:24;2767:14;2759:52;;;;-1:-1:-1;;;2759:52:29;;;;;;;:::i;:::-;11688:19:2::1;11700:6;11688:11;:19::i;:::-;11680:100;;;::::0;-1:-1:-1;;;11680:100:2;;40149:2:184;11680:100:2::1;::::0;::::1;40131:21:184::0;40188:2;40168:18;;;40161:30;;;40227:34;40207:18;;;40200:62;40298:34;40278:18;;;40271:62;-1:-1:-1;;;40349:19:184;;;40342:35;40394:19;;11680:100:2::1;39947:472:184::0;11680:100:2::1;11799:18;11810:6;11799:10;:18::i;:::-;11798:19;11790:93;;;::::0;-1:-1:-1;;;11790:93:2;;40626:2:184;11790:93:2::1;::::0;::::1;40608:21:184::0;40665:2;40645:18;;;40638:30;40704:34;40684:18;;;40677:62;40775:31;40755:18;;;40748:59;40824:19;;11790:93:2::1;40424:425:184::0;11790:93:2::1;-1:-1:-1::0;;;;;11901:20:2;::::1;11893:93;;;::::0;-1:-1:-1;;;11893:93:2;;41056:2:184;11893:93:2::1;::::0;::::1;41038:21:184::0;41095:2;41075:18;;;41068:30;41134:34;41114:18;;;41107:62;41205:30;41185:18;;;41178:58;41253:19;;11893:93:2::1;40854:424:184::0;11893:93:2::1;-1:-1:-1::0;;;;;12015:19:2;;::::1;11996:16;12015:19:::0;;;:11:::1;:19;::::0;;;;;;;::::1;::::0;12065:10:::1;:20;::::0;:62:::1;;-1:-1:-1::0;12105:10:2::1;-1:-1:-1::0;;;;;12105:22:2;::::1;;12065:62;:141;;;-1:-1:-1::0;;;;;;12161:26:2;;::::1;;::::0;;;:16:::1;:26;::::0;;;;:45:::1;;::::0;::::1;12147:10;:59;12065:141;12044:249;;;::::0;-1:-1:-1;;;12044:249:2;;41485:2:184;12044:249:2::1;::::0;::::1;41467:21:184::0;41524:2;41504:18;;;41497:30;41563:34;41543:18;;;41536:62;41634:31;41614:18;;;41607:59;41683:19;;12044:249:2::1;41283:425:184::0;12044:249:2::1;12471:29;12502:23:::0;12529:28:::1;12550:6;12529:20;:28::i;:::-;12470:87:::0;;-1:-1:-1;12470:87:2;-1:-1:-1;12655:10:2::1;-1:-1:-1::0;;;;;12655:20:2;::::1;;12651:96;;12727:8;-1:-1:-1::0;;;;;12696:40:2::1;12719:6;-1:-1:-1::0;;;;;12696:40:2::1;;;;;;;;;;;12651:96;12821:8;-1:-1:-1::0;;;;;12795:35:2::1;12813:6;-1:-1:-1::0;;;;;12795:35:2::1;;;;;;;;;;;-1:-1:-1::0;;;;;12840:19:2;::::1;12870:1;12840:19:::0;;;:11:::1;:19;::::0;;;;:32;;-1:-1:-1;;;;;;12840:32:2::1;::::0;;12976:17;;12972:772:::1;;13032:16;::::0;;13046:1:::1;13032:16:::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;12972:772:2::1;;;13111:10;:17;-1:-1:-1::0;;;;;13097:32:2::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;13097:32:2::1;;13079:50;;13148:9;13143:591;13167:10;:17;13163:1;:21;13143:591;;;13245:18;::::0;;13261:1:::1;13245:18:::0;;;;;::::1;::::0;;;13209:33:::1;::::0;13245:18:::1;::::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;13312:16:2::1;::::0;;13326:1:::1;13312:16:::0;;;;;::::1;::::0;;;13209:54;;-1:-1:-1;13281:28:2::1;::::0;13312:16;-1:-1:-1;13312:16:2::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;13312:16:2::1;13281:47;;13366:10;13377:1;13366:13;;;;;;;;:::i;:::-;;;;;;;13346:14;13361:1;13346:17;;;;;;;;:::i;:::-;;;;;;:33;-1:-1:-1::0;;;;;13346:33:2::1;;;-1:-1:-1::0;;;;;13346:33:2::1;;;::::0;::::1;13414:6;13421:1;13414:9;;;;;;;;:::i;:::-;;;;;;;13397:11;13409:1;13397:14;;;;;;;;:::i;:::-;;;;;;:26;;;::::0;::::1;13463:256;13525:6;13563:8;13605:6;13645:14;13689:11;13463:31;:256::i;:::-;13442:15;13458:1;13442:18;;;;;;;;:::i;:::-;;;;;;:277;;;::::0;::::1;13191:543;;13186:3;;;;;:::i;:::-;;;;13143:591;;;;12972:772;13754:22;;;11533:2250:::0;;;;:::o;7541:578::-;7714:23;7726:10;7714:11;:23::i;:::-;7713:24;7705:103;;;;-1:-1:-1;;;7705:103:2;;41915:2:184;7705:103:2;;;41897:21:184;41954:2;41934:18;;;41927:30;41993:34;41973:18;;;41966:62;42064:34;42044:18;;;42037:62;-1:-1:-1;;;42115:19:184;;;42108:33;42158:19;;7705:103:2;41713:470:184;7705:103:2;7826:20;7837:8;7826:10;:20::i;:::-;7818:103;;;;-1:-1:-1;;;7818:103:2;;42390:2:184;7818:103:2;;;42372:21:184;42429:2;42409:18;;;42402:30;42468:34;42448:18;;;42441:62;42539:34;42519:18;;;42512:62;-1:-1:-1;;;42590:19:184;;;42583:37;42637:19;;7818:103:2;42188:474:184;7818:103:2;8039:73;8049:10;8061:8;8071:26;8099:12;8039:9;:73::i;5791:265::-;5894:22;5905:10;5894;:22::i;:::-;5886:102;;;;-1:-1:-1;;;5886:102:2;;42869:2:184;5886:102:2;;;42851:21:184;42908:2;42888:18;;;42881:30;42947:34;42927:18;;;42920:62;43018:34;42998:18;;;42991:62;-1:-1:-1;;;43069:19:184;;;43062:34;43113:19;;5886:102:2;42667:471:184;5886:102:2;5998:51;6018:10;6030:18;5998:19;:51::i;2321:198:42:-;1334:13;:11;:13::i;:::-;-1:-1:-1;;;;;2409:22:42;::::1;2401:73;;;::::0;-1:-1:-1;;;2401:73:42;;43345:2:184;2401:73:42::1;::::0;::::1;43327:21:184::0;43384:2;43364:18;;;43357:30;43423:34;43403:18;;;43396:62;-1:-1:-1;;;43474:18:184;;;43467:36;43520:19;;2401:73:42::1;43143:402:184::0;2401:73:42::1;2484:28;2503:8;2484:18;:28::i;39379:227:2:-:0;39427:7;39467:17;39450:13;:34;39446:154;;;-1:-1:-1;39507:17:2;;;39379:227::o;39446:154::-;39562:27;:25;:27::i;:::-;39555:34;;39379:227;:::o;4911:437:29:-;2285:14;;;;;;;;;-1:-1:-1;;;;;2285:14:29;-1:-1:-1;;;;;2285:23:29;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2271:39:29;:10;-1:-1:-1;;;;;2271:39:29;;2263:94;;;;-1:-1:-1;;;2263:94:29;;;;;;;:::i;:::-;5164:7:::1;;5163:8;5141:15;5140:16;5128:7;;5127:8;5126:31;5125:47;5104:150;;;::::0;-1:-1:-1;;;5104:150:29;;43752:2:184;5104:150:29::1;::::0;::::1;43734:21:184::0;43791:2;43771:18;;;43764:30;43830:34;43810:18;;;43803:62;43901:26;43881:18;;;43874:54;43945:19;;5104:150:29::1;43550:420:184::0;5104:150:29::1;5264:7;:25:::0;;;5304:37:::1;::::0;1014:25:184;;;5313:10:29::1;::::0;5304:37:::1;::::0;1002:2:184;987:18;5304:37:29::1;868:177:184::0;33099:2938:2;33316:7;-1:-1:-1;;;;;33343:20:2;;33335:113;;;;-1:-1:-1;;;33335:113:2;;44177:2:184;33335:113:2;;;44159:21:184;44216:2;44196:18;;;44189:30;44255:34;44235:18;;;44228:62;44326:34;44306:18;;;44299:62;-1:-1:-1;;;44377:19:184;;;44370:47;44434:19;;33335:113:2;43975:484:184;33335:113:2;33466:17;;33458:112;;;;-1:-1:-1;;;33458:112:2;;44666:2:184;33458:112:2;;;44648:21:184;44705:2;44685:18;;;44678:30;44744:34;44724:18;;;44717:62;44815:34;44795:18;;;44788:62;-1:-1:-1;;;44866:19:184;;;44859:44;44920:19;;33458:112:2;44464:481:184;33458:112:2;33728:9;33723:1588;33747:10;:17;33743:1;:21;33723:1588;;;-1:-1:-1;;;;;33831:22:2;;;33827:264;;33873:203;33929:8;33967:6;34005:10;34016:1;34005:13;;;;;;;;:::i;:::-;;;;;;;34048:6;34055:1;34048:9;;;;;;;;:::i;:::-;;;;;;;33873:23;:203::i;:::-;2088:42;-1:-1:-1;;;;;34182:39:2;:10;34193:1;34182:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;34182:39:2;;34178:1091;;;34690:15;-1:-1:-1;;;;;34690:28:2;;34719:6;34727;34734:1;34727:9;;;;;;;;:::i;:::-;;;;;;;34690:47;;;;;;;;;;;;;;;-1:-1:-1;;;;;45142:32:184;;;;45124:51;;45206:2;45191:18;;45184:34;45112:2;45097:18;;44950:274;34690:47:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34178:1091;;;34815:10;-1:-1:-1;;;;;34805:20:2;:6;-1:-1:-1;;;;;34805:20:2;;:84;;;;34830:15;-1:-1:-1;;;;;34830:44:2;;34875:10;34886:1;34875:13;;;;;;;;:::i;:::-;;;;;;;34830:59;;;;;;;;;;;;;;-1:-1:-1;;;;;9831:32:184;;;;9813:51;;9801:2;9786:18;;9642:228;34830:59:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34829:60;34805:84;34776:287;;;;-1:-1:-1;;;34776:287:2;;45431:2:184;34776:287:2;;;45413:21:184;45470:3;45450:18;;;45443:31;;;45510:34;45490:18;;;45483:62;45581:34;45561:18;;;45554:62;45653:34;45632:19;;;45625:63;45725:34;45704:19;;;45697:63;-1:-1:-1;;;45776:19:184;;;45769:35;45821:19;;34776:287:2;45229:617:184;34776:287:2;35192:15;-1:-1:-1;;;;;35192:28:2;;35221:6;35229:10;35240:1;35229:13;;;;;;;;:::i;:::-;;;;;;;35244:6;35251:1;35244:9;;;;;;;;:::i;:::-;;;;;;;35192:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34178:1091;35295:3;;33723:1588;;;-1:-1:-1;;;;;;35398:35:2;;35382:13;35398:35;;;:27;:35;;;;;;;;;;;35443:37;35398:35;35443:37;:::i;:::-;;;;;;35491:28;35522:257;;;;;;;;35555:6;-1:-1:-1;;;;;35522:257:2;;;;;35588:8;-1:-1:-1;;;;;35522:257:2;;;;;35622:10;-1:-1:-1;;;;;35522:257:2;;;;;35653:5;35522:257;;;;35691:12;35522:257;;;;;;35730:10;35522:257;;;;35762:6;35522:257;;;35491:288;;35790:22;35815:35;35839:10;35815:23;:35::i;:::-;35898:34;;;;:18;:34;;;;;;;:41;;-1:-1:-1;;35898:41:2;35935:4;35898:41;;;35955:44;35790:60;;-1:-1:-1;35955:44:2;;;;35790:60;;35988:10;;35955:44;:::i;:::-;;;;;;;;36016:14;33099:2938;-1:-1:-1;;;;;;;;33099:2938:2:o;22246:717::-;1944:15;22378:43;;;;;;;;:::i;:::-;:79;;;;22357:234;;;;-1:-1:-1;;;22357:234:2;;47044:2:184;22357:234:2;;;47026:21:184;47083:3;47063:18;;;47056:31;47123:34;47103:18;;;47096:62;47194:34;47174:18;;;47167:62;47266:34;47245:19;;;47238:63;-1:-1:-1;;;47317:19:184;;;47310:43;47370:19;;22357:234:2;46842:553:184;22357:234:2;-1:-1:-1;;;;;22669:26:2;;;;;;:16;:26;;;;;;;:51;;;-1:-1:-1;;;22669:51:2;;;;;22622:43;;;;;;;;;:::i;:::-;:98;;;;22601:228;;;;-1:-1:-1;;;22601:228:2;;47602:2:184;22601:228:2;;;47584:21:184;47641:2;47621:18;;;47614:30;47680:34;47660:18;;;47653:62;47751:34;47731:18;;;47724:62;-1:-1:-1;;;47802:19:184;;;47795:50;47862:19;;22601:228:2;47400:487:184;22601:228:2;-1:-1:-1;;;;;22839:26:2;;;;;;:16;:26;;;;;22868:18;;22839:47;22868:18;22839:26;:47;:::i;:::-;-1:-1:-1;;22901:55:2;;22925:10;;22901:55;;;;22937:18;;22901:55;:::i;23937:2700::-;5724:7:29;;1383:1:2;;5695::29;5724:14;;;5723:24;2767:14;2759:52;;;;-1:-1:-1;;;2759:52:29;;;;;;;:::i;:::-;-1:-1:-1;;;;;24320:26:2;;::::1;24290:27;24320:26:::0;;;:16:::1;:26;::::0;;;;:45:::1;;::::0;::::1;24782:33:::0;;;::::1;::::0;:70:::1;;-1:-1:-1::0;24819:10:2::1;-1:-1:-1::0;;;;;24819:33:2;::::1;;;24782:70;:96;;;;-1:-1:-1::0;24856:10:2::1;-1:-1:-1::0;;;;;24856:22:2;::::1;;;24782:96;24778:1267;;;24998:15;24961:26;:33;;;:52;;24936:166;;;::::0;-1:-1:-1;;;24936:166:2;;49057:2:184;24936:166:2::1;::::0;::::1;49039:21:184::0;49096:2;49076:18;;;49069:30;49135:34;49115:18;;;49108:62;49206:25;49186:18;;;49179:53;49249:19;;24936:166:2::1;48855:419:184::0;24936:166:2::1;-1:-1:-1::0;;;;;25234:50:2;::::1;;::::0;;;:29:::1;:50;::::0;;;;;;;:64;;;;;;;;;::::1;;25233:65;25208:179;;;::::0;-1:-1:-1;;;25208:179:2;;49481:2:184;25208:179:2::1;::::0;::::1;49463:21:184::0;49520:2;49500:18;;;49493:30;49559:34;49539:18;;;49532:62;49630:25;49610:18;;;49603:53;49673:19;;25208:179:2::1;49279:419:184::0;25208:179:2::1;-1:-1:-1::0;;;;;25401:50:2;::::1;;::::0;;;:29:::1;:50;::::0;;;;;;;:64;;;;;;;:71;;-1:-1:-1;;25401:71:2::1;25468:4;25401:71;::::0;;25729:33;::::1;::::0;25557:219:::1;::::0;25612:6;;25636:8;;25431:19;;25452:12;;25557:37:::1;:219::i;:::-;25528:248;;25849:185;25911:19;25948:18;25984:26;:36;;;25849:44;:185::i;:::-;24880:1165;24778:1267;-1:-1:-1::0;;;;;26148:19:2;;::::1;;::::0;;;:11:::1;:19;::::0;;;;;:30;;-1:-1:-1;;;;;;26148:30:2::1;::::0;;::::1;::::0;;::::1;::::0;;26193:33;::::1;::::0;26148:19;26193:33:::1;26238:29;26269:23:::0;26308:28:::1;26329:6;26308:20;:28::i;:::-;26237:99;;;;26352:9;26347:284;26371:10;:17;26367:1;:21;26347:284;;;26405:183;26457:8;26491:6;26525:10;26536:1;26525:13;;;;;;;;:::i;:::-;;;;;;;26564:6;26571:1;26564:9;;;;;;;;:::i;:::-;;;;;;;26405:23;:183::i;:::-;26615:3;;26347:284;;6024:360:29::0;-1:-1:-1;;;;;6127:40:29;;6106:160;;;;-1:-1:-1;;;6106:160:29;;49905:2:184;6106:160:29;;;49887:21:184;49944:2;49924:18;;;49917:30;49983:34;49963:18;;;49956:62;50054:34;50034:18;;;50027:62;-1:-1:-1;;;50105:19:184;;;50098:40;50155:19;;6106:160:29;49703:477:184;6106:160:29;6299:14;;6281:52;;;-1:-1:-1;;;;;6299:14:29;;;50445:34:184;;50515:15;;;50510:2;50495:18;;50488:43;6281:52:29;;50380:18:184;6281:52:29;;;;;;;6343:14;:34;;-1:-1:-1;;;;;;6343:34:29;-1:-1:-1;;;;;6343:34:29;;;;;;;;;;6024:360::o;32323:308:2:-;-1:-1:-1;;;;;32506:24:2;;;;;;;:14;:24;;;;;;;;:34;;;;;;;;;;;:44;;32544:6;;32506:24;:44;;32544:6;;32506:44;:::i;:::-;;;;;;;;32589:8;-1:-1:-1;;;;;32565:59:2;;32599:6;32607:8;32617:6;32565:59;;;;;;;;:::i;1599:130:42:-;1513:6;;-1:-1:-1;;;;;1513:6:42;929:10:51;1662:23:42;1654:68;;;;-1:-1:-1;;;1654:68:42;;50744:2:184;1654:68:42;;;50726:21:184;;;50763:18;;;50756:30;50822:34;50802:18;;;50795:62;50874:18;;1654:68:42;50542:356:184;37511:1259:2;37693:51;;;37672:172;;;;-1:-1:-1;;;37672:172:2;;51105:2:184;37672:172:2;;;51087:21:184;51144:2;51124:18;;;51117:30;51183:34;51163:18;;;51156:62;51254:34;51234:18;;;51227:62;-1:-1:-1;;;51305:19:184;;;51298:41;51356:19;;37672:172:2;50903:478:184;37672:172:2;37874:11;37854:17;37902:862;37926:9;37922:1;:13;37902:862;;;37956:18;37977:11;;37989:1;37977:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38049:39:2;;38005:41;38049:39;;;:29;:39;;;;;;37956:35;;-1:-1:-1;38145:22:2;;38168:1;38145:25;;;;;;;:::i;:::-;;;;;;;38102:68;;2105:6:3;38209:32:2;:63;;38184:237;;;;-1:-1:-1;;;38184:237:2;;51588:2:184;38184:237:2;;;51570:21:184;51627:3;51607:18;;;51600:31;51667:34;51647:18;;;51640:62;51738:34;51718:18;;;51711:62;51810:34;51789:19;;;51782:63;-1:-1:-1;;;51861:19:184;;;51854:50;51921:19;;38184:237:2;51386:560:184;38184:237:2;-1:-1:-1;;;;;38487:39:2;;;;;;:29;:39;;;;;;;;;:74;;;38580:173;;52171:51:184;;;52238:18;;52231:34;;;52281:18;;52274:34;;;38580:173:2;;52159:2:184;52144:18;38580:173:2;;;;;;;37942:822;;;37937:3;;;;:::i;:::-;;;37902:862;;;;37662:1108;37511:1259;;;;:::o;2943:441:29:-;3077:14;;-1:-1:-1;;;;;3077:14:29;3069:37;:79;;;;-1:-1:-1;;;;;;3110:38:29;;;;3069:79;3048:197;;;;-1:-1:-1;;;3048:197:29;;52521:2:184;3048:197:29;;;52503:21:184;52560:2;52540:18;;;52533:30;52599:34;52579:18;;;52572:62;52670:34;52650:18;;;52643:62;-1:-1:-1;;;52721:19:184;;;52714:38;52769:19;;3048:197:29;52319:475:184;3048:197:29;3255:7;:26;;;3296:36;;1014:25:184;;;3303:10:29;;3296:36;;1002:2:184;987:18;3296:36:29;;;;;;;3342:35;3361:15;3342:18;:35::i;:::-;2943:441;;:::o;47285:193:2:-;47419:19;;;;;;;;;;;-1:-1:-1;;;47419:19:2;;;;;47381:89;;699:80:3;47381:89:2;;;53030:25:184;47409:30:2;53071:18:184;;;53064:34;47441:13:2;53114:18:184;;;53107:34;47464:4:2;53157:18:184;;;;53150:60;;;;47381:89:2;;;;;;;;;;53002:19:184;;;;47381:89:2;;;47371:100;;;;;;47285:193::o;2673:187:42:-;2765:6;;;-1:-1:-1;;;;;2781:17:42;;;-1:-1:-1;;;;;;2781:17:42;;;;;;;2813:40;;2765:6;;;2781:17;2765:6;;2813:40;;2746:16;;2813:40;2736:124;2673:187;:::o;36810:472:2:-;2105:6:3;36923:25:2;:56;;36902:216;;;;-1:-1:-1;;;36902:216:2;;53423:2:184;36902:216:2;;;53405:21:184;53462:3;53442:18;;;53435:31;53502:34;53482:18;;;53475:62;53573:34;53553:18;;;53546:62;53645:34;53624:19;;;53617:63;-1:-1:-1;;;53696:19:184;;;53689:48;53754:19;;36902:216:2;53221:558:184;36902:216:2;37161:24;;37133:80;;;53958:25:184;;;54014:2;53999:18;;53992:34;;;37133:80:2;;53931:18:184;37133:80:2;;;;;;;37223:24;:52;36810:472::o;31945:247::-;-1:-1:-1;;;;;32067:24:2;;;;;;;:14;:24;;;;;;;;:34;;;;;;;;;;;:44;;32105:6;;32067:24;:44;;32105:6;;32067:44;:::i;:::-;;;;;;;;32150:8;-1:-1:-1;;;;;32126:59:2;;32160:6;32168:8;32178:6;32126:59;;;;;;;;:::i;26980:4834::-;27186:22;27211:35;;27235:10;27211:35;:::i;:::-;27278:34;;;;:18;:34;;;;;;27186:60;;-1:-1:-1;27278:34:2;;27257:149;;;;-1:-1:-1;;;27257:149:2;;54446:2:184;27257:149:2;;;54428:21:184;54485:2;54465:18;;;54458:30;-1:-1:-1;;;;;;;;;;;54504:18:184;;;54497:62;54595:34;54575:18;;;54568:62;-1:-1:-1;;;54646:19:184;;;54639:34;54690:19;;27257:149:2;54244:471:184;27257:149:2;27462:24;;27490:12;;27438:21;;;;;;;;:::i;:::-;:48;;;;;;:::i;:::-;:64;;27417:207;;;;-1:-1:-1;;;27417:207:2;;54922:2:184;27417:207:2;;;54904:21:184;54961:2;54941:18;;;54934:30;-1:-1:-1;;;;;;;;;;;54980:18:184;;;54973:62;55071:34;55051:18;;;55044:62;55143:33;55122:19;;;55115:62;55194:19;;27417:207:2;54720:499:184;27417:207:2;27670:21;;;;;;;;:::i;:::-;-1:-1:-1;;;;;27656:35:2;:10;-1:-1:-1;;;;;27656:35:2;;27635:163;;;;-1:-1:-1;;;27635:163:2;;55426:2:184;27635:163:2;;;55408:21:184;55465:2;55445:18;;;55438:30;-1:-1:-1;;;;;;;;;;;55484:18:184;;;55477:62;55575:34;55555:18;;;55548:62;-1:-1:-1;;;55626:19:184;;;55619:47;55683:19;;27635:163:2;55224:484:184;27635:163:2;27813:15;27809:217;;;27886:21;;;;:10;:21;:::i;:::-;27869:45;;;-1:-1:-1;27844:171:2;;;;-1:-1:-1;;;27844:171:2;;55915:2:184;27844:171:2;;;55897:21:184;55954:2;55934:18;;;55927:30;-1:-1:-1;;;;;;;;;;;55973:18:184;;;55966:62;56064:34;56044:18;;;56037:62;-1:-1:-1;;;56115:19:184;;;56108:33;56158:19;;27844:171:2;55713:470:184;27844:171:2;28097:34;;;;:18;:34;;;;;28090:41;;-1:-1:-1;;28090:41:2;;;28273:3484;;;;28313:9;28308:697;28332:21;;;;:10;:21;:::i;:::-;:28;;28328:1;:32;28308:697;;;28494:12;28435:29;:55;28465:21;;;;:10;:21;:::i;:::-;28487:1;28465:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28435:55:2;;;;;;;;;;;;-1:-1:-1;28435:55:2;;28411:21;;;;;;;;:::i;:::-;:79;;;;;;:::i;:::-;:95;;28382:276;;;;-1:-1:-1;;;28382:276:2;;;;;;;:::i;:::-;28677:278;28731:17;;;;:10;:17;:::i;:::-;28782:10;28824:21;;;;:10;:21;:::i;:::-;28846:1;28824:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;28878:17;;;;:10;:17;:::i;:::-;28896:1;28878:20;;;;;;;:::i;:::-;;;;;;;28927:6;;28934:1;28927:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;28677:23;:278::i;:::-;28985:3;;28308:697;;;;28273:3484;;;29212:10;29174:23;29200;;;:11;:23;;;;;;-1:-1:-1;;;;;29200:23:2;;29237:2510;29261:21;;;;:10;:21;:::i;:::-;:28;;29257:1;:32;29237:2510;;;29423:12;29364:29;:55;29394:21;;;;:10;:21;:::i;:::-;29416:1;29394:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29364:55:2;;;;;;;;;;;;-1:-1:-1;29364:55:2;;29340:21;;;;;;;;:::i;:::-;:79;;;;;;:::i;:::-;:95;;29311:277;;;;-1:-1:-1;;;29311:277:2;;;;;;;:::i;:::-;2088:42;29850:21;;;;:10;:21;:::i;:::-;29872:1;29850:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29850:50:2;;29846:1852;;;29924:14;29941:17;;;;:10;:17;:::i;:::-;29924:34;-1:-1:-1;30238:36:2;-1:-1:-1;;;;;30277:15:2;:25;;29924:34;30379:17;;;;:10;:17;:::i;:::-;30397:1;30379:20;;;;;;;:::i;:::-;30277:145;;-1:-1:-1;;;;;;30277:145:2;;;;;;;-1:-1:-1;;;;;45142:32:184;;;30277:145:2;;;45124:51:184;30379:20:2;;;;;;;45191:18:184;;;45184:34;-1:-1:-1;45097:18:184;;30277:145:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30471:19:2;;;30444:24;30471:19;;;:11;:19;;;;;;30238:184;;-1:-1:-1;30471:19:2;30570:30;;30566:451;;30628:366;30692:16;30831:6;30877:21;;;;:10;:21;:::i;:::-;30899:1;30877:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;30939:28;30628:23;:366::i;:::-;29902:1133;;;29846:1852;;;31063:15;-1:-1:-1;;;;;31063:25:2;;31089:10;31101:6;;31108:1;31101:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;31112:21;;;;:10;:21;:::i;:::-;31134:1;31112:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;31138:17;;;;:10;:17;:::i;:::-;31156:1;31138:20;;;;;;;:::i;:::-;31063:96;;;;;;-1:-1:-1;;;;;;31063:96:2;;;-1:-1:-1;;;;;57526:15:184;;;31063:96:2;;;57508:34:184;57578:15;;;57558:18;;;57551:43;57630:15;;;;57610:18;;;57603:43;31138:20:2;;;;;;57662:18:184;;;57655:34;57442:19;;;-1:-1:-1;31063:96:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;31239:29:2;;;31235:445;;31296:361;31360:15;31498:10;31548:21;;;;:10;:21;:::i;:::-;31570:1;31548:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;31610:17;;;;:10;:17;:::i;:::-;31628:1;31610:20;;;;;;;:::i;:::-;;;;;;;31296:23;:361::i;:::-;31727:3;;29237:2510;;;;29160:2597;28273:3484;31772:35;;1014:25:184;;;31772:35:2;;1002:2:184;987:18;31772:35:2;;;;;;;27176:4638;26980:4834;;;;;:::o;974:926:25:-;-1:-1:-1;;;;;1476:19:50;;;:23;1410:484:25;;1481:56;;-1:-1:-1;;;1481:56:25;;;1541:18;-1:-1:-1;;;;;1481:33:25;;;574:10;;1481:56;;1515:10;;1527:9;;1481:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;1481:78:25;;1456:220;;;;-1:-1:-1;;;1456:220:25;;58868:2:184;1456:220:25;;;58850:21:184;58907:2;58887:18;;;58880:30;58946:34;58926:18;;;58919:62;59017:34;58997:18;;;58990:62;-1:-1:-1;;;59068:19:184;;;59061:50;59128:19;;1456:220:25;58666:487:184;1410:484:25;1772:6;-1:-1:-1;;;;;1732:46:25;:36;1746:10;1758:9;1732:13;:36::i;:::-;-1:-1:-1;;;;;1732:46:25;;1707:176;;;;-1:-1:-1;;;1707:176:25;;59360:2:184;1707:176:25;;;59342:21:184;59399:2;59379:18;;;59372:30;59438:34;59418:18;;;59411:62;59509:34;59489:18;;;59482:62;-1:-1:-1;;;59560:19:184;;;59553:38;59608:19;;1707:176:25;59158:475:184;36328:476:2;-1:-1:-1;;;;;36470:34:2;;2088:42;36470:34;36466:332;;;36520:161;;-1:-1:-1;;;36520:161:2;;-1:-1:-1;;;;;36520:15:2;:38;;;;:161;;36587:6;;36624:10;;36660:6;;36520:161;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36466:332;;;36712:75;;-1:-1:-1;;;36712:75:2;;-1:-1:-1;;;;;60339:15:184;;;36712:75:2;;;60321:34:184;60391:15;;;60371:18;;;60364:43;60423:18;;;60416:34;;;60486:15;;;60466:18;;;60459:43;36712:15:2;:38;;;;60255:19:184;;36712:75:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36466:332;36328:476;;;;;:::o;4402:227:77:-;4480:7;4500:17;4519:18;4541:27;4552:4;4558:9;4541:10;:27::i;:::-;4499:69;;;;4578:18;4590:5;4578:11;:18::i;2243:1373::-;2324:7;2333:12;2554:9;:16;2574:2;2554:22;2550:1060;;;2890:4;2875:20;;2869:27;2939:4;2924:20;;2918:27;2996:4;2981:20;;2975:27;2592:9;2967:36;3037:25;3048:4;2967:36;2869:27;2918;3037:10;:25::i;:::-;3030:32;;;;;;;;;2550:1060;3083:9;:16;3103:2;3083:22;3079:531;;;3399:4;3384:20;;3378:27;3449:4;3434:20;;3428:27;3489:23;3500:4;3378:27;3428;3489:10;:23::i;:::-;3482:30;;;;;;;;3079:531;-1:-1:-1;3559:1:77;;-1:-1:-1;3563:35:77;3079:531;2243:1373;;;;;:::o;548:631::-;625:20;616:5;:29;;;;;;;;:::i;:::-;;612:561;;;548:631;:::o;612:561::-;721:29;712:5;:38;;;;;;;;:::i;:::-;;708:465;;;766:34;;-1:-1:-1;;;766:34:77;;60847:2:184;766:34:77;;;60829:21:184;60886:2;60866:18;;;60859:30;60925:26;60905:18;;;60898:54;60969:18;;766:34:77;60645:348:184;708:465:77;830:35;821:5;:44;;;;;;;;:::i;:::-;;817:356;;;881:41;;-1:-1:-1;;;881:41:77;;61200:2:184;881:41:77;;;61182:21:184;61239:2;61219:18;;;61212:30;61278:33;61258:18;;;61251:61;61329:18;;881:41:77;60998:355:184;817:356:77;952:30;943:5;:39;;;;;;;;:::i;:::-;;939:234;;;998:44;;-1:-1:-1;;;998:44:77;;61560:2:184;998:44:77;;;61542:21:184;61599:2;61579:18;;;61572:30;61638:34;61618:18;;;61611:62;-1:-1:-1;;;61689:18:184;;;61682:32;61731:19;;998:44:77;61358:398:184;939:234:77;1072:30;1063:5;:39;;;;;;;;:::i;:::-;;1059:114;;;1118:44;;-1:-1:-1;;;1118:44:77;;61963:2:184;1118:44:77;;;61945:21:184;62002:2;61982:18;;;61975:30;62041:34;62021:18;;;62014:62;-1:-1:-1;;;62092:18:184;;;62085:32;62134:19;;1118:44:77;61761:398:184;5810:1603:77;5936:7;;6860:66;6847:79;;6843:161;;;-1:-1:-1;6958:1:77;;-1:-1:-1;6962:30:77;6942:51;;6843:161;7017:1;:7;;7022:2;7017:7;;:18;;;;;7028:1;:7;;7033:2;7028:7;;7017:18;7013:100;;;-1:-1:-1;7067:1:77;;-1:-1:-1;7071:30:77;7051:51;;7013:100;7224:24;;;7207:14;7224:24;;;;;;;;;62391:25:184;;;62464:4;62452:17;;62432:18;;;62425:45;;;;62486:18;;;62479:34;;;62529:18;;;62522:34;;;7224:24:77;;62363:19:184;;7224:24:77;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7224:24:77;;-1:-1:-1;;7224:24:77;;;-1:-1:-1;;;;;;;7262:20:77;;7258:101;;7314:1;7318:29;7298:50;;;;;;;7258:101;7377:6;-1:-1:-1;7385:20:77;;-1:-1:-1;5810:1603:77;;;;;;;;:::o;4883:336::-;4993:7;;-1:-1:-1;;;;;5038:80:77;;4993:7;5144:25;5160:3;5145:18;;;5167:2;5144:25;:::i;:::-;5128:42;;5187:25;5198:4;5204:1;5207;5210;5187:10;:25::i;:::-;5180:32;;;;;;4883:336;;;;;;:::o;14:378:184:-;88:8;98:6;152:3;145:4;137:6;133:17;129:27;119:55;;170:1;167;160:12;119:55;-1:-1:-1;193:20:184;;-1:-1:-1;;;;;225:30:184;;222:50;;;268:1;265;258:12;222:50;305:4;297:6;293:17;281:29;;365:3;358:4;348:6;345:1;341:14;333:6;329:27;325:38;322:47;319:67;;;382:1;379;372:12;397:466;501:6;509;562:2;550:9;541:7;537:23;533:32;530:52;;;578:1;575;568:12;530:52;618:9;605:23;-1:-1:-1;;;;;643:6:184;640:30;637:50;;;683:1;680;673:12;637:50;722:81;795:7;786:6;775:9;771:22;722:81;:::i;:::-;822:8;;696:107;;-1:-1:-1;397:466:184;-1:-1:-1;;;;397:466:184:o;1232:131::-;-1:-1:-1;;;;;1307:31:184;;1297:42;;1287:70;;1353:1;1350;1343:12;1368:134;1436:20;;1465:31;1436:20;1465:31;:::i;:::-;1368:134;;;:::o;1507:667::-;1602:6;1610;1618;1626;1634;1687:3;1675:9;1666:7;1662:23;1658:33;1655:53;;;1704:1;1701;1694:12;1655:53;1743:9;1730:23;1762:31;1787:5;1762:31;:::i;:::-;1812:5;-1:-1:-1;1869:2:184;1854:18;;1841:32;1882:33;1841:32;1882:33;:::i;:::-;1934:7;-1:-1:-1;1993:2:184;1978:18;;1965:32;2006:33;1965:32;2006:33;:::i;:::-;1507:667;;;;-1:-1:-1;2058:7:184;;2112:2;2097:18;;2084:32;;-1:-1:-1;2163:3:184;2148:19;2135:33;;1507:667;-1:-1:-1;;1507:667:184:o;2674:632::-;2845:2;2897:21;;;2967:13;;2870:18;;;2989:22;;;2816:4;;2845:2;3068:15;;;;3042:2;3027:18;;;2816:4;3111:169;3125:6;3122:1;3119:13;3111:169;;;3186:13;;3174:26;;3255:15;;;;3220:12;;;;3147:1;3140:9;3111:169;;;-1:-1:-1;3297:3:184;;2674:632;-1:-1:-1;;;;;;2674:632:184:o;3311:163::-;3379:5;3424:2;3415:6;3410:3;3406:16;3402:25;3399:45;;;3440:1;3437;3430:12;3399:45;-1:-1:-1;3462:6:184;3311:163;-1:-1:-1;3311:163:184:o;3479:348::-;3531:8;3541:6;3595:3;3588:4;3580:6;3576:17;3572:27;3562:55;;3613:1;3610;3603:12;3562:55;-1:-1:-1;3636:20:184;;-1:-1:-1;;;;;3668:30:184;;3665:50;;;3711:1;3708;3701:12;3665:50;3748:4;3740:6;3736:17;3724:29;;3800:3;3793:4;3784:6;3776;3772:19;3768:30;3765:39;3762:59;;;3817:1;3814;3807:12;3832:554;3947:6;3955;3963;4016:3;4004:9;3995:7;3991:23;3987:33;3984:53;;;4033:1;4030;4023:12;3984:53;4056:62;4110:7;4099:9;4056:62;:::i;:::-;4046:72;;4169:2;4158:9;4154:18;4141:32;-1:-1:-1;;;;;4188:6:184;4185:30;4182:50;;;4228:1;4225;4218:12;4182:50;4267:59;4318:7;4309:6;4298:9;4294:22;4267:59;:::i;:::-;3832:554;;4345:8;;-1:-1:-1;4241:85:184;;-1:-1:-1;;;;3832:554:184:o;4391:271::-;4474:6;4527:2;4515:9;4506:7;4502:23;4498:32;4495:52;;;4543:1;4540;4533:12;4495:52;4582:9;4569:23;4601:31;4626:5;4601:31;:::i;:::-;4651:5;4391:271;-1:-1:-1;;;4391:271:184:o;4667:474::-;4762:6;4770;4778;4831:2;4819:9;4810:7;4806:23;4802:32;4799:52;;;4847:1;4844;4837:12;4799:52;4886:9;4873:23;4905:31;4930:5;4905:31;:::i;:::-;4955:5;-1:-1:-1;5012:2:184;4997:18;;4984:32;5025:33;4984:32;5025:33;:::i;:::-;4667:474;;5077:7;;-1:-1:-1;;;5131:2:184;5116:18;;;;5103:32;;4667:474::o;5146:180::-;5205:6;5258:2;5246:9;5237:7;5233:23;5229:32;5226:52;;;5274:1;5271;5264:12;5226:52;-1:-1:-1;5297:23:184;;5146:180;-1:-1:-1;5146:180:184:o;5331:813::-;5471:6;5479;5487;5495;5548:2;5536:9;5527:7;5523:23;5519:32;5516:52;;;5564:1;5561;5554:12;5516:52;5604:9;5591:23;-1:-1:-1;;;;;5674:2:184;5666:6;5663:14;5660:34;;;5690:1;5687;5680:12;5660:34;5729:81;5802:7;5793:6;5782:9;5778:22;5729:81;:::i;:::-;5829:8;;-1:-1:-1;5703:107:184;-1:-1:-1;5917:2:184;5902:18;;5889:32;;-1:-1:-1;5933:16:184;;;5930:36;;;5962:1;5959;5952:12;5930:36;;6001:83;6076:7;6065:8;6054:9;6050:24;6001:83;:::i;:::-;5331:813;;;;-1:-1:-1;6103:8:184;-1:-1:-1;;;;5331:813:184:o;6862:1252::-;7062:6;7070;7078;7086;7094;7102;7110;7118;7171:3;7159:9;7150:7;7146:23;7142:33;7139:53;;;7188:1;7185;7178:12;7139:53;7227:9;7214:23;7246:31;7271:5;7246:31;:::i;:::-;7296:5;-1:-1:-1;7353:2:184;7338:18;;7325:32;7366:33;7325:32;7366:33;:::i;:::-;7418:7;-1:-1:-1;7472:2:184;7457:18;;7444:32;;-1:-1:-1;7523:2:184;7508:18;;7495:32;;-1:-1:-1;7578:3:184;7563:19;;7550:33;-1:-1:-1;;;;;7632:14:184;;;7629:34;;;7659:1;7656;7649:12;7629:34;7698:81;7771:7;7762:6;7751:9;7747:22;7698:81;:::i;:::-;7798:8;;-1:-1:-1;7672:107:184;-1:-1:-1;7886:3:184;7871:19;;7858:33;;-1:-1:-1;7903:16:184;;;7900:36;;;7932:1;7929;7922:12;7900:36;;7971:83;8046:7;8035:8;8024:9;8020:24;7971:83;:::i;:::-;6862:1252;;;;-1:-1:-1;6862:1252:184;;-1:-1:-1;6862:1252:184;;;;;;8073:8;-1:-1:-1;;;6862:1252:184:o;8119:1518::-;8383:6;8391;8399;8407;8415;8423;8431;8439;8492:3;8480:9;8471:7;8467:23;8463:33;8460:53;;;8509:1;8506;8499:12;8460:53;8549:9;8536:23;-1:-1:-1;;;;;8619:2:184;8611:6;8608:14;8605:34;;;8635:1;8632;8625:12;8605:34;8674:81;8747:7;8738:6;8727:9;8723:22;8674:81;:::i;:::-;8774:8;;-1:-1:-1;8648:107:184;-1:-1:-1;8862:2:184;8847:18;;8834:32;;-1:-1:-1;8878:16:184;;;8875:36;;;8907:1;8904;8897:12;8875:36;8946:83;9021:7;9010:8;8999:9;8995:24;8946:83;:::i;:::-;9048:8;;-1:-1:-1;8920:109:184;-1:-1:-1;9136:2:184;9121:18;;9108:32;;-1:-1:-1;9152:16:184;;;9149:36;;;9181:1;9178;9171:12;9149:36;9220:83;9295:7;9284:8;9273:9;9269:24;9220:83;:::i;:::-;9322:8;;-1:-1:-1;9194:109:184;-1:-1:-1;9410:2:184;9395:18;;9382:32;;-1:-1:-1;9426:16:184;;;9423:36;;;9455:1;9452;9445:12;10508:127;10569:10;10564:3;10560:20;10557:1;10550:31;10600:4;10597:1;10590:15;10624:4;10621:1;10614:15;10640:253;10712:2;10706:9;10754:4;10742:17;;-1:-1:-1;;;;;10774:34:184;;10810:22;;;10771:62;10768:88;;;10836:18;;:::i;:::-;10872:2;10865:22;10640:253;:::o;10898:257::-;10970:4;10964:11;;;11002:17;;-1:-1:-1;;;;;11034:34:184;;11070:22;;;11031:62;11028:88;;;11096:18;;:::i;11160:275::-;11231:2;11225:9;11296:2;11277:13;;-1:-1:-1;;11273:27:184;11261:40;;-1:-1:-1;;;;;11316:34:184;;11352:22;;;11313:62;11310:88;;;11378:18;;:::i;:::-;11414:2;11407:22;11160:275;;-1:-1:-1;11160:275:184:o;11440:121::-;11525:10;11518:5;11514:22;11507:5;11504:33;11494:61;;11551:1;11548;11541:12;11566:132;11633:20;;11662:30;11633:20;11662:30;:::i;11703:194::-;11774:4;-1:-1:-1;;;;;11799:6:184;11796:30;11793:56;;;11829:18;;:::i;:::-;-1:-1:-1;11874:1:184;11870:14;11886:4;11866:25;;11703:194::o;11902:759::-;11967:5;12020:3;12013:4;12005:6;12001:17;11997:27;11987:55;;12038:1;12035;12028:12;11987:55;12074:6;12061:20;12100:4;12124:71;12140:54;12191:2;12140:54;:::i;:::-;12124:71;:::i;:::-;12229:15;;;12315:1;12311:10;;;;12299:23;;12295:32;;;12260:12;;;;12339:15;;;12336:35;;;12367:1;12364;12357:12;12336:35;12403:2;12395:6;12391:15;12415:217;12431:6;12426:3;12423:15;12415:217;;;12511:3;12498:17;12528:31;12553:5;12528:31;:::i;:::-;12572:18;;12610:12;;;;12448;;12415:217;;;-1:-1:-1;12650:5:184;11902:759;-1:-1:-1;;;;;;11902:759:184:o;12666:673::-;12720:5;12773:3;12766:4;12758:6;12754:17;12750:27;12740:55;;12791:1;12788;12781:12;12740:55;12827:6;12814:20;12853:4;12877:71;12893:54;12944:2;12893:54;:::i;12877:71::-;12982:15;;;13068:1;13064:10;;;;13052:23;;13048:32;;;13013:12;;;;13092:15;;;13089:35;;;13120:1;13117;13110:12;13089:35;13156:2;13148:6;13144:15;13168:142;13184:6;13179:3;13176:15;13168:142;;;13250:17;;13238:30;;13288:12;;;;13201;;13168:142;;13344:939;13401:5;13449:4;13437:9;13432:3;13428:19;13424:30;13421:50;;;13467:1;13464;13457:12;13421:50;13489:22;;:::i;:::-;13480:31;;13534:29;13553:9;13534:29;:::i;:::-;13527:5;13520:44;13596:38;13630:2;13619:9;13615:18;13596:38;:::i;:::-;13591:2;13584:5;13580:14;13573:62;13667:38;13701:2;13690:9;13686:18;13667:38;:::i;:::-;13662:2;13655:5;13651:14;13644:62;13766:2;13755:9;13751:18;13738:32;13733:2;13726:5;13722:14;13715:56;13804:38;13837:3;13826:9;13822:19;13804:38;:::i;:::-;13798:3;13791:5;13787:15;13780:63;13894:3;13883:9;13879:19;13866:33;-1:-1:-1;;;;;13959:2:184;13951:6;13948:14;13945:34;;;13975:1;13972;13965:12;13945:34;14012:68;14076:3;14067:6;14056:9;14052:22;14012:68;:::i;:::-;14006:3;13999:5;13995:15;13988:93;14134:3;14123:9;14119:19;14106:33;14090:49;;14164:2;14154:8;14151:16;14148:36;;;14180:1;14177;14170:12;14148:36;;14217:59;14272:3;14261:8;14250:9;14246:24;14217:59;:::i;:::-;14211:3;14204:5;14200:15;14193:84;;13344:939;;;;:::o;14288:351::-;14375:6;14428:2;14416:9;14407:7;14403:23;14399:32;14396:52;;;14444:1;14441;14434:12;14396:52;14484:9;14471:23;-1:-1:-1;;;;;14509:6:184;14506:30;14503:50;;;14549:1;14546;14539:12;14503:50;14572:61;14625:7;14616:6;14605:9;14601:22;14572:61;:::i;:::-;14562:71;14288:351;-1:-1:-1;;;;14288:351:184:o;14644:269::-;14701:6;14754:2;14742:9;14733:7;14729:23;14725:32;14722:52;;;14770:1;14767;14760:12;14722:52;14809:9;14796:23;14859:4;14852:5;14848:16;14841:5;14838:27;14828:55;;14879:1;14876;14869:12;14918:118;15004:5;14997:13;14990:21;14983:5;14980:32;14970:60;;15026:1;15023;15016:12;15041:951;15197:6;15205;15213;15221;15229;15282:3;15270:9;15261:7;15257:23;15253:33;15250:53;;;15299:1;15296;15289:12;15250:53;15339:9;15326:23;-1:-1:-1;;;;;15409:2:184;15401:6;15398:14;15395:34;;;15425:1;15422;15415:12;15395:34;15448:22;;;;15504:3;15486:16;;;15482:26;15479:46;;;15521:1;15518;15511:12;15479:46;15544:2;;-1:-1:-1;15599:2:184;15584:18;;15571:32;;15615:16;;;15612:36;;;15644:1;15641;15634:12;15612:36;;15683:83;15758:7;15747:8;15736:9;15732:24;15683:83;:::i;:::-;15785:8;;-1:-1:-1;15657:109:184;-1:-1:-1;;15867:2:184;15852:18;;15839:32;;-1:-1:-1;15921:2:184;15906:18;;15893:32;15934:28;15893:32;15934:28;:::i;:::-;15981:5;15971:15;;;15041:951;;;;;;;;:::o;15997:406::-;16083:6;16091;16144:2;16132:9;16123:7;16119:23;16115:32;16112:52;;;16160:1;16157;16150:12;16112:52;16199:9;16186:23;16218:31;16243:5;16218:31;:::i;:::-;16268:5;-1:-1:-1;16325:2:184;16310:18;;16297:32;16338:33;16297:32;16338:33;:::i;:::-;16390:7;16380:17;;;15997:406;;;;;:::o;16408:862::-;16474:5;16522:4;16510:9;16505:3;16501:19;16497:30;16494:50;;;16540:1;16537;16530:12;16494:50;16562:22;;:::i;:::-;16553:31;;16620:9;16607:23;-1:-1:-1;;;;;16690:2:184;16682:6;16679:14;16676:34;;;16706:1;16703;16696:12;16676:34;16744:6;16733:9;16729:22;16719:32;;16789:3;16782:4;16778:2;16774:13;16770:23;16760:51;;16807:1;16804;16797:12;16760:51;16843:2;16830:16;16865:4;16888:2;16884;16881:10;16878:36;;;16894:18;;:::i;:::-;16936:53;16979:2;16960:13;;-1:-1:-1;;16956:27:184;16952:36;;16936:53;:::i;:::-;16923:66;;17012:2;17005:5;16998:17;17052:3;17047:2;17042;17038;17034:11;17030:20;17027:29;17024:49;;;17069:1;17066;17059:12;17024:49;17124:2;17119;17115;17111:11;17106:2;17099:5;17095:14;17082:45;17168:1;17163:2;17158;17151:5;17147:14;17143:23;17136:34;17193:5;17186;17179:20;17259:2;17248:9;17244:18;17231:32;17226:2;17219:5;17215:14;17208:56;;;;;16408:862;;;;:::o;17275:983::-;17444:6;17452;17460;17468;17476;17529:3;17517:9;17508:7;17504:23;17500:33;17497:53;;;17546:1;17543;17536:12;17497:53;17585:9;17572:23;17604:31;17629:5;17604:31;:::i;:::-;17654:5;-1:-1:-1;17711:2:184;17696:18;;17683:32;17724:33;17683:32;17724:33;:::i;:::-;17776:7;-1:-1:-1;17834:2:184;17819:18;;17806:32;-1:-1:-1;;;;;17887:14:184;;;17884:34;;;17914:1;17911;17904:12;17884:34;17937:70;17999:7;17990:6;17979:9;17975:22;17937:70;:::i;:::-;17927:80;;18060:2;18049:9;18045:18;18032:32;18016:48;;18089:2;18079:8;18076:16;18073:36;;;18105:1;18102;18095:12;18073:36;;18128:72;18192:7;18181:8;18170:9;18166:24;18128:72;:::i;:::-;17275:983;;;;-1:-1:-1;17275:983:184;;18247:3;18232:19;18219:33;;17275:983;-1:-1:-1;;;17275:983:184:o;18495:512::-;18606:6;18614;18667:2;18655:9;18646:7;18642:23;18638:32;18635:52;;;18683:1;18680;18673:12;18635:52;18722:9;18709:23;18741:31;18766:5;18741:31;:::i;:::-;18791:5;-1:-1:-1;18847:2:184;18832:18;;18819:32;-1:-1:-1;;;;;18863:30:184;;18860:50;;;18906:1;18903;18896:12;18860:50;18929:72;18993:7;18984:6;18973:9;18969:22;18929:72;:::i;:::-;18919:82;;;18495:512;;;;;:::o;19012:435::-;19065:3;19103:5;19097:12;19130:6;19125:3;19118:19;19156:4;19185:2;19180:3;19176:12;19169:19;;19222:2;19215:5;19211:14;19243:1;19253:169;19267:6;19264:1;19261:13;19253:169;;;19328:13;;19316:26;;19362:12;;;;19397:15;;;;19289:1;19282:9;19253:169;;;-1:-1:-1;19438:3:184;;19012:435;-1:-1:-1;;;;;19012:435:184:o;19452:261::-;19631:2;19620:9;19613:21;19594:4;19651:56;19703:2;19692:9;19688:18;19680:6;19651:56;:::i;19944:411::-;20015:6;20023;20076:2;20064:9;20055:7;20051:23;20047:32;20044:52;;;20092:1;20089;20082:12;20044:52;20132:9;20119:23;-1:-1:-1;;;;;20157:6:184;20154:30;20151:50;;;20197:1;20194;20187:12;20151:50;20236:59;20287:7;20278:6;20267:9;20263:22;20236:59;:::i;20770:315::-;20838:6;20846;20899:2;20887:9;20878:7;20874:23;20870:32;20867:52;;;20915:1;20912;20905:12;20867:52;20954:9;20941:23;20973:31;20998:5;20973:31;:::i;:::-;21023:5;21075:2;21060:18;;;;21047:32;;-1:-1:-1;;;20770:315:184:o;21814:525::-;21900:6;21908;21916;21924;21977:3;21965:9;21956:7;21952:23;21948:33;21945:53;;;21994:1;21991;21984:12;21945:53;22033:9;22020:23;22052:31;22077:5;22052:31;:::i;:::-;22102:5;-1:-1:-1;22154:2:184;22139:18;;22126:32;;-1:-1:-1;22210:2:184;22195:18;;22182:32;22223:33;22182:32;22223:33;:::i;:::-;21814:525;;;;-1:-1:-1;22275:7:184;;22329:2;22314:18;22301:32;;-1:-1:-1;;21814:525:184:o;22344:472::-;22408:3;22446:5;22440:12;22473:6;22468:3;22461:19;22499:4;22528:2;22523:3;22519:12;22512:19;;22565:2;22558:5;22554:14;22586:1;22596:195;22610:6;22607:1;22604:13;22596:195;;;22675:13;;-1:-1:-1;;;;;22671:39:184;22659:52;;22731:12;;;;22766:15;;;;22707:1;22625:9;22596:195;;22821:494;23096:2;23085:9;23078:21;23059:4;23122:67;23185:2;23174:9;23170:18;23162:6;23122:67;:::i;:::-;23237:9;23229:6;23225:22;23220:2;23209:9;23205:18;23198:50;23265:44;23302:6;23294;23265:44;:::i;23320:572::-;23434:6;23442;23450;23503:2;23491:9;23482:7;23478:23;23474:32;23471:52;;;23519:1;23516;23509:12;23471:52;23558:9;23545:23;23577:31;23602:5;23577:31;:::i;:::-;23627:5;-1:-1:-1;23683:2:184;23668:18;;23655:32;-1:-1:-1;;;;;23699:30:184;;23696:50;;;23742:1;23739;23732:12;23696:50;23765:70;23827:7;23818:6;23807:9;23803:22;23765:70;:::i;:::-;23755:80;;;23882:2;23871:9;23867:18;23854:32;23844:42;;23320:572;;;;;:::o;23897:254::-;23991:6;24044:2;24032:9;24023:7;24019:23;24015:32;24012:52;;;24060:1;24057;24050:12;24012:52;24083:62;24137:7;24126:9;24083:62;:::i;24156:127::-;24217:10;24212:3;24208:20;24205:1;24198:31;24248:4;24245:1;24238:15;24272:4;24269:1;24262:15;24288:127;24349:10;24344:3;24340:20;24337:1;24330:31;24380:4;24377:1;24370:15;24404:4;24401:1;24394:15;24420:135;24459:3;-1:-1:-1;;24480:17:184;;24477:43;;;24500:18;;:::i;:::-;-1:-1:-1;24547:1:184;24536:13;;24420:135::o;25562:349::-;25764:2;25746:21;;;25803:2;25783:18;;;25776:30;25842:27;25837:2;25822:18;;25815:55;25902:2;25887:18;;25562:349::o;25916:339::-;26024:4;26082:11;26069:25;26176:2;26172:7;26161:8;26145:14;26141:29;26137:43;26117:18;26113:68;26103:96;;26195:1;26192;26185:12;26103:96;26216:33;;;;;25916:339;-1:-1:-1;;25916:339:184:o;26260:545::-;26353:4;26359:6;26419:11;26406:25;26513:2;26509:7;26498:8;26482:14;26478:29;26474:43;26454:18;26450:68;26440:96;;26532:1;26529;26522:12;26440:96;26559:33;;26611:20;;;-1:-1:-1;;;;;;26643:30:184;;26640:50;;;26686:1;26683;26676:12;26640:50;26719:4;26707:17;;-1:-1:-1;26770:1:184;26766:14;;;26750;26746:35;26736:46;;26733:66;;;26795:1;26792;26785:12;28715:684;28917:2;28902:18;;28942:20;;28971:31;28942:20;28971:31;:::i;:::-;-1:-1:-1;;;;;29067:14:184;;;29049:33;;29131:4;29119:17;;29106:31;;29146:33;29106:31;29146:33;:::i;:::-;29217:16;29210:4;29195:20;;29188:46;29283:4;29271:17;;29258:31;29298:32;29258:31;29298:32;:::i;:::-;29381:10;29372:7;29368:24;29361:4;29350:9;29346:20;29339:54;;28715:684;;;;:::o;29404:390::-;29563:2;29552:9;29545:21;29602:6;29597:2;29586:9;29582:18;29575:34;29659:6;29651;29646:2;29635:9;29631:18;29618:48;29715:1;29686:22;;;29710:2;29682:31;;;29675:42;;;;29778:2;29757:15;;;-1:-1:-1;;29753:29:184;29738:45;29734:54;;29404:390;-1:-1:-1;29404:390:184:o;29799:251::-;29869:6;29922:2;29910:9;29901:7;29897:23;29893:32;29890:52;;;29938:1;29935;29928:12;29890:52;29970:9;29964:16;29989:31;30014:5;29989:31;:::i;30055:406::-;30257:2;30239:21;;;30296:2;30276:18;;;30269:30;30335:34;30330:2;30315:18;;30308:62;-1:-1:-1;;;30401:2:184;30386:18;;30379:40;30451:3;30436:19;;30055:406::o;30466:419::-;30668:2;30650:21;;;30707:2;30687:18;;;30680:30;30746:34;30741:2;30726:18;;30719:62;30817:25;30812:2;30797:18;;30790:53;30875:3;30860:19;;30466:419::o;30890:245::-;30957:6;31010:2;30998:9;30989:7;30985:23;30981:32;30978:52;;;31026:1;31023;31016:12;30978:52;31058:9;31052:16;31077:28;31099:5;31077:28;:::i;31140:404::-;31342:2;31324:21;;;31381:2;31361:18;;;31354:30;31420:34;31415:2;31400:18;;31393:62;-1:-1:-1;;;31486:2:184;31471:18;;31464:38;31534:3;31519:19;;31140:404::o;32948:328::-;33044:4;33102:11;33089:25;33196:3;33192:8;33181;33165:14;33161:29;33157:44;33137:18;33133:69;33123:97;;33216:1;33213;33206:12;33847:241;33903:6;33956:2;33944:9;33935:7;33931:23;33927:32;33924:52;;;33972:1;33969;33962:12;33924:52;34011:9;33998:23;34030:28;34052:5;34030:28;:::i;34093:754::-;34146:3;34191:1;34187;34182:3;34178:11;34174:19;34232:2;34224:5;34218:12;34214:21;34209:3;34202:34;34297:2;34289:4;34282:5;34278:16;34272:23;34268:32;34261:4;34256:3;34252:14;34245:56;34362:2;34354:4;34347:5;34343:16;34337:23;34333:32;34326:4;34321:3;34317:14;34310:56;;34415:4;34408:5;34404:16;34398:23;34391:4;34386:3;34382:14;34375:47;34483:10;34475:4;34468:5;34464:16;34458:23;34454:40;34447:4;34442:3;34438:14;34431:64;34541:4;34534:5;34530:16;34524:23;34579:4;34572;34567:3;34563:14;34556:28;34605:69;34668:4;34663:3;34659:14;34645:12;34605:69;:::i;:::-;34593:81;;34722:4;34715:5;34711:16;34705:23;34770:3;34764:4;34760:14;34753:4;34748:3;34744:14;34737:38;34791:50;34836:4;34820:14;34791:50;:::i;34852:267::-;35037:2;35026:9;35019:21;35000:4;35057:56;35109:2;35098:9;35094:18;35086:6;35057:56;:::i;37578:183::-;37647:6;37700:2;37688:9;37679:7;37675:23;37671:32;37668:52;;;37716:1;37713;37706:12;37668:52;-1:-1:-1;37739:16:184;;37578:183;-1:-1:-1;37578:183:184:o;37766:670::-;37831:5;37884:3;37877:4;37869:6;37865:17;37861:27;37851:55;;37902:1;37899;37892:12;37851:55;37931:6;37925:13;37957:4;37981:71;37997:54;38048:2;37997:54;:::i;37981:71::-;38086:15;;;38172:1;38168:10;;;;38156:23;;38152:32;;;38117:12;;;;38196:15;;;38193:35;;;38224:1;38221;38214:12;38193:35;38260:2;38252:6;38248:15;38272:135;38288:6;38283:3;38280:15;38272:135;;;38354:10;;38342:23;;38385:12;;;;38305;;38272:135;;38441:1238;38588:6;38596;38649:2;38637:9;38628:7;38624:23;38620:32;38617:52;;;38665:1;38662;38655:12;38617:52;38698:9;38692:16;-1:-1:-1;;;;;38768:2:184;38760:6;38757:14;38754:34;;;38784:1;38781;38774:12;38754:34;38822:6;38811:9;38807:22;38797:32;;38867:7;38860:4;38856:2;38852:13;38848:27;38838:55;;38889:1;38886;38879:12;38838:55;38918:2;38912:9;38940:4;38964:71;38980:54;39031:2;38980:54;:::i;38964:71::-;39069:15;;;39151:1;39147:10;;;;39139:19;;39135:28;;;39100:12;;;;39175:19;;;39172:39;;;39207:1;39204;39197:12;39172:39;39231:11;;;;39251:210;39267:6;39262:3;39259:15;39251:210;;;39340:3;39334:10;39357:31;39382:5;39357:31;:::i;:::-;39401:18;;39284:12;;;;39439;;;;39251:210;;;39516:18;;;39510:25;39480:5;;-1:-1:-1;39510:25:184;;-1:-1:-1;;;39547:16:184;;;39544:36;;;39576:1;39573;39566:12;39544:36;;39599:74;39665:7;39654:8;39643:9;39639:24;39599:74;:::i;39684:128::-;39724:3;39755:1;39751:6;39748:1;39745:13;39742:39;;;39761:18;;:::i;:::-;-1:-1:-1;39797:9:184;;39684:128::o;39817:125::-;39857:4;39885:1;39882;39879:8;39876:34;;;39890:18;;:::i;:::-;-1:-1:-1;39927:9:184;;39817:125::o;45851:393::-;-1:-1:-1;;;;;46127:15:184;;;46109:34;;46179:15;;;;46174:2;46159:18;;46152:43;46226:2;46211:18;;46204:34;;;;46059:2;46044:18;;45851:393::o;46249:338::-;46462:6;46451:9;46444:25;46505:2;46500;46489:9;46485:18;46478:30;46425:4;46525:56;46577:2;46566:9;46562:18;46554:6;46525:56;:::i;46592:245::-;46650:6;46703:2;46691:9;46682:7;46678:23;46674:32;46671:52;;;46719:1;46716;46709:12;46671:52;46758:9;46745:23;46777:30;46801:5;46777:30;:::i;47892:195::-;47996:11;;-1:-1:-1;;;;;;47992:54:184;-1:-1:-1;;;;;48048:31:184;;;;47989:91;;;;47976:105;;47892:195::o;48092:758::-;48273:5;48260:19;48288:33;48313:7;48288:33;:::i;:::-;48330:62;48384:7;48378:4;48330:62;:::i;:::-;;48429:1;48423:4;48419:12;48479:2;48472:5;48468:14;48455:28;48492:33;48517:7;48492:33;:::i;:::-;48534:68;48594:7;48582:10;48534:68;:::i;:::-;;48650:2;48643:5;48639:14;48626:28;48663:32;48687:7;48663:32;:::i;:::-;48714:17;;-1:-1:-1;;;;48762:34:184;48825:3;48802:17;;;;-1:-1:-1;;;48798:44:184;48759:84;48740:104;;-1:-1:-1;;48092:758:184:o;54037:202::-;54145:9;54182:51;54218:14;54211:5;54182:51;:::i;:::-;54169:64;54037:202;-1:-1:-1;;54037:202:184:o;56188:555::-;56390:2;56372:21;;;56429:3;56409:18;;;56402:31;-1:-1:-1;;;;;;;;;;;56464:2:184;56449:18;;56442:62;56540:34;56535:2;56520:18;;56513:62;56612:34;56606:3;56591:19;;56584:63;-1:-1:-1;;;56678:3:184;56663:19;;56656:45;56733:3;56718:19;;56188:555::o;57700:666::-;57875:6;57864:9;57857:25;57838:4;57901:2;57939;57934;57923:9;57919:18;57912:30;57971:6;57965:13;58014:6;58009:2;57998:9;57994:18;57987:34;58039:1;58049:140;58063:6;58060:1;58057:13;58049:140;;;58158:14;;;58154:23;;58148:30;58124:17;;;58143:2;58120:26;58113:66;58078:10;;58049:140;;;58207:6;58204:1;58201:13;58198:91;;;58277:1;58272:2;58263:6;58252:9;58248:22;58244:31;58237:42;58198:91;-1:-1:-1;58350:2:184;58329:15;-1:-1:-1;;58325:29:184;58310:45;;;;58357:2;58306:54;;57700:666;-1:-1:-1;;;;57700:666:184:o;58371:290::-;58440:6;58493:2;58481:9;58472:7;58468:23;58464:32;58461:52;;;58509:1;58506;58499:12;58461:52;58535:16;;-1:-1:-1;;;;;;58580:32:184;;58570:43;;58560:71;;58627:1;58624;58617:12;60513:127;60574:10;60569:3;60565:20;60562:1;60555:31;60605:4;60602:1;60595:15;60629:4;60626:1;60619:15","linkReferences":{},"immutableReferences":{"2560":[{"start":1273,"length":32},{"start":4092,"length":32},{"start":4984,"length":32},{"start":7326,"length":32},{"start":10925,"length":32},{"start":11312,"length":32},{"start":16313,"length":32},{"start":17445,"length":32}],"2564":[{"start":1890,"length":32}],"2568":[{"start":1457,"length":32},{"start":4142,"length":32},{"start":5034,"length":32},{"start":7178,"length":32},{"start":10720,"length":32},{"start":16019,"length":32},{"start":17279,"length":32}],"429":[{"start":9863,"length":32}]}},"methodIdentifiers":{"DELEGATION_APPROVAL_TYPEHASH()":"04a4f979","DOMAIN_TYPEHASH()":"20606b70","MAX_STAKER_OPT_OUT_WINDOW_BLOCKS()":"4fc40b61","MAX_WITHDRAWAL_DELAY_BLOCKS()":"ca661c04","STAKER_DELEGATION_TYPEHASH()":"43377382","beaconChainETHStrategy()":"9104c319","calculateCurrentStakerDelegationDigestHash(address,address,uint256)":"1bbce091","calculateDelegationApprovalDigestHash(address,address,address,bytes32,uint256)":"0b9f487a","calculateStakerDelegationDigestHash(address,uint256,address,uint256)":"c94b5111","calculateWithdrawalRoot((address,address,address,uint256,uint32,address[],uint256[]))":"597b36da","completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]),address[],uint256,bool)":"60d7faed","completeQueuedWithdrawals((address,address,address,uint256,uint32,address[],uint256[])[],address[][],uint256[],bool[])":"33404396","cumulativeWithdrawalsQueued(address)":"a1788484","decreaseDelegatedShares(address,address,uint256)":"132d4967","delegateTo(address,(bytes,uint256),bytes32)":"eea9064b","delegateToBySignature(address,address,(bytes,uint256),(bytes,uint256),bytes32)":"7f548071","delegatedTo(address)":"65da1264","delegationApprover(address)":"3cdeb5e0","delegationApproverSaltIsSpent(address,bytes32)":"bb45fef2","domainSeparator()":"f698da25","eigenPodManager()":"4665bcda","getDelegatableShares(address)":"cf80873e","getOperatorShares(address,address[])":"90041347","getWithdrawalDelay(address[])":"0449ca39","increaseDelegatedShares(address,address,uint256)":"28a573ae","initialize(address,address,uint256,uint256,address[],uint256[])":"22bf40e4","isDelegated(address)":"3e28391d","isOperator(address)":"6d70f7ae","minWithdrawalDelayBlocks()":"c448feb8","modifyOperatorDetails((address,address,uint32))":"f16172b0","operatorDetails(address)":"c5e480db","operatorShares(address,address)":"778e55f3","owner()":"8da5cb5b","pause(uint256)":"136439dd","pauseAll()":"595c6a67","paused()":"5c975abb","paused(uint8)":"5ac86ab7","pauserRegistry()":"886f1195","pendingWithdrawals(bytes32)":"b7f06ebe","queueWithdrawals((address[],uint256[],address)[])":"0dd8dd02","registerAsOperator((address,address,uint32),string)":"0f589e59","renounceOwnership()":"715018a6","setMinWithdrawalDelayBlocks(uint256)":"635bbd10","setPauserRegistry(address)":"10d67a2f","setStrategyWithdrawalDelayBlocks(address[],uint256[])":"1522bf02","slasher()":"b1344271","stakerNonce(address)":"29c77d4f","stakerOptOutWindowBlocks(address)":"16928365","strategyManager()":"39b70e38","strategyWithdrawalDelayBlocks(address)":"c488375a","transferOwnership(address)":"f2fde38b","undelegate(address)":"da8be864","unpause(uint256)":"fabc1cbc","updateOperatorMetadataURI(string)":"99be81c8"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IStrategyManager\",\"name\":\"_strategyManager\",\"type\":\"address\"},{\"internalType\":\"contract ISlasher\",\"name\":\"_slasher\",\"type\":\"address\"},{\"internalType\":\"contract IEigenPodManager\",\"name\":\"_eigenPodManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousValue\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newValue\",\"type\":\"uint256\"}],\"name\":\"MinWithdrawalDelayBlocksSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegationApprover\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"struct IDelegationManager.OperatorDetails\",\"name\":\"newOperatorDetails\",\"type\":\"tuple\"}],\"name\":\"OperatorDetailsModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"name\":\"OperatorMetadataURIUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegationApprover\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"struct IDelegationManager.OperatorDetails\",\"name\":\"operatorDetails\",\"type\":\"tuple\"}],\"name\":\"OperatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"OperatorSharesDecreased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"OperatorSharesIncreased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPausedStatus\",\"type\":\"uint256\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IPauserRegistry\",\"name\":\"pauserRegistry\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IPauserRegistry\",\"name\":\"newPauserRegistry\",\"type\":\"address\"}],\"name\":\"PauserRegistrySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"StakerDelegated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"StakerForceUndelegated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"StakerUndelegated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousValue\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newValue\",\"type\":\"uint256\"}],\"name\":\"StrategyWithdrawalDelayBlocksSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPausedStatus\",\"type\":\"uint256\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"WithdrawalCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegatedTo\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"withdrawer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"startBlock\",\"type\":\"uint32\"},{\"internalType\":\"contract IStrategy[]\",\"name\":\"strategies\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"shares\",\"type\":\"uint256[]\"}],\"indexed\":false,\"internalType\":\"struct IDelegationManager.Withdrawal\",\"name\":\"withdrawal\",\"type\":\"tuple\"}],\"name\":\"WithdrawalQueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOMAIN_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_STAKER_OPT_OUT_WINDOW_BLOCKS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKER_DELEGATION_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"beaconChainETHStrategy\",\"outputs\":[{\"internalType\":\"contract IStrategy\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"}],\"name\":\"calculateCurrentStakerDelegationDigestHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_delegationApprover\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"approverSalt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"}],\"name\":\"calculateDelegationApprovalDigestHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_stakerNonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"}],\"name\":\"calculateStakerDelegationDigestHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegatedTo\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"withdrawer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"startBlock\",\"type\":\"uint32\"},{\"internalType\":\"contract IStrategy[]\",\"name\":\"strategies\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"shares\",\"type\":\"uint256[]\"}],\"internalType\":\"struct IDelegationManager.Withdrawal\",\"name\":\"withdrawal\",\"type\":\"tuple\"}],\"name\":\"calculateWithdrawalRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegatedTo\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"withdrawer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"startBlock\",\"type\":\"uint32\"},{\"internalType\":\"contract IStrategy[]\",\"name\":\"strategies\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"shares\",\"type\":\"uint256[]\"}],\"internalType\":\"struct IDelegationManager.Withdrawal\",\"name\":\"withdrawal\",\"type\":\"tuple\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"middlewareTimesIndex\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"receiveAsTokens\",\"type\":\"bool\"}],\"name\":\"completeQueuedWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegatedTo\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"withdrawer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"startBlock\",\"type\":\"uint32\"},{\"internalType\":\"contract IStrategy[]\",\"name\":\"strategies\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"shares\",\"type\":\"uint256[]\"}],\"internalType\":\"struct IDelegationManager.Withdrawal[]\",\"name\":\"withdrawals\",\"type\":\"tuple[]\"},{\"internalType\":\"contract IERC20[][]\",\"name\":\"tokens\",\"type\":\"address[][]\"},{\"internalType\":\"uint256[]\",\"name\":\"middlewareTimesIndexes\",\"type\":\"uint256[]\"},{\"internalType\":\"bool[]\",\"name\":\"receiveAsTokens\",\"type\":\"bool[]\"}],\"name\":\"completeQueuedWithdrawals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"cumulativeWithdrawalsQueued\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"decreaseDelegatedShares\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureUtils.SignatureWithExpiry\",\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"approverSalt\",\"type\":\"bytes32\"}],\"name\":\"delegateTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureUtils.SignatureWithExpiry\",\"name\":\"stakerSignatureAndExpiry\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"}],\"internalType\":\"struct ISignatureUtils.SignatureWithExpiry\",\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"approverSalt\",\"type\":\"bytes32\"}],\"name\":\"delegateToBySignature\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"delegatedTo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"delegationApprover\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"delegationApproverSaltIsSpent\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"domainSeparator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eigenPodManager\",\"outputs\":[{\"internalType\":\"contract IEigenPodManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"getDelegatableShares\",\"outputs\":[{\"internalType\":\"contract IStrategy[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"contract IStrategy[]\",\"name\":\"strategies\",\"type\":\"address[]\"}],\"name\":\"getOperatorShares\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IStrategy[]\",\"name\":\"strategies\",\"type\":\"address[]\"}],\"name\":\"getWithdrawalDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"increaseDelegatedShares\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"},{\"internalType\":\"contract IPauserRegistry\",\"name\":\"_pauserRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"initialPausedStatus\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minWithdrawalDelayBlocks\",\"type\":\"uint256\"},{\"internalType\":\"contract IStrategy[]\",\"name\":\"_strategies\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_withdrawalDelayBlocks\",\"type\":\"uint256[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"isDelegated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isOperator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minWithdrawalDelayBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegationApprover\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\"}],\"internalType\":\"struct IDelegationManager.OperatorDetails\",\"name\":\"newOperatorDetails\",\"type\":\"tuple\"}],\"name\":\"modifyOperatorDetails\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"operatorDetails\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegationApprover\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\"}],\"internalType\":\"struct IDelegationManager.OperatorDetails\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"contract IStrategy\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"operatorShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPausedStatus\",\"type\":\"uint256\"}],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pauseAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pauserRegistry\",\"outputs\":[{\"internalType\":\"contract IPauserRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"pendingWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contract IStrategy[]\",\"name\":\"strategies\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"shares\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"withdrawer\",\"type\":\"address\"}],\"internalType\":\"struct IDelegationManager.QueuedWithdrawalParams[]\",\"name\":\"queuedWithdrawalParams\",\"type\":\"tuple[]\"}],\"name\":\"queueWithdrawals\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegationApprover\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\"}],\"internalType\":\"struct IDelegationManager.OperatorDetails\",\"name\":\"registeringOperatorDetails\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"name\":\"registerAsOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newMinWithdrawalDelayBlocks\",\"type\":\"uint256\"}],\"name\":\"setMinWithdrawalDelayBlocks\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IPauserRegistry\",\"name\":\"newPauserRegistry\",\"type\":\"address\"}],\"name\":\"setPauserRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IStrategy[]\",\"name\":\"strategies\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"withdrawalDelayBlocks\",\"type\":\"uint256[]\"}],\"name\":\"setStrategyWithdrawalDelayBlocks\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"slasher\",\"outputs\":[{\"internalType\":\"contract ISlasher\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"stakerNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"stakerOptOutWindowBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"strategyManager\",\"outputs\":[{\"internalType\":\"contract IStrategyManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IStrategy\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"strategyWithdrawalDelayBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"undelegate\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPausedStatus\",\"type\":\"uint256\"}],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"name\":\"updateOperatorMetadataURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Layr Labs, Inc.\",\"kind\":\"dev\",\"methods\":{\"calculateCurrentStakerDelegationDigestHash(address,address,uint256)\":{\"params\":{\"expiry\":\"The desired expiry time of the staker's signature\",\"operator\":\"The operator who is being delegated to\",\"staker\":\"The signing staker\"}},\"calculateDelegationApprovalDigestHash(address,address,address,bytes32,uint256)\":{\"params\":{\"_delegationApprover\":\"the operator's `delegationApprover` who will be signing the delegationHash (in general)\",\"approverSalt\":\"A unique and single use value associated with the approver signature.\",\"expiry\":\"Time after which the approver's signature becomes invalid\",\"operator\":\"The account receiving delegated stake\",\"staker\":\"The account delegating their stake\"}},\"calculateStakerDelegationDigestHash(address,uint256,address,uint256)\":{\"params\":{\"_stakerNonce\":\"The nonce of the staker. In practice we use the staker's current nonce, stored at `stakerNonce[staker]`\",\"expiry\":\"The desired expiry time of the staker's signature\",\"operator\":\"The operator who is being delegated to\",\"staker\":\"The signing staker\"}},\"completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]),address[],uint256,bool)\":{\"details\":\"middlewareTimesIndex is unused, but will be used in the Slasher eventuallybeaconChainETHStrategy shares are non-transferrable, so if `receiveAsTokens = false` and `withdrawal.withdrawer != withdrawal.staker`, note that any beaconChainETHStrategy shares in the `withdrawal` will be _returned to the staker_, rather than transferred to the withdrawer, unlike shares in any other strategies, which will be transferred to the withdrawer.\",\"params\":{\"middlewareTimesIndex\":\"is the index in the operator that the staker who triggered the withdrawal was delegated to's middleware times array\",\"receiveAsTokens\":\"If true, the shares specified in the withdrawal will be withdrawn from the specified strategies themselves and sent to the caller, through calls to `withdrawal.strategies[i].withdraw`. If false, then the shares in the specified strategies will simply be transferred to the caller directly.\",\"tokens\":\"Array in which the i-th entry specifies the `token` input to the 'withdraw' function of the i-th Strategy in the `withdrawal.strategies` array. This input can be provided with zero length if `receiveAsTokens` is set to 'false' (since in that case, this input will be unused)\",\"withdrawal\":\"The Withdrawal to complete.\"}},\"completeQueuedWithdrawals((address,address,address,uint256,uint32,address[],uint256[])[],address[][],uint256[],bool[])\":{\"details\":\"See `completeQueuedWithdrawal` for relevant dev tags\",\"params\":{\"middlewareTimesIndexes\":\"One index to reference per Withdrawal. See `completeQueuedWithdrawal` for the usage of a single index.\",\"receiveAsTokens\":\"Whether or not to complete each withdrawal as tokens. See `completeQueuedWithdrawal` for the usage of a single boolean.\",\"tokens\":\"Array of tokens for each Withdrawal. See `completeQueuedWithdrawal` for the usage of a single array.\",\"withdrawals\":\"The Withdrawals to complete.\"}},\"constructor\":{\"details\":\"Initializes the immutable addresses of the strategy mananger and slasher.\"},\"decreaseDelegatedShares(address,address,uint256)\":{\"details\":\"*If the staker is actively delegated*, then decreases the `staker`'s delegated shares in `strategy` by `shares`. Otherwise does nothing.Callable only by the StrategyManager or EigenPodManager.\",\"params\":{\"shares\":\"The number of shares to decrease.\",\"staker\":\"The address to increase the delegated shares for their operator.\",\"strategy\":\"The strategy in which to decrease the delegated shares.\"}},\"delegateTo(address,(bytes,uint256),bytes32)\":{\"details\":\"The approverSignatureAndExpiry is used in the event that: 1) the operator's `delegationApprover` address is set to a non-zero value. AND 2) neither the operator nor their `delegationApprover` is the `msg.sender`, since in the event that the operator or their delegationApprover is the `msg.sender`, then approval is assumed.In the event that `approverSignatureAndExpiry` is not checked, its content is ignored entirely; it's recommended to use an empty input in this case to save on complexity + gas costs\",\"params\":{\"approverSalt\":\"A unique single use value tied to an individual signature.\",\"approverSignatureAndExpiry\":\"Verifies the operator approves of this delegation\",\"operator\":\"The account (`msg.sender`) is delegating its assets to for use in serving applications built on EigenLayer.\"}},\"delegateToBySignature(address,address,(bytes,uint256),(bytes,uint256),bytes32)\":{\"details\":\"If `staker` is an EOA, then `stakerSignature` is verified to be a valid ECDSA stakerSignature from `staker`, indicating their intention for this action.If `staker` is a contract, then `stakerSignature` will be checked according to EIP-1271.the operator's `delegationApprover` address is set to a non-zero value.neither the operator nor their `delegationApprover` is the `msg.sender`, since in the event that the operator or their delegationApprover is the `msg.sender`, then approval is assumed.This function will revert if the current `block.timestamp` is equal to or exceeds the expiryIn the case that `approverSignatureAndExpiry` is not checked, its content is ignored entirely; it's recommended to use an empty input in this case to save on complexity + gas costs\",\"params\":{\"approverSalt\":\"Is a salt used to help guarantee signature uniqueness. Each salt can only be used once by a given approver.\",\"approverSignatureAndExpiry\":\"is a parameter that will be used for verifying that the operator approves of this delegation action in the event that:\",\"operator\":\"The account (`staker`) is delegating its assets to for use in serving applications built on EigenLayer.\",\"staker\":\"The account delegating stake to an `operator` account\",\"stakerSignatureAndExpiry\":\"Signed data from the staker authorizing delegating stake to an operator\"}},\"domainSeparator()\":{\"details\":\"The domain separator will change in the event of a fork that changes the ChainID.By introducing a domain separator the DApp developers are guaranteed that there can be no signature collision. for more detailed information please read EIP-712.\"},\"getDelegatableShares(address)\":{\"details\":\"Returns two empty arrays in the case that the Staker has no actively-delegateable shares.\"},\"getWithdrawalDelay(address[])\":{\"params\":{\"strategies\":\"The strategies to check withdrawal delays for\"}},\"increaseDelegatedShares(address,address,uint256)\":{\"details\":\"*If the staker is actively delegated*, then increases the `staker`'s delegated shares in `strategy` by `shares`. Otherwise does nothing.Callable only by the StrategyManager or EigenPodManager.\",\"params\":{\"shares\":\"The number of shares to increase.\",\"staker\":\"The address to increase the delegated shares for their operator.\",\"strategy\":\"The strategy in which to increase the delegated shares.\"}},\"initialize(address,address,uint256,uint256,address[],uint256[])\":{\"details\":\"Initializes the addresses of the initial owner, pauser registry, and paused status. minWithdrawalDelayBlocks is set only once here\"},\"modifyOperatorDetails((address,address,uint32))\":{\"details\":\"The caller must have previously registered as an operator in EigenLayer.\",\"params\":{\"newOperatorDetails\":\"is the updated `OperatorDetails` for the operator, to replace their current OperatorDetails`.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pause(uint256)\":{\"details\":\"This function can only pause functionality, and thus cannot 'unflip' any bit in `_paused` from 1 to 0.\",\"params\":{\"newPausedStatus\":\"represents the new value for `_paused` to take, which means it may flip several bits at once.\"}},\"registerAsOperator((address,address,uint32),string)\":{\"details\":\"Once an operator is registered, they cannot 'deregister' as an operator, and they will forever be considered \\\"delegated to themself\\\".This function will revert if the caller is already delegated to an operator.Note that the `metadataURI` is *never stored * and is only emitted in the `OperatorMetadataURIUpdated` event\",\"params\":{\"metadataURI\":\"is a URI for the operator's metadata, i.e. a link providing more details on the operator.\",\"registeringOperatorDetails\":\"is the `OperatorDetails` for the operator.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setMinWithdrawalDelayBlocks(uint256)\":{\"params\":{\"newMinWithdrawalDelayBlocks\":\"new value of `minWithdrawalDelayBlocks`.\"}},\"setStrategyWithdrawalDelayBlocks(address[],uint256[])\":{\"params\":{\"strategies\":\"The strategies to set the minimum withdrawal delay blocks for\",\"withdrawalDelayBlocks\":\"The minimum withdrawal delay blocks to set for each strategy\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"unpause(uint256)\":{\"details\":\"This function can only unpause functionality, and thus cannot 'flip' any bit in `_paused` from 0 to 1.\",\"params\":{\"newPausedStatus\":\"represents the new value for `_paused` to take, which means it may flip several bits at once.\"}},\"updateOperatorMetadataURI(string)\":{\"params\":{\"metadataURI\":\"The URI for metadata associated with an operator\"}}},\"title\":\"DelegationManager\",\"version\":1},\"userdoc\":{\"events\":{\"MinWithdrawalDelayBlocksSet(uint256,uint256)\":{\"notice\":\"Emitted when the `minWithdrawalDelayBlocks` variable is modified from `previousValue` to `newValue`.\"},\"OperatorDetailsModified(address,(address,address,uint32))\":{\"notice\":\"Emitted when an operator updates their OperatorDetails to @param newOperatorDetails\"},\"OperatorMetadataURIUpdated(address,string)\":{\"notice\":\"Emitted when @param operator indicates that they are updating their MetadataURI string\"},\"OperatorSharesDecreased(address,address,address,uint256)\":{\"notice\":\"Emitted whenever an operator's shares are decreased for a given strategy. Note that shares is the delta in the operator's shares.\"},\"OperatorSharesIncreased(address,address,address,uint256)\":{\"notice\":\"Emitted whenever an operator's shares are increased for a given strategy. Note that shares is the delta in the operator's shares.\"},\"Paused(address,uint256)\":{\"notice\":\"Emitted when the pause is triggered by `account`, and changed to `newPausedStatus`.\"},\"PauserRegistrySet(address,address)\":{\"notice\":\"Emitted when the `pauserRegistry` is set to `newPauserRegistry`.\"},\"StakerDelegated(address,address)\":{\"notice\":\"Emitted when @param staker delegates to @param operator.\"},\"StakerForceUndelegated(address,address)\":{\"notice\":\"Emitted when @param staker is undelegated via a call not originating from the staker themself\"},\"StakerUndelegated(address,address)\":{\"notice\":\"Emitted when @param staker undelegates from @param operator.\"},\"StrategyWithdrawalDelayBlocksSet(address,uint256,uint256)\":{\"notice\":\"Emitted when the `strategyWithdrawalDelayBlocks` variable is modified from `previousValue` to `newValue`.\"},\"Unpaused(address,uint256)\":{\"notice\":\"Emitted when the pause is lifted by `account`, and changed to `newPausedStatus`.\"},\"WithdrawalCompleted(bytes32)\":{\"notice\":\"Emitted when a queued withdrawal is completed\"},\"WithdrawalQueued(bytes32,(address,address,address,uint256,uint32,address[],uint256[]))\":{\"notice\":\"Emitted when a new withdrawal is queued.\"}},\"kind\":\"user\",\"methods\":{\"DELEGATION_APPROVAL_TYPEHASH()\":{\"notice\":\"The EIP-712 typehash for the `DelegationApproval` struct used by the contract\"},\"DOMAIN_TYPEHASH()\":{\"notice\":\"The EIP-712 typehash for the contract's domain\"},\"STAKER_DELEGATION_TYPEHASH()\":{\"notice\":\"The EIP-712 typehash for the `StakerDelegation` struct used by the contract\"},\"beaconChainETHStrategy()\":{\"notice\":\"Canonical, virtual beacon chain ETH strategy\"},\"calculateCurrentStakerDelegationDigestHash(address,address,uint256)\":{\"notice\":\"Calculates the digestHash for a `staker` to sign to delegate to an `operator`\"},\"calculateDelegationApprovalDigestHash(address,address,address,bytes32,uint256)\":{\"notice\":\"Calculates the digest hash to be signed by the operator's delegationApprove and used in the `delegateTo` and `delegateToBySignature` functions.\"},\"calculateStakerDelegationDigestHash(address,uint256,address,uint256)\":{\"notice\":\"Calculates the digest hash to be signed and used in the `delegateToBySignature` function\"},\"calculateWithdrawalRoot((address,address,address,uint256,uint32,address[],uint256[]))\":{\"notice\":\"Returns the keccak256 hash of `withdrawal`.\"},\"completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]),address[],uint256,bool)\":{\"notice\":\"Used to complete the specified `withdrawal`. The caller must match `withdrawal.withdrawer`\"},\"completeQueuedWithdrawals((address,address,address,uint256,uint32,address[],uint256[])[],address[][],uint256[],bool[])\":{\"notice\":\"Array-ified version of `completeQueuedWithdrawal`. Used to complete the specified `withdrawals`. The function caller must match `withdrawals[...].withdrawer`\"},\"cumulativeWithdrawalsQueued(address)\":{\"notice\":\"Mapping: staker => cumulative number of queued withdrawals they have ever initiated.\"},\"decreaseDelegatedShares(address,address,uint256)\":{\"notice\":\"Decreases a staker's delegated share balance in a strategy.\"},\"delegateTo(address,(bytes,uint256),bytes32)\":{\"notice\":\"Caller delegates their stake to an operator.\"},\"delegateToBySignature(address,address,(bytes,uint256),(bytes,uint256),bytes32)\":{\"notice\":\"Caller delegates a staker's stake to an operator with valid signatures from both parties.\"},\"delegatedTo(address)\":{\"notice\":\"Mapping: staker => operator whom the staker is currently delegated to.\"},\"delegationApprover(address)\":{\"notice\":\"Returns the delegationApprover account for an operator\"},\"delegationApproverSaltIsSpent(address,bytes32)\":{\"notice\":\"Mapping: delegationApprover => 32-byte salt => whether or not the salt has already been used by the delegationApprover.\"},\"domainSeparator()\":{\"notice\":\"Getter function for the current EIP-712 domain separator for this contract.\"},\"eigenPodManager()\":{\"notice\":\"The EigenPodManager contract for EigenLayer\"},\"getDelegatableShares(address)\":{\"notice\":\"Returns the number of actively-delegatable shares a staker has across all strategies.\"},\"getOperatorShares(address,address[])\":{\"notice\":\"Given array of strategies, returns array of shares for the operator\"},\"getWithdrawalDelay(address[])\":{\"notice\":\"Given a list of strategies, return the minimum number of blocks that must pass to withdraw from all the inputted strategies. Return value is >= minWithdrawalDelayBlocks as this is the global min withdrawal delay.\"},\"increaseDelegatedShares(address,address,uint256)\":{\"notice\":\"Increases a staker's delegated share balance in a strategy.\"},\"isDelegated(address)\":{\"notice\":\"Returns 'true' if `staker` *is* actively delegated, and 'false' otherwise.\"},\"isOperator(address)\":{\"notice\":\"Returns true is an operator has previously registered for delegation.\"},\"minWithdrawalDelayBlocks()\":{\"notice\":\"Global minimum withdrawal delay for all strategy withdrawals. In a prior Goerli release, we only had a global min withdrawal delay across all strategies. In addition, we now also configure withdrawal delays on a per-strategy basis. To withdraw from a strategy, max(minWithdrawalDelayBlocks, strategyWithdrawalDelayBlocks[strategy]) number of blocks must have passed. See mapping strategyWithdrawalDelayBlocks below for per-strategy withdrawal delays.\"},\"modifyOperatorDetails((address,address,uint32))\":{\"notice\":\"Updates an operator's stored `OperatorDetails`.\"},\"operatorDetails(address)\":{\"notice\":\"Returns the OperatorDetails struct associated with an `operator`.\"},\"operatorShares(address,address)\":{\"notice\":\"returns the total number of shares in `strategy` that are delegated to `operator`.Mapping: operator => strategy => total number of shares in the strategy delegated to the operator.\"},\"pause(uint256)\":{\"notice\":\"This function is used to pause an EigenLayer contract's functionality. It is permissioned to the `pauser` address, which is expected to be a low threshold multisig.\"},\"pauseAll()\":{\"notice\":\"Alias for `pause(type(uint256).max)`.\"},\"paused()\":{\"notice\":\"Returns the current paused status as a uint256.\"},\"paused(uint8)\":{\"notice\":\"Returns 'true' if the `indexed`th bit of `_paused` is 1, and 'false' otherwise\"},\"pauserRegistry()\":{\"notice\":\"Address of the `PauserRegistry` contract that this contract defers to for determining access control (for pausing).\"},\"pendingWithdrawals(bytes32)\":{\"notice\":\"Mapping: hash of withdrawal inputs, aka 'withdrawalRoot' => whether the withdrawal is pending\"},\"queueWithdrawals((address[],uint256[],address)[])\":{\"notice\":\"Allows a staker to withdraw some shares. Withdrawn shares/strategies are immediately removed from the staker. If the staker is delegated, withdrawn shares/strategies are also removed from their operator. All withdrawn shares/strategies are placed in a queue and can be fully withdrawn after a delay.\"},\"registerAsOperator((address,address,uint32),string)\":{\"notice\":\"Registers the caller as an operator in EigenLayer.\"},\"setMinWithdrawalDelayBlocks(uint256)\":{\"notice\":\"Owner-only function for modifying the value of the `minWithdrawalDelayBlocks` variable.\"},\"setPauserRegistry(address)\":{\"notice\":\"Allows the unpauser to set a new pauser registry\"},\"setStrategyWithdrawalDelayBlocks(address[],uint256[])\":{\"notice\":\"Called by owner to set the minimum withdrawal delay blocks for each passed in strategy Note that the min number of blocks to complete a withdrawal of a strategy is MAX(minWithdrawalDelayBlocks, strategyWithdrawalDelayBlocks[strategy])\"},\"slasher()\":{\"notice\":\"The Slasher contract for EigenLayer\"},\"stakerNonce(address)\":{\"notice\":\"Mapping: staker => number of signed messages (used in `delegateToBySignature`) from the staker that this contract has already checked.\"},\"stakerOptOutWindowBlocks(address)\":{\"notice\":\"Returns the stakerOptOutWindowBlocks for an operator\"},\"strategyManager()\":{\"notice\":\"The StrategyManager contract for EigenLayer\"},\"strategyWithdrawalDelayBlocks(address)\":{\"notice\":\"Minimum delay enforced by this contract per Strategy for completing queued withdrawals. Measured in blocks, and adjustable by this contract's owner, up to a maximum of `MAX_WITHDRAWAL_DELAY_BLOCKS`. Minimum value is 0 (i.e. no delay enforced).\"},\"undelegate(address)\":{\"notice\":\"Allows the staker, the staker's operator, or that operator's delegationApprover to undelegate a staker from their operator. Undelegation immediately removes ALL active shares/strategies from both the staker and operator, and places the shares and strategies in the withdrawal queue\"},\"unpause(uint256)\":{\"notice\":\"This function is used to unpause an EigenLayer contract's functionality. It is permissioned to the `unpauser` address, which is expected to be a high threshold multisig or governance contract.\"},\"updateOperatorMetadataURI(string)\":{\"notice\":\"Called by an operator to emit an `OperatorMetadataURIUpdated` event indicating the information has updated.\"}},\"notice\":\"Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-serviceThis is the contract for delegation in EigenLayer. The main functionalities of this contract are - enabling anyone to register as an operator in EigenLayer - allowing operators to specify parameters related to stakers who delegate to them - enabling any staker to delegate its stake to the operator of its choice (a given staker can only delegate to a single operator at a time) - enabling a staker to undelegate its assets from the operator it is delegated to (performed as part of the withdrawal process, initiated through the StrategyManager)\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/DelegationManager.sol\":\"DelegationManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/\",\":eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/\",\":eigenlayer-middleware/=lib/eigenlayer-middleware/src/\",\":eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/\",\":erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/\"]},\"sources\":{\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/DelegationManager.sol\":{\"keccak256\":\"0xebb7560a956ece70b08cf36bc548e70c7a04ad4f8718eba194927bcfc03c6190\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://ac5fe6c05d4268c8fd5853e44662bf9d306313e014d27542f02abd62265168d2\",\"dweb:/ipfs/QmTXcATcpgFpAD8FLmoeWoGYKTh3rRjxntsHCP7wcTWkwY\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/DelegationManagerStorage.sol\":{\"keccak256\":\"0xd834e9bc2f4d03545102004ffa9651e5bf9b559d43e4102bf2955314ef2d94f5\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://9c7670995b7ca634f94848f426b36278f98389c120b177b737ef325bd457ca00\",\"dweb:/ipfs/QmRtLyA4Kq5TrhhhXQAp2jAH7bJ5gqbjrr1JesD6wRbqqV\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol\":{\"keccak256\":\"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983\",\"dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol\":{\"keccak256\":\"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914\",\"dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol\":{\"keccak256\":\"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c\",\"license\":\"CC0-1.0\",\"urls\":[\"bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91\",\"dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol\":{\"keccak256\":\"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc\",\"dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol\":{\"keccak256\":\"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8\",\"dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol\":{\"keccak256\":\"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324\",\"dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol\":{\"keccak256\":\"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d\",\"dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol\":{\"keccak256\":\"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c\",\"dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol\":{\"keccak256\":\"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232\",\"dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol\":{\"keccak256\":\"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73\",\"dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol\":{\"keccak256\":\"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef\",\"dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol\":{\"keccak256\":\"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7\",\"dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/EIP1271SignatureUtils.sol\":{\"keccak256\":\"0xe92d584c47c5828e026a8082af3da38a853e3942c4da7deb705d6470a41afab3\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://1c436c578781fd7d3dffdb24e906819422819f5e9a71d39ee63166a3d5cb3373\",\"dweb:/ipfs/QmP7bJhYqLpwqk2Xq4tqDCUMi2nFAhxxW3Pz36ctE1sbdD\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol\":{\"keccak256\":\"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f\",\"dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol\":{\"keccak256\":\"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f\",\"dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/permissions/Pausable.sol\":{\"keccak256\":\"0xce8ee0ab28f2bce9e94aa19fffe55bebef080327632ac98ff3ab14994b369bc0\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://5c7e2be97a8840fa2a0434077a36136553a84efd9bff4b46712ce9fddb813a6a\",\"dweb:/ipfs/QmZKvgPxLAbGo1CqTA4AX6MCDPFLSSNt43ZKWRjvvzFp7S\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a\",\"dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/security/ReentrancyGuardUpgradeable.sol\":{\"keccak256\":\"0x8cc03c5ac17e8a7396e487cda41fc1f1dfdb91db7d528e6da84bee3b6dd7e167\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://607818f1b44548c2d8268176f73cdb290e1faed971b1061930d92698366e2a11\",\"dweb:/ipfs/QmQibMe3r5no95b6q7isGT5R75V8xSofWEDLXzp95b7LgZ\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol\":{\"keccak256\":\"0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c45b821ef9e882e57c256697a152e108f0f2ad6997609af8904cae99c9bd422e\",\"dweb:/ipfs/QmRKCJW6jjzR5UYZcLpGnhEJ75UVbH6EHkEa49sWx2SKng\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"keccak256\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6f2cf1c531122bc7ca96b8c8db6a60deae60441e5223065e792553d4849b5638\",\"dweb:/ipfs/QmPBdJmBBABMDCfyDjCbdxgiqRavgiSL88SYPGibgbPas9\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x84ac2d2f343df1e683da7a12bbcf70db542a7a7a0cea90a5d70fcb5e5d035481\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://73ae8e0c6f975052973265113d762629002ce33987b1933c2a378667e2816f2f\",\"dweb:/ipfs/QmQAootkVfoe4PLaYbT4Xob2dJRm3bZfbCffEHRbCYXNPF\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.12+commit.f00d7308"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract IStrategyManager","name":"_strategyManager","type":"address"},{"internalType":"contract ISlasher","name":"_slasher","type":"address"},{"internalType":"contract IEigenPodManager","name":"_eigenPodManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"uint256","name":"previousValue","type":"uint256","indexed":false},{"internalType":"uint256","name":"newValue","type":"uint256","indexed":false}],"type":"event","name":"MinWithdrawalDelayBlocksSet","anonymous":false},{"inputs":[{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"struct IDelegationManager.OperatorDetails","name":"newOperatorDetails","type":"tuple","components":[{"internalType":"address","name":"__deprecated_earningsReceiver","type":"address"},{"internalType":"address","name":"delegationApprover","type":"address"},{"internalType":"uint32","name":"stakerOptOutWindowBlocks","type":"uint32"}],"indexed":false}],"type":"event","name":"OperatorDetailsModified","anonymous":false},{"inputs":[{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"string","name":"metadataURI","type":"string","indexed":false}],"type":"event","name":"OperatorMetadataURIUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"struct IDelegationManager.OperatorDetails","name":"operatorDetails","type":"tuple","components":[{"internalType":"address","name":"__deprecated_earningsReceiver","type":"address"},{"internalType":"address","name":"delegationApprover","type":"address"},{"internalType":"uint32","name":"stakerOptOutWindowBlocks","type":"uint32"}],"indexed":false}],"type":"event","name":"OperatorRegistered","anonymous":false},{"inputs":[{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"address","name":"staker","type":"address","indexed":false},{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false},{"internalType":"uint256","name":"shares","type":"uint256","indexed":false}],"type":"event","name":"OperatorSharesDecreased","anonymous":false},{"inputs":[{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"address","name":"staker","type":"address","indexed":false},{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false},{"internalType":"uint256","name":"shares","type":"uint256","indexed":false}],"type":"event","name":"OperatorSharesIncreased","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"uint256","name":"newPausedStatus","type":"uint256","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"contract IPauserRegistry","name":"pauserRegistry","type":"address","indexed":false},{"internalType":"contract IPauserRegistry","name":"newPauserRegistry","type":"address","indexed":false}],"type":"event","name":"PauserRegistrySet","anonymous":false},{"inputs":[{"internalType":"address","name":"staker","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true}],"type":"event","name":"StakerDelegated","anonymous":false},{"inputs":[{"internalType":"address","name":"staker","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true}],"type":"event","name":"StakerForceUndelegated","anonymous":false},{"inputs":[{"internalType":"address","name":"staker","type":"address","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true}],"type":"event","name":"StakerUndelegated","anonymous":false},{"inputs":[{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false},{"internalType":"uint256","name":"previousValue","type":"uint256","indexed":false},{"internalType":"uint256","name":"newValue","type":"uint256","indexed":false}],"type":"event","name":"StrategyWithdrawalDelayBlocksSet","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"uint256","name":"newPausedStatus","type":"uint256","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"withdrawalRoot","type":"bytes32","indexed":false}],"type":"event","name":"WithdrawalCompleted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"withdrawalRoot","type":"bytes32","indexed":false},{"internalType":"struct IDelegationManager.Withdrawal","name":"withdrawal","type":"tuple","components":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"address","name":"delegatedTo","type":"address"},{"internalType":"address","name":"withdrawer","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint32","name":"startBlock","type":"uint32"},{"internalType":"contract IStrategy[]","name":"strategies","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}],"indexed":false}],"type":"event","name":"WithdrawalQueued","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DELEGATION_APPROVAL_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_STAKER_OPT_OUT_WINDOW_BLOCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_WITHDRAWAL_DELAY_BLOCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"STAKER_DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"beaconChainETHStrategy","outputs":[{"internalType":"contract IStrategy","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"stateMutability":"view","type":"function","name":"calculateCurrentStakerDelegationDigestHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"_delegationApprover","type":"address"},{"internalType":"bytes32","name":"approverSalt","type":"bytes32"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"stateMutability":"view","type":"function","name":"calculateDelegationApprovalDigestHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"_stakerNonce","type":"uint256"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"stateMutability":"view","type":"function","name":"calculateStakerDelegationDigestHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"struct IDelegationManager.Withdrawal","name":"withdrawal","type":"tuple","components":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"address","name":"delegatedTo","type":"address"},{"internalType":"address","name":"withdrawer","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint32","name":"startBlock","type":"uint32"},{"internalType":"contract IStrategy[]","name":"strategies","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}]}],"stateMutability":"pure","type":"function","name":"calculateWithdrawalRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"struct IDelegationManager.Withdrawal","name":"withdrawal","type":"tuple","components":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"address","name":"delegatedTo","type":"address"},{"internalType":"address","name":"withdrawer","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint32","name":"startBlock","type":"uint32"},{"internalType":"contract IStrategy[]","name":"strategies","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}]},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256","name":"middlewareTimesIndex","type":"uint256"},{"internalType":"bool","name":"receiveAsTokens","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"completeQueuedWithdrawal"},{"inputs":[{"internalType":"struct IDelegationManager.Withdrawal[]","name":"withdrawals","type":"tuple[]","components":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"address","name":"delegatedTo","type":"address"},{"internalType":"address","name":"withdrawer","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint32","name":"startBlock","type":"uint32"},{"internalType":"contract IStrategy[]","name":"strategies","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}]},{"internalType":"contract IERC20[][]","name":"tokens","type":"address[][]"},{"internalType":"uint256[]","name":"middlewareTimesIndexes","type":"uint256[]"},{"internalType":"bool[]","name":"receiveAsTokens","type":"bool[]"}],"stateMutability":"nonpayable","type":"function","name":"completeQueuedWithdrawals"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"cumulativeWithdrawalsQueued","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"decreaseDelegatedShares"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"struct ISignatureUtils.SignatureWithExpiry","name":"approverSignatureAndExpiry","type":"tuple","components":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"expiry","type":"uint256"}]},{"internalType":"bytes32","name":"approverSalt","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"delegateTo"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"struct ISignatureUtils.SignatureWithExpiry","name":"stakerSignatureAndExpiry","type":"tuple","components":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"expiry","type":"uint256"}]},{"internalType":"struct ISignatureUtils.SignatureWithExpiry","name":"approverSignatureAndExpiry","type":"tuple","components":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"expiry","type":"uint256"}]},{"internalType":"bytes32","name":"approverSalt","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"delegateToBySignature"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"delegatedTo","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"delegationApprover","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"delegationApproverSaltIsSpent","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"eigenPodManager","outputs":[{"internalType":"contract IEigenPodManager","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"stateMutability":"view","type":"function","name":"getDelegatableShares","outputs":[{"internalType":"contract IStrategy[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"contract IStrategy[]","name":"strategies","type":"address[]"}],"stateMutability":"view","type":"function","name":"getOperatorShares","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}]},{"inputs":[{"internalType":"contract IStrategy[]","name":"strategies","type":"address[]"}],"stateMutability":"view","type":"function","name":"getWithdrawalDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"increaseDelegatedShares"},{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"contract IPauserRegistry","name":"_pauserRegistry","type":"address"},{"internalType":"uint256","name":"initialPausedStatus","type":"uint256"},{"internalType":"uint256","name":"_minWithdrawalDelayBlocks","type":"uint256"},{"internalType":"contract IStrategy[]","name":"_strategies","type":"address[]"},{"internalType":"uint256[]","name":"_withdrawalDelayBlocks","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"stateMutability":"view","type":"function","name":"isDelegated","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"minWithdrawalDelayBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct IDelegationManager.OperatorDetails","name":"newOperatorDetails","type":"tuple","components":[{"internalType":"address","name":"__deprecated_earningsReceiver","type":"address"},{"internalType":"address","name":"delegationApprover","type":"address"},{"internalType":"uint32","name":"stakerOptOutWindowBlocks","type":"uint32"}]}],"stateMutability":"nonpayable","type":"function","name":"modifyOperatorDetails"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"operatorDetails","outputs":[{"internalType":"struct IDelegationManager.OperatorDetails","name":"","type":"tuple","components":[{"internalType":"address","name":"__deprecated_earningsReceiver","type":"address"},{"internalType":"address","name":"delegationApprover","type":"address"},{"internalType":"uint32","name":"stakerOptOutWindowBlocks","type":"uint32"}]}]},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"contract IStrategy","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"operatorShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"newPausedStatus","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"pause"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"pauseAll"},{"inputs":[{"internalType":"uint8","name":"index","type":"uint8"}],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"pauserRegistry","outputs":[{"internalType":"contract IPauserRegistry","name":"","type":"address"}]},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"pendingWithdrawals","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct IDelegationManager.QueuedWithdrawalParams[]","name":"queuedWithdrawalParams","type":"tuple[]","components":[{"internalType":"contract IStrategy[]","name":"strategies","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"},{"internalType":"address","name":"withdrawer","type":"address"}]}],"stateMutability":"nonpayable","type":"function","name":"queueWithdrawals","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}]},{"inputs":[{"internalType":"struct IDelegationManager.OperatorDetails","name":"registeringOperatorDetails","type":"tuple","components":[{"internalType":"address","name":"__deprecated_earningsReceiver","type":"address"},{"internalType":"address","name":"delegationApprover","type":"address"},{"internalType":"uint32","name":"stakerOptOutWindowBlocks","type":"uint32"}]},{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"registerAsOperator"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"uint256","name":"newMinWithdrawalDelayBlocks","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setMinWithdrawalDelayBlocks"},{"inputs":[{"internalType":"contract IPauserRegistry","name":"newPauserRegistry","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setPauserRegistry"},{"inputs":[{"internalType":"contract IStrategy[]","name":"strategies","type":"address[]"},{"internalType":"uint256[]","name":"withdrawalDelayBlocks","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function","name":"setStrategyWithdrawalDelayBlocks"},{"inputs":[],"stateMutability":"view","type":"function","name":"slasher","outputs":[{"internalType":"contract ISlasher","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"stakerNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"stakerOptOutWindowBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"strategyManager","outputs":[{"internalType":"contract IStrategyManager","name":"","type":"address"}]},{"inputs":[{"internalType":"contract IStrategy","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"strategyWithdrawalDelayBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"undelegate","outputs":[{"internalType":"bytes32[]","name":"withdrawalRoots","type":"bytes32[]"}]},{"inputs":[{"internalType":"uint256","name":"newPausedStatus","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"unpause"},{"inputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"updateOperatorMetadataURI"}],"devdoc":{"kind":"dev","methods":{"calculateCurrentStakerDelegationDigestHash(address,address,uint256)":{"params":{"expiry":"The desired expiry time of the staker's signature","operator":"The operator who is being delegated to","staker":"The signing staker"}},"calculateDelegationApprovalDigestHash(address,address,address,bytes32,uint256)":{"params":{"_delegationApprover":"the operator's `delegationApprover` who will be signing the delegationHash (in general)","approverSalt":"A unique and single use value associated with the approver signature.","expiry":"Time after which the approver's signature becomes invalid","operator":"The account receiving delegated stake","staker":"The account delegating their stake"}},"calculateStakerDelegationDigestHash(address,uint256,address,uint256)":{"params":{"_stakerNonce":"The nonce of the staker. In practice we use the staker's current nonce, stored at `stakerNonce[staker]`","expiry":"The desired expiry time of the staker's signature","operator":"The operator who is being delegated to","staker":"The signing staker"}},"completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]),address[],uint256,bool)":{"details":"middlewareTimesIndex is unused, but will be used in the Slasher eventuallybeaconChainETHStrategy shares are non-transferrable, so if `receiveAsTokens = false` and `withdrawal.withdrawer != withdrawal.staker`, note that any beaconChainETHStrategy shares in the `withdrawal` will be _returned to the staker_, rather than transferred to the withdrawer, unlike shares in any other strategies, which will be transferred to the withdrawer.","params":{"middlewareTimesIndex":"is the index in the operator that the staker who triggered the withdrawal was delegated to's middleware times array","receiveAsTokens":"If true, the shares specified in the withdrawal will be withdrawn from the specified strategies themselves and sent to the caller, through calls to `withdrawal.strategies[i].withdraw`. If false, then the shares in the specified strategies will simply be transferred to the caller directly.","tokens":"Array in which the i-th entry specifies the `token` input to the 'withdraw' function of the i-th Strategy in the `withdrawal.strategies` array. This input can be provided with zero length if `receiveAsTokens` is set to 'false' (since in that case, this input will be unused)","withdrawal":"The Withdrawal to complete."}},"completeQueuedWithdrawals((address,address,address,uint256,uint32,address[],uint256[])[],address[][],uint256[],bool[])":{"details":"See `completeQueuedWithdrawal` for relevant dev tags","params":{"middlewareTimesIndexes":"One index to reference per Withdrawal. See `completeQueuedWithdrawal` for the usage of a single index.","receiveAsTokens":"Whether or not to complete each withdrawal as tokens. See `completeQueuedWithdrawal` for the usage of a single boolean.","tokens":"Array of tokens for each Withdrawal. See `completeQueuedWithdrawal` for the usage of a single array.","withdrawals":"The Withdrawals to complete."}},"constructor":{"details":"Initializes the immutable addresses of the strategy mananger and slasher."},"decreaseDelegatedShares(address,address,uint256)":{"details":"*If the staker is actively delegated*, then decreases the `staker`'s delegated shares in `strategy` by `shares`. Otherwise does nothing.Callable only by the StrategyManager or EigenPodManager.","params":{"shares":"The number of shares to decrease.","staker":"The address to increase the delegated shares for their operator.","strategy":"The strategy in which to decrease the delegated shares."}},"delegateTo(address,(bytes,uint256),bytes32)":{"details":"The approverSignatureAndExpiry is used in the event that: 1) the operator's `delegationApprover` address is set to a non-zero value. AND 2) neither the operator nor their `delegationApprover` is the `msg.sender`, since in the event that the operator or their delegationApprover is the `msg.sender`, then approval is assumed.In the event that `approverSignatureAndExpiry` is not checked, its content is ignored entirely; it's recommended to use an empty input in this case to save on complexity + gas costs","params":{"approverSalt":"A unique single use value tied to an individual signature.","approverSignatureAndExpiry":"Verifies the operator approves of this delegation","operator":"The account (`msg.sender`) is delegating its assets to for use in serving applications built on EigenLayer."}},"delegateToBySignature(address,address,(bytes,uint256),(bytes,uint256),bytes32)":{"details":"If `staker` is an EOA, then `stakerSignature` is verified to be a valid ECDSA stakerSignature from `staker`, indicating their intention for this action.If `staker` is a contract, then `stakerSignature` will be checked according to EIP-1271.the operator's `delegationApprover` address is set to a non-zero value.neither the operator nor their `delegationApprover` is the `msg.sender`, since in the event that the operator or their delegationApprover is the `msg.sender`, then approval is assumed.This function will revert if the current `block.timestamp` is equal to or exceeds the expiryIn the case that `approverSignatureAndExpiry` is not checked, its content is ignored entirely; it's recommended to use an empty input in this case to save on complexity + gas costs","params":{"approverSalt":"Is a salt used to help guarantee signature uniqueness. Each salt can only be used once by a given approver.","approverSignatureAndExpiry":"is a parameter that will be used for verifying that the operator approves of this delegation action in the event that:","operator":"The account (`staker`) is delegating its assets to for use in serving applications built on EigenLayer.","staker":"The account delegating stake to an `operator` account","stakerSignatureAndExpiry":"Signed data from the staker authorizing delegating stake to an operator"}},"domainSeparator()":{"details":"The domain separator will change in the event of a fork that changes the ChainID.By introducing a domain separator the DApp developers are guaranteed that there can be no signature collision. for more detailed information please read EIP-712."},"getDelegatableShares(address)":{"details":"Returns two empty arrays in the case that the Staker has no actively-delegateable shares."},"getWithdrawalDelay(address[])":{"params":{"strategies":"The strategies to check withdrawal delays for"}},"increaseDelegatedShares(address,address,uint256)":{"details":"*If the staker is actively delegated*, then increases the `staker`'s delegated shares in `strategy` by `shares`. Otherwise does nothing.Callable only by the StrategyManager or EigenPodManager.","params":{"shares":"The number of shares to increase.","staker":"The address to increase the delegated shares for their operator.","strategy":"The strategy in which to increase the delegated shares."}},"initialize(address,address,uint256,uint256,address[],uint256[])":{"details":"Initializes the addresses of the initial owner, pauser registry, and paused status. minWithdrawalDelayBlocks is set only once here"},"modifyOperatorDetails((address,address,uint32))":{"details":"The caller must have previously registered as an operator in EigenLayer.","params":{"newOperatorDetails":"is the updated `OperatorDetails` for the operator, to replace their current OperatorDetails`."}},"owner()":{"details":"Returns the address of the current owner."},"pause(uint256)":{"details":"This function can only pause functionality, and thus cannot 'unflip' any bit in `_paused` from 1 to 0.","params":{"newPausedStatus":"represents the new value for `_paused` to take, which means it may flip several bits at once."}},"registerAsOperator((address,address,uint32),string)":{"details":"Once an operator is registered, they cannot 'deregister' as an operator, and they will forever be considered \"delegated to themself\".This function will revert if the caller is already delegated to an operator.Note that the `metadataURI` is *never stored * and is only emitted in the `OperatorMetadataURIUpdated` event","params":{"metadataURI":"is a URI for the operator's metadata, i.e. a link providing more details on the operator.","registeringOperatorDetails":"is the `OperatorDetails` for the operator."}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"setMinWithdrawalDelayBlocks(uint256)":{"params":{"newMinWithdrawalDelayBlocks":"new value of `minWithdrawalDelayBlocks`."}},"setStrategyWithdrawalDelayBlocks(address[],uint256[])":{"params":{"strategies":"The strategies to set the minimum withdrawal delay blocks for","withdrawalDelayBlocks":"The minimum withdrawal delay blocks to set for each strategy"}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"unpause(uint256)":{"details":"This function can only unpause functionality, and thus cannot 'flip' any bit in `_paused` from 0 to 1.","params":{"newPausedStatus":"represents the new value for `_paused` to take, which means it may flip several bits at once."}},"updateOperatorMetadataURI(string)":{"params":{"metadataURI":"The URI for metadata associated with an operator"}}},"version":1},"userdoc":{"kind":"user","methods":{"DELEGATION_APPROVAL_TYPEHASH()":{"notice":"The EIP-712 typehash for the `DelegationApproval` struct used by the contract"},"DOMAIN_TYPEHASH()":{"notice":"The EIP-712 typehash for the contract's domain"},"STAKER_DELEGATION_TYPEHASH()":{"notice":"The EIP-712 typehash for the `StakerDelegation` struct used by the contract"},"beaconChainETHStrategy()":{"notice":"Canonical, virtual beacon chain ETH strategy"},"calculateCurrentStakerDelegationDigestHash(address,address,uint256)":{"notice":"Calculates the digestHash for a `staker` to sign to delegate to an `operator`"},"calculateDelegationApprovalDigestHash(address,address,address,bytes32,uint256)":{"notice":"Calculates the digest hash to be signed by the operator's delegationApprove and used in the `delegateTo` and `delegateToBySignature` functions."},"calculateStakerDelegationDigestHash(address,uint256,address,uint256)":{"notice":"Calculates the digest hash to be signed and used in the `delegateToBySignature` function"},"calculateWithdrawalRoot((address,address,address,uint256,uint32,address[],uint256[]))":{"notice":"Returns the keccak256 hash of `withdrawal`."},"completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]),address[],uint256,bool)":{"notice":"Used to complete the specified `withdrawal`. The caller must match `withdrawal.withdrawer`"},"completeQueuedWithdrawals((address,address,address,uint256,uint32,address[],uint256[])[],address[][],uint256[],bool[])":{"notice":"Array-ified version of `completeQueuedWithdrawal`. Used to complete the specified `withdrawals`. The function caller must match `withdrawals[...].withdrawer`"},"cumulativeWithdrawalsQueued(address)":{"notice":"Mapping: staker => cumulative number of queued withdrawals they have ever initiated."},"decreaseDelegatedShares(address,address,uint256)":{"notice":"Decreases a staker's delegated share balance in a strategy."},"delegateTo(address,(bytes,uint256),bytes32)":{"notice":"Caller delegates their stake to an operator."},"delegateToBySignature(address,address,(bytes,uint256),(bytes,uint256),bytes32)":{"notice":"Caller delegates a staker's stake to an operator with valid signatures from both parties."},"delegatedTo(address)":{"notice":"Mapping: staker => operator whom the staker is currently delegated to."},"delegationApprover(address)":{"notice":"Returns the delegationApprover account for an operator"},"delegationApproverSaltIsSpent(address,bytes32)":{"notice":"Mapping: delegationApprover => 32-byte salt => whether or not the salt has already been used by the delegationApprover."},"domainSeparator()":{"notice":"Getter function for the current EIP-712 domain separator for this contract."},"eigenPodManager()":{"notice":"The EigenPodManager contract for EigenLayer"},"getDelegatableShares(address)":{"notice":"Returns the number of actively-delegatable shares a staker has across all strategies."},"getOperatorShares(address,address[])":{"notice":"Given array of strategies, returns array of shares for the operator"},"getWithdrawalDelay(address[])":{"notice":"Given a list of strategies, return the minimum number of blocks that must pass to withdraw from all the inputted strategies. Return value is >= minWithdrawalDelayBlocks as this is the global min withdrawal delay."},"increaseDelegatedShares(address,address,uint256)":{"notice":"Increases a staker's delegated share balance in a strategy."},"isDelegated(address)":{"notice":"Returns 'true' if `staker` *is* actively delegated, and 'false' otherwise."},"isOperator(address)":{"notice":"Returns true is an operator has previously registered for delegation."},"minWithdrawalDelayBlocks()":{"notice":"Global minimum withdrawal delay for all strategy withdrawals. In a prior Goerli release, we only had a global min withdrawal delay across all strategies. In addition, we now also configure withdrawal delays on a per-strategy basis. To withdraw from a strategy, max(minWithdrawalDelayBlocks, strategyWithdrawalDelayBlocks[strategy]) number of blocks must have passed. See mapping strategyWithdrawalDelayBlocks below for per-strategy withdrawal delays."},"modifyOperatorDetails((address,address,uint32))":{"notice":"Updates an operator's stored `OperatorDetails`."},"operatorDetails(address)":{"notice":"Returns the OperatorDetails struct associated with an `operator`."},"operatorShares(address,address)":{"notice":"returns the total number of shares in `strategy` that are delegated to `operator`.Mapping: operator => strategy => total number of shares in the strategy delegated to the operator."},"pause(uint256)":{"notice":"This function is used to pause an EigenLayer contract's functionality. It is permissioned to the `pauser` address, which is expected to be a low threshold multisig."},"pauseAll()":{"notice":"Alias for `pause(type(uint256).max)`."},"paused()":{"notice":"Returns the current paused status as a uint256."},"paused(uint8)":{"notice":"Returns 'true' if the `indexed`th bit of `_paused` is 1, and 'false' otherwise"},"pauserRegistry()":{"notice":"Address of the `PauserRegistry` contract that this contract defers to for determining access control (for pausing)."},"pendingWithdrawals(bytes32)":{"notice":"Mapping: hash of withdrawal inputs, aka 'withdrawalRoot' => whether the withdrawal is pending"},"queueWithdrawals((address[],uint256[],address)[])":{"notice":"Allows a staker to withdraw some shares. Withdrawn shares/strategies are immediately removed from the staker. If the staker is delegated, withdrawn shares/strategies are also removed from their operator. All withdrawn shares/strategies are placed in a queue and can be fully withdrawn after a delay."},"registerAsOperator((address,address,uint32),string)":{"notice":"Registers the caller as an operator in EigenLayer."},"setMinWithdrawalDelayBlocks(uint256)":{"notice":"Owner-only function for modifying the value of the `minWithdrawalDelayBlocks` variable."},"setPauserRegistry(address)":{"notice":"Allows the unpauser to set a new pauser registry"},"setStrategyWithdrawalDelayBlocks(address[],uint256[])":{"notice":"Called by owner to set the minimum withdrawal delay blocks for each passed in strategy Note that the min number of blocks to complete a withdrawal of a strategy is MAX(minWithdrawalDelayBlocks, strategyWithdrawalDelayBlocks[strategy])"},"slasher()":{"notice":"The Slasher contract for EigenLayer"},"stakerNonce(address)":{"notice":"Mapping: staker => number of signed messages (used in `delegateToBySignature`) from the staker that this contract has already checked."},"stakerOptOutWindowBlocks(address)":{"notice":"Returns the stakerOptOutWindowBlocks for an operator"},"strategyManager()":{"notice":"The StrategyManager contract for EigenLayer"},"strategyWithdrawalDelayBlocks(address)":{"notice":"Minimum delay enforced by this contract per Strategy for completing queued withdrawals. Measured in blocks, and adjustable by this contract's owner, up to a maximum of `MAX_WITHDRAWAL_DELAY_BLOCKS`. Minimum value is 0 (i.e. no delay enforced)."},"undelegate(address)":{"notice":"Allows the staker, the staker's operator, or that operator's delegationApprover to undelegate a staker from their operator. Undelegation immediately removes ALL active shares/strategies from both the staker and operator, and places the shares and strategies in the withdrawal queue"},"unpause(uint256)":{"notice":"This function is used to unpause an EigenLayer contract's functionality. It is permissioned to the `unpauser` address, which is expected to be a high threshold multisig or governance contract."},"updateOperatorMetadataURI(string)":{"notice":"Called by an operator to emit an `OperatorMetadataURIUpdated` event indicating the information has updated."}},"version":1}},"settings":{"remappings":["@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/","eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/","eigenlayer-middleware/=lib/eigenlayer-middleware/src/","eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/","erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/DelegationManager.sol":"DelegationManager"},"evmVersion":"london","libraries":{}},"sources":{"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/DelegationManager.sol":{"keccak256":"0xebb7560a956ece70b08cf36bc548e70c7a04ad4f8718eba194927bcfc03c6190","urls":["bzz-raw://ac5fe6c05d4268c8fd5853e44662bf9d306313e014d27542f02abd62265168d2","dweb:/ipfs/QmTXcATcpgFpAD8FLmoeWoGYKTh3rRjxntsHCP7wcTWkwY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/DelegationManagerStorage.sol":{"keccak256":"0xd834e9bc2f4d03545102004ffa9651e5bf9b559d43e4102bf2955314ef2d94f5","urls":["bzz-raw://9c7670995b7ca634f94848f426b36278f98389c120b177b737ef325bd457ca00","dweb:/ipfs/QmRtLyA4Kq5TrhhhXQAp2jAH7bJ5gqbjrr1JesD6wRbqqV"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol":{"keccak256":"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00","urls":["bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983","dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol":{"keccak256":"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9","urls":["bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914","dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol":{"keccak256":"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c","urls":["bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91","dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz"],"license":"CC0-1.0"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol":{"keccak256":"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba","urls":["bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc","dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol":{"keccak256":"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c","urls":["bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8","dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol":{"keccak256":"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f","urls":["bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324","dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol":{"keccak256":"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49","urls":["bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d","dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol":{"keccak256":"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092","urls":["bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c","dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol":{"keccak256":"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79","urls":["bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232","dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol":{"keccak256":"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420","urls":["bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73","dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol":{"keccak256":"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52","urls":["bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef","dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol":{"keccak256":"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377","urls":["bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7","dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/EIP1271SignatureUtils.sol":{"keccak256":"0xe92d584c47c5828e026a8082af3da38a853e3942c4da7deb705d6470a41afab3","urls":["bzz-raw://1c436c578781fd7d3dffdb24e906819422819f5e9a71d39ee63166a3d5cb3373","dweb:/ipfs/QmP7bJhYqLpwqk2Xq4tqDCUMi2nFAhxxW3Pz36ctE1sbdD"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol":{"keccak256":"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d","urls":["bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f","dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol":{"keccak256":"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71","urls":["bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f","dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5"],"license":"MIT"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/permissions/Pausable.sol":{"keccak256":"0xce8ee0ab28f2bce9e94aa19fffe55bebef080327632ac98ff3ab14994b369bc0","urls":["bzz-raw://5c7e2be97a8840fa2a0434077a36136553a84efd9bff4b46712ce9fddb813a6a","dweb:/ipfs/QmZKvgPxLAbGo1CqTA4AX6MCDPFLSSNt43ZKWRjvvzFp7S"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol":{"keccak256":"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888","urls":["bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a","dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e","urls":["bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497","dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/security/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x8cc03c5ac17e8a7396e487cda41fc1f1dfdb91db7d528e6da84bee3b6dd7e167","urls":["bzz-raw://607818f1b44548c2d8268176f73cdb290e1faed971b1061930d92698366e2a11","dweb:/ipfs/QmQibMe3r5no95b6q7isGT5R75V8xSofWEDLXzp95b7LgZ"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol":{"keccak256":"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3","urls":["bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4","dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"keccak256":"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149","urls":["bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c","dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol":{"keccak256":"0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544","urls":["bzz-raw://c45b821ef9e882e57c256697a152e108f0f2ad6997609af8904cae99c9bd422e","dweb:/ipfs/QmRKCJW6jjzR5UYZcLpGnhEJ75UVbH6EHkEa49sWx2SKng"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61","urls":["bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354","dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/utils/Strings.sol":{"keccak256":"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3","urls":["bzz-raw://6f2cf1c531122bc7ca96b8c8db6a60deae60441e5223065e792553d4849b5638","dweb:/ipfs/QmPBdJmBBABMDCfyDjCbdxgiqRavgiSL88SYPGibgbPas9"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0x84ac2d2f343df1e683da7a12bbcf70db542a7a7a0cea90a5d70fcb5e5d035481","urls":["bzz-raw://73ae8e0c6f975052973265113d762629002ce33987b1933c2a378667e2816f2f","dweb:/ipfs/QmQAootkVfoe4PLaYbT4Xob2dJRm3bZfbCffEHRbCYXNPF"],"license":"MIT"}},"version":1},"id":2} \ No newline at end of file diff --git a/telemetry_api/priv/abi/IRegistryCoordinator.json b/telemetry_api/priv/abi/IRegistryCoordinator.json new file mode 100644 index 0000000000..53ece9cf8e --- /dev/null +++ b/telemetry_api/priv/abi/IRegistryCoordinator.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"blsApkRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IBLSApkRegistry"}],"stateMutability":"view"},{"type":"function","name":"ejectOperator","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getCurrentQuorumBitmap","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint192","internalType":"uint192"}],"stateMutability":"view"},{"type":"function","name":"getOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IRegistryCoordinator.OperatorInfo","components":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"status","type":"uint8","internalType":"enum IRegistryCoordinator.OperatorStatus"}]}],"stateMutability":"view"},{"type":"function","name":"getOperatorFromId","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"operator","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getOperatorId","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getOperatorSetParams","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IRegistryCoordinator.OperatorSetParam","components":[{"name":"maxOperatorCount","type":"uint32","internalType":"uint32"},{"name":"kickBIPsOfOperatorStake","type":"uint16","internalType":"uint16"},{"name":"kickBIPsOfTotalStake","type":"uint16","internalType":"uint16"}]}],"stateMutability":"view"},{"type":"function","name":"getOperatorStatus","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint8","internalType":"enum IRegistryCoordinator.OperatorStatus"}],"stateMutability":"view"},{"type":"function","name":"getQuorumBitmapAtBlockNumberByIndex","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"blockNumber","type":"uint32","internalType":"uint32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint192","internalType":"uint192"}],"stateMutability":"view"},{"type":"function","name":"getQuorumBitmapHistoryLength","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getQuorumBitmapIndicesAtBlockNumber","inputs":[{"name":"blockNumber","type":"uint32","internalType":"uint32"},{"name":"operatorIds","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"","type":"uint32[]","internalType":"uint32[]"}],"stateMutability":"view"},{"type":"function","name":"getQuorumBitmapUpdateByIndex","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IRegistryCoordinator.QuorumBitmapUpdate","components":[{"name":"updateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"nextUpdateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"quorumBitmap","type":"uint192","internalType":"uint192"}]}],"stateMutability":"view"},{"type":"function","name":"indexRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IIndexRegistry"}],"stateMutability":"view"},{"type":"function","name":"numRegistries","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"pubkeyRegistrationMessageHash","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct BN254.G1Point","components":[{"name":"X","type":"uint256","internalType":"uint256"},{"name":"Y","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"quorumCount","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"quorumUpdateBlockNumber","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"registries","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"stakeRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IStakeRegistry"}],"stateMutability":"view"},{"type":"event","name":"ChurnApproverUpdated","inputs":[{"name":"prevChurnApprover","type":"address","indexed":false,"internalType":"address"},{"name":"newChurnApprover","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EjectorUpdated","inputs":[{"name":"prevEjector","type":"address","indexed":false,"internalType":"address"},{"name":"newEjector","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OperatorDeregistered","inputs":[{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"operatorId","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"OperatorRegistered","inputs":[{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"operatorId","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"OperatorSetParamsUpdated","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"operatorSetParams","type":"tuple","indexed":false,"internalType":"struct IRegistryCoordinator.OperatorSetParam","components":[{"name":"maxOperatorCount","type":"uint32","internalType":"uint32"},{"name":"kickBIPsOfOperatorStake","type":"uint16","internalType":"uint16"},{"name":"kickBIPsOfTotalStake","type":"uint16","internalType":"uint16"}]}],"anonymous":false},{"type":"event","name":"QuorumBlockNumberUpdated","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"blocknumber","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"blsApkRegistry()":"5df45946","ejectOperator(address,bytes)":"6e3b17db","getCurrentQuorumBitmap(bytes32)":"871ef049","getOperator(address)":"5865c60c","getOperatorFromId(bytes32)":"296bb064","getOperatorId(address)":"13542a4e","getOperatorSetParams(uint8)":"e65797ad","getOperatorStatus(address)":"fd39105a","getQuorumBitmapAtBlockNumberByIndex(bytes32,uint32,uint256)":"04ec6351","getQuorumBitmapHistoryLength(bytes32)":"03fd3492","getQuorumBitmapIndicesAtBlockNumber(uint32,bytes32[])":"c391425e","getQuorumBitmapUpdateByIndex(bytes32,uint256)":"1eb812da","indexRegistry()":"9e9923c2","numRegistries()":"d72d8dd6","owner()":"8da5cb5b","pubkeyRegistrationMessageHash(address)":"3c2a7f4c","quorumCount()":"9aa1653d","quorumUpdateBlockNumber(uint8)":"249a0c42","registries(uint256)":"6347c900","stakeRegistry()":"68304835"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"prevChurnApprover\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newChurnApprover\",\"type\":\"address\"}],\"name\":\"ChurnApproverUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"prevEjector\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newEjector\",\"type\":\"address\"}],\"name\":\"EjectorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"}],\"name\":\"OperatorDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"}],\"name\":\"OperatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"maxOperatorCount\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"kickBIPsOfOperatorStake\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"kickBIPsOfTotalStake\",\"type\":\"uint16\"}],\"indexed\":false,\"internalType\":\"struct IRegistryCoordinator.OperatorSetParam\",\"name\":\"operatorSetParams\",\"type\":\"tuple\"}],\"name\":\"OperatorSetParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"blocknumber\",\"type\":\"uint256\"}],\"name\":\"QuorumBlockNumberUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"blsApkRegistry\",\"outputs\":[{\"internalType\":\"contract IBLSApkRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"}],\"name\":\"ejectOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"}],\"name\":\"getCurrentQuorumBitmap\",\"outputs\":[{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"getOperator\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"enum IRegistryCoordinator.OperatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"internalType\":\"struct IRegistryCoordinator.OperatorInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"}],\"name\":\"getOperatorFromId\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"getOperatorId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getOperatorSetParams\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"maxOperatorCount\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"kickBIPsOfOperatorStake\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"kickBIPsOfTotalStake\",\"type\":\"uint16\"}],\"internalType\":\"struct IRegistryCoordinator.OperatorSetParam\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"getOperatorStatus\",\"outputs\":[{\"internalType\":\"enum IRegistryCoordinator.OperatorStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getQuorumBitmapAtBlockNumberByIndex\",\"outputs\":[{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"}],\"name\":\"getQuorumBitmapHistoryLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32[]\",\"name\":\"operatorIds\",\"type\":\"bytes32[]\"}],\"name\":\"getQuorumBitmapIndicesAtBlockNumber\",\"outputs\":[{\"internalType\":\"uint32[]\",\"name\":\"\",\"type\":\"uint32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getQuorumBitmapUpdateByIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"updateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"nextUpdateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint192\",\"name\":\"quorumBitmap\",\"type\":\"uint192\"}],\"internalType\":\"struct IRegistryCoordinator.QuorumBitmapUpdate\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"indexRegistry\",\"outputs\":[{\"internalType\":\"contract IIndexRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"numRegistries\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"pubkeyRegistrationMessageHash\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"X\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"Y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumCount\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"quorumUpdateBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"registries\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakeRegistry\",\"outputs\":[{\"internalType\":\"contract IStakeRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Layr Labs, Inc.\",\"kind\":\"dev\",\"methods\":{\"ejectOperator(address,bytes)\":{\"params\":{\"operator\":\"is the operator to eject\",\"quorumNumbers\":\"are the quorum numbers to eject the operator from\"}},\"getQuorumBitmapAtBlockNumberByIndex(bytes32,uint32,uint256)\":{\"details\":\"reverts if `index` is incorrect \"},\"pubkeyRegistrationMessageHash(address)\":{\"params\":{\"operator\":\"is the address of the operator registering their BLS public key\"}}},\"title\":\"Interface for a contract that coordinates between various registries for an AVS.\",\"version\":1},\"userdoc\":{\"events\":{\"OperatorDeregistered(address,bytes32)\":{\"notice\":\"Emits when an operator is deregistered\"},\"OperatorRegistered(address,bytes32)\":{\"notice\":\"Emits when an operator is registered\"},\"QuorumBlockNumberUpdated(uint8,uint256)\":{\"notice\":\"emitted when all the operators for a quorum are updated at once\"}},\"kind\":\"user\",\"methods\":{\"blsApkRegistry()\":{\"notice\":\"the BLS Aggregate Pubkey Registry contract that will keep track of operators' BLS aggregate pubkeys per quorum\"},\"ejectOperator(address,bytes)\":{\"notice\":\"Ejects the provided operator from the provided quorums from the AVS\"},\"getCurrentQuorumBitmap(bytes32)\":{\"notice\":\"Returns the current quorum bitmap for the given `operatorId`\"},\"getOperator(address)\":{\"notice\":\"Returns the operator struct for the given `operator`\"},\"getOperatorFromId(bytes32)\":{\"notice\":\"Returns the operator address for the given `operatorId`\"},\"getOperatorId(address)\":{\"notice\":\"Returns the operatorId for the given `operator`\"},\"getOperatorSetParams(uint8)\":{\"notice\":\"Returns the operator set params for the given `quorumNumber`\"},\"getOperatorStatus(address)\":{\"notice\":\"Returns the status for the given `operator`\"},\"getQuorumBitmapAtBlockNumberByIndex(bytes32,uint32,uint256)\":{\"notice\":\"Returns the quorum bitmap for the given `operatorId` at the given `blockNumber` via the `index`\"},\"getQuorumBitmapHistoryLength(bytes32)\":{\"notice\":\"Returns the length of the quorum bitmap history for the given `operatorId`\"},\"getQuorumBitmapIndicesAtBlockNumber(uint32,bytes32[])\":{\"notice\":\"Returns the indices of the quorumBitmaps for the provided `operatorIds` at the given `blockNumber`\"},\"getQuorumBitmapUpdateByIndex(bytes32,uint256)\":{\"notice\":\"Returns the `index`th entry in the operator with `operatorId`'s bitmap history\"},\"indexRegistry()\":{\"notice\":\"the index Registry contract that will keep track of operators' indexes\"},\"numRegistries()\":{\"notice\":\"Returns the number of registries\"},\"owner()\":{\"notice\":\"The owner of the registry coordinator\"},\"pubkeyRegistrationMessageHash(address)\":{\"notice\":\"Returns the message hash that an operator must sign to register their BLS public key.\"},\"quorumCount()\":{\"notice\":\"Returns the number of quorums the registry coordinator has created\"},\"quorumUpdateBlockNumber(uint8)\":{\"notice\":\"returns the blocknumber the quorum was last updated all at once for all operators\"},\"registries(uint256)\":{\"notice\":\"Returns the registry at the desired index\"},\"stakeRegistry()\":{\"notice\":\"the Stake registry contract that will keep track of operators' stakes\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol\":\"IRegistryCoordinator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/\",\":eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/\",\":eigenlayer-middleware/=lib/eigenlayer-middleware/src/\",\":eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/\",\":erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/\"]},\"sources\":{\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol\":{\"keccak256\":\"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983\",\"dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol\":{\"keccak256\":\"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914\",\"dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol\":{\"keccak256\":\"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c\",\"license\":\"CC0-1.0\",\"urls\":[\"bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91\",\"dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol\":{\"keccak256\":\"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc\",\"dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol\":{\"keccak256\":\"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8\",\"dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol\":{\"keccak256\":\"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324\",\"dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol\":{\"keccak256\":\"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d\",\"dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol\":{\"keccak256\":\"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c\",\"dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol\":{\"keccak256\":\"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232\",\"dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol\":{\"keccak256\":\"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73\",\"dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol\":{\"keccak256\":\"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef\",\"dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol\":{\"keccak256\":\"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7\",\"dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol\":{\"keccak256\":\"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f\",\"dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol\":{\"keccak256\":\"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f\",\"dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/eigenlayer-middleware/src/interfaces/IBLSApkRegistry.sol\":{\"keccak256\":\"0xc07a5edfd95ab4f16f16a8dc8e76eadf4b0e90fe49db90540d01daaad86898c5\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://52b53266450a53da641e82d8ae3be93c5e09f8342b4ea0cc96bb9038d8406354\",\"dweb:/ipfs/QmVuoiQyqPTLCGnyt8zDaxiyaj4ETdgTGKv4MDHWzqEDjp\"]},\"lib/eigenlayer-middleware/src/interfaces/IIndexRegistry.sol\":{\"keccak256\":\"0x83b2d56aacf27e65c4959a832c5de573e013908c044f6e48ea8284ac5282ae2b\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://877af382587e96bb39bcc6db8bb5e4b871db5025c52347d4bee9afeaa4a6cc8d\",\"dweb:/ipfs/QmdnhsQCChzq2o5NgbeT3JxSsEcMm1PC9QW6zenZNPjD9F\"]},\"lib/eigenlayer-middleware/src/interfaces/IRegistry.sol\":{\"keccak256\":\"0x51426a17fb7e54bd3720e2890104e97a8559a13ff248b3d6b840916751c143d3\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://01f91289e6100d528cb8b318cb14ff22a0bc52882c9d4db41585e030cc9ddc25\",\"dweb:/ipfs/Qmb22nqGrsrtNovHRwbMCvDHGENuxAgrWu3Db4p7Er2MHY\"]},\"lib/eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol\":{\"keccak256\":\"0xdd8effb082c1d5957d5ff43d7c59497b32866a6d82bcc7d5efa49ea9bc9b3385\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://cb33a2a1446585b13b7a509e880c60d658d2d2522ec48a9f02e30d2cff54002d\",\"dweb:/ipfs/QmVNG8ZPZkXzNEadPdTj1uBYLiZdCnYfsE5iGU6nJcJXiD\"]},\"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol\":{\"keccak256\":\"0x1b8b4d757c1b804bc4cf6fbbf8bf8f89ebdeb30a31014751fe7d01deb9d513d4\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://984bf2777b898ed187d28997f9783f5c293a1a1848e3e9aa470ce9183d454c97\",\"dweb:/ipfs/Qme3aTpBrkLu8wYHFMZbCfhXHoZ1M6SpXkeC237T9BuU5B\"]},\"lib/eigenlayer-middleware/src/libraries/BN254.sol\":{\"keccak256\":\"0xb428c8d0c3b325507a88a61a80115493eb88606ccc19ed64a31e11294ab853b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7b6fb935bfe0494e6ff970c8f30a86d5f4cf5c3e0967300c28cd383c043acae\",\"dweb:/ipfs/QmUHfFZaVjLPXhkBmcxrZhAHZaSFQDqXtrLGpjGBQBa5Ki\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.12+commit.f00d7308"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"prevChurnApprover","type":"address","indexed":false},{"internalType":"address","name":"newChurnApprover","type":"address","indexed":false}],"type":"event","name":"ChurnApproverUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"prevEjector","type":"address","indexed":false},{"internalType":"address","name":"newEjector","type":"address","indexed":false}],"type":"event","name":"EjectorUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bytes32","name":"operatorId","type":"bytes32","indexed":true}],"type":"event","name":"OperatorDeregistered","anonymous":false},{"inputs":[{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bytes32","name":"operatorId","type":"bytes32","indexed":true}],"type":"event","name":"OperatorRegistered","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"struct IRegistryCoordinator.OperatorSetParam","name":"operatorSetParams","type":"tuple","components":[{"internalType":"uint32","name":"maxOperatorCount","type":"uint32"},{"internalType":"uint16","name":"kickBIPsOfOperatorStake","type":"uint16"},{"internalType":"uint16","name":"kickBIPsOfTotalStake","type":"uint16"}],"indexed":false}],"type":"event","name":"OperatorSetParamsUpdated","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"uint256","name":"blocknumber","type":"uint256","indexed":false}],"type":"event","name":"QuorumBlockNumberUpdated","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"blsApkRegistry","outputs":[{"internalType":"contract IBLSApkRegistry","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"ejectOperator"},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getCurrentQuorumBitmap","outputs":[{"internalType":"uint192","name":"","type":"uint192"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"getOperator","outputs":[{"internalType":"struct IRegistryCoordinator.OperatorInfo","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"enum IRegistryCoordinator.OperatorStatus","name":"status","type":"uint8"}]}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getOperatorFromId","outputs":[{"internalType":"address","name":"operator","type":"address"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"getOperatorId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getOperatorSetParams","outputs":[{"internalType":"struct IRegistryCoordinator.OperatorSetParam","name":"","type":"tuple","components":[{"internalType":"uint32","name":"maxOperatorCount","type":"uint32"},{"internalType":"uint16","name":"kickBIPsOfOperatorStake","type":"uint16"},{"internalType":"uint16","name":"kickBIPsOfTotalStake","type":"uint16"}]}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"getOperatorStatus","outputs":[{"internalType":"enum IRegistryCoordinator.OperatorStatus","name":"","type":"uint8"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getQuorumBitmapAtBlockNumberByIndex","outputs":[{"internalType":"uint192","name":"","type":"uint192"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getQuorumBitmapHistoryLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"bytes32[]","name":"operatorIds","type":"bytes32[]"}],"stateMutability":"view","type":"function","name":"getQuorumBitmapIndicesAtBlockNumber","outputs":[{"internalType":"uint32[]","name":"","type":"uint32[]"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getQuorumBitmapUpdateByIndex","outputs":[{"internalType":"struct IRegistryCoordinator.QuorumBitmapUpdate","name":"","type":"tuple","components":[{"internalType":"uint32","name":"updateBlockNumber","type":"uint32"},{"internalType":"uint32","name":"nextUpdateBlockNumber","type":"uint32"},{"internalType":"uint192","name":"quorumBitmap","type":"uint192"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"indexRegistry","outputs":[{"internalType":"contract IIndexRegistry","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"numRegistries","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"pubkeyRegistrationMessageHash","outputs":[{"internalType":"struct BN254.G1Point","name":"","type":"tuple","components":[{"internalType":"uint256","name":"X","type":"uint256"},{"internalType":"uint256","name":"Y","type":"uint256"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"quorumCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"quorumUpdateBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"registries","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"stakeRegistry","outputs":[{"internalType":"contract IStakeRegistry","name":"","type":"address"}]}],"devdoc":{"kind":"dev","methods":{"ejectOperator(address,bytes)":{"params":{"operator":"is the operator to eject","quorumNumbers":"are the quorum numbers to eject the operator from"}},"getQuorumBitmapAtBlockNumberByIndex(bytes32,uint32,uint256)":{"details":"reverts if `index` is incorrect "},"pubkeyRegistrationMessageHash(address)":{"params":{"operator":"is the address of the operator registering their BLS public key"}}},"version":1},"userdoc":{"kind":"user","methods":{"blsApkRegistry()":{"notice":"the BLS Aggregate Pubkey Registry contract that will keep track of operators' BLS aggregate pubkeys per quorum"},"ejectOperator(address,bytes)":{"notice":"Ejects the provided operator from the provided quorums from the AVS"},"getCurrentQuorumBitmap(bytes32)":{"notice":"Returns the current quorum bitmap for the given `operatorId`"},"getOperator(address)":{"notice":"Returns the operator struct for the given `operator`"},"getOperatorFromId(bytes32)":{"notice":"Returns the operator address for the given `operatorId`"},"getOperatorId(address)":{"notice":"Returns the operatorId for the given `operator`"},"getOperatorSetParams(uint8)":{"notice":"Returns the operator set params for the given `quorumNumber`"},"getOperatorStatus(address)":{"notice":"Returns the status for the given `operator`"},"getQuorumBitmapAtBlockNumberByIndex(bytes32,uint32,uint256)":{"notice":"Returns the quorum bitmap for the given `operatorId` at the given `blockNumber` via the `index`"},"getQuorumBitmapHistoryLength(bytes32)":{"notice":"Returns the length of the quorum bitmap history for the given `operatorId`"},"getQuorumBitmapIndicesAtBlockNumber(uint32,bytes32[])":{"notice":"Returns the indices of the quorumBitmaps for the provided `operatorIds` at the given `blockNumber`"},"getQuorumBitmapUpdateByIndex(bytes32,uint256)":{"notice":"Returns the `index`th entry in the operator with `operatorId`'s bitmap history"},"indexRegistry()":{"notice":"the index Registry contract that will keep track of operators' indexes"},"numRegistries()":{"notice":"Returns the number of registries"},"owner()":{"notice":"The owner of the registry coordinator"},"pubkeyRegistrationMessageHash(address)":{"notice":"Returns the message hash that an operator must sign to register their BLS public key."},"quorumCount()":{"notice":"Returns the number of quorums the registry coordinator has created"},"quorumUpdateBlockNumber(uint8)":{"notice":"returns the blocknumber the quorum was last updated all at once for all operators"},"registries(uint256)":{"notice":"Returns the registry at the desired index"},"stakeRegistry()":{"notice":"the Stake registry contract that will keep track of operators' stakes"}},"version":1}},"settings":{"remappings":["@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/","eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/","eigenlayer-middleware/=lib/eigenlayer-middleware/src/","eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/","erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol":"IRegistryCoordinator"},"evmVersion":"london","libraries":{}},"sources":{"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol":{"keccak256":"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00","urls":["bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983","dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol":{"keccak256":"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9","urls":["bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914","dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol":{"keccak256":"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c","urls":["bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91","dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz"],"license":"CC0-1.0"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol":{"keccak256":"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba","urls":["bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc","dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol":{"keccak256":"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c","urls":["bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8","dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol":{"keccak256":"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f","urls":["bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324","dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol":{"keccak256":"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49","urls":["bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d","dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol":{"keccak256":"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092","urls":["bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c","dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol":{"keccak256":"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79","urls":["bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232","dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol":{"keccak256":"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420","urls":["bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73","dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol":{"keccak256":"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52","urls":["bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef","dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol":{"keccak256":"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377","urls":["bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7","dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol":{"keccak256":"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d","urls":["bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f","dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol":{"keccak256":"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71","urls":["bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f","dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61","urls":["bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354","dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/eigenlayer-middleware/src/interfaces/IBLSApkRegistry.sol":{"keccak256":"0xc07a5edfd95ab4f16f16a8dc8e76eadf4b0e90fe49db90540d01daaad86898c5","urls":["bzz-raw://52b53266450a53da641e82d8ae3be93c5e09f8342b4ea0cc96bb9038d8406354","dweb:/ipfs/QmVuoiQyqPTLCGnyt8zDaxiyaj4ETdgTGKv4MDHWzqEDjp"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IIndexRegistry.sol":{"keccak256":"0x83b2d56aacf27e65c4959a832c5de573e013908c044f6e48ea8284ac5282ae2b","urls":["bzz-raw://877af382587e96bb39bcc6db8bb5e4b871db5025c52347d4bee9afeaa4a6cc8d","dweb:/ipfs/QmdnhsQCChzq2o5NgbeT3JxSsEcMm1PC9QW6zenZNPjD9F"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IRegistry.sol":{"keccak256":"0x51426a17fb7e54bd3720e2890104e97a8559a13ff248b3d6b840916751c143d3","urls":["bzz-raw://01f91289e6100d528cb8b318cb14ff22a0bc52882c9d4db41585e030cc9ddc25","dweb:/ipfs/Qmb22nqGrsrtNovHRwbMCvDHGENuxAgrWu3Db4p7Er2MHY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol":{"keccak256":"0xdd8effb082c1d5957d5ff43d7c59497b32866a6d82bcc7d5efa49ea9bc9b3385","urls":["bzz-raw://cb33a2a1446585b13b7a509e880c60d658d2d2522ec48a9f02e30d2cff54002d","dweb:/ipfs/QmVNG8ZPZkXzNEadPdTj1uBYLiZdCnYfsE5iGU6nJcJXiD"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol":{"keccak256":"0x1b8b4d757c1b804bc4cf6fbbf8bf8f89ebdeb30a31014751fe7d01deb9d513d4","urls":["bzz-raw://984bf2777b898ed187d28997f9783f5c293a1a1848e3e9aa470ce9183d454c97","dweb:/ipfs/Qme3aTpBrkLu8wYHFMZbCfhXHoZ1M6SpXkeC237T9BuU5B"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/libraries/BN254.sol":{"keccak256":"0xb428c8d0c3b325507a88a61a80115493eb88606ccc19ed64a31e11294ab853b3","urls":["bzz-raw://d7b6fb935bfe0494e6ff970c8f30a86d5f4cf5c3e0967300c28cd383c043acae","dweb:/ipfs/QmUHfFZaVjLPXhkBmcxrZhAHZaSFQDqXtrLGpjGBQBa5Ki"],"license":"MIT"}},"version":1},"id":130} \ No newline at end of file diff --git a/telemetry_api/priv/abi/OperatorStateRetriever.json b/telemetry_api/priv/abi/OperatorStateRetriever.json new file mode 100644 index 0000000000..97c87658ac --- /dev/null +++ b/telemetry_api/priv/abi/OperatorStateRetriever.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"getBatchOperatorFromId","inputs":[{"name":"registryCoordinator","type":"address","internalType":"contract IRegistryCoordinator"},{"name":"operatorIds","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"operators","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"getBatchOperatorId","inputs":[{"name":"registryCoordinator","type":"address","internalType":"contract IRegistryCoordinator"},{"name":"operators","type":"address[]","internalType":"address[]"}],"outputs":[{"name":"operatorIds","type":"bytes32[]","internalType":"bytes32[]"}],"stateMutability":"view"},{"type":"function","name":"getCheckSignaturesIndices","inputs":[{"name":"registryCoordinator","type":"address","internalType":"contract IRegistryCoordinator"},{"name":"referenceBlockNumber","type":"uint32","internalType":"uint32"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"},{"name":"nonSignerOperatorIds","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"","type":"tuple","internalType":"struct OperatorStateRetriever.CheckSignaturesIndices","components":[{"name":"nonSignerQuorumBitmapIndices","type":"uint32[]","internalType":"uint32[]"},{"name":"quorumApkIndices","type":"uint32[]","internalType":"uint32[]"},{"name":"totalStakeIndices","type":"uint32[]","internalType":"uint32[]"},{"name":"nonSignerStakeIndices","type":"uint32[][]","internalType":"uint32[][]"}]}],"stateMutability":"view"},{"type":"function","name":"getOperatorState","inputs":[{"name":"registryCoordinator","type":"address","internalType":"contract IRegistryCoordinator"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"},{"name":"blockNumber","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"tuple[][]","internalType":"struct OperatorStateRetriever.Operator[][]","components":[{"name":"operator","type":"address","internalType":"address"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"stake","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"getOperatorState","inputs":[{"name":"registryCoordinator","type":"address","internalType":"contract IRegistryCoordinator"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"blockNumber","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"tuple[][]","internalType":"struct OperatorStateRetriever.Operator[][]","components":[{"name":"operator","type":"address","internalType":"address"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"stake","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"getQuorumBitmapsAtBlockNumber","inputs":[{"name":"registryCoordinator","type":"address","internalType":"contract IRegistryCoordinator"},{"name":"operatorIds","type":"bytes32[]","internalType":"bytes32[]"},{"name":"blockNumber","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"}],"bytecode":{"object":"0x6080604052348015600f57600080fd5b50611dcb8061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806331b36bd9146100675780633563b0d1146100905780634d2b57fe146100b05780634f739f74146100d05780635c155662146100f0578063cefdc1d414610110575b600080fd5b61007a6100753660046113b8565b610131565b60405161008791906114ac565b60405180910390f35b6100a361009e3660046114e8565b610245565b6040516100879190611653565b6100c36100be3660046116c4565b6106c5565b6040516100879190611713565b6100e36100de3660046117aa565b6107d2565b60405161008791906118ab565b6101036100fe366004611963565b610eea565b60405161008791906119c6565b61012361011e3660046119fe565b6110a8565b604051610087929190611a35565b606081516001600160401b0381111561014c5761014c61134f565b604051908082528060200260200182016040528015610175578160200160208202803683370190505b50905060005b825181101561023e57836001600160a01b03166313542a4e8483815181106101a5576101a5611a56565b60200260200101516040518263ffffffff1660e01b81526004016101d891906001600160a01b0391909116815260200190565b602060405180830381865afa1580156101f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102199190611a6c565b82828151811061022b5761022b611a56565b602090810291909101015260010161017b565b5092915050565b60606000846001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ab9190611a85565b90506000856001600160a01b0316639e9923c26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103119190611a85565b90506000866001600160a01b0316635df459466040518163ffffffff1660e01b8152600401602060405180830381865afa158015610353573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103779190611a85565b9050600086516001600160401b038111156103945761039461134f565b6040519080825280602002602001820160405280156103c757816020015b60608152602001906001900390816103b25790505b50905060005b87518110156106b95760008882815181106103ea576103ea611a56565b0160200151604051638902624560e01b815260f89190911c6004820181905263ffffffff8a16602483015291506000906001600160a01b03871690638902624590604401600060405180830381865afa15801561044b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104739190810190611aa2565b905080516001600160401b0381111561048e5761048e61134f565b6040519080825280602002602001820160405280156104d957816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816104ac5790505b508484815181106104ec576104ec611a56565b602002602001018190525060005b81518110156106ae576040518060600160405280876001600160a01b03166347b314e885858151811061052f5761052f611a56565b60200260200101516040518263ffffffff1660e01b815260040161055591815260200190565b602060405180830381865afa158015610572573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105969190611a85565b6001600160a01b031681526020018383815181106105b6576105b6611a56565b60200260200101518152602001896001600160a01b031663fa28c6278585815181106105e4576105e4611a56565b60209081029190910101516040516001600160e01b031960e084901b168152600481019190915260ff8816602482015263ffffffff8f166044820152606401602060405180830381865afa158015610640573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106649190611b37565b6001600160601b031681525085858151811061068257610682611a56565b6020026020010151828151811061069b5761069b611a56565b60209081029190910101526001016104fa565b5050506001016103cd565b50979650505050505050565b606081516001600160401b038111156106e0576106e061134f565b604051908082528060200260200182016040528015610709578160200160208202803683370190505b50905060005b825181101561023e57836001600160a01b031663296bb06484838151811061073957610739611a56565b60200260200101516040518263ffffffff1660e01b815260040161075f91815260200190565b602060405180830381865afa15801561077c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a09190611a85565b8282815181106107b2576107b2611a56565b6001600160a01b039092166020928302919091019091015260010161070f565b6107fd6040518060800160405280606081526020016060815260200160608152602001606081525090565b6000876001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa15801561083d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108619190611a85565b905061088e6040518060800160405280606081526020016060815260200160608152602001606081525090565b6040516361c8a12f60e11b81526001600160a01b038a169063c391425e906108be908b9089908990600401611b60565b600060405180830381865afa1580156108db573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109039190810190611ba7565b81526040516340e03a8160e11b81526001600160a01b038316906381c0750290610935908b908b908b90600401611c64565b600060405180830381865afa158015610952573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261097a9190810190611ba7565b6040820152856001600160401b038111156109975761099761134f565b6040519080825280602002602001820160405280156109ca57816020015b60608152602001906001900390816109b55790505b50606082015260005b60ff8116871115610dfb576000856001600160401b038111156109f8576109f861134f565b604051908082528060200260200182016040528015610a21578160200160208202803683370190505b5083606001518360ff1681518110610a3b57610a3b611a56565b602002602001018190525060005b86811015610d055760008c6001600160a01b03166304ec63518a8a85818110610a7457610a74611a56565b905060200201358e88600001518681518110610a9257610a92611a56565b60200260200101516040518463ffffffff1660e01b8152600401610acf9392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa158015610aec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b109190611c8d565b9050806001600160c01b0316600003610bbb5760405162461bcd60e51b815260206004820152605c60248201527f4f70657261746f7253746174655265747269657665722e676574436865636b5360448201527f69676e617475726573496e64696365733a206f70657261746f72206d7573742060648201527f6265207265676973746572656420617420626c6f636b6e756d62657200000000608482015260a40160405180910390fd5b8a8a8560ff16818110610bd057610bd0611a56565b60016001600160c01b038516919093013560f81c1c82169091039050610cfc57856001600160a01b031663dd9846b98a8a85818110610c1157610c11611a56565b905060200201358d8d8860ff16818110610c2d57610c2d611a56565b6040516001600160e01b031960e087901b1681526004810194909452919091013560f81c60248301525063ffffffff8f166044820152606401602060405180830381865afa158015610c83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca79190611cb6565b85606001518560ff1681518110610cc057610cc0611a56565b60200260200101518481518110610cd957610cd9611a56565b63ffffffff9092166020928302919091019091015282610cf881611ce9565b9350505b50600101610a49565b506000816001600160401b03811115610d2057610d2061134f565b604051908082528060200260200182016040528015610d49578160200160208202803683370190505b50905060005b82811015610dc05784606001518460ff1681518110610d7057610d70611a56565b60200260200101518181518110610d8957610d89611a56565b6020026020010151828281518110610da357610da3611a56565b63ffffffff90921660209283029190910190910152600101610d4f565b508084606001518460ff1681518110610ddb57610ddb611a56565b602002602001018190525050508080610df390611d02565b9150506109d3565b506000896001600160a01b0316635df459466040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e609190611a85565b60405163354952a360e21b81529091506001600160a01b0382169063d5254a8c90610e93908b908b908e90600401611d21565b600060405180830381865afa158015610eb0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed89190810190611ba7565b60208301525098975050505050505050565b60606000846001600160a01b031663c391425e84866040518363ffffffff1660e01b8152600401610f1c929190611d4b565b600060405180830381865afa158015610f39573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f619190810190611ba7565b9050600084516001600160401b03811115610f7e57610f7e61134f565b604051908082528060200260200182016040528015610fa7578160200160208202803683370190505b50905060005b855181101561109e57866001600160a01b03166304ec6351878381518110610fd757610fd7611a56565b602002602001015187868581518110610ff257610ff2611a56565b60200260200101516040518463ffffffff1660e01b815260040161102f9392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa15801561104c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110709190611c8d565b6001600160c01b031682828151811061108b5761108b611a56565b6020908102919091010152600101610fad565b5095945050505050565b60408051600180825281830190925260009160609183916020808301908036833701905050905084816000815181106110e3576110e3611a56565b60209081029190910101526040516361c8a12f60e11b81526000906001600160a01b0388169063c391425e9061111f9088908690600401611d4b565b600060405180830381865afa15801561113c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111649190810190611ba7565b60008151811061117657611176611a56565b60209081029190910101516040516304ec635160e01b81526004810188905263ffffffff87811660248301529091166044820181905291506000906001600160a01b038916906304ec635190606401602060405180830381865afa1580156111e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112069190611c8d565b6001600160c01b03169050600061121c8261123a565b90508161122a8a838a610245565b9550955050505050935093915050565b606060008061124884611306565b61ffff166001600160401b038111156112635761126361134f565b6040519080825280601f01601f19166020018201604052801561128d576020820181803683370190505b5090506000805b8251821080156112a5575061010081105b156112fc576001811b9350858416156112ec578060f81b8383815181106112ce576112ce611a56565b60200101906001600160f81b031916908160001a9053508160010191505b6112f581611ce9565b9050611294565b5090949350505050565b6000805b82156113315761131b600184611d6a565b909216918061132981611d7d565b91505061130a565b92915050565b6001600160a01b038116811461134c57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561138d5761138d61134f565b604052919050565b60006001600160401b038211156113ae576113ae61134f565b5060051b60200190565b600080604083850312156113cb57600080fd5b82356113d681611337565b915060208301356001600160401b038111156113f157600080fd5b8301601f8101851361140257600080fd5b803561141561141082611395565b611365565b8082825260208201915060208360051b85010192508783111561143757600080fd5b6020840193505b8284101561146257833561145181611337565b82526020938401939091019061143e565b809450505050509250929050565b600081518084526020840193506020830160005b828110156114a2578151865260209586019590910190600101611484565b5093949350505050565b6020815260006114bf6020830184611470565b9392505050565b63ffffffff8116811461134c57600080fd5b80356114e3816114c6565b919050565b6000806000606084860312156114fd57600080fd5b833561150881611337565b925060208401356001600160401b0381111561152357600080fd5b8401601f8101861361153457600080fd5b80356001600160401b0381111561154d5761154d61134f565b611560601f8201601f1916602001611365565b81815287602083850101111561157557600080fd5b8160208401602083013760006020838301015280945050505061159a604085016114d8565b90509250925092565b600082825180855260208501945060208160051b8301016020850160005b8381101561164757848303601f190188528151805180855260209182019185019060005b8181101561162e57835180516001600160a01b03168452602080820151818601526040918201516001600160601b031691850191909152909301926060909201916001016115e5565b50506020998a01999094509290920191506001016115c1565b50909695505050505050565b6020815260006114bf60208301846115a3565b600082601f83011261167757600080fd5b813561168561141082611395565b8082825260208201915060208360051b8601019250858311156116a757600080fd5b602085015b8381101561109e5780358352602092830192016116ac565b600080604083850312156116d757600080fd5b82356116e281611337565b915060208301356001600160401b038111156116fd57600080fd5b61170985828601611666565b9150509250929050565b602080825282518282018190526000918401906040840190835b818110156117545783516001600160a01b031683526020938401939092019160010161172d565b509095945050505050565b60008083601f84011261177157600080fd5b5081356001600160401b0381111561178857600080fd5b6020830191508360208260051b85010111156117a357600080fd5b9250929050565b600080600080600080608087890312156117c357600080fd5b86356117ce81611337565b955060208701356117de816114c6565b945060408701356001600160401b038111156117f957600080fd5b8701601f8101891361180a57600080fd5b80356001600160401b0381111561182057600080fd5b89602082840101111561183257600080fd5b6020919091019450925060608701356001600160401b0381111561185557600080fd5b61186189828a0161175f565b979a9699509497509295939492505050565b600081518084526020840193506020830160005b828110156114a257815163ffffffff16865260209586019590910190600101611887565b6020815260008251608060208401526118c760a0840182611873565b90506020840151601f198483030160408501526118e48282611873565b9150506040840151601f198483030160608501526119028282611873565b6060860151858203601f190160808701528051808352919350602090810192508084019190600582901b85010160005b828110156106b957601f1986830301845261194e828651611873565b60209586019594909401939150600101611932565b60008060006060848603121561197857600080fd5b833561198381611337565b925060208401356001600160401b0381111561199e57600080fd5b6119aa86828701611666565b92505060408401356119bb816114c6565b809150509250925092565b602080825282518282018190526000918401906040840190835b818110156117545783518352602093840193909201916001016119e0565b600080600060608486031215611a1357600080fd5b8335611a1e81611337565b92506020840135915060408401356119bb816114c6565b828152604060208201526000611a4e60408301846115a3565b949350505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611a7e57600080fd5b5051919050565b600060208284031215611a9757600080fd5b81516114bf81611337565b600060208284031215611ab457600080fd5b81516001600160401b03811115611aca57600080fd5b8201601f81018413611adb57600080fd5b8051611ae961141082611395565b8082825260208201915060208360051b850101925086831115611b0b57600080fd5b6020840193505b82841015611b2d578351825260209384019390910190611b12565b9695505050505050565b600060208284031215611b4957600080fd5b81516001600160601b03811681146114bf57600080fd5b63ffffffff84168152604060208201819052810182905260006001600160fb1b03831115611b8d57600080fd5b8260051b8085606085013791909101606001949350505050565b600060208284031215611bb957600080fd5b81516001600160401b03811115611bcf57600080fd5b8201601f81018413611be057600080fd5b8051611bee61141082611395565b8082825260208201915060208360051b850101925086831115611c1057600080fd5b6020840193505b82841015611b2d578351611c2a816114c6565b825260209384019390910190611c17565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff84168152604060208201526000611c84604083018486611c3b565b95945050505050565b600060208284031215611c9f57600080fd5b81516001600160c01b03811681146114bf57600080fd5b600060208284031215611cc857600080fd5b81516114bf816114c6565b634e487b7160e01b600052601160045260246000fd5b600060018201611cfb57611cfb611cd3565b5060010190565b600060ff821660ff8103611d1857611d18611cd3565b60010192915050565b604081526000611d35604083018587611c3b565b905063ffffffff83166020830152949350505050565b63ffffffff83168152604060208201526000611a4e6040830184611470565b8181038181111561133157611331611cd3565b600061ffff821661ffff8103611d1857611d18611cd356fea264697066735822122033585ad22b02fc74fbd447d232f18fbc94c4d2d5f8667d94aaa1ee5226d7192a64736f6c634300081b0033","sourceMap":"540:11298:117:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100625760003560e01c806331b36bd9146100675780633563b0d1146100905780634d2b57fe146100b05780634f739f74146100d05780635c155662146100f0578063cefdc1d414610110575b600080fd5b61007a6100753660046113b8565b610131565b60405161008791906114ac565b60405180910390f35b6100a361009e3660046114e8565b610245565b6040516100879190611653565b6100c36100be3660046116c4565b6106c5565b6040516100879190611713565b6100e36100de3660046117aa565b6107d2565b60405161008791906118ab565b6101036100fe366004611963565b610eea565b60405161008791906119c6565b61012361011e3660046119fe565b6110a8565b604051610087929190611a35565b606081516001600160401b0381111561014c5761014c61134f565b604051908082528060200260200182016040528015610175578160200160208202803683370190505b50905060005b825181101561023e57836001600160a01b03166313542a4e8483815181106101a5576101a5611a56565b60200260200101516040518263ffffffff1660e01b81526004016101d891906001600160a01b0391909116815260200190565b602060405180830381865afa1580156101f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102199190611a6c565b82828151811061022b5761022b611a56565b602090810291909101015260010161017b565b5092915050565b60606000846001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ab9190611a85565b90506000856001600160a01b0316639e9923c26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103119190611a85565b90506000866001600160a01b0316635df459466040518163ffffffff1660e01b8152600401602060405180830381865afa158015610353573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103779190611a85565b9050600086516001600160401b038111156103945761039461134f565b6040519080825280602002602001820160405280156103c757816020015b60608152602001906001900390816103b25790505b50905060005b87518110156106b95760008882815181106103ea576103ea611a56565b0160200151604051638902624560e01b815260f89190911c6004820181905263ffffffff8a16602483015291506000906001600160a01b03871690638902624590604401600060405180830381865afa15801561044b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104739190810190611aa2565b905080516001600160401b0381111561048e5761048e61134f565b6040519080825280602002602001820160405280156104d957816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816104ac5790505b508484815181106104ec576104ec611a56565b602002602001018190525060005b81518110156106ae576040518060600160405280876001600160a01b03166347b314e885858151811061052f5761052f611a56565b60200260200101516040518263ffffffff1660e01b815260040161055591815260200190565b602060405180830381865afa158015610572573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105969190611a85565b6001600160a01b031681526020018383815181106105b6576105b6611a56565b60200260200101518152602001896001600160a01b031663fa28c6278585815181106105e4576105e4611a56565b60209081029190910101516040516001600160e01b031960e084901b168152600481019190915260ff8816602482015263ffffffff8f166044820152606401602060405180830381865afa158015610640573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106649190611b37565b6001600160601b031681525085858151811061068257610682611a56565b6020026020010151828151811061069b5761069b611a56565b60209081029190910101526001016104fa565b5050506001016103cd565b50979650505050505050565b606081516001600160401b038111156106e0576106e061134f565b604051908082528060200260200182016040528015610709578160200160208202803683370190505b50905060005b825181101561023e57836001600160a01b031663296bb06484838151811061073957610739611a56565b60200260200101516040518263ffffffff1660e01b815260040161075f91815260200190565b602060405180830381865afa15801561077c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a09190611a85565b8282815181106107b2576107b2611a56565b6001600160a01b039092166020928302919091019091015260010161070f565b6107fd6040518060800160405280606081526020016060815260200160608152602001606081525090565b6000876001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa15801561083d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108619190611a85565b905061088e6040518060800160405280606081526020016060815260200160608152602001606081525090565b6040516361c8a12f60e11b81526001600160a01b038a169063c391425e906108be908b9089908990600401611b60565b600060405180830381865afa1580156108db573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109039190810190611ba7565b81526040516340e03a8160e11b81526001600160a01b038316906381c0750290610935908b908b908b90600401611c64565b600060405180830381865afa158015610952573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261097a9190810190611ba7565b6040820152856001600160401b038111156109975761099761134f565b6040519080825280602002602001820160405280156109ca57816020015b60608152602001906001900390816109b55790505b50606082015260005b60ff8116871115610dfb576000856001600160401b038111156109f8576109f861134f565b604051908082528060200260200182016040528015610a21578160200160208202803683370190505b5083606001518360ff1681518110610a3b57610a3b611a56565b602002602001018190525060005b86811015610d055760008c6001600160a01b03166304ec63518a8a85818110610a7457610a74611a56565b905060200201358e88600001518681518110610a9257610a92611a56565b60200260200101516040518463ffffffff1660e01b8152600401610acf9392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa158015610aec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b109190611c8d565b9050806001600160c01b0316600003610bbb5760405162461bcd60e51b815260206004820152605c60248201527f4f70657261746f7253746174655265747269657665722e676574436865636b5360448201527f69676e617475726573496e64696365733a206f70657261746f72206d7573742060648201527f6265207265676973746572656420617420626c6f636b6e756d62657200000000608482015260a40160405180910390fd5b8a8a8560ff16818110610bd057610bd0611a56565b60016001600160c01b038516919093013560f81c1c82169091039050610cfc57856001600160a01b031663dd9846b98a8a85818110610c1157610c11611a56565b905060200201358d8d8860ff16818110610c2d57610c2d611a56565b6040516001600160e01b031960e087901b1681526004810194909452919091013560f81c60248301525063ffffffff8f166044820152606401602060405180830381865afa158015610c83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca79190611cb6565b85606001518560ff1681518110610cc057610cc0611a56565b60200260200101518481518110610cd957610cd9611a56565b63ffffffff9092166020928302919091019091015282610cf881611ce9565b9350505b50600101610a49565b506000816001600160401b03811115610d2057610d2061134f565b604051908082528060200260200182016040528015610d49578160200160208202803683370190505b50905060005b82811015610dc05784606001518460ff1681518110610d7057610d70611a56565b60200260200101518181518110610d8957610d89611a56565b6020026020010151828281518110610da357610da3611a56565b63ffffffff90921660209283029190910190910152600101610d4f565b508084606001518460ff1681518110610ddb57610ddb611a56565b602002602001018190525050508080610df390611d02565b9150506109d3565b506000896001600160a01b0316635df459466040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e609190611a85565b60405163354952a360e21b81529091506001600160a01b0382169063d5254a8c90610e93908b908b908e90600401611d21565b600060405180830381865afa158015610eb0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed89190810190611ba7565b60208301525098975050505050505050565b60606000846001600160a01b031663c391425e84866040518363ffffffff1660e01b8152600401610f1c929190611d4b565b600060405180830381865afa158015610f39573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f619190810190611ba7565b9050600084516001600160401b03811115610f7e57610f7e61134f565b604051908082528060200260200182016040528015610fa7578160200160208202803683370190505b50905060005b855181101561109e57866001600160a01b03166304ec6351878381518110610fd757610fd7611a56565b602002602001015187868581518110610ff257610ff2611a56565b60200260200101516040518463ffffffff1660e01b815260040161102f9392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa15801561104c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110709190611c8d565b6001600160c01b031682828151811061108b5761108b611a56565b6020908102919091010152600101610fad565b5095945050505050565b60408051600180825281830190925260009160609183916020808301908036833701905050905084816000815181106110e3576110e3611a56565b60209081029190910101526040516361c8a12f60e11b81526000906001600160a01b0388169063c391425e9061111f9088908690600401611d4b565b600060405180830381865afa15801561113c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111649190810190611ba7565b60008151811061117657611176611a56565b60209081029190910101516040516304ec635160e01b81526004810188905263ffffffff87811660248301529091166044820181905291506000906001600160a01b038916906304ec635190606401602060405180830381865afa1580156111e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112069190611c8d565b6001600160c01b03169050600061121c8261123a565b90508161122a8a838a610245565b9550955050505050935093915050565b606060008061124884611306565b61ffff166001600160401b038111156112635761126361134f565b6040519080825280601f01601f19166020018201604052801561128d576020820181803683370190505b5090506000805b8251821080156112a5575061010081105b156112fc576001811b9350858416156112ec578060f81b8383815181106112ce576112ce611a56565b60200101906001600160f81b031916908160001a9053508160010191505b6112f581611ce9565b9050611294565b5090949350505050565b6000805b82156113315761131b600184611d6a565b909216918061132981611d7d565b91505061130a565b92915050565b6001600160a01b038116811461134c57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561138d5761138d61134f565b604052919050565b60006001600160401b038211156113ae576113ae61134f565b5060051b60200190565b600080604083850312156113cb57600080fd5b82356113d681611337565b915060208301356001600160401b038111156113f157600080fd5b8301601f8101851361140257600080fd5b803561141561141082611395565b611365565b8082825260208201915060208360051b85010192508783111561143757600080fd5b6020840193505b8284101561146257833561145181611337565b82526020938401939091019061143e565b809450505050509250929050565b600081518084526020840193506020830160005b828110156114a2578151865260209586019590910190600101611484565b5093949350505050565b6020815260006114bf6020830184611470565b9392505050565b63ffffffff8116811461134c57600080fd5b80356114e3816114c6565b919050565b6000806000606084860312156114fd57600080fd5b833561150881611337565b925060208401356001600160401b0381111561152357600080fd5b8401601f8101861361153457600080fd5b80356001600160401b0381111561154d5761154d61134f565b611560601f8201601f1916602001611365565b81815287602083850101111561157557600080fd5b8160208401602083013760006020838301015280945050505061159a604085016114d8565b90509250925092565b600082825180855260208501945060208160051b8301016020850160005b8381101561164757848303601f190188528151805180855260209182019185019060005b8181101561162e57835180516001600160a01b03168452602080820151818601526040918201516001600160601b031691850191909152909301926060909201916001016115e5565b50506020998a01999094509290920191506001016115c1565b50909695505050505050565b6020815260006114bf60208301846115a3565b600082601f83011261167757600080fd5b813561168561141082611395565b8082825260208201915060208360051b8601019250858311156116a757600080fd5b602085015b8381101561109e5780358352602092830192016116ac565b600080604083850312156116d757600080fd5b82356116e281611337565b915060208301356001600160401b038111156116fd57600080fd5b61170985828601611666565b9150509250929050565b602080825282518282018190526000918401906040840190835b818110156117545783516001600160a01b031683526020938401939092019160010161172d565b509095945050505050565b60008083601f84011261177157600080fd5b5081356001600160401b0381111561178857600080fd5b6020830191508360208260051b85010111156117a357600080fd5b9250929050565b600080600080600080608087890312156117c357600080fd5b86356117ce81611337565b955060208701356117de816114c6565b945060408701356001600160401b038111156117f957600080fd5b8701601f8101891361180a57600080fd5b80356001600160401b0381111561182057600080fd5b89602082840101111561183257600080fd5b6020919091019450925060608701356001600160401b0381111561185557600080fd5b61186189828a0161175f565b979a9699509497509295939492505050565b600081518084526020840193506020830160005b828110156114a257815163ffffffff16865260209586019590910190600101611887565b6020815260008251608060208401526118c760a0840182611873565b90506020840151601f198483030160408501526118e48282611873565b9150506040840151601f198483030160608501526119028282611873565b6060860151858203601f190160808701528051808352919350602090810192508084019190600582901b85010160005b828110156106b957601f1986830301845261194e828651611873565b60209586019594909401939150600101611932565b60008060006060848603121561197857600080fd5b833561198381611337565b925060208401356001600160401b0381111561199e57600080fd5b6119aa86828701611666565b92505060408401356119bb816114c6565b809150509250925092565b602080825282518282018190526000918401906040840190835b818110156117545783518352602093840193909201916001016119e0565b600080600060608486031215611a1357600080fd5b8335611a1e81611337565b92506020840135915060408401356119bb816114c6565b828152604060208201526000611a4e60408301846115a3565b949350505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611a7e57600080fd5b5051919050565b600060208284031215611a9757600080fd5b81516114bf81611337565b600060208284031215611ab457600080fd5b81516001600160401b03811115611aca57600080fd5b8201601f81018413611adb57600080fd5b8051611ae961141082611395565b8082825260208201915060208360051b850101925086831115611b0b57600080fd5b6020840193505b82841015611b2d578351825260209384019390910190611b12565b9695505050505050565b600060208284031215611b4957600080fd5b81516001600160601b03811681146114bf57600080fd5b63ffffffff84168152604060208201819052810182905260006001600160fb1b03831115611b8d57600080fd5b8260051b8085606085013791909101606001949350505050565b600060208284031215611bb957600080fd5b81516001600160401b03811115611bcf57600080fd5b8201601f81018413611be057600080fd5b8051611bee61141082611395565b8082825260208201915060208360051b850101925086831115611c1057600080fd5b6020840193505b82841015611b2d578351611c2a816114c6565b825260209384019390910190611c17565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff84168152604060208201526000611c84604083018486611c3b565b95945050505050565b600060208284031215611c9f57600080fd5b81516001600160c01b03811681146114bf57600080fd5b600060208284031215611cc857600080fd5b81516114bf816114c6565b634e487b7160e01b600052601160045260246000fd5b600060018201611cfb57611cfb611cd3565b5060010190565b600060ff821660ff8103611d1857611d18611cd3565b60010192915050565b604081526000611d35604083018587611c3b565b905063ffffffff83166020830152949350505050565b63ffffffff83168152604060208201526000611a4e6040830184611470565b8181038181111561133157611331611cd3565b600061ffff821661ffff8103611d1857611d18611cd356fea264697066735822122033585ad22b02fc74fbd447d232f18fbc94c4d2d5f8667d94aaa1ee5226d7192a64736f6c634300081b0033","sourceMap":"540:11298:117:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10650:380;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3037:1255;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11441:390::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5476:3709::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9602:654::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1757:712::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;10650:380::-;10793:28;10861:9;:16;-1:-1:-1;;;;;10847:31:117;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10847:31:117;;10833:45;;10893:9;10888:136;10912:9;:16;10908:1;:20;10888:136;;;10966:19;-1:-1:-1;;;;;10966:33:117;;11000:9;11010:1;11000:12;;;;;;;;:::i;:::-;;;;;;;10966:47;;;;;;;;;;;;;;-1:-1:-1;;;;;13640:32:197;;;;13622:51;;13610:2;13595:18;;13476:203;10966:47:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10949:11;10961:1;10949:14;;;;;;;;:::i;:::-;;;;;;;;;;:64;10930:3;;10888:136;;;;10650:380;;;;:::o;3037:1255::-;3205:19;3236:28;3267:19;-1:-1:-1;;;;;3267:33:117;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3236:66;;3312:28;3343:19;-1:-1:-1;;;;;3343:33:117;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3312:66;;3388:30;3421:19;-1:-1:-1;;;;;3421:34:117;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3388:69;;3468:29;3517:13;:20;-1:-1:-1;;;;;3500:38:117;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3468:70;;3553:9;3548:699;3572:13;:20;3568:1;:24;3548:699;;;3613:18;3640:13;3654:1;3640:16;;;;;;;;:::i;:::-;;;;;3702:69;;-1:-1:-1;;;3702:69:117;;3640:16;;;;;3702:69;;;14994:36:197;;;15078:10;15066:23;;15046:18;;;15039:51;3640:16:117;-1:-1:-1;;;;;;;;3702:42:117;;;;;14967:18:197;;3702:69:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3702:69:117;;;;;;;;;;;;:::i;:::-;3671:100;;3815:11;:18;-1:-1:-1;;;;;3800:34:117;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;3800:34:117;;-1:-1:-1;;3800:34:117;;;;;;;;;;;;3785:9;3795:1;3785:12;;;;;;;;:::i;:::-;;;;;;:49;;;;3853:9;3848:389;3872:11;:18;3868:1;:22;3848:389;;;3933:289;;;;;;;;3974:14;-1:-1:-1;;;;;3974:40:117;;4015:11;4027:1;4015:14;;;;;;;;:::i;:::-;;;;;;;3974:56;;;;;;;;;;;;;16182:25:197;;16170:2;16155:18;;16036:177;3974:56:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3933:289:117;;;;;4072:11;4084:1;4072:14;;;;;;;;:::i;:::-;;;;;;;3933:289;;;;4116:13;-1:-1:-1;;;;;4116:35:117;;4160:11;4172:1;4160:14;;;;;;;;:::i;:::-;;;;;;;;;;;4116:87;;-1:-1:-1;;;;;;4116:87:117;;;;;;;;;;16692:25:197;;;;16765:4;16753:17;;16733:18;;;16726:45;4116:87:117;16807:23:197;;16787:18;;;16780:51;16665:18;;4116:87:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3933:289:117;;;;3915:9;3925:1;3915:12;;;;;;;;:::i;:::-;;;;;;;3928:1;3915:15;;;;;;;;:::i;:::-;;;;;;;;;;:307;3892:3;;3848:389;;;-1:-1:-1;;;3594:3:117;;3548:699;;;-1:-1:-1;4276:9:117;3037:1255;-1:-1:-1;;;;;;;3037:1255:117:o;11441:390::-;11590:26;11654:11;:18;-1:-1:-1;;;;;11640:33:117;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11640:33:117;;11628:45;;11688:9;11683:142;11707:11;:18;11703:1;:22;11683:142;;;11761:19;-1:-1:-1;;;;;11761:37:117;;11799:11;11811:1;11799:14;;;;;;;;:::i;:::-;;;;;;;11761:53;;;;;;;;;;;;;16182:25:197;;16170:2;16155:18;;16036:177;11761:53:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11746:9;11756:1;11746:12;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11746:68:117;;;:12;;;;;;;;;;;:68;11727:3;;11683:142;;5476:3709;5716:29;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5716:29:117;5757:28;5788:19;-1:-1:-1;;;;;5788:33:117;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5757:66;;5833:52;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5833:52:117;6065:99;;-1:-1:-1;;;6065:99:117;;-1:-1:-1;;;;;6065:55:117;;;;;:99;;6121:20;;6143;;;;6065:99;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6065:99:117;;;;;;;;;;;;:::i;:::-;6011:153;;6322:84;;-1:-1:-1;;;6322:84:117;;-1:-1:-1;;;;;6322:47:117;;;;;:84;;6370:20;;6392:13;;;;6322:84;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6322:84:117;;;;;;;;;;;;:::i;:::-;6279:40;;;:127;6487:13;-1:-1:-1;;;;;6472:36:117;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6425:44:117;;;:83;6523:23;6518:2307;6552:40;;;;-1:-1:-1;6518:2307:117;;;6629:30;6883:20;-1:-1:-1;;;;;6870:41:117;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6870:41:117;;6804:22;:44;;;6849:17;6804:63;;;;;;;;;;:::i;:::-;;;;;;:107;;;;6931:6;6926:1405;6943:31;;;6926:1405;;;7091:29;7144:19;-1:-1:-1;;;;;7144:55:117;;7225:20;;7246:1;7225:23;;;;;;;:::i;:::-;;;;;;;7275:20;7322:22;:51;;;7374:1;7322:54;;;;;;;;:::i;:::-;;;;;;;7144:254;;;;;;;;;;;;;;;;19436:25:197;;;19509:10;19497:23;;;19492:2;19477:18;;19470:51;19557:23;19552:2;19537:18;;19530:51;19424:2;19409:18;;19237:350;7144:254:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7091:307;;7441:21;-1:-1:-1;;;;;7441:26:117;7466:1;7441:26;7433:131;;;;-1:-1:-1;;;7433:131:117;;20089:2:197;7433:131:117;;;20071:21:197;20128:2;20108:18;;;20101:30;20167:34;20147:18;;;20140:62;20238:34;20218:18;;;20211:62;20310:30;20289:19;;;20282:59;20358:19;;7433:131:117;;;;;;;;7750:13;;7764:17;7750:32;;;;;;;;;:::i;:::-;7787:1;-1:-1:-1;;;;;7719:64:117;;7750:32;;;;;;;7719:64;7718:70;;:75;;;;-1:-1:-1;7714:603:117;;8024:13;-1:-1:-1;;;;;8024:46:117;;8096:20;;8117:1;8096:23;;;;;;;:::i;:::-;;;;;;;8151:13;;8165:17;8151:32;;;;;;;;;:::i;:::-;8024:228;;-1:-1:-1;;;;;;8024:228:117;;;;;;;;;;16692:25:197;;;;8151:32:117;;;;;;;16733:18:197;;;16726:45;-1:-1:-1;8024:228:117;16807:23:197;;16787:18;;;16780:51;16665:18;;8024:228:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7934:22;:44;;;7979:17;7934:63;;;;;;;;;;:::i;:::-;;;;;;;7998:22;7934:87;;;;;;;;:::i;:::-;:318;;;;:87;;;;;;;;;;;:318;8274:24;;;;:::i;:::-;;;;7714:603;-1:-1:-1;6976:3:117;;6926:1405;;;;8421:46;8483:22;-1:-1:-1;;;;;8470:36:117;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8470:36:117;;8421:85;;8525:6;8520:185;8541:22;8537:1;:26;8520:185;;;8624:22;:44;;;8669:17;8624:63;;;;;;;;;;:::i;:::-;;;;;;;8688:1;8624:66;;;;;;;;:::i;:::-;;;;;;;8588:30;8619:1;8588:33;;;;;;;;:::i;:::-;:102;;;;:33;;;;;;;;;;;:102;8565:3;;8520:185;;;;8784:30;8718:22;:44;;;8763:17;8718:63;;;;;;;;;;:::i;:::-;;;;;;:96;;;;6615:2210;;6594:19;;;;;:::i;:::-;;;;6518:2307;;;;8835:30;8868:19;-1:-1:-1;;;;;8868:34:117;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9060:78;;-1:-1:-1;;;9060:78:117;;8835:69;;-1:-1:-1;;;;;;9060:41:117;;;;;:78;;9102:13;;;;9117:20;;9060:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9060:78:117;;;;;;;;;;;;:::i;:::-;9018:39;;;:120;-1:-1:-1;9018:39:117;5476:3709;-1:-1:-1;;;;;;;;5476:3709:117:o;9602:654::-;9786:16;9814:35;9852:19;-1:-1:-1;;;;;9852:55:117;;9908:11;9921;9852:81;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9852:81:117;;;;;;;;;;;;:::i;:::-;9814:119;;9943:30;9990:11;:18;-1:-1:-1;;;;;9976:33:117;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9976:33:117;;9943:66;;10024:9;10019:201;10043:11;:18;10039:1;:22;10019:201;;;10101:19;-1:-1:-1;;;;;10101:55:117;;10157:11;10169:1;10157:14;;;;;;;;:::i;:::-;;;;;;;10173:11;10186:19;10206:1;10186:22;;;;;;;;:::i;:::-;;;;;;;10101:108;;;;;;;;;;;;;;;;19436:25:197;;;19509:10;19497:23;;;19492:2;19477:18;;19470:51;19557:23;19552:2;19537:18;;19530:51;19424:2;19409:18;;19237:350;10101:108:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10082:127:117;:13;10096:1;10082:16;;;;;;;;:::i;:::-;;;;;;;;;;:127;10063:3;;10019:201;;;-1:-1:-1;10236:13:117;9602:654;-1:-1:-1;;;;;9602:654:117:o;1757:712::-;1991:16;;;2005:1;1991:16;;;;;;;;;1920:7;;1929:19;;1920:7;;1991:16;;;;;;;;;;;-1:-1:-1;1991:16:117;1960:47;;2034:10;2017:11;2029:1;2017:14;;;;;;;;:::i;:::-;;;;;;;;;;:27;2070:81;;-1:-1:-1;;;2070:81:117;;2054:13;;-1:-1:-1;;;;;2070:55:117;;;;;:81;;2126:11;;2139;;2070:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2070:81:117;;;;;;;;;;;;:::i;:::-;2152:1;2070:84;;;;;;;;:::i;:::-;;;;;;;;;;;2192:87;;-1:-1:-1;;;2192:87:117;;;;;21982:25:197;;;2054:100:117;22043:23:197;;;22023:18;;;22016:51;2054:100:117;;;22083:18:197;;;22076:34;;;2054:100:117;-1:-1:-1;2169:20:117;;-1:-1:-1;;;;;2192:55:117;;;;;21955:18:197;;2192:87:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2169:110:117;;;2290:26;2319:44;2350:12;2319:30;:44::i;:::-;2290:73;;2382:12;2396:65;2413:19;2434:13;2449:11;2396:16;:65::i;:::-;2374:88;;;;;;;;1757:712;;;;;;:::o;5465:1257:136:-;5532:12;5650:15;5728:23;5764:20;5777:6;5764:12;:20::i;:::-;5754:31;;-1:-1:-1;;;;;5754:31:136;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5754:31:136;;5728:57;;5841:18;6093:9;6088:601;6122:10;:17;6109:10;:30;6108:45;;;;;6149:3;6145:1;:7;6108:45;6088:601;;;6252:1;:6;;;-1:-1:-1;6339:16:136;;;:21;6335:344;;6524:1;6511:16;;6486:10;6497;6486:22;;;;;;;;:::i;:::-;;;;:41;-1:-1:-1;;;;;6486:41:136;;;;;;;;;6650:12;;;;;6335:344;6155:3;;;:::i;:::-;;;6088:601;;;-1:-1:-1;6705:10:136;;5465:1257;-1:-1:-1;;;;5465:1257:136:o;6797:406::-;6853:6;;6897:209;6904:5;;6897:209;;6931:5;6935:1;6931;:5;:::i;:::-;6925:12;;;;7020:7;;;;:::i;:::-;;;;6897:209;;;7122:5;6797:406;-1:-1:-1;;6797:406:136:o;14:153:197:-;-1:-1:-1;;;;;111:31:197;;101:42;;91:70;;157:1;154;147:12;91:70;14:153;:::o;172:127::-;233:10;228:3;224:20;221:1;214:31;264:4;261:1;254:15;288:4;285:1;278:15;304:275;375:2;369:9;440:2;421:13;;-1:-1:-1;;417:27:197;405:40;;-1:-1:-1;;;;;460:34:197;;496:22;;;457:62;454:88;;;522:18;;:::i;:::-;558:2;551:22;304:275;;-1:-1:-1;304:275:197:o;584:183::-;644:4;-1:-1:-1;;;;;669:6:197;666:30;663:56;;;699:18;;:::i;:::-;-1:-1:-1;744:1:197;740:14;756:4;736:25;;584:183::o;772:1176::-;895:6;903;956:2;944:9;935:7;931:23;927:32;924:52;;;972:1;969;962:12;924:52;1011:9;998:23;1030:53;1077:5;1030:53;:::i;:::-;1102:5;-1:-1:-1;1158:2:197;1143:18;;1130:32;-1:-1:-1;;;;;1174:30:197;;1171:50;;;1217:1;1214;1207:12;1171:50;1240:22;;1293:4;1285:13;;1281:27;-1:-1:-1;1271:55:197;;1322:1;1319;1312:12;1271:55;1362:2;1349:16;1385:64;1401:47;1441:6;1401:47;:::i;:::-;1385:64;:::i;:::-;1471:3;1495:6;1490:3;1483:19;1527:2;1522:3;1518:12;1511:19;;1582:2;1572:6;1569:1;1565:14;1561:2;1557:23;1553:32;1539:46;;1608:7;1600:6;1597:19;1594:39;;;1629:1;1626;1619:12;1594:39;1661:2;1657;1653:11;1642:22;;1673:245;1689:6;1684:3;1681:15;1673:245;;;1771:3;1758:17;1788:55;1835:7;1788:55;:::i;:::-;1856:20;;1905:2;1706:12;;;;1896;;;;1673:245;;;1937:5;1927:15;;;;;;772:1176;;;;;:::o;1953:420::-;2006:3;2044:5;2038:12;2071:6;2066:3;2059:19;2103:4;2098:3;2094:14;2087:21;;2142:4;2135:5;2131:16;2165:1;2175:173;2189:6;2186:1;2183:13;2175:173;;;2250:13;;2238:26;;2293:4;2284:14;;;;2321:17;;;;2211:1;2204:9;2175:173;;;-1:-1:-1;2364:3:197;;1953:420;-1:-1:-1;;;;1953:420:197:o;2378:261::-;2557:2;2546:9;2539:21;2520:4;2577:56;2629:2;2618:9;2614:18;2606:6;2577:56;:::i;:::-;2569:64;2378:261;-1:-1:-1;;;2378:261:197:o;2644:121::-;2729:10;2722:5;2718:22;2711:5;2708:33;2698:61;;2755:1;2752;2745:12;2770:132;2837:20;;2866:30;2837:20;2866:30;:::i;:::-;2770:132;;;:::o;2907:1024::-;3022:6;3030;3038;3091:2;3079:9;3070:7;3066:23;3062:32;3059:52;;;3107:1;3104;3097:12;3059:52;3146:9;3133:23;3165:53;3212:5;3165:53;:::i;:::-;3237:5;-1:-1:-1;3293:2:197;3278:18;;3265:32;-1:-1:-1;;;;;3309:30:197;;3306:50;;;3352:1;3349;3342:12;3306:50;3375:22;;3428:4;3420:13;;3416:27;-1:-1:-1;3406:55:197;;3457:1;3454;3447:12;3406:55;3497:2;3484:16;-1:-1:-1;;;;;3515:6:197;3512:30;3509:56;;;3545:18;;:::i;:::-;3587:57;3634:2;3611:17;;-1:-1:-1;;3607:31:197;3640:2;3603:40;3587:57;:::i;:::-;3667:6;3660:5;3653:21;3715:7;3710:2;3701:6;3697:2;3693:15;3689:24;3686:37;3683:57;;;3736:1;3733;3726:12;3683:57;3791:6;3786:2;3782;3778:11;3773:2;3766:5;3762:14;3749:49;3843:1;3838:2;3829:6;3822:5;3818:18;3814:27;3807:38;3864:5;3854:15;;;;;3888:37;3921:2;3910:9;3906:18;3888:37;:::i;:::-;3878:47;;2907:1024;;;;;:::o;3936:1255::-;4007:3;4038;4070:5;4064:12;4097:6;4092:3;4085:19;4129:4;4124:3;4120:14;4113:21;;4187:4;4177:6;4174:1;4170:14;4163:5;4159:26;4155:37;4226:4;4219:5;4215:16;4249:1;4259:906;4273:6;4270:1;4267:13;4259:906;;;4338:16;;;-1:-1:-1;;4334:30:197;4322:43;;4388:13;;4460:9;;4482:22;;;4536:4;4570:13;;;;4526:15;;;4607:1;4621:434;4637:8;4632:3;4629:17;4621:434;;;4710:15;;4760:9;;-1:-1:-1;;;;;4756:35:197;4742:50;;4848:4;4840:13;;;4834:20;4816:16;;;4809:46;4915:4;4907:13;;;4901:20;-1:-1:-1;;;;;4897:53:197;4879:16;;;4872:79;;;;5022:19;;;;4988:4;4977:16;;;;4788:1;4656:11;4621:434;;;-1:-1:-1;;5116:4:197;5141:14;;;;5076:5;;-1:-1:-1;5104:17:197;;;;;-1:-1:-1;4295:1:197;4288:9;4259:906;;;-1:-1:-1;5181:4:197;;3936:1255;-1:-1:-1;;;;;;3936:1255:197:o;5196:383::-;5479:2;5468:9;5461:21;5442:4;5499:74;5569:2;5558:9;5554:18;5546:6;5499:74;:::i;5584:723::-;5638:5;5691:3;5684:4;5676:6;5672:17;5668:27;5658:55;;5709:1;5706;5699:12;5658:55;5749:6;5736:20;5776:64;5792:47;5832:6;5792:47;:::i;5776:64::-;5864:3;5888:6;5883:3;5876:19;5920:4;5915:3;5911:14;5904:21;;5981:4;5971:6;5968:1;5964:14;5956:6;5952:27;5948:38;5934:52;;6009:3;6001:6;5998:15;5995:35;;;6026:1;6023;6016:12;5995:35;6062:4;6054:6;6050:17;6076:200;6092:6;6087:3;6084:15;6076:200;;;6184:17;;6214:18;;6261:4;6252:14;;;;6109;6076:200;;6312:535;6435:6;6443;6496:2;6484:9;6475:7;6471:23;6467:32;6464:52;;;6512:1;6509;6502:12;6464:52;6551:9;6538:23;6570:53;6617:5;6570:53;:::i;:::-;6642:5;-1:-1:-1;6698:2:197;6683:18;;6670:32;-1:-1:-1;;;;;6714:30:197;;6711:50;;;6757:1;6754;6747:12;6711:50;6780:61;6833:7;6824:6;6813:9;6809:22;6780:61;:::i;:::-;6770:71;;;6312:535;;;;;:::o;6852:637::-;7042:2;7054:21;;;7124:13;;7027:18;;;7146:22;;;6994:4;;7225:15;;;7199:2;7184:18;;;6994:4;7268:195;7282:6;7279:1;7276:13;7268:195;;;7347:13;;-1:-1:-1;;;;;7343:39:197;7331:52;;7412:2;7438:15;;;;7403:12;;;;7379:1;7297:9;7268:195;;;-1:-1:-1;7480:3:197;;6852:637;-1:-1:-1;;;;;6852:637:197:o;7494:367::-;7557:8;7567:6;7621:3;7614:4;7606:6;7602:17;7598:27;7588:55;;7639:1;7636;7629:12;7588:55;-1:-1:-1;7662:20:197;;-1:-1:-1;;;;;7694:30:197;;7691:50;;;7737:1;7734;7727:12;7691:50;7774:4;7766:6;7762:17;7750:29;;7834:3;7827:4;7817:6;7814:1;7810:14;7802:6;7798:27;7794:38;7791:47;7788:67;;;7851:1;7848;7841:12;7788:67;7494:367;;;;;:::o;7866:1244::-;8019:6;8027;8035;8043;8051;8059;8112:3;8100:9;8091:7;8087:23;8083:33;8080:53;;;8129:1;8126;8119:12;8080:53;8168:9;8155:23;8187:53;8234:5;8187:53;:::i;:::-;8259:5;-1:-1:-1;8316:2:197;8301:18;;8288:32;8329;8288;8329;:::i;:::-;8380:7;-1:-1:-1;8438:2:197;8423:18;;8410:32;-1:-1:-1;;;;;8454:30:197;;8451:50;;;8497:1;8494;8487:12;8451:50;8520:22;;8573:4;8565:13;;8561:27;-1:-1:-1;8551:55:197;;8602:1;8599;8592:12;8551:55;8642:2;8629:16;-1:-1:-1;;;;;8660:6:197;8657:30;8654:50;;;8700:1;8697;8690:12;8654:50;8745:7;8740:2;8731:6;8727:2;8723:15;8719:24;8716:37;8713:57;;;8766:1;8763;8756:12;8713:57;8797:2;8789:11;;;;;-1:-1:-1;8819:6:197;-1:-1:-1;8878:2:197;8863:18;;8850:32;-1:-1:-1;;;;;8894:32:197;;8891:52;;;8939:1;8936;8929:12;8891:52;8978:72;9042:7;9031:8;9020:9;9016:24;8978:72;:::i;:::-;7866:1244;;;;-1:-1:-1;7866:1244:197;;-1:-1:-1;7866:1244:197;;9069:8;;7866:1244;-1:-1:-1;;;7866:1244:197:o;9115:436::-;9167:3;9205:5;9199:12;9232:6;9227:3;9220:19;9264:4;9259:3;9255:14;9248:21;;9303:4;9296:5;9292:16;9326:1;9336:190;9350:6;9347:1;9344:13;9336:190;;;9415:13;;9430:10;9411:30;9399:43;;9471:4;9462:14;;;;9499:17;;;;9372:1;9365:9;9336:190;;9556:1466;9767:2;9756:9;9749:21;9730:4;9805:6;9799:13;9848:4;9843:2;9832:9;9828:18;9821:32;9876:62;9933:3;9922:9;9918:19;9904:12;9876:62;:::i;:::-;9862:76;;9987:2;9979:6;9975:15;9969:22;10059:2;10055:7;10043:9;10035:6;10031:22;10027:36;10022:2;10011:9;10007:18;10000:64;10087:51;10131:6;10115:14;10087:51;:::i;:::-;10073:65;;;10187:2;10179:6;10175:15;10169:22;10259:2;10255:7;10243:9;10235:6;10231:22;10227:36;10222:2;10211:9;10207:18;10200:64;10287:51;10331:6;10315:14;10287:51;:::i;:::-;10387:2;10375:15;;10369:22;10433;;;-1:-1:-1;;10429:36:197;10422:4;10407:20;;10400:66;10515:21;;10545:22;;;10273:65;;-1:-1:-1;10595:2:197;10680:23;;;;-1:-1:-1;10583:15:197;;;;10515:21;10641:1;10637:14;;;10625:27;;10621:36;10721:1;10731:262;10745:6;10742:1;10739:13;10731:262;;;10835:2;10831:7;10822:6;10814;10810:19;10806:33;10801:3;10794:46;10863:50;10906:6;10897;10891:13;10863:50;:::i;:::-;10948:2;10936:15;;;;10971:12;;;;;10853:60;-1:-1:-1;10767:1:197;10760:9;10731:262;;11027:674;11158:6;11166;11174;11227:2;11215:9;11206:7;11202:23;11198:32;11195:52;;;11243:1;11240;11233:12;11195:52;11282:9;11269:23;11301:53;11348:5;11301:53;:::i;:::-;11373:5;-1:-1:-1;11429:2:197;11414:18;;11401:32;-1:-1:-1;;;;;11445:30:197;;11442:50;;;11488:1;11485;11478:12;11442:50;11511:61;11564:7;11555:6;11544:9;11540:22;11511:61;:::i;:::-;11501:71;;;11624:2;11613:9;11609:18;11596:32;11637;11661:7;11637:32;:::i;:::-;11688:7;11678:17;;;11027:674;;;;;:::o;11706:611::-;11896:2;11908:21;;;11978:13;;11881:18;;;12000:22;;;11848:4;;12079:15;;;12053:2;12038:18;;;11848:4;12122:169;12136:6;12133:1;12130:13;12122:169;;;12197:13;;12185:26;;12240:2;12266:15;;;;12231:12;;;;12158:1;12151:9;12122:169;;12322:558;12428:6;12436;12444;12497:2;12485:9;12476:7;12472:23;12468:32;12465:52;;;12513:1;12510;12503:12;12465:52;12552:9;12539:23;12571:53;12618:5;12571:53;:::i;:::-;12643:5;-1:-1:-1;12721:2:197;12706:18;;12693:32;;-1:-1:-1;12803:2:197;12788:18;;12775:32;12816;12775;12816;:::i;12885:454::-;13196:6;13185:9;13178:25;13239:2;13234;13223:9;13219:18;13212:30;13159:4;13259:74;13329:2;13318:9;13314:18;13306:6;13259:74;:::i;:::-;13251:82;12885:454;-1:-1:-1;;;;12885:454:197:o;13344:127::-;13405:10;13400:3;13396:20;13393:1;13386:31;13436:4;13433:1;13426:15;13460:4;13457:1;13450:15;13684:230;13754:6;13807:2;13795:9;13786:7;13782:23;13778:32;13775:52;;;13823:1;13820;13813:12;13775:52;-1:-1:-1;13868:16:197;;13684:230;-1:-1:-1;13684:230:197:o;13919:297::-;14013:6;14066:2;14054:9;14045:7;14041:23;14037:32;14034:52;;;14082:1;14079;14072:12;14034:52;14114:9;14108:16;14133:53;14180:5;14133:53;:::i;15101:930::-;15196:6;15249:2;15237:9;15228:7;15224:23;15220:32;15217:52;;;15265:1;15262;15255:12;15217:52;15298:9;15292:16;-1:-1:-1;;;;;15323:6:197;15320:30;15317:50;;;15363:1;15360;15353:12;15317:50;15386:22;;15439:4;15431:13;;15427:27;-1:-1:-1;15417:55:197;;15468:1;15465;15458:12;15417:55;15501:2;15495:9;15524:64;15540:47;15580:6;15540:47;:::i;15524:64::-;15610:3;15634:6;15629:3;15622:19;15666:2;15661:3;15657:12;15650:19;;15721:2;15711:6;15708:1;15704:14;15700:2;15696:23;15692:32;15678:46;;15747:7;15739:6;15736:19;15733:39;;;15768:1;15765;15758:12;15733:39;15800:2;15796;15792:11;15781:22;;15812:189;15828:6;15823:3;15820:15;15812:189;;;15918:10;;15941:18;;15988:2;15845:12;;;;15979;;;;15812:189;;;16020:5;15101:930;-1:-1:-1;;;;;;15101:930:197:o;16842:296::-;16911:6;16964:2;16952:9;16943:7;16939:23;16935:32;16932:52;;;16980:1;16977;16970:12;16932:52;17012:9;17006:16;-1:-1:-1;;;;;17055:5:197;17051:38;17044:5;17041:49;17031:77;;17104:1;17101;17094:12;17143:529;17370:10;17358:23;;17340:42;;17418:2;17413;17398:18;;17391:30;;;17437:18;;17430:34;;;-1:-1:-1;;;;;;17476:31:197;;17473:51;;;17520:1;17517;17510:12;17473:51;17554:6;17551:1;17547:14;17611:6;17603;17598:2;17587:9;17583:18;17570:48;17639:22;;;;17663:2;17635:31;;17143:529;-1:-1:-1;;;;17143:529:197:o;17677:949::-;17771:6;17824:2;17812:9;17803:7;17799:23;17795:32;17792:52;;;17840:1;17837;17830:12;17792:52;17873:9;17867:16;-1:-1:-1;;;;;17898:6:197;17895:30;17892:50;;;17938:1;17935;17928:12;17892:50;17961:22;;18014:4;18006:13;;18002:27;-1:-1:-1;17992:55:197;;18043:1;18040;18033:12;17992:55;18076:2;18070:9;18099:64;18115:47;18155:6;18115:47;:::i;18099:64::-;18185:3;18209:6;18204:3;18197:19;18241:2;18236:3;18232:12;18225:19;;18296:2;18286:6;18283:1;18279:14;18275:2;18271:23;18267:32;18253:46;;18322:7;18314:6;18311:19;18308:39;;;18343:1;18340;18333:12;18308:39;18375:2;18371;18367:11;18356:22;;18387:209;18403:6;18398:3;18395:15;18387:209;;;18476:3;18470:10;18493:30;18517:5;18493:30;:::i;:::-;18536:18;;18583:2;18420:12;;;;18574;;;;18387:209;;18631:266;18719:6;18714:3;18707:19;18771:6;18764:5;18757:4;18752:3;18748:14;18735:43;-1:-1:-1;18823:1:197;18798:16;;;18816:4;18794:27;;;18787:38;;;;18879:2;18858:15;;;-1:-1:-1;;18854:29:197;18845:39;;;18841:50;;18631:266::o;18902:330::-;19097:10;19089:6;19085:23;19074:9;19067:42;19145:2;19140;19129:9;19125:18;19118:30;19048:4;19165:61;19222:2;19211:9;19207:18;19199:6;19191;19165:61;:::i;:::-;19157:69;18902:330;-1:-1:-1;;;;;18902:330:197:o;19592:290::-;19662:6;19715:2;19703:9;19694:7;19690:23;19686:32;19683:52;;;19731:1;19728;19721:12;19683:52;19757:16;;-1:-1:-1;;;;;19802:31:197;;19792:42;;19782:70;;19848:1;19845;19838:12;20388:249;20457:6;20510:2;20498:9;20489:7;20485:23;20481:32;20478:52;;;20526:1;20523;20516:12;20478:52;20558:9;20552:16;20577:30;20601:5;20577:30;:::i;20642:127::-;20703:10;20698:3;20694:20;20691:1;20684:31;20734:4;20731:1;20724:15;20758:4;20755:1;20748:15;20774:135;20813:3;20834:17;;;20831:43;;20854:18;;:::i;:::-;-1:-1:-1;20901:1:197;20890:13;;20774:135::o;20914:175::-;20951:3;20995:4;20988:5;20984:16;21024:4;21015:7;21012:17;21009:43;;21032:18;;:::i;:::-;21081:1;21068:15;;20914:175;-1:-1:-1;;20914:175:197:o;21094:331::-;21278:2;21267:9;21260:21;21241:4;21298:61;21355:2;21344:9;21340:18;21332:6;21324;21298:61;:::i;:::-;21290:69;;21407:10;21399:6;21395:23;21390:2;21379:9;21375:18;21368:51;21094:331;;;;;;:::o;21430:347::-;21647:10;21639:6;21635:23;21624:9;21617:42;21695:2;21690;21679:9;21675:18;21668:30;21598:4;21715:56;21767:2;21756:9;21752:18;21744:6;21715:56;:::i;22121:128::-;22188:9;;;22209:11;;;22206:37;;;22223:18;;:::i;22254:180::-;22292:3;22336:6;22329:5;22325:18;22367:6;22358:7;22355:19;22352:45;;22377:18;;:::i","linkReferences":{}},"methodIdentifiers":{"getBatchOperatorFromId(address,bytes32[])":"4d2b57fe","getBatchOperatorId(address,address[])":"31b36bd9","getCheckSignaturesIndices(address,uint32,bytes,bytes32[])":"4f739f74","getOperatorState(address,bytes,uint32)":"3563b0d1","getOperatorState(address,bytes32,uint32)":"cefdc1d4","getQuorumBitmapsAtBlockNumber(address,bytes32[],uint32)":"5c155662"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IRegistryCoordinator\",\"name\":\"registryCoordinator\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"operatorIds\",\"type\":\"bytes32[]\"}],\"name\":\"getBatchOperatorFromId\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"operators\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRegistryCoordinator\",\"name\":\"registryCoordinator\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"operators\",\"type\":\"address[]\"}],\"name\":\"getBatchOperatorId\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"operatorIds\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRegistryCoordinator\",\"name\":\"registryCoordinator\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"referenceBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"nonSignerOperatorIds\",\"type\":\"bytes32[]\"}],\"name\":\"getCheckSignaturesIndices\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32[]\",\"name\":\"nonSignerQuorumBitmapIndices\",\"type\":\"uint32[]\"},{\"internalType\":\"uint32[]\",\"name\":\"quorumApkIndices\",\"type\":\"uint32[]\"},{\"internalType\":\"uint32[]\",\"name\":\"totalStakeIndices\",\"type\":\"uint32[]\"},{\"internalType\":\"uint32[][]\",\"name\":\"nonSignerStakeIndices\",\"type\":\"uint32[][]\"}],\"internalType\":\"struct OperatorStateRetriever.CheckSignaturesIndices\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRegistryCoordinator\",\"name\":\"registryCoordinator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"}],\"name\":\"getOperatorState\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"internalType\":\"struct OperatorStateRetriever.Operator[][]\",\"name\":\"\",\"type\":\"tuple[][]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRegistryCoordinator\",\"name\":\"registryCoordinator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"}],\"name\":\"getOperatorState\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"internalType\":\"struct OperatorStateRetriever.Operator[][]\",\"name\":\"\",\"type\":\"tuple[][]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRegistryCoordinator\",\"name\":\"registryCoordinator\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"operatorIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"}],\"name\":\"getQuorumBitmapsAtBlockNumber\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Layr Labs Inc.\",\"kind\":\"dev\",\"methods\":{\"getBatchOperatorFromId(address,bytes32[])\":{\"details\":\"if an operator is not registered, the operator address will be 0\",\"params\":{\"operators\":\"is the array of operatorIds to get corresponding operator addresses for\",\"registryCoordinator\":\"is the AVS registry coordinator to fetch the operator information from\"}},\"getBatchOperatorId(address,address[])\":{\"details\":\"if an operator is not registered, the operatorId will be 0\",\"params\":{\"operators\":\"is the array of operator address to get corresponding operatorIds for\",\"registryCoordinator\":\"is the AVS registry coordinator to fetch the operator information from\"}},\"getCheckSignaturesIndices(address,uint32,bytes,bytes32[])\":{\"params\":{\"nonSignerOperatorIds\":\"are the ids of the nonsigning operators\",\"quorumNumbers\":\"are the ids of the quorums to get the operator state for\",\"referenceBlockNumber\":\"is the block number to get the indices for\",\"registryCoordinator\":\"is the registry coordinator to fetch the AVS registry information from\"},\"returns\":{\"_0\":\"1) the indices of the quorumBitmaps for each of the operators in the @param nonSignerOperatorIds array at the given blocknumber 2) the indices of the total stakes entries for the given quorums at the given blocknumber 3) the indices of the stakes of each of the nonsigners in each of the quorums they were a part of (for each nonsigner, an array of length the number of quorums they were a part of that are also part of the provided quorumNumbers) at the given blocknumber 4) the indices of the quorum apks for each of the provided quorums at the given blocknumber\"}},\"getOperatorState(address,bytes,uint32)\":{\"params\":{\"blockNumber\":\"is the block number to get the operator state for\",\"quorumNumbers\":\"are the ids of the quorums to get the operator state for\",\"registryCoordinator\":\"is the registry coordinator to fetch the AVS registry information from\"},\"returns\":{\"_0\":\"2d array of Operators. For each quorum, an ordered list of Operators\"}},\"getOperatorState(address,bytes32,uint32)\":{\"params\":{\"blockNumber\":\"is the block number to get the operator state for\",\"operatorId\":\"the id of the operator to fetch the quorums lists \",\"registryCoordinator\":\"is the registry coordinator to fetch the AVS registry information from\"},\"returns\":{\"_0\":\"1) the quorumBitmap of the operator at the given blockNumber 2) 2d array of Operator structs. For each quorum the provided operator was a part of at `blockNumber`, an ordered list of operators.\"}},\"getQuorumBitmapsAtBlockNumber(address,bytes32[],uint32)\":{\"params\":{\"blockNumber\":\"is the block number to get the quorumBitmaps for\",\"operatorIds\":\"are the ids of the operators to get the quorumBitmaps for\",\"registryCoordinator\":\"is the AVS registry coordinator to fetch the operator information from\"}}},\"title\":\"OperatorStateRetriever with view functions that allow to retrieve the state of an AVSs registry system.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getBatchOperatorFromId(address,bytes32[])\":{\"notice\":\"This function returns the operator addresses for each of the operators in the operatorIds array\"},\"getBatchOperatorId(address,address[])\":{\"notice\":\"This function returns the operatorIds for each of the operators in the operators array\"},\"getCheckSignaturesIndices(address,uint32,bytes,bytes32[])\":{\"notice\":\"this is called by the AVS operator to get the relevant indices for the checkSignatures function if they are not running an indexer \"},\"getOperatorState(address,bytes,uint32)\":{\"notice\":\"returns the ordered list of operators (id and stake) for each quorum. The AVS coordinator may call this function directly to get the operator state for a given block number\"},\"getOperatorState(address,bytes32,uint32)\":{\"notice\":\"This function is intended to to be called by AVS operators every time a new task is created (i.e.) the AVS coordinator makes a request to AVS operators. Since all of the crucial information is kept onchain, operators don't need to run indexers to fetch the data.\"},\"getQuorumBitmapsAtBlockNumber(address,bytes32[],uint32)\":{\"notice\":\"this function returns the quorumBitmaps for each of the operators in the operatorIds array at the given blocknumber\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/eigenlayer-middleware/src/OperatorStateRetriever.sol\":\"OperatorStateRetriever\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":@openzeppelin-upgrades/contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/\",\":eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/\",\":eigenlayer-middleware/=lib/eigenlayer-middleware/src/\",\":eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/\"]},\"sources\":{\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol\":{\"keccak256\":\"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983\",\"dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol\":{\"keccak256\":\"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914\",\"dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol\":{\"keccak256\":\"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c\",\"license\":\"CC0-1.0\",\"urls\":[\"bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91\",\"dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol\":{\"keccak256\":\"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc\",\"dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol\":{\"keccak256\":\"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8\",\"dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol\":{\"keccak256\":\"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324\",\"dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol\":{\"keccak256\":\"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d\",\"dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol\":{\"keccak256\":\"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c\",\"dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol\":{\"keccak256\":\"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232\",\"dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol\":{\"keccak256\":\"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73\",\"dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol\":{\"keccak256\":\"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef\",\"dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol\":{\"keccak256\":\"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7\",\"dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol\":{\"keccak256\":\"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f\",\"dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol\":{\"keccak256\":\"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f\",\"dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/eigenlayer-middleware/src/OperatorStateRetriever.sol\":{\"keccak256\":\"0x5573c9b7416d08e8b2f3e2e238ca4ba7a0c0fd4e6c6f8d4f7eca5487f26a042a\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://98c9e6ec2b3478f3a962d57e280ddb69a93be7035ed7a4cdb775d29b763053af\",\"dweb:/ipfs/QmaMHNFsddfP7fKxaVwn8foWqwp7ySwaD5Lof19bsmsdvg\"]},\"lib/eigenlayer-middleware/src/interfaces/IBLSApkRegistry.sol\":{\"keccak256\":\"0xc07a5edfd95ab4f16f16a8dc8e76eadf4b0e90fe49db90540d01daaad86898c5\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://52b53266450a53da641e82d8ae3be93c5e09f8342b4ea0cc96bb9038d8406354\",\"dweb:/ipfs/QmVuoiQyqPTLCGnyt8zDaxiyaj4ETdgTGKv4MDHWzqEDjp\"]},\"lib/eigenlayer-middleware/src/interfaces/IIndexRegistry.sol\":{\"keccak256\":\"0x83b2d56aacf27e65c4959a832c5de573e013908c044f6e48ea8284ac5282ae2b\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://877af382587e96bb39bcc6db8bb5e4b871db5025c52347d4bee9afeaa4a6cc8d\",\"dweb:/ipfs/QmdnhsQCChzq2o5NgbeT3JxSsEcMm1PC9QW6zenZNPjD9F\"]},\"lib/eigenlayer-middleware/src/interfaces/IRegistry.sol\":{\"keccak256\":\"0x51426a17fb7e54bd3720e2890104e97a8559a13ff248b3d6b840916751c143d3\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://01f91289e6100d528cb8b318cb14ff22a0bc52882c9d4db41585e030cc9ddc25\",\"dweb:/ipfs/Qmb22nqGrsrtNovHRwbMCvDHGENuxAgrWu3Db4p7Er2MHY\"]},\"lib/eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol\":{\"keccak256\":\"0xdd8effb082c1d5957d5ff43d7c59497b32866a6d82bcc7d5efa49ea9bc9b3385\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://cb33a2a1446585b13b7a509e880c60d658d2d2522ec48a9f02e30d2cff54002d\",\"dweb:/ipfs/QmVNG8ZPZkXzNEadPdTj1uBYLiZdCnYfsE5iGU6nJcJXiD\"]},\"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol\":{\"keccak256\":\"0x1b8b4d757c1b804bc4cf6fbbf8bf8f89ebdeb30a31014751fe7d01deb9d513d4\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://984bf2777b898ed187d28997f9783f5c293a1a1848e3e9aa470ce9183d454c97\",\"dweb:/ipfs/Qme3aTpBrkLu8wYHFMZbCfhXHoZ1M6SpXkeC237T9BuU5B\"]},\"lib/eigenlayer-middleware/src/libraries/BN254.sol\":{\"keccak256\":\"0xb428c8d0c3b325507a88a61a80115493eb88606ccc19ed64a31e11294ab853b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7b6fb935bfe0494e6ff970c8f30a86d5f4cf5c3e0967300c28cd383c043acae\",\"dweb:/ipfs/QmUHfFZaVjLPXhkBmcxrZhAHZaSFQDqXtrLGpjGBQBa5Ki\"]},\"lib/eigenlayer-middleware/src/libraries/BitmapUtils.sol\":{\"keccak256\":\"0x44315ac460be30a6b18fd4df4d1b8afb46653bf4dc06ca9f93c32353fd0605c5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da14f2ead3a375b02afd09d4a02edddf7b63a88945746b96789b2473184fdb04\",\"dweb:/ipfs/QmRqcjxa2Vv2MrLdPeAwsktXdWTirapEDsRbJCyYRtKT6g\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.27+commit.40a35a09"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract IRegistryCoordinator","name":"registryCoordinator","type":"address"},{"internalType":"bytes32[]","name":"operatorIds","type":"bytes32[]"}],"stateMutability":"view","type":"function","name":"getBatchOperatorFromId","outputs":[{"internalType":"address[]","name":"operators","type":"address[]"}]},{"inputs":[{"internalType":"contract IRegistryCoordinator","name":"registryCoordinator","type":"address"},{"internalType":"address[]","name":"operators","type":"address[]"}],"stateMutability":"view","type":"function","name":"getBatchOperatorId","outputs":[{"internalType":"bytes32[]","name":"operatorIds","type":"bytes32[]"}]},{"inputs":[{"internalType":"contract IRegistryCoordinator","name":"registryCoordinator","type":"address"},{"internalType":"uint32","name":"referenceBlockNumber","type":"uint32"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"},{"internalType":"bytes32[]","name":"nonSignerOperatorIds","type":"bytes32[]"}],"stateMutability":"view","type":"function","name":"getCheckSignaturesIndices","outputs":[{"internalType":"struct OperatorStateRetriever.CheckSignaturesIndices","name":"","type":"tuple","components":[{"internalType":"uint32[]","name":"nonSignerQuorumBitmapIndices","type":"uint32[]"},{"internalType":"uint32[]","name":"quorumApkIndices","type":"uint32[]"},{"internalType":"uint32[]","name":"totalStakeIndices","type":"uint32[]"},{"internalType":"uint32[][]","name":"nonSignerStakeIndices","type":"uint32[][]"}]}]},{"inputs":[{"internalType":"contract IRegistryCoordinator","name":"registryCoordinator","type":"address"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"},{"internalType":"uint32","name":"blockNumber","type":"uint32"}],"stateMutability":"view","type":"function","name":"getOperatorState","outputs":[{"internalType":"struct OperatorStateRetriever.Operator[][]","name":"","type":"tuple[][]","components":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint96","name":"stake","type":"uint96"}]}]},{"inputs":[{"internalType":"contract IRegistryCoordinator","name":"registryCoordinator","type":"address"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint32","name":"blockNumber","type":"uint32"}],"stateMutability":"view","type":"function","name":"getOperatorState","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"struct OperatorStateRetriever.Operator[][]","name":"","type":"tuple[][]","components":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint96","name":"stake","type":"uint96"}]}]},{"inputs":[{"internalType":"contract IRegistryCoordinator","name":"registryCoordinator","type":"address"},{"internalType":"bytes32[]","name":"operatorIds","type":"bytes32[]"},{"internalType":"uint32","name":"blockNumber","type":"uint32"}],"stateMutability":"view","type":"function","name":"getQuorumBitmapsAtBlockNumber","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}]}],"devdoc":{"kind":"dev","methods":{"getBatchOperatorFromId(address,bytes32[])":{"details":"if an operator is not registered, the operator address will be 0","params":{"operators":"is the array of operatorIds to get corresponding operator addresses for","registryCoordinator":"is the AVS registry coordinator to fetch the operator information from"}},"getBatchOperatorId(address,address[])":{"details":"if an operator is not registered, the operatorId will be 0","params":{"operators":"is the array of operator address to get corresponding operatorIds for","registryCoordinator":"is the AVS registry coordinator to fetch the operator information from"}},"getCheckSignaturesIndices(address,uint32,bytes,bytes32[])":{"params":{"nonSignerOperatorIds":"are the ids of the nonsigning operators","quorumNumbers":"are the ids of the quorums to get the operator state for","referenceBlockNumber":"is the block number to get the indices for","registryCoordinator":"is the registry coordinator to fetch the AVS registry information from"},"returns":{"_0":"1) the indices of the quorumBitmaps for each of the operators in the @param nonSignerOperatorIds array at the given blocknumber 2) the indices of the total stakes entries for the given quorums at the given blocknumber 3) the indices of the stakes of each of the nonsigners in each of the quorums they were a part of (for each nonsigner, an array of length the number of quorums they were a part of that are also part of the provided quorumNumbers) at the given blocknumber 4) the indices of the quorum apks for each of the provided quorums at the given blocknumber"}},"getOperatorState(address,bytes,uint32)":{"params":{"blockNumber":"is the block number to get the operator state for","quorumNumbers":"are the ids of the quorums to get the operator state for","registryCoordinator":"is the registry coordinator to fetch the AVS registry information from"},"returns":{"_0":"2d array of Operators. For each quorum, an ordered list of Operators"}},"getOperatorState(address,bytes32,uint32)":{"params":{"blockNumber":"is the block number to get the operator state for","operatorId":"the id of the operator to fetch the quorums lists ","registryCoordinator":"is the registry coordinator to fetch the AVS registry information from"},"returns":{"_0":"1) the quorumBitmap of the operator at the given blockNumber 2) 2d array of Operator structs. For each quorum the provided operator was a part of at `blockNumber`, an ordered list of operators."}},"getQuorumBitmapsAtBlockNumber(address,bytes32[],uint32)":{"params":{"blockNumber":"is the block number to get the quorumBitmaps for","operatorIds":"are the ids of the operators to get the quorumBitmaps for","registryCoordinator":"is the AVS registry coordinator to fetch the operator information from"}}},"version":1},"userdoc":{"kind":"user","methods":{"getBatchOperatorFromId(address,bytes32[])":{"notice":"This function returns the operator addresses for each of the operators in the operatorIds array"},"getBatchOperatorId(address,address[])":{"notice":"This function returns the operatorIds for each of the operators in the operators array"},"getCheckSignaturesIndices(address,uint32,bytes,bytes32[])":{"notice":"this is called by the AVS operator to get the relevant indices for the checkSignatures function if they are not running an indexer "},"getOperatorState(address,bytes,uint32)":{"notice":"returns the ordered list of operators (id and stake) for each quorum. The AVS coordinator may call this function directly to get the operator state for a given block number"},"getOperatorState(address,bytes32,uint32)":{"notice":"This function is intended to to be called by AVS operators every time a new task is created (i.e.) the AVS coordinator makes a request to AVS operators. Since all of the crucial information is kept onchain, operators don't need to run indexers to fetch the data."},"getQuorumBitmapsAtBlockNumber(address,bytes32[],uint32)":{"notice":"this function returns the quorumBitmaps for each of the operators in the operatorIds array at the given blocknumber"}},"version":1}},"settings":{"remappings":["@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","@openzeppelin-upgrades/contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/","ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/","eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/","eigenlayer-middleware/=lib/eigenlayer-middleware/src/","eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/openzeppelin-contracts/","openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/eigenlayer-middleware/src/OperatorStateRetriever.sol":"OperatorStateRetriever"},"evmVersion":"paris","libraries":{}},"sources":{"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol":{"keccak256":"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00","urls":["bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983","dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol":{"keccak256":"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9","urls":["bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914","dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol":{"keccak256":"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c","urls":["bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91","dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz"],"license":"CC0-1.0"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol":{"keccak256":"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba","urls":["bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc","dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol":{"keccak256":"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c","urls":["bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8","dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol":{"keccak256":"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f","urls":["bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324","dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol":{"keccak256":"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49","urls":["bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d","dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol":{"keccak256":"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092","urls":["bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c","dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol":{"keccak256":"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79","urls":["bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232","dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol":{"keccak256":"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420","urls":["bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73","dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol":{"keccak256":"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52","urls":["bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef","dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol":{"keccak256":"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377","urls":["bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7","dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol":{"keccak256":"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d","urls":["bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f","dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol":{"keccak256":"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71","urls":["bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f","dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61","urls":["bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354","dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/eigenlayer-middleware/src/OperatorStateRetriever.sol":{"keccak256":"0x5573c9b7416d08e8b2f3e2e238ca4ba7a0c0fd4e6c6f8d4f7eca5487f26a042a","urls":["bzz-raw://98c9e6ec2b3478f3a962d57e280ddb69a93be7035ed7a4cdb775d29b763053af","dweb:/ipfs/QmaMHNFsddfP7fKxaVwn8foWqwp7ySwaD5Lof19bsmsdvg"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IBLSApkRegistry.sol":{"keccak256":"0xc07a5edfd95ab4f16f16a8dc8e76eadf4b0e90fe49db90540d01daaad86898c5","urls":["bzz-raw://52b53266450a53da641e82d8ae3be93c5e09f8342b4ea0cc96bb9038d8406354","dweb:/ipfs/QmVuoiQyqPTLCGnyt8zDaxiyaj4ETdgTGKv4MDHWzqEDjp"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IIndexRegistry.sol":{"keccak256":"0x83b2d56aacf27e65c4959a832c5de573e013908c044f6e48ea8284ac5282ae2b","urls":["bzz-raw://877af382587e96bb39bcc6db8bb5e4b871db5025c52347d4bee9afeaa4a6cc8d","dweb:/ipfs/QmdnhsQCChzq2o5NgbeT3JxSsEcMm1PC9QW6zenZNPjD9F"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IRegistry.sol":{"keccak256":"0x51426a17fb7e54bd3720e2890104e97a8559a13ff248b3d6b840916751c143d3","urls":["bzz-raw://01f91289e6100d528cb8b318cb14ff22a0bc52882c9d4db41585e030cc9ddc25","dweb:/ipfs/Qmb22nqGrsrtNovHRwbMCvDHGENuxAgrWu3Db4p7Er2MHY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol":{"keccak256":"0xdd8effb082c1d5957d5ff43d7c59497b32866a6d82bcc7d5efa49ea9bc9b3385","urls":["bzz-raw://cb33a2a1446585b13b7a509e880c60d658d2d2522ec48a9f02e30d2cff54002d","dweb:/ipfs/QmVNG8ZPZkXzNEadPdTj1uBYLiZdCnYfsE5iGU6nJcJXiD"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol":{"keccak256":"0x1b8b4d757c1b804bc4cf6fbbf8bf8f89ebdeb30a31014751fe7d01deb9d513d4","urls":["bzz-raw://984bf2777b898ed187d28997f9783f5c293a1a1848e3e9aa470ce9183d454c97","dweb:/ipfs/Qme3aTpBrkLu8wYHFMZbCfhXHoZ1M6SpXkeC237T9BuU5B"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/libraries/BN254.sol":{"keccak256":"0xb428c8d0c3b325507a88a61a80115493eb88606ccc19ed64a31e11294ab853b3","urls":["bzz-raw://d7b6fb935bfe0494e6ff970c8f30a86d5f4cf5c3e0967300c28cd383c043acae","dweb:/ipfs/QmUHfFZaVjLPXhkBmcxrZhAHZaSFQDqXtrLGpjGBQBa5Ki"],"license":"MIT"},"lib/eigenlayer-middleware/src/libraries/BitmapUtils.sol":{"keccak256":"0x44315ac460be30a6b18fd4df4d1b8afb46653bf4dc06ca9f93c32353fd0605c5","urls":["bzz-raw://da14f2ead3a375b02afd09d4a02edddf7b63a88945746b96789b2473184fdb04","dweb:/ipfs/QmRqcjxa2Vv2MrLdPeAwsktXdWTirapEDsRbJCyYRtKT6g"],"license":"MIT"}},"version":1},"id":117} \ No newline at end of file diff --git a/telemetry_api/priv/repo/migrations/.formatter.exs b/telemetry_api/priv/repo/migrations/.formatter.exs new file mode 100644 index 0000000000..49f9151ed2 --- /dev/null +++ b/telemetry_api/priv/repo/migrations/.formatter.exs @@ -0,0 +1,4 @@ +[ + import_deps: [:ecto_sql], + inputs: ["*.exs"] +] diff --git a/telemetry_api/priv/repo/migrations/20240917212329_create_operators.exs b/telemetry_api/priv/repo/migrations/20240917212329_create_operators.exs new file mode 100644 index 0000000000..80a5e40fe7 --- /dev/null +++ b/telemetry_api/priv/repo/migrations/20240917212329_create_operators.exs @@ -0,0 +1,17 @@ +defmodule TelemetryApi.Repo.Migrations.CreateOperators do + use Ecto.Migration + + def change do + create table(:operators, primary_key: false) do + add :address, :string, primary_key: true + add :id, :string + add :stake, :string + add :name, :string + add :version, :string + + timestamps(type: :utc_datetime) + end + + create unique_index(:operators, [:address]) + end +end diff --git a/telemetry_api/priv/repo/seeds.exs b/telemetry_api/priv/repo/seeds.exs new file mode 100644 index 0000000000..7b50b07e13 --- /dev/null +++ b/telemetry_api/priv/repo/seeds.exs @@ -0,0 +1,11 @@ +# Script for populating the database. You can run it as: +# +# mix run priv/repo/seeds.exs +# +# Inside the script, you can read and write to any of your +# repositories directly: +# +# TelemetryApi.Repo.insert!(%TelemetryApi.SomeSchema{}) +# +# We recommend using the bang functions (`insert!`, `update!` +# and so on) as they will fail if something goes wrong. diff --git a/telemetry_api/priv/static/favicon.ico b/telemetry_api/priv/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7f372bfc21cdd8cb47585339d5fa4d9dd424402f GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=@t!V@Ar*{oFEH`~d50E!_s``s q?{G*w(7?#d#v@^nKnY_HKaYb01EZMZjMqTJ89ZJ6T-G@yGywoKK_h|y literal 0 HcmV?d00001 diff --git a/telemetry_api/priv/static/robots.txt b/telemetry_api/priv/static/robots.txt new file mode 100644 index 0000000000..ab7fef159b --- /dev/null +++ b/telemetry_api/priv/static/robots.txt @@ -0,0 +1,5 @@ +# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file +# +# To ban all spiders from the entire site uncomment the next two lines: +User-agent: * +Disallow: / diff --git a/telemetry_api/start.sh b/telemetry_api/start.sh new file mode 100755 index 0000000000..b20a0bfae8 --- /dev/null +++ b/telemetry_api/start.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +source .env + +# Add new environment variables here +env_vars=( + "ENVIRONMENT" + "ALIGNED_CONFIG_FILE" +) + +for var in "${env_vars[@]}"; do + export "$var=${!var}" +done + +mix compile --force #force recompile to get the latest .env values + +elixir --sname telemetry -S mix phx.server diff --git a/telemetry_api/test/support/conn_case.ex b/telemetry_api/test/support/conn_case.ex new file mode 100644 index 0000000000..b51e7f0e02 --- /dev/null +++ b/telemetry_api/test/support/conn_case.ex @@ -0,0 +1,38 @@ +defmodule TelemetryApiWeb.ConnCase do + @moduledoc """ + This module defines the test case to be used by + tests that require setting up a connection. + + Such tests rely on `Phoenix.ConnTest` and also + import other functionality to make it easier + to build common data structures and query the data layer. + + Finally, if the test case interacts with the database, + we enable the SQL sandbox, so changes done to the database + are reverted at the end of every test. If you are using + PostgreSQL, you can even run database tests asynchronously + by setting `use TelemetryApiWeb.ConnCase, async: true`, although + this option is not recommended for other databases. + """ + + use ExUnit.CaseTemplate + + using do + quote do + # The default endpoint for testing + @endpoint TelemetryApiWeb.Endpoint + + use TelemetryApiWeb, :verified_routes + + # Import conveniences for testing with connections + import Plug.Conn + import Phoenix.ConnTest + import TelemetryApiWeb.ConnCase + end + end + + setup tags do + TelemetryApi.DataCase.setup_sandbox(tags) + {:ok, conn: Phoenix.ConnTest.build_conn()} + end +end diff --git a/telemetry_api/test/support/data_case.ex b/telemetry_api/test/support/data_case.ex new file mode 100644 index 0000000000..7a30b5a25a --- /dev/null +++ b/telemetry_api/test/support/data_case.ex @@ -0,0 +1,58 @@ +defmodule TelemetryApi.DataCase do + @moduledoc """ + This module defines the setup for tests requiring + access to the application's data layer. + + You may define functions here to be used as helpers in + your tests. + + Finally, if the test case interacts with the database, + we enable the SQL sandbox, so changes done to the database + are reverted at the end of every test. If you are using + PostgreSQL, you can even run database tests asynchronously + by setting `use TelemetryApi.DataCase, async: true`, although + this option is not recommended for other databases. + """ + + use ExUnit.CaseTemplate + + using do + quote do + alias TelemetryApi.Repo + + import Ecto + import Ecto.Changeset + import Ecto.Query + import TelemetryApi.DataCase + end + end + + setup tags do + TelemetryApi.DataCase.setup_sandbox(tags) + :ok + end + + @doc """ + Sets up the sandbox based on the test tags. + """ + def setup_sandbox(tags) do + pid = Ecto.Adapters.SQL.Sandbox.start_owner!(TelemetryApi.Repo, shared: not tags[:async]) + on_exit(fn -> Ecto.Adapters.SQL.Sandbox.stop_owner(pid) end) + end + + @doc """ + A helper that transforms changeset errors into a map of messages. + + assert {:error, changeset} = Accounts.create_user(%{password: "short"}) + assert "password is too short" in errors_on(changeset).password + assert %{password: ["password is too short"]} = errors_on(changeset) + + """ + def errors_on(changeset) do + Ecto.Changeset.traverse_errors(changeset, fn {message, opts} -> + Regex.replace(~r"%{(\w+)}", message, fn _, key -> + opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string() + end) + end) + end +end diff --git a/telemetry_api/test/support/fixtures/urls_fixtures.ex b/telemetry_api/test/support/fixtures/urls_fixtures.ex new file mode 100644 index 0000000000..f94b638451 --- /dev/null +++ b/telemetry_api/test/support/fixtures/urls_fixtures.ex @@ -0,0 +1,21 @@ +defmodule TelemetryApi.UrlsFixtures do + @moduledoc """ + This module defines test helpers for creating + entities via the `TelemetryApi.Urls` context. + """ + + @doc """ + Generate a operator. + """ + def operator_fixture(attrs \\ %{}) do + {:ok, operator} = + attrs + |> Enum.into(%{ + address: "some address", + version: "some version" + }) + |> TelemetryApi.Urls.create_operator() + + operator + end +end diff --git a/telemetry_api/test/telemetry_api/urls_test.exs b/telemetry_api/test/telemetry_api/urls_test.exs new file mode 100644 index 0000000000..618f10f859 --- /dev/null +++ b/telemetry_api/test/telemetry_api/urls_test.exs @@ -0,0 +1,61 @@ +defmodule TelemetryApi.UrlsTest do + use TelemetryApi.DataCase + + alias TelemetryApi.Urls + + describe "operators" do + alias TelemetryApi.Urls.Operator + + import TelemetryApi.UrlsFixtures + + @invalid_attrs %{version: nil, address: nil} + + test "list_operators/0 returns all operators" do + operator = operator_fixture() + assert Urls.list_operators() == [operator] + end + + test "get_operator!/1 returns the operator with given id" do + operator = operator_fixture() + assert Urls.get_operator!(operator.id) == operator + end + + test "create_operator/1 with valid data creates a operator" do + valid_attrs = %{version: "some version", address: "some address"} + + assert {:ok, %Operator{} = operator} = Urls.create_operator(valid_attrs) + assert operator.version == "some version" + assert operator.address == "some address" + end + + test "create_operator/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Urls.create_operator(@invalid_attrs) + end + + test "update_operator/2 with valid data updates the operator" do + operator = operator_fixture() + update_attrs = %{version: "some updated version", address: "some updated address"} + + assert {:ok, %Operator{} = operator} = Urls.update_operator(operator, update_attrs) + assert operator.version == "some updated version" + assert operator.address == "some updated address" + end + + test "update_operator/2 with invalid data returns error changeset" do + operator = operator_fixture() + assert {:error, %Ecto.Changeset{}} = Urls.update_operator(operator, @invalid_attrs) + assert operator == Urls.get_operator!(operator.id) + end + + test "delete_operator/1 deletes the operator" do + operator = operator_fixture() + assert {:ok, %Operator{}} = Urls.delete_operator(operator) + assert_raise Ecto.NoResultsError, fn -> Urls.get_operator!(operator.id) end + end + + test "change_operator/1 returns a operator changeset" do + operator = operator_fixture() + assert %Ecto.Changeset{} = Urls.change_operator(operator) + end + end +end diff --git a/telemetry_api/test/telemetry_api_web/controllers/error_json_test.exs b/telemetry_api/test/telemetry_api_web/controllers/error_json_test.exs new file mode 100644 index 0000000000..5cb349fdc4 --- /dev/null +++ b/telemetry_api/test/telemetry_api_web/controllers/error_json_test.exs @@ -0,0 +1,12 @@ +defmodule TelemetryApiWeb.ErrorJSONTest do + use TelemetryApiWeb.ConnCase, async: true + + test "renders 404" do + assert TelemetryApiWeb.ErrorJSON.render("404.json", %{}) == %{errors: %{detail: "Not Found"}} + end + + test "renders 500" do + assert TelemetryApiWeb.ErrorJSON.render("500.json", %{}) == + %{errors: %{detail: "Internal Server Error"}} + end +end diff --git a/telemetry_api/test/telemetry_api_web/controllers/operator_controller_test.exs b/telemetry_api/test/telemetry_api_web/controllers/operator_controller_test.exs new file mode 100644 index 0000000000..bcb8b80826 --- /dev/null +++ b/telemetry_api/test/telemetry_api_web/controllers/operator_controller_test.exs @@ -0,0 +1,88 @@ +defmodule TelemetryApiWeb.OperatorControllerTest do + use TelemetryApiWeb.ConnCase + + import TelemetryApi.UrlsFixtures + + alias TelemetryApi.Urls.Operator + + @create_attrs %{ + version: "some version", + address: "some address" + } + @update_attrs %{ + version: "some updated version", + address: "some updated address" + } + @invalid_attrs %{version: nil, address: nil} + + setup %{conn: conn} do + {:ok, conn: put_req_header(conn, "accept", "application/json")} + end + + describe "index" do + test "lists all operators", %{conn: conn} do + conn = get(conn, ~p"/api/operators") + assert json_response(conn, 200)["data"] == [] + end + end + + describe "create operator" do + test "renders operator when data is valid", %{conn: conn} do + conn = post(conn, ~p"/api/operators", operator: @create_attrs) + assert %{"id" => id} = json_response(conn, 201)["data"] + + conn = get(conn, ~p"/api/operators/#{id}") + + assert %{ + "id" => ^id, + "address" => "some address", + "version" => "some version" + } = json_response(conn, 200)["data"] + end + + test "renders errors when data is invalid", %{conn: conn} do + conn = post(conn, ~p"/api/operators", operator: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} + end + end + + describe "update operator" do + setup [:create_operator] + + test "renders operator when data is valid", %{conn: conn, operator: %Operator{id: id} = operator} do + conn = put(conn, ~p"/api/operators/#{operator}", operator: @update_attrs) + assert %{"id" => ^id} = json_response(conn, 200)["data"] + + conn = get(conn, ~p"/api/operators/#{id}") + + assert %{ + "id" => ^id, + "address" => "some updated address", + "version" => "some updated version" + } = json_response(conn, 200)["data"] + end + + test "renders errors when data is invalid", %{conn: conn, operator: operator} do + conn = put(conn, ~p"/api/operators/#{operator}", operator: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} + end + end + + describe "delete operator" do + setup [:create_operator] + + test "deletes chosen operator", %{conn: conn, operator: operator} do + conn = delete(conn, ~p"/api/operators/#{operator}") + assert response(conn, 204) + + assert_error_sent 404, fn -> + get(conn, ~p"/api/operators/#{operator}") + end + end + end + + defp create_operator(_) do + operator = operator_fixture() + %{operator: operator} + end +end diff --git a/telemetry_api/test/test_helper.exs b/telemetry_api/test/test_helper.exs new file mode 100644 index 0000000000..a354f9030e --- /dev/null +++ b/telemetry_api/test/test_helper.exs @@ -0,0 +1,2 @@ +ExUnit.start() +Ecto.Adapters.SQL.Sandbox.mode(TelemetryApi.Repo, :manual) From 0d57e3c3dc1093f3a479ee3b2327cc0c2a566a74 Mon Sep 17 00:00:00 2001 From: Julian Ventura <43799596+JulianVentura@users.noreply.github.com> Date: Mon, 7 Oct 2024 11:09:31 -0300 Subject: [PATCH 07/12] chore: Add `explorer_create_env` makefile target and update error messages. (#1121) Co-authored-by: Julian Ventura --- Makefile | 4 ++++ .../contract_managers/aligned_layer_service_manager.ex | 2 +- .../lib/explorer/contract_managers/avs_directory_manager.ex | 2 +- .../contract_managers/batcher_payment_service_manager.ex | 2 +- explorer/lib/explorer/contract_managers/delegation_manager.ex | 2 +- .../contract_managers/registry_coordinator_manager.ex | 2 +- .../lib/explorer/contract_managers/stake_registry_manager.ex | 2 +- explorer/mix.lock | 2 +- 8 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index d30540750e..f3f7579b22 100644 --- a/Makefile +++ b/Makefile @@ -628,6 +628,10 @@ explorer_fetch_old_operators_strategies_restakes: @cd explorer && \ ./scripts/fetch_old_operators_strategies_restakes.sh 0 +explorer_create_env: + @cd explorer && \ + cp .env.dev .env + __TRACKER__: tracker_devnet_start: tracker_run_db diff --git a/explorer/lib/explorer/contract_managers/aligned_layer_service_manager.ex b/explorer/lib/explorer/contract_managers/aligned_layer_service_manager.ex index 05f091aada..fb31b19d50 100644 --- a/explorer/lib/explorer/contract_managers/aligned_layer_service_manager.ex +++ b/explorer/lib/explorer/contract_managers/aligned_layer_service_manager.ex @@ -26,7 +26,7 @@ defmodule AlignedLayerServiceManager do :error -> raise( - "Config file not read successfully, did you run make create-env? If you did,\n make sure Alignedlayer config file is correctly stored" + "Config file not read successfully, did you run make explorer_create_env? If you did,\n make sure AlignedLayer config file is correctly stored" ) end diff --git a/explorer/lib/explorer/contract_managers/avs_directory_manager.ex b/explorer/lib/explorer/contract_managers/avs_directory_manager.ex index 36297c5cdc..a511b243e4 100644 --- a/explorer/lib/explorer/contract_managers/avs_directory_manager.ex +++ b/explorer/lib/explorer/contract_managers/avs_directory_manager.ex @@ -14,7 +14,7 @@ defmodule AVSDirectoryManager do :error -> raise( - "Config file not read successfully, did you run make create-env? If you did,\n make sure Eigenlayer config file is correctly stored" + "Config file not read successfully, did you run make explorer_create_env? If you did,\n make sure Eigenlayer config file is correctly stored" ) end diff --git a/explorer/lib/explorer/contract_managers/batcher_payment_service_manager.ex b/explorer/lib/explorer/contract_managers/batcher_payment_service_manager.ex index 883d08694f..9dcfe04663 100644 --- a/explorer/lib/explorer/contract_managers/batcher_payment_service_manager.ex +++ b/explorer/lib/explorer/contract_managers/batcher_payment_service_manager.ex @@ -25,7 +25,7 @@ defmodule BatcherPaymentServiceManager do :error -> raise( - "Config file not read successfully, did you run make create-env? If you did,\n make sure Alignedlayer config file is correctly stored" + "Config file not read successfully, did you run make explorer_create_env? If you did,\n make sure AlignedLayer config file is correctly stored" ) end diff --git a/explorer/lib/explorer/contract_managers/delegation_manager.ex b/explorer/lib/explorer/contract_managers/delegation_manager.ex index de2c7f8d9d..696f9b4130 100644 --- a/explorer/lib/explorer/contract_managers/delegation_manager.ex +++ b/explorer/lib/explorer/contract_managers/delegation_manager.ex @@ -21,7 +21,7 @@ defmodule DelegationManager do :error -> raise( - "Config file not read successfully, did you run make create-env? If you did,\n make sure Eigenlayer config file is correctly stored" + "Config file not read successfully, did you run make explorer_create_env? If you did,\n make sure Eigenlayer config file is correctly stored" ) end diff --git a/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex b/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex index 3ce5c6aa01..10f371882c 100644 --- a/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex +++ b/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex @@ -17,7 +17,7 @@ defmodule RegistryCoordinatorManager do :error -> raise( - "Config file not read successfully, did you run make create-env? If you did,\n make sure Eigenlayer config file is correctly stored" + "Config file not read successfully, did you run make explorer_create_env? If you did,\n make sure Eigenlayer config file is correctly stored" ) end diff --git a/explorer/lib/explorer/contract_managers/stake_registry_manager.ex b/explorer/lib/explorer/contract_managers/stake_registry_manager.ex index e06927a3a7..81bd975957 100644 --- a/explorer/lib/explorer/contract_managers/stake_registry_manager.ex +++ b/explorer/lib/explorer/contract_managers/stake_registry_manager.ex @@ -17,7 +17,7 @@ defmodule StakeRegistryManager do :error -> raise( - "Config file not read successfully, did you run make create-env? If you did,\n make sure Eigenlayer config file is correctly stored" + "Config file not read successfully, did you run make explorer_create_env? If you did,\n make sure Eigenlayer config file is correctly stored" ) end diff --git a/explorer/mix.lock b/explorer/mix.lock index 17f684b6a1..336bebe7ee 100644 --- a/explorer/mix.lock +++ b/explorer/mix.lock @@ -23,7 +23,7 @@ "floki": {:hex, :floki, "0.36.2", "a7da0193538c93f937714a6704369711998a51a6164a222d710ebd54020aa7a3", [:mix], [], "hexpm", "a8766c0bc92f074e5cb36c4f9961982eda84c5d2b8e979ca67f5c268ec8ed580"}, "gettext": {:hex, :gettext, "0.24.0", "6f4d90ac5f3111673cbefc4ebee96fe5f37a114861ab8c7b7d5b30a1108ce6d8", [:mix], [{:expo, "~> 0.5.1", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"}, "hackney": {:hex, :hackney, "1.20.1", "8d97aec62ddddd757d128bfd1df6c5861093419f8f7a4223823537bad5d064e2", [:rebar3], [{:certifi, "~> 2.12.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"}, - "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized"]}, + "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized", depth: 1]}, "hpax": {:hex, :hpax, "0.2.0", "5a58219adcb75977b2edce5eb22051de9362f08236220c9e859a47111c194ff5", [:mix], [], "hexpm", "bea06558cdae85bed075e6c036993d43cd54d447f76d8190a8db0dc5893fa2f1"}, "httpoison": {:hex, :httpoison, "2.2.1", "87b7ed6d95db0389f7df02779644171d7319d319178f6680438167d7b69b1f3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "51364e6d2f429d80e14fe4b5f8e39719cacd03eb3f9a9286e61e216feac2d2df"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, From 0023a7bde26fb95628e11f3395c01fcbd1a3ab22 Mon Sep 17 00:00:00 2001 From: Nacho Avecilla Date: Mon, 7 Oct 2024 12:08:27 -0300 Subject: [PATCH 08/12] fix: update package version in `.toml` to fix `aligned --version` (#1187) --- batcher/Cargo.lock | 2 +- batcher/aligned/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/batcher/Cargo.lock b/batcher/Cargo.lock index 3935d562a9..438a67decc 100644 --- a/batcher/Cargo.lock +++ b/batcher/Cargo.lock @@ -78,7 +78,7 @@ dependencies = [ [[package]] name = "aligned" -version = "0.1.0" +version = "0.8.0" dependencies = [ "aligned-sdk", "clap", diff --git a/batcher/aligned/Cargo.toml b/batcher/aligned/Cargo.toml index 4da271005b..5c37437044 100644 --- a/batcher/aligned/Cargo.toml +++ b/batcher/aligned/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aligned" -version = "0.1.0" +version = "0.8.0" edition = "2021" [dependencies] From dca81e0301cdf6f4eb0f0d19dd4ab8f394835045 Mon Sep 17 00:00:00 2001 From: PatStiles <33334338+PatStiles@users.noreply.github.com> Date: Mon, 7 Oct 2024 13:00:13 -0300 Subject: [PATCH 09/12] fix(batcher): Update Lambdaworks Merkle Trees + Update merkle leaves length check in batcher (#1067) Co-authored-by: Mariano Nicolini Co-authored-by: Urix <43704209+uri-99@users.noreply.github.com> --- batcher/Cargo.lock | 886 +++++++++--------- batcher/aligned-batcher/Cargo.toml | 2 +- batcher/aligned-batcher/src/lib.rs | 16 +- batcher/aligned-sdk/Cargo.toml | 2 +- batcher/aligned/Cargo.toml | 25 +- operator/merkle_tree/lib/Cargo.lock | 55 +- operator/merkle_tree/lib/Cargo.toml | 2 +- operator/merkle_tree/lib/src/lib.rs | 23 +- .../lib/test_files/merkle_root.bin | 2 +- .../lib/test_files/merkle_tree_batch.bin | Bin 37152 -> 37357 bytes 10 files changed, 535 insertions(+), 478 deletions(-) diff --git a/batcher/Cargo.lock b/batcher/Cargo.lock index 438a67decc..391a839976 100644 --- a/batcher/Cargo.lock +++ b/batcher/Cargo.lock @@ -25,19 +25,13 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "adler2" version = "2.0.0" @@ -176,9 +170,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a43b18702501396fa9bcdeecd533bc85fac75150d308fc0f6800a01e6234a003" +checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" dependencies = [ "arrayvec", "bytes", @@ -195,7 +189,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -207,11 +201,11 @@ dependencies = [ "alloy-sol-macro-input", "const-hex", "heck", - "indexmap 2.2.6", + "indexmap 2.6.0", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "syn-solidity", "tiny-keccak", ] @@ -227,7 +221,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "syn-solidity", ] @@ -269,9 +263,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.14" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", @@ -284,33 +278,33 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -318,9 +312,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "ark-bn254" @@ -402,7 +396,7 @@ dependencies = [ "num-bigint 0.4.6", "num-traits", "paste", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "zeroize", ] @@ -558,15 +552,15 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "ascii-canvas" @@ -579,13 +573,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -596,7 +590,7 @@ checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" dependencies = [ "futures", "pharos", - "rustc_version 0.4.0", + "rustc_version 0.4.1", ] [[package]] @@ -613,7 +607,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -624,9 +618,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-config" -version = "1.5.6" +version = "1.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848d7b9b605720989929279fa644ce8f244d0ce3146fcca5b70e4eb7b3c020fc" +checksum = "7198e6f03240fdceba36656d8be440297b6b82270325908c7381f37d826a74f6" dependencies = [ "aws-credential-types", "aws-runtime", @@ -687,14 +681,14 @@ dependencies = [ "percent-encoding", "pin-project-lite", "tracing", - "uuid 1.9.1", + "uuid 1.10.0", ] [[package]] name = "aws-sdk-s3" -version = "1.49.0" +version = "1.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e518950d4ac43508c8bfc2fe4e24b0752d99eab80134461d5e162dcda0214b55" +checksum = "e2f2a62020f3e06f9b352b2a23547f6e1d110b6bf1e18a6b588ae36114eaf6e2" dependencies = [ "ahash", "aws-credential-types", @@ -727,9 +721,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.42.0" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27bf24cd0d389daa923e974b0e7c38daf308fc21e963c049f57980235017175e" +checksum = "e33ae899566f3d395cbf42858e433930682cc9c1889fa89318896082fef45efb" dependencies = [ "aws-credential-types", "aws-runtime", @@ -749,9 +743,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.43.0" +version = "1.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43b3220f1c46ac0e9dcc0a97d94b93305dacb36d1dd393996300c6b9b74364" +checksum = "f39c09e199ebd96b9f860b0fce4b6625f211e064ad7c8693b72ecf7ef03881e0" dependencies = [ "aws-credential-types", "aws-runtime", @@ -771,9 +765,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.42.0" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1c46924fb1add65bba55636e12812cae2febf68c0f37361766f627ddcca91ce" +checksum = "3d95f93a98130389eb6233b9d615249e543f6c24a68ca1f109af9ca5164a8765" dependencies = [ "aws-credential-types", "aws-runtime", @@ -919,9 +913,9 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "http-body 1.0.0", + "http-body 1.0.1", "httparse", - "hyper 0.14.29", + "hyper 0.14.30", "hyper-rustls 0.24.2", "once_cell", "pin-project-lite", @@ -950,9 +944,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.2.6" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03701449087215b5369c7ea17fef0dd5d24cb93439ec5af0c7615f58c3f22605" +checksum = "147100a7bea70fa20ef224a6bad700358305f5dc0f84649c53769761395b355b" dependencies = [ "base64-simd", "bytes", @@ -961,7 +955,7 @@ dependencies = [ "http 0.2.12", "http 1.1.0", "http-body 0.4.6", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", "itoa", "num-integer", @@ -993,7 +987,7 @@ dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "tracing", ] @@ -1008,9 +1002,9 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", - "hyper 1.4.0", + "hyper 1.4.1", "hyper-util", "itoa", "matchit", @@ -1041,7 +1035,7 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", "mime", "pin-project-lite", @@ -1054,18 +1048,18 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide", "object", "rustc-demangle", "serde", + "windows-targets 0.52.6", ] [[package]] @@ -1146,9 +1140,9 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 1.1.0", "shlex", - "syn 2.0.77", + "syn 2.0.79", "which", ] @@ -1208,21 +1202,21 @@ checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", "arrayvec", - "constant_time_eq 0.3.0", + "constant_time_eq 0.3.1", ] [[package]] name = "blake3" -version = "1.5.1" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", - "constant_time_eq 0.3.0", - "rayon", + "constant_time_eq 0.3.1", + "rayon-core", ] [[package]] @@ -1252,7 +1246,7 @@ name = "bonsai-sdk" version = "0.8.0" source = "git+https://github.com/risc0/risc0?tag=v1.0.1#79de616506543634cb5d75b9db7f3aee3640d68c" dependencies = [ - "reqwest 0.12.7", + "reqwest 0.12.8", "risc0-groth16", "serde", "thiserror", @@ -1282,22 +1276,22 @@ checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" [[package]] name = "bytemuck" -version = "1.16.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1308,9 +1302,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" dependencies = [ "serde", ] @@ -1348,9 +1342,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.7" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" dependencies = [ "serde", ] @@ -1380,9 +1374,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.20" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45bcde016d64c21da4be18b655631e5ab6d3107607e71a73a9f53eb48aae23fb" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ "jobserver", "libc", @@ -1467,9 +1461,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.13" +version = "4.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc" +checksum = "7be5744db7978a28d9df86a214130d106a89ce49644cbc4e3f0c22c3fba30615" dependencies = [ "clap_builder", "clap_derive", @@ -1477,9 +1471,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.13" +version = "4.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99" +checksum = "a5fbc17d3ef8278f55b282b2a2e75ae6f6c7d4bb70ed3d0382375104bfafdb4b" dependencies = [ "anstream", "anstyle", @@ -1489,21 +1483,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.13" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "clap_lex" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "cobs" @@ -1565,9 +1559,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "console" @@ -1609,9 +1603,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "constant_time_eq" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "convert_case" @@ -1631,15 +1625,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -1650,7 +1644,7 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a47af21622d091a8f0fb295b88bc886ac74efcc613efc19f5d0b21de5c89e47" dependencies = [ - "rustc_version 0.4.0", + "rustc_version 0.4.1", ] [[package]] @@ -1746,7 +1740,7 @@ dependencies = [ "cpufeatures", "curve25519-dalek-derive", "fiat-crypto", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "subtle", "zeroize", ] @@ -1759,14 +1753,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "darling" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -1774,27 +1768,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "darling_macro" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1853,8 +1847,8 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version 0.4.0", - "syn 2.0.77", + "rustc_version 0.4.1", + "syn 2.0.79", ] [[package]] @@ -1947,9 +1941,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dunce" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "ecdsa" @@ -2034,6 +2028,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "ena" version = "0.14.3" @@ -2078,9 +2078,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" dependencies = [ "log", "regex", @@ -2088,9 +2088,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.3" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" dependencies = [ "anstream", "anstyle", @@ -2291,7 +2291,7 @@ dependencies = [ "regex", "serde", "serde_json", - "syn 2.0.77", + "syn 2.0.79", "toml", "walkdir", ] @@ -2314,7 +2314,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "syn 2.0.77", + "syn 2.0.79", "toml", "walkdir", ] @@ -2332,7 +2332,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2347,7 +2347,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2365,7 +2365,7 @@ dependencies = [ "ethabi", "generic-array 0.14.7", "k256", - "num_enum 0.7.2", + "num_enum 0.7.3", "once_cell", "open-fastrlp", "rand", @@ -2373,7 +2373,7 @@ dependencies = [ "serde", "serde_json", "strum", - "syn 2.0.77", + "syn 2.0.79", "tempfile", "thiserror", "tiny-keccak", @@ -2394,7 +2394,7 @@ dependencies = [ "ethabi", "generic-array 0.14.7", "k256", - "num_enum 0.7.2", + "num_enum 0.7.3", "once_cell", "open-fastrlp", "rand", @@ -2402,7 +2402,7 @@ dependencies = [ "serde", "serde_json", "strum", - "syn 2.0.77", + "syn 2.0.79", "tempfile", "thiserror", "tiny-keccak", @@ -2629,9 +2629,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fastrlp" @@ -2710,12 +2710,12 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.33" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", - "miniz_oxide 0.8.0", + "miniz_oxide", ] [[package]] @@ -2724,6 +2724,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -2766,9 +2772,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -2781,9 +2787,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -2791,15 +2797,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -2808,9 +2814,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-locks" @@ -2824,26 +2830,26 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" @@ -2857,9 +2863,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -2922,15 +2928,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "git2" -version = "0.18.3" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "232e6a7bfe35766bf715e55a88b39a700596c0ccfd88cd3680b4cdb40d66ef70" +checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" dependencies = [ "bitflags 2.6.0", "libc", @@ -2992,7 +2998,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.2.6", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -3001,9 +3007,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" dependencies = [ "atomic-waker", "bytes", @@ -3011,7 +3017,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.1.0", - "indexmap 2.2.6", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -3077,6 +3083,17 @@ dependencies = [ "serde", ] +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + [[package]] name = "hashers" version = "1.0.1" @@ -3163,9 +3180,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http 1.1.0", @@ -3180,7 +3197,7 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "pin-project-lite", ] @@ -3204,9 +3221,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.29" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", @@ -3228,16 +3245,16 @@ dependencies = [ [[package]] name = "hyper" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4fe55fb7a772d59a5ff1dfbff4fe0258d19b89fec4b233e75d35d5d2316badc" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.5", + "h2 0.4.6", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "httparse", "httpdate", "itoa", @@ -3255,7 +3272,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.29", + "hyper 0.14.30", "log", "rustls 0.21.12", "rustls-native-certs", @@ -3265,20 +3282,20 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.4.0", + "hyper 1.4.1", "hyper-util", - "rustls 0.23.11", + "rustls 0.23.14", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", "tower-service", - "webpki-roots 0.26.5", + "webpki-roots 0.26.6", ] [[package]] @@ -3289,7 +3306,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.0", + "hyper 1.4.1", "hyper-util", "native-tls", "tokio", @@ -3299,29 +3316,28 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", - "http-body 1.0.0", - "hyper 1.4.0", + "http-body 1.0.1", + "hyper 1.4.1", "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -3413,12 +3429,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.0", "serde", ] @@ -3455,15 +3471,15 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is_terminal_polyfill" -version = "1.70.0" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" @@ -3509,18 +3525,18 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -3578,9 +3594,9 @@ dependencies = [ [[package]] name = "keccak-asm" -version = "0.1.1" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" dependencies = [ "digest 0.10.7", "sha3-asm", @@ -3618,9 +3634,8 @@ dependencies = [ [[package]] name = "lambdaworks-crypto" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb5d4f22241504f7c7b8d2c3a7d7835d7c07117f10bff2a7d96a9ef6ef217c3" +version = "0.10.0" +source = "git+https://github.com/lambdaclass/lambdaworks.git?rev=efd46f0b0aea3aa95d94bba7de86cb96611b40d3#efd46f0b0aea3aa95d94bba7de86cb96611b40d3" dependencies = [ "lambdaworks-math", "serde", @@ -3630,9 +3645,8 @@ dependencies = [ [[package]] name = "lambdaworks-math" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "358e172628e713b80a530a59654154bfc45783a6ed70ea284839800cebdf8f97" +version = "0.10.0" +source = "git+https://github.com/lambdaclass/lambdaworks.git?rev=efd46f0b0aea3aa95d94bba7de86cb96611b40d3#efd46f0b0aea3aa95d94bba7de86cb96611b40d3" dependencies = [ "serde", "serde_json", @@ -3655,15 +3669,15 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libgit2-sys" -version = "0.16.2+1.7.2" +version = "0.17.0+1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4126d8b4ee5c9d9ea891dd875cfdc1e9d0950437179104b183d7d8a74d24e8" +checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" dependencies = [ "cc", "libc", @@ -3673,9 +3687,9 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", "windows-targets 0.52.6", @@ -3699,9 +3713,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.18" +version = "1.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" +checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" dependencies = [ "cc", "libc", @@ -3733,11 +3747,11 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -3789,15 +3803,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - [[package]] name = "miniz_oxide" version = "0.8.0" @@ -3809,13 +3814,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -3988,11 +3994,11 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ - "num_enum_derive 0.7.2", + "num_enum_derive 0.7.3", ] [[package]] @@ -4009,14 +4015,14 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4036,21 +4042,18 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.36.1" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "oneshot" @@ -4085,9 +4088,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -4106,7 +4109,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4117,9 +4120,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -4456,7 +4459,7 @@ version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 1.0.109", @@ -4577,9 +4580,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.12" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c73c26c01b8c87956cea613c907c9d6ecffd8d18a2a5908e5de0adfaa185cea" +checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" dependencies = [ "memchr", "thiserror", @@ -4593,7 +4596,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.2.6", + "indexmap 2.6.0", ] [[package]] @@ -4603,7 +4606,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" dependencies = [ "futures", - "rustc_version 0.4.0", + "rustc_version 0.4.1", ] [[package]] @@ -4636,7 +4639,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4659,22 +4662,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4717,18 +4720,19 @@ checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "portable-atomic" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" [[package]] name = "postcard" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55c51ee6c0db07e68448e336cf8ea4131a620edefebf9893e759b2d793420f8" +checksum = "5f7f0a8d620d71c457dd1d47df76bb18960378da56af4527aaa10f515eee732e" dependencies = [ "cobs", - "embedded-io", + "embedded-io 0.4.0", + "embedded-io 0.6.1", "serde", ] @@ -4740,9 +4744,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "precomputed-hash" @@ -4752,12 +4759,12 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "prettyplease" -version = "0.2.20" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4782,7 +4789,7 @@ checksum = "714c75db297bc88a63783ffc6ab9f830698a6705aa0201416931759ef4c8183d" dependencies = [ "autocfg", "equivalent", - "indexmap 2.2.6", + "indexmap 2.6.0", ] [[package]] @@ -4797,11 +4804,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.21.1", + "toml_edit 0.22.22", ] [[package]] @@ -4830,9 +4837,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -4877,14 +4884,14 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "psm" -version = "0.1.21" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205" dependencies = [ "cc", ] @@ -4897,16 +4904,17 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quinn" -version = "0.11.2" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" dependencies = [ "bytes", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash", - "rustls 0.23.11", + "rustc-hash 2.0.0", + "rustls 0.23.14", + "socket2", "thiserror", "tokio", "tracing", @@ -4914,15 +4922,15 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.3" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ "bytes", "rand", "ring 0.17.8", - "rustc-hash", - "rustls 0.23.11", + "rustc-hash 2.0.0", + "rustls 0.23.14", "slab", "thiserror", "tinyvec", @@ -4931,22 +4939,22 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" +checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" dependencies = [ "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -5027,18 +5035,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", @@ -5047,9 +5055,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.6" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", @@ -5109,7 +5117,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.29", + "hyper 0.14.30", "hyper-rustls 0.24.2", "ipnet", "js-sys", @@ -5138,9 +5146,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", @@ -5148,12 +5156,12 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.4.5", + "h2 0.4.6", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", - "hyper 1.4.0", - "hyper-rustls 0.27.2", + "hyper 1.4.1", + "hyper-rustls 0.27.3", "hyper-tls", "hyper-util", "ipnet", @@ -5165,8 +5173,8 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.11", - "rustls-pemfile 2.1.3", + "rustls 0.23.14", + "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", "serde_json", @@ -5183,20 +5191,20 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 0.26.5", + "webpki-roots 0.26.6", "windows-registry", ] [[package]] name = "reqwest-middleware" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39346a33ddfe6be00cbc17a34ce996818b97b230b87229f10114693becca1268" +checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" dependencies = [ "anyhow", "async-trait", "http 1.1.0", - "reqwest 0.12.7", + "reqwest 0.12.8", "serde", "thiserror", "tower-service", @@ -5496,6 +5504,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "rustc-hex" version = "2.1.0" @@ -5513,18 +5527,18 @@ dependencies = [ [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver 1.0.23", ] [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ "bitflags 2.6.0", "errno", @@ -5547,14 +5561,14 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.11" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4828ea528154ae444e5a642dbb7d5623354030dc9822b83fd9bb79683c7399d0" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "once_cell", "ring 0.17.8", "rustls-pki-types", - "rustls-webpki 0.102.5", + "rustls-webpki 0.102.8", "subtle", "zeroize", ] @@ -5582,19 +5596,18 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" [[package]] name = "rustls-webpki" @@ -5608,9 +5621,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.5" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring 0.17.8", "rustls-pki-types", @@ -5677,7 +5690,7 @@ version = "2.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 1.0.109", @@ -5685,20 +5698,20 @@ dependencies = [ [[package]] name = "scc" -version = "2.1.17" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c947adb109a8afce5fc9c7bf951f87f146e9147b3a6a58413105628fb1d1e66" +checksum = "836f1e0f4963ef5288b539b643b35e043e76a32d0f4e47e67febf69576527f50" dependencies = [ "sdd", ] [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5765,9 +5778,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", "core-foundation", @@ -5778,9 +5791,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -5827,31 +5840,32 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.204" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.204" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -5874,14 +5888,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -5900,15 +5914,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.2.6", + "indexmap 2.6.0", "serde", "serde_derive", "serde_json", @@ -5918,14 +5932,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5934,7 +5948,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.2.6", + "indexmap 2.6.0", "itoa", "ryu", "serde", @@ -5963,7 +5977,7 @@ checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6000,9 +6014,9 @@ dependencies = [ [[package]] name = "sha3-asm" -version = "0.1.1" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" dependencies = [ "cc", "cfg-if", @@ -6423,7 +6437,7 @@ dependencies = [ "p3-fri", "p3-matrix", "prost", - "reqwest 0.12.7", + "reqwest 0.12.8", "reqwest-middleware", "serde", "serde_json", @@ -6475,15 +6489,15 @@ dependencies = [ [[package]] name = "stacker" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" +checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" dependencies = [ "cc", "cfg-if", "libc", "psm", - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -6530,7 +6544,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6581,9 +6595,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -6599,7 +6613,7 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6682,9 +6696,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand", @@ -6706,22 +6720,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6793,32 +6807,31 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6847,7 +6860,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.11", + "rustls 0.23.14", "rustls-pki-types", "tokio", ] @@ -6888,20 +6901,20 @@ dependencies = [ "futures-util", "log", "native-tls", - "rustls 0.23.11", + "rustls 0.23.14", "rustls-pki-types", "tokio", "tokio-native-tls", "tokio-rustls 0.26.0", "tungstenite 0.23.0", - "webpki-roots 0.26.5", + "webpki-roots 0.26.6", ] [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -6912,21 +6925,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.14" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.15", + "toml_edit 0.22.22", ] [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] @@ -6937,33 +6950,22 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.6", + "indexmap 2.6.0", "toml_datetime", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.21.1" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.2.6", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.22.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59a3a72298453f564e2b111fa896f8d07fabb36f51f06d7e875fc5e0b5a3ef1" -dependencies = [ - "indexmap 2.2.6", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.18", + "winnow 0.6.20", ] [[package]] @@ -6984,15 +6986,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -7014,7 +7016,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -7147,7 +7149,7 @@ dependencies = [ "log", "native-tls", "rand", - "rustls 0.23.11", + "rustls 0.23.14", "rustls-pki-types", "sha1", "thiserror", @@ -7166,9 +7168,9 @@ dependencies = [ "futures", "http 1.1.0", "http-body-util", - "hyper 1.4.0", + "hyper 1.4.1", "prost", - "reqwest 0.12.7", + "reqwest 0.12.8", "serde", "serde_json", "thiserror", @@ -7209,15 +7211,15 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" @@ -7236,9 +7238,9 @@ checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-xid" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unsafe-libyaml" @@ -7299,9 +7301,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.9.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" [[package]] name = "valuable" @@ -7317,9 +7319,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vergen" -version = "8.3.1" +version = "8.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27d6bdd219887a9eadd19e1c34f32e47fa332301184935c6d9bca26f3cca525" +checksum = "2990d9ea5967266ea0ccf413a4aa5c42a93dbcfda9cb49a97de6931726b12566" dependencies = [ "anyhow", "cfg-if", @@ -7330,9 +7332,9 @@ dependencies = [ [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vsimd" @@ -7376,34 +7378,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -7413,9 +7416,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7423,22 +7426,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "wasm-streams" @@ -7455,9 +7458,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -7481,9 +7484,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.5" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bd24728e5af82c6c4ec1b66ac4844bdf8156257fccda846ec58b42cd0cdbe6a" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" dependencies = [ "rustls-pki-types", ] @@ -7518,11 +7521,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -7739,9 +7742,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -7767,7 +7770,7 @@ dependencies = [ "js-sys", "log", "pharos", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "send_wrapper 0.6.0", "thiserror", "wasm-bindgen", @@ -7802,6 +7805,7 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] @@ -7813,7 +7817,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -7833,7 +7837,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -7904,9 +7908,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.12+zstd.1.5.6" +version = "2.0.13+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" dependencies = [ "cc", "pkg-config", diff --git a/batcher/aligned-batcher/Cargo.toml b/batcher/aligned-batcher/Cargo.toml index 86c752d235..88af04ecc5 100644 --- a/batcher/aligned-batcher/Cargo.toml +++ b/batcher/aligned-batcher/Cargo.toml @@ -23,7 +23,7 @@ ethers = { tag = "v2.0.15-fix-reconnections", features = [ "ws", "rustls", ], git = "https://github.com/yetanotherco/ethers-rs.git" } -lambdaworks-crypto = { version = "0.7.0", features = ["serde"] } +lambdaworks-crypto = { git = "https://github.com/lambdaclass/lambdaworks.git", rev = "efd46f0b0aea3aa95d94bba7de86cb96611b40d3", features = ["serde"] } serde_yaml = "0.9.34" sp1-sdk = { git = "https://github.com/succinctlabs/sp1.git", rev = "v1.0.1" } risc0-zkvm = { git = "https://github.com/risc0/risc0", tag = "v1.0.1" } diff --git a/batcher/aligned-batcher/src/lib.rs b/batcher/aligned-batcher/src/lib.rs index 21a5e9623e..d9cf990a73 100644 --- a/batcher/aligned-batcher/src/lib.rs +++ b/batcher/aligned-batcher/src/lib.rs @@ -754,19 +754,17 @@ impl Batcher { let current_batch_len = batch_state_lock.batch_queue.len(); let last_uploaded_batch_block_lock = self.last_uploaded_batch_block.lock().await; - // FIXME(marian): This condition should be changed to current_batch_size == 0 - // once the bug in Lambdaworks merkle tree is fixed. - if current_batch_len < 2 { - info!("Current batch is empty or length 1. Waiting for more proofs..."); + if current_batch_len == 0 { + info!("Current batch is empty. Waiting for more proofs..."); return None; } - if current_batch_len < self.min_batch_len + if batch_state_lock.batch_queue.len() < self.min_batch_len && block_number < *last_uploaded_batch_block_lock + self.max_block_interval { info!( "Current batch not ready to be posted. Current block: {} - Last uploaded block: {}. Current batch length: {} - Minimum batch length: {}", - block_number, *last_uploaded_batch_block_lock, current_batch_len, self.min_batch_len + block_number, *last_uploaded_batch_block_lock, batch_state_lock.batch_queue.len(), self.min_batch_len ); return None; } @@ -853,7 +851,11 @@ impl Batcher { .collect(); let batch_merkle_tree: MerkleTree = - MerkleTree::build(&batch_data_comm); + MerkleTree::build(&batch_data_comm).ok_or_else(|| { + BatcherError::TaskCreationError( + "Failed to Build Merkle Tree: Empty Batch".to_string(), + ) + })?; { let mut last_uploaded_batch_block = self.last_uploaded_batch_block.lock().await; diff --git a/batcher/aligned-sdk/Cargo.toml b/batcher/aligned-sdk/Cargo.toml index 004499ffa4..3704c6072a 100644 --- a/batcher/aligned-sdk/Cargo.toml +++ b/batcher/aligned-sdk/Cargo.toml @@ -21,7 +21,7 @@ tokio = { version = "1.37.0", features = [ "rt-multi-thread", "sync", ] } -lambdaworks-crypto = { version = "0.7.0", features = ["serde"] } +lambdaworks-crypto = { git = "https://github.com/lambdaclass/lambdaworks.git", rev = "efd46f0b0aea3aa95d94bba7de86cb96611b40d3", features = ["serde"] } serde = { version = "1.0.201", features = ["derive"] } sha3 = { version = "0.10.8" } url = "2.5.0" diff --git a/batcher/aligned/Cargo.toml b/batcher/aligned/Cargo.toml index 5c37437044..8f9a6a78a3 100644 --- a/batcher/aligned/Cargo.toml +++ b/batcher/aligned/Cargo.toml @@ -7,14 +7,27 @@ edition = "2021" serde = { version = "1.0.201", features = ["derive"] } serde_json = "1.0.117" futures-util = "0.3.30" -tokio = { version = "1.37.0", features = ["io-std", "time", "macros", "rt", "rt-multi-thread", "sync"] } -tokio-tungstenite = { version = "0.23.1", features = ["rustls-tls-webpki-roots", "native-tls"] } +tokio = { version = "1.37.0", features = [ + "io-std", + "time", + "macros", + "rt", + "rt-multi-thread", + "sync", +] } +tokio-tungstenite = { version = "0.23.1", features = [ + "rustls-tls-webpki-roots", + "native-tls", +] } url = "2.5.0" log = "0.4.21" env_logger = "0.11.3" clap = { version = "4.5.4", features = ["derive"] } -lambdaworks-crypto = { version = "0.7.0", features = ["serde"] } -ethers = { tag = "v2.0.15-fix-reconnections", features = ["ws", "rustls"], git = "https://github.com/yetanotherco/ethers-rs.git" } -aligned-sdk = { path = "../aligned-sdk"} +lambdaworks-crypto = { git = "https://github.com/lambdaclass/lambdaworks.git", rev = "efd46f0b0aea3aa95d94bba7de86cb96611b40d3", features = ["serde"] } +ethers = { tag = "v2.0.15-fix-reconnections", features = [ + "ws", + "rustls", +], git = "https://github.com/yetanotherco/ethers-rs.git" } +aligned-sdk = { path = "../aligned-sdk" } rpassword = "7.3.1" -sha3 = { version = "0.10.8"} +sha3 = { version = "0.10.8" } diff --git a/operator/merkle_tree/lib/Cargo.lock b/operator/merkle_tree/lib/Cargo.lock index 079878cdbd..6833d25727 100644 --- a/operator/merkle_tree/lib/Cargo.lock +++ b/operator/merkle_tree/lib/Cargo.lock @@ -52,6 +52,7 @@ name = "aligned-sdk" version = "0.1.0" dependencies = [ "ciborium", + "dialoguer", "ethers", "futures-util", "hex", @@ -433,6 +434,19 @@ dependencies = [ "thiserror", ] +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", +] + [[package]] name = "const-hex" version = "1.11.4" @@ -590,6 +604,19 @@ dependencies = [ "syn 1.0.109", ] +[[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", + "zeroize", +] + [[package]] name = "digest" version = "0.10.7" @@ -698,6 +725,12 @@ dependencies = [ "log", ] +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "encoding_rs" version = "0.8.34" @@ -1677,9 +1710,8 @@ dependencies = [ [[package]] name = "lambdaworks-crypto" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb5d4f22241504f7c7b8d2c3a7d7835d7c07117f10bff2a7d96a9ef6ef217c3" +version = "0.10.0" +source = "git+https://github.com/lambdaclass/lambdaworks.git?rev=efd46f0b0aea3aa95d94bba7de86cb96611b40d3#efd46f0b0aea3aa95d94bba7de86cb96611b40d3" dependencies = [ "lambdaworks-math", "serde", @@ -1689,9 +1721,8 @@ dependencies = [ [[package]] name = "lambdaworks-math" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "358e172628e713b80a530a59654154bfc45783a6ed70ea284839800cebdf8f97" +version = "0.10.0" +source = "git+https://github.com/lambdaclass/lambdaworks.git?rev=efd46f0b0aea3aa95d94bba7de86cb96611b40d3#efd46f0b0aea3aa95d94bba7de86cb96611b40d3" dependencies = [ "serde", "serde_json", @@ -2826,6 +2857,12 @@ dependencies = [ "keccak", ] +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + [[package]] name = "signature" version = "2.2.0" @@ -3407,6 +3444,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + [[package]] name = "unicode-xid" version = "0.2.4" diff --git a/operator/merkle_tree/lib/Cargo.toml b/operator/merkle_tree/lib/Cargo.toml index f862404cff..ba5fe61126 100644 --- a/operator/merkle_tree/lib/Cargo.toml +++ b/operator/merkle_tree/lib/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" serde = { version = "1.0.201", features = ["derive"] } serde_json = "1.0.117" bincode = "1.3.3" -lambdaworks-crypto = { version = "0.7.0", features = ["serde"] } +lambdaworks-crypto = { git = "https://github.com/lambdaclass/lambdaworks.git", rev = "efd46f0b0aea3aa95d94bba7de86cb96611b40d3", features = ["serde"] } hex = "0.4.3" sha3 = "0.10.8" aligned-sdk = { path = "../../../batcher/aligned-sdk" } diff --git a/operator/merkle_tree/lib/src/lib.rs b/operator/merkle_tree/lib/src/lib.rs index d5b55669d8..415b6363c3 100644 --- a/operator/merkle_tree/lib/src/lib.rs +++ b/operator/merkle_tree/lib/src/lib.rs @@ -43,8 +43,12 @@ pub extern "C" fn verify_merkle_tree_batch_ffi( let batch_data_comm: Vec = batch.into_iter().map(|v| v.into()).collect(); - let computed_batch_merkle_tree: MerkleTree = - MerkleTree::build(&batch_data_comm); + let Some(computed_batch_merkle_tree) = + MerkleTree::::build(&batch_data_comm) + else { + error!("Failed to build merkle tree, batch data commitment is empty"); + return false; + }; computed_batch_merkle_tree.root == *merkle_root } @@ -66,10 +70,7 @@ mod tests { merkle_root_file.read_to_end(&mut root_vec).unwrap(); let mut merkle_root = [0; 32]; - merkle_root.copy_from_slice( - &hex::decode(&root_vec) - .unwrap(), - ); + merkle_root.copy_from_slice(&hex::decode(&root_vec).unwrap()); let result = verify_merkle_tree_batch_ffi(bytes_vec.as_ptr(), bytes_vec.len(), &merkle_root); @@ -86,10 +87,7 @@ mod tests { merkle_root_file.read_to_end(&mut root_vec).unwrap(); let mut merkle_root = [0; 32]; - merkle_root.copy_from_slice( - &hex::decode(&root_vec) - .unwrap(), - ); + merkle_root.copy_from_slice(&hex::decode(&root_vec).unwrap()); let result = verify_merkle_tree_batch_ffi(bytes_vec.as_ptr(), bytes_vec.len(), &merkle_root); @@ -106,10 +104,7 @@ mod tests { merkle_root_file.read_to_end(&mut root_vec).unwrap(); let mut merkle_root = [0; 32]; - merkle_root.copy_from_slice( - &hex::decode(&root_vec) - .unwrap(), - ); + merkle_root.copy_from_slice(&hex::decode(&root_vec).unwrap()); let result = verify_merkle_tree_batch_ffi(bytes_vec.as_ptr(), bytes_vec.len(), &merkle_root); diff --git a/operator/merkle_tree/lib/test_files/merkle_root.bin b/operator/merkle_tree/lib/test_files/merkle_root.bin index 623903edd1..235f4cb7b0 100644 --- a/operator/merkle_tree/lib/test_files/merkle_root.bin +++ b/operator/merkle_tree/lib/test_files/merkle_root.bin @@ -1 +1 @@ -715181f01c095618472a72cd06e384d92f02eadc4ea28bf097181b17fdc57f28 \ No newline at end of file +d8f7329e4f522a871373c6251aa3c39be8b89766e54174c9e6457fcd491cd86d \ No newline at end of file diff --git a/operator/merkle_tree/lib/test_files/merkle_tree_batch.bin b/operator/merkle_tree/lib/test_files/merkle_tree_batch.bin index 733703c5436ea0c8c3815f83203b4b466e711ffa..6ad052ec7df7330d045dae1b420f3d96fbb37bad 100644 GIT binary patch literal 37357 zcmeI52T)b#)`mGEf&~#3cvXzv7z;76gHfW_29_AFLE+j#6qH0k5wS!~z^>RU2^K8G z7He#=1T-257y+w%{G=`|T&*onIb>jRJXPj~F+)oG2Is1J3`__8bVzKwb+WX8d zmlD}0Ix03IvPW>gLH%OFdiQD?9Tn5Fx=*9X8s4?ScrPk^_9CUKh1%&=mCl0pf)mb*T(n$TF2<_)_HUnB~Jd^Bq(j5)gYCX^`CCOjA zG@3aZX@~0R3w@`5=qkH3S6xQ6E3O(kuZoIvRaaLfXqE=Zi=j>J6t3@eLs?8)1}nbQ z*X(yer`157y30HNWX@$eiXj(ujMWw@MQt^ykj@rUJr}LiP6z#=Hu7_K({k3`q%>W_ zugmJBH}Eyfj(=)kegA*{MfB+(8XOVXr+-YslcV~?hDAq&M|A5N6A={|{6W~DL|aQ8 zQhTk(iL3T%scGuqAV2-6tx8vUwziUwlCif7B6V;?v2AXy>V`?@%tT>ut%RL_0v6l#D<@A5^-j-?Vz%XYYr;S%7++9sziKxYKXo< z=~uK|x4amcXrGhMg`NhOTv( zqOIOlW?_Abd=qq-Q2tEZb}-XazD5;OFJdr8bM+g~%A)fU@}Q))$(QfLNtv4D)g!{& zjA!GC|1xD@Ofu1Zjo7Yc%s3|6gafTmtd^GITpH%Tg{z+E@S$E;`GWdgYYS?xHfoD5 zsUz!TXf4jZ!g_nqEsfWUa^|?h94l19o#p%#r?GmEba-F$^fwZ+7MYuXK~*p?&K*Y@ zv0sozI;%r5qE$x!^l(+C8~MJ8NCl{bX4w(BG{if`Pf1I~kVj?6(doR-z}{+j@G7#j zWubKa%7_h!-k%?r>1_K<8}qQ{6n>DJlSVc+2j~DsPb0Ap^L&R+VdD)@9Uq@s;dN?<*9i5l7VcA{d-a-OU90)js`FNj@H#bpx`);F@$s&0 ziiIf_rdXI_VTy%0vM@&$=E%YvS(wuha~fh!L(FN2VHSp27-sR`%PhtLnKGT#%|jvj z1+-Mx5p3qK86ciWHXYUp#X^)0!5F8gAslNjAkq_b)CoYD0bwc&PAjF};I$55vi(rH zm0+9XU{n&1v-z^nVJuL!q>ix6FYvqzK);3nx=?KgOtsW) zI8g#79|mt;fGJJY89lUM(F?_#*8!MG@^&wbHT5Bpy&-CM^iX?jS_kbbuiNg>wZ6p^ z<)k%$!>i6bw8qUu$lP)lWE=n@I{=imz;0F4sFFiKo5RC~^A!ScY^(*)=Hra5h}U;P zfbRp}ULgQMAiv4l&Ffe^4uv0AAv6u(W~Eh5zBZ=%(v5jq!`nUsG*(AxPpDsI!ckA3 zv-Km!$2$U1z4-4BRkULC4(!nz@OHBh>Q>G{&l6y?3Ahx3y|aL~sesB-Sk|&&9-5kVV$i#(CR$vFS86IR!0EWi%G6+;Ld3%uvu}A zI_Xpl(D*ehaVF`}L=$LGTairjF+2;Sw<#fMzT5OHbd)GA483%XRP-y{?$t!zCWq0-l&N4#Oo3mskXr423Uk z05ST3ONM|=)_K580>MoS^mhQ_d*GeBTAmjw^)c-$CuvX{0e(;a`zdiZy+^AJKjfZhi2`T(~54Ka>l^jSdJPMRGr;Cge^olX!AsA?WM z71yI-Iq+*)CO8AQTuX0a6iX!);YqeDuag+{z75RWhQ>vIBJew$EfFTSR{jo%w*$&N zQ6-#-WE|XaterEA?k-W=SQxe!z|w0_?>tSQXBq89JmMgJDKNFfqL9uiv_kHNQGN>| zdMML0k{)OI9d^qda%S8RKM@SlUS@7jU6)_pyC$lYsKShBwa~Irf))f z<8Xj>GRyAH0eD~L2MS&VXx4UM?;Gqn$Cb{wQ*k1{M8{ zud7zW=w&(^6JVlNi)1qf{mi_-12R((ry^<90>Lai@6G!aP#+?0V>5tR*_>sBBu8(*gPJlx2YOA91 zll4|-rHz0z*B4}8UKnM6AnA2H`UbNSG2w^&He5}G)}8~aRzlNRaM=;4RR>3|SZQnh zds&^CrcV4@|EIq{&ryV_6Q)j>I$@3{o~R(tB$uX6m^xwVgsBszPMGr!bKYUjJD#Wm zkDr?J4#Ou5pLp^z^AVuFcKHBk-hi_i9$>CFpqaIyHQNCx9q81nC2xCJi!WatAw~ze zFgAe}!*nQ`^(V3tpq+AB=}sr#Ran|1u-$wPL{lJn;oz9z3WmqM1%N6CqiR9N;CZOg zI;A;4X!h$XH%9kjA1=XW1};3#L-(d1gvV;MOa>i2U^VOV=xR*84@A|ONi!K3&p3ZA zac16kv2~j>f2>QzfCe7$%pZ$j!hR6hO#rJWd@D@Jg&4xLL)7kr z##%ws`amrc0a|mwWqo0=^|AB>;*4=+(?LLFMot^*atHWW2YgAzug;3_K$)sA+WWd| zqlvU8;O!F_Rtn!Q(z5p(GwnvGwyuov1&B4I7c&9JuG9ONN&lda+PKk|7@&==V8rY^ z_`Ly4xSz;=$bNNMdNYjDlLaauMOpNJTW#~wZq|=J!PKSD|{tFgk$)i473T ziR?Cu*K;w%AJF$P6D5!-)}{4}aPa{qZo-;VdXohg&}=wGoeQgz6LJ58^ayq!?D0x< z<=ykZUH~SmEnv-oV7!H}#sHcPE9y0S@ZwI=r5C8M1AzP#?9x}i+9Ob$1Lg%e1Gy(a zew(RPQBr0N6P`og`YfEzq$T)12BXKqRVRaoH-Ip&!6xfNK3BmG-(=aTw5GlXI37%f zrLodd*6ggSt;|+z_Vi3;jt0qiq3& z&9LJd;F?^0d<$k23WvK(^Ph!1OEB~t)GdxhE;>Pok~GGFEh99v7|1jQQ$Giq&8PV^ zgCTQ4af9S*om0F}wmFX8yTE*~EKg8mDHg1vrg?Z02MXK;C~OD;v#zQ>$LpoAwREgF z2Atdu!=u|DXwCe-joCJ}354g7i+LuL7;n$?bE+#z9a+S%4;ZVDGh+QS9=~T@xi2T!l zg&mnImauuznmC&^hcfgs4jpIsP8et$t(?(zG^F|!$B>D<8U-q!4mLkbCN>9e9)%8C zOqEVZ8+w#uiVvA=89R@K_};-jE7xYD!9geMg6&?|m5p{W7;qgs1IX1bI^nE)#j*S} z`$vFMgQ3VDgHrdAk!RtNR+Hsi3c)ul`3=&wz+3C)1?iB=VaPR_y*?st1Ic15nv>PV z4X>&K^be`2BZ)kV3--Gs+cpH`Zn2IC)6fRGujmfN{*)wcrfe6Y)*1m4wT;BHfwleg zp#$#p#F>u7s57RXW$99=F&872@Eh8?eM4Ddc9`caajhSw*5b$SWbO&^%fg$cT;xXJ zsmJHRo2Fcta$(AaIlB0Z_vbd{!jubBE=;*F<-(kdn3IvGKK{d;j68J`lKaA(j2L!d z*u|eeEoi<<7KKekfs`hLpC*8`{DDQSbMVzB*vl3eOGiLX_k211Xjyccr6|Y=6m}Nk z^NSi5X9vN1=F)|B5Y*Pwg#llKkAfg;Lz%ZHWOAMpKxZ{?q=9xqc>7jixMdjlYC90A zA*?GE!g}5giWdd3ih%b`grO~^UvnV1=M;ReCLMD-FeeIT6$)F6gCF@hD!vFkch=2J zE4hKct|{A*p2sz;(HmZOQ1jgZQA_NwG1^^$9#%Pc!JKo578X_=XK3#^cko~!4Wv?M zmmCy(30#*#Tj_G$a)jj#24FVVm_iV_2zXs2K9%PEB|y?1T$#+LD1pBO){0P5CuKR( zyP1h6A&e@k-F(Q9b)(I;Ia?R8&|R2b7_YCvnfIu4esr#Bhu79k2C6}izo%RAJfk~8 z__}i0^h$_f6G&l2-OLZ7>koPz2btZ=*I zwok!|*8qW=@g$r{+rcQ86XPYoirxAq5q*UWIYHGMv+@TbH#Wv(>?^c_t9=wvZo{l4FK?N z$D&AGal`MinplLvfjDKc`&*FDvviLRhiO)#W3(USe=lpNGw~v_y(c0?Db)r-uYl*N zB;~{c#PtAFdjoNO8&dj+fJc&aHezmds5U~TFb1w9H@^UgCL?1DGPolBoyS=t4H9Zy z;O^(noIP;r0LJan)!g4>FN<-SI*}WJ|9gDCV+vCzOr0=w!W>ULt{>0r-5kd+5_3FZ zjwj6VggNi{Po*$*!kl-Q^A5u&9v?WE^A5u&44-)VQ_rVDj5ZgC^CUqg+i>Y}0B4&k zp(n2c9ydC`y-ou$Lka;}{4}W;yz($C<^W8o3>4}D&6L?-oNpmL<#KLP*pnWqCgH0j4@JML5{9DfDS7ys0r@ zCkU2yhH?AgXrF>GJ%NAaK|WSvV+hOcwRZ+!9mk9T*5{skajAO~+}O{vqxAS)#+LF- zI+`t?L;e!!>8r17t0ufqo_RH=y>1FCE&#}O0r2^u(?FFhg20oZeCg1_04yGl9tVJ0 zBLQ|pL187uzHMC6Hqzt)!u-ZQZf+ zyL_ZZC}LJeg?{?U>Tf+l%W5XNzJYQ3Af<1B6CWbe9289ZhS&1z(Y-IRc@-Y(uPinFadrPvZ5}>yQ$oCHV>>_nH=BpHD?{ Px0q8B!!Z7b7{ literal 37152 zcmeI52T)dL*2j5)7ZFjAB7e);8){rd#cr&tQG>l;LsUR4fQUVIi6vr*J+Z_Zj9EpE zt}V8;mxWlPQR6BWu$Q1l(fwUr^X1Dp-+azE-q6`p1R!?b9$eI<9B=z`9WZl`4jDEINGdGVRu7MQNFaYqfT1y8fYftj{o+ScR$@f8^}pj${}RLp?5$-i$EGcYVRGCZ<-Xk27;R7mfzA@gianK}}) zCop&|t;3)a`WXi^c)p}qT~ljaP>fb$*ta_4tQapf^N?_=5<=cqdDYe_+`EcDTkyW0 z(lk-y5Lg=Er>7e0%kcMg#EV7QLgR*7uNHjwQ>y0kxJi#)G#LFRxgm0H6-Kd3>W>9C z5qCFBF<)00zOE8ffp>{or6g_7#kvh)rN*j=z9s^iXd%OIM9% zfXOU)3;p1(axBjZZ_KF3vBfHA!-?~HtnG;0#FhSsh=Xsi_z6b?^j#LZ2}_C+Y@aIL zn>j|{`!3e4EZqWB$eTAU)H$1e)FW*8llG_#=0~W8UH%%))SnTDCm3`kT7IX3OuijY zBW+l}NqaTUPa#^DL-{n-1^LR*u9}YFZGKGn6Tvo?us%%4l+juyAF1c8)>Qq(sQCz| z{v4UX3MQz4vpVP_KTU8&mCHJ=IEH(SO&{oU9*goEqvJW0?x8P{wwXR=s>`h00pisk zH)AogIFnV?VmGx{O(NkL5oDv;aE-#AW6U*&VUFTWH54nXeVR;cTqSlIa~c#viOssF zrHEJyUAGZO=QR6u6h;s18^YNe5gXb!qlhApWyo2I`*k8%UKeu7&zq-$$fX_}hyYNi_7^fw0;_5qF^13C@jUrqfJ ziZ$$|Wp^zy^iFx^F67w7=+o6p-y`HajQWrnk2=5!AAryjar+Di@s0znR-?yV-Ueu= zhQhLvIZ)IaE_Rr1vuE7w}?Gm_j0Ix4sVugB&08s?=+++Pc$sY zrZo8SR#vNwFN>BA8f?hhbSEvrD&gZaP;X=8D9P&P<Gij*M|h zoje(QJkCb@q0dcN>vLM%QvIyjV~70qf+~(ihi15u%&YpoMA(|FblL!^ugbJd(P${q zbI#3!VEdF{EUI)*J_ttI&WLv$AJZWk)#3N!dFStjt8v8iJ?!jND}uwQnDLTl?tb~hg4#aN+}a$hgs}6m zE;1{p(tTDU3^@Fp6R$E(wnNZKoM^>p+=ZdXylMs;f!e)20I0v>kiQpgURa6Xo#M-x_;nj%SPSIT-3BWyNQvr}EEJ+n0oa9rET=(! zTVwrK;L5UKs;8c~m_apO893M^x)%YmtGwE9y zX>&us=Hls4faXV3Esh12-gAN46-1z}aN<0OR7#E9QFIGTZ8xJFf$S#1D33r!`(Vi^ zP+U2n+#3Ep^HG8qaJMZj_o02fp26gXda^cS0HAeLAS*-eu}TylYJwZo@ebA%gza4f z&s~6NKL&dyvU0_+|D>*ZvhZbD({{kjb~#z|5?G({a+MY<*clSKhYp!cGtZ6ykFc#F zKBb^mD^@p_9*sDdt_#l2to>BPiGy4oAu2{u&X`CM;~?l?6@;D#Urc_#Uw-b^< zta4#28jXi(VC&}q$?IrJ6{s^p?Zfz*Ojk)!R*~dvoLZ#C-dMa4_s0-E#hswTm$3MR z%DKWfhvUmc#IeeH+vDD259YW5L(hZ0P0-;Pb97;VWAOH1qHiUZO~jw_yiY@+E?D1{ zu(Pq$XK0^E&x!2QLa}xPgQqf{KchU;ua1QKdL*gI^wU|0LCEm|LwyXauWyB}_4U4L zGEKI4rT-rv-{zviWDAomOtvuB7XQCnJxsPR*}`NClPyfPFgp>m6ZxO}NX<^uC;g;Fiu+qHnn*-GAoq;E%!k1E^N3n3VSSl%xx-(W;FUZgmh|gDW zof%YKt_3K~rEdyt_CQEK0IF4^AH>y_|IAD5MvOusIUdGJYjn?_?gdcD;c~~#<^1mt((HT z0twIRiaR{687gkUqY9MUjmNtpFtZ;Zf%}10-(&JTKvo`Zah`?06A*G0iZt@b1=BrB z5o9EsuO!?q9^zRI6xq&PV4A6c+0QlDFe zqZS}62ZAi*qcjg-YGWo&!iIDP9t^{5kKAK0GSP+DxyMii35wQm*>*gKD9*;w3OE_T z`Xzum#i575yxO3^C(yiaL7#OXj)S;2d#5+P)C19OZ~>f-K(q$B??K7)UK=v*=XV{1 z!6(z0+n*p@uUhUP%jFofRwwO*UZ7U{VnZ0iTQ}VgAOOAB#A2Cq^r?H>>z~_Y&PQV2`>8U@2)Iy6h9}J&Xhr(%$k8>5v*hq zT(mNaF%;$J&}68RvQbXEO5v~m?|Oe+)8vQOEAad0x4D)u`N8A|lON3W1Nq~PWtk>F znEYV!gUJsjKbZZ6*`OdTHJdKMdQPHXj~Ea z76Dgl>_f#~DJuSgneiuAAWj_oFba&doYKqDjCS8yGhG2&$)L8!K%1ee;Rdw{vg#?B zHx%-Dn9|Oj*#S$#0g;P9LTf13o6X~8@DU}Tz@of7-&Tqrt<%-W5&E?f>=z0eoeL(q zrWot|f2V-*G&4NJik8@s2Lg3bzh;MgB}1S39|r_mA`WE5+OoJ4b;MQ0y)k141o9TDv_!65EOjqX z+iEYsU`Hw+2heGR1IIG3U?p_5n z20Otl293b)2>oaW6kc(J)K-B=wqzML5mBuWb1o;rLzbZ*r-F1kJ8qBT4B1AL z2b?RR1n4L#PWgS9J}hS@R5(#n>{{puQ*91n-bvwWOO+(hY-qGyld>T71Ni7CSTmk; zscsGkZFSC(JpkQK3>(D?pGJgAv>psPZBO(+P$4T;t*`f0b!oE0EB*iQ_%@dhCOeqy zV6ua`c6c+KG}*yq2a_F4b}-q&>@3XA!f*$(voPGja0lqvI(_Er3RWrS1BKa0saG#P zN`N^{P-hQVOgm2+ou}+87~VFR`pKHqkqx86O8CzZ?Q*2JaTj-KKLMtUreoO4sR@nP66Vi`1@3kLS)~A`?qkBX zY#^e1eqLa^4i;W`r%3V`&~*!v^mM|oJpjkM5T;|Gr;bQ+f+D+Km^BOrwU|#*-9c(| z0J)<9W7W_kmB-c`7_D|*ki&blUuNA_eHf{0L&647I5*0bn$QWTa0hp%0?5+zkqL7z$m<@z#ql_}@hJb_eFU?st2m2rHp~S>jL4xf zPSmrG!=B3?cGf8znPY*E3vl2dzrHbn@or&BSAL*f59-$(pji`Gb}}c?(7+Y&R-3*H zSb-a$yp6Pf>Z3vKlu7;*{Mj2cw;UK<0!+M*6-rliZxwLGpGe%;itml6<(vhCrbshC zjqCHqx_Nz<*8ApwY?p?2p2VySN*=Ah74-!g)JN={7`2+<3gh@RhG_;`oTbgqaNkt? z32;=wTz2SUX^cLD2}ziL8HkvOQ4c-QeuRe;N=)I^3()ovBBnDCa5@@Z!Xkg*?E~r{ zC!xV8CTq+S&>>_Cf6y_^CT5#5JpWjW{0yyju=k4u{T z@OlkiKfleTgUJsjKbZVrt{=!9Z>*U#`N8A|lOIfeF!{mkFUKN$Y- z>TiiJpolC8TJjejlPD$|N(opzrD?MPDTM$eF%;tU1_(_DN1ml5ay_hXEg&gHm+f}I zKZM9;BUdke!KuqC@UXGn`K2D4=uK3O~x% zo-_6eel_24;M8U%x@QO2RB;40b))!gE7f|fKwxv=Qq`c9@c^SPprmb(%_zHSWCb#H zS92de=mJ6dk%qZpl=Hb6Io=I0x1J)maLoA<`ZEeTSJ27;?-Wrkq?mLV?%wu8sYPh{ zXVlB&R^XjzwbTv@>j+_-jVzg9)GdIotGHPonl+2Y=iyoH;8K&_5atjl?kTF5)X$zk zvlk%4Q<`aqoAvb49&ZMD!3>*OnN4(C$&fRs3><*p^&y%Ib0PRhbXy5F91bPh2~e!Z z0;~fI$3n->(KHaKIhz5-AX5q2roo*@Bi=7OrZPw~7I~`!>pqwU-5_#1Ae$X2EnJd4 zJ9B@*kv+7`7tL1 z^tKAi8?%gQL|kv0*CT=&;CEx-^a(g?9Q5yjC-yYgIZtMj`nb?}G2^CL<(3@zT;F-% z(q5`DlQcOe40CN++McEbtR@!Bdf?ZESFj_1YL2zX&5A|n-eT8#B; zz>#8nI+Cd$5x^rEtrR_WXCd}CQsNkbc=6V+;k=@ZEEv)kglPTF%$~SA3jqr-XbIFB z&Lp2R>?|bROl&W}>qI)W(|jV&#+fq!1D-k{S&;5#VU(m?Iaxoe;C2Y1Toy(=-v?`} zXqb)uy?n4GQ2DI5wZ7gLsWh45mHvNte4C32lPOH5Fqy(!Q%wGS4tXQCG?~I=3X>^J irZAbp>^{uyW9~9`QHE3e{;J{Mug&hmaEkvLPVq0T3M~Kt From 54cabeae6f90dd2a5072fc8d7a3b17ceecf3c0b6 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau <76252340+MarcosNicolau@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:21:37 -0300 Subject: [PATCH 10/12] refactor: zkquiz setup and testing locally/devnet (#1153) Co-authored-by: Urix <43704209+uri-99@users.noreply.github.com> --- batcher/aligned-sdk/src/core/types.rs | 18 ++++++ examples/zkquiz/Makefile | 13 +++++ examples/zkquiz/README.md | 22 +++++++ examples/zkquiz/contracts/.devnet.env | 4 ++ examples/zkquiz/quiz/script/src/main.rs | 78 +++++++++---------------- 5 files changed, 85 insertions(+), 50 deletions(-) create mode 100644 examples/zkquiz/contracts/.devnet.env diff --git a/batcher/aligned-sdk/src/core/types.rs b/batcher/aligned-sdk/src/core/types.rs index b392ae6b05..a11bb75fbd 100644 --- a/batcher/aligned-sdk/src/core/types.rs +++ b/batcher/aligned-sdk/src/core/types.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + use ethers::core::k256::ecdsa::SigningKey; use ethers::signers::Signer; use ethers::signers::Wallet; @@ -344,6 +346,22 @@ pub enum Network { HoleskyStage, } +impl FromStr for Network { + type Err = String; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "holesky" => Ok(Network::Holesky), + "holesky-stage" => Ok(Network::HoleskyStage), + "devnet" => Ok(Network::Devnet), + _ => Err( + "Invalid network, possible values are: \"holesky\", \"holesky-stage\", \"devnet\"" + .to_string(), + ), + } + } +} + #[cfg(test)] mod tests { use ethers::signers::LocalWallet; diff --git a/examples/zkquiz/Makefile b/examples/zkquiz/Makefile index 45dfc53242..62812913ca 100644 --- a/examples/zkquiz/Makefile +++ b/examples/zkquiz/Makefile @@ -1,6 +1,11 @@ +SHELL := /bin/bash + deploy_verifier: @. ./contracts/.env && . ./contracts/deploy.sh +deploy_verifier_devnet: + @. ./contracts/.devnet.env && . ./contracts/deploy.sh + CONTRACT_ADDRESS=0xA828f1463074d26FB761c662F80194f5dB2d31D0 RPC_URL=https://ethereum-holesky-rpc.publicnode.com VERIFICATION_DATA=./aligned_verification_data/0a1fab5df88a71e48633cbdeedc8d1a234b790d15a8a2fd04cd6a03c1e05b5ef_212.json @@ -10,3 +15,11 @@ answer_quiz: --keystore-path $(KEYSTORE_PATH) \ --rpc-url $(RPC_URL) \ --verifier-contract-address $(CONTRACT_ADDRESS) + +answer_quiz_local: + @cd quiz/script && cargo run -r -- \ + --keystore-path ../../../../config-files/devnet/keys/operator-3.ecdsa.key.json \ + --rpc-url http://localhost:8545 \ + --batcher-url ws://localhost:8080 \ + --network devnet \ + --verifier-contract-address $(CONTRACT_ADDRESS) diff --git a/examples/zkquiz/README.md b/examples/zkquiz/README.md index 1b32c390e7..14dc790c12 100644 --- a/examples/zkquiz/README.md +++ b/examples/zkquiz/README.md @@ -52,3 +52,25 @@ This will: 3. Pay & submit proof to aligned for verification 4. Wait for proof to be verified in aligned 5. Claim NFT if proof is verified + +## Testing locally + +If you want to test the zk quiz on a local network follow these steps: + +1. Setup Aligned locally following [this guide](../../docs/3_guides/6_setup_aligned.md) + +3. Move into the zkquiz example: + ``` + cd examples/zkquiz + ``` + +4. Deploy the ZKQuiz verifier contract, and locate the `CONTRACT_ADDRESS` from its output: + ``` + make deploy_verifier_devnet + ``` + + +5. Run the quiz: + ``` + CONTRACT_ADDRESS= make answer_quiz_local + ``` diff --git a/examples/zkquiz/contracts/.devnet.env b/examples/zkquiz/contracts/.devnet.env new file mode 100644 index 0000000000..9b51f9cafe --- /dev/null +++ b/examples/zkquiz/contracts/.devnet.env @@ -0,0 +1,4 @@ +RPC_URL=http://localhost:8545 +PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 # a rich anvil account +ALIGNED_SERVICE_MANAGER_ADDRESS=0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8 +BATCHER_PAYMENT_SERVICE_ADDRESS=0x7969c5eD335650692Bc04293B07F5BF2e7A673C0 diff --git a/examples/zkquiz/quiz/script/src/main.rs b/examples/zkquiz/quiz/script/src/main.rs index 07e565f53b..69d0092fbd 100644 --- a/examples/zkquiz/quiz/script/src/main.rs +++ b/examples/zkquiz/quiz/script/src/main.rs @@ -1,12 +1,10 @@ #![feature(slice_flatten)] - use std::io; -use std::sync::Arc; use aligned_sdk::core::types::{ AlignedVerificationData, Network, PriceEstimate, ProvingSystemId, VerificationData, }; -use aligned_sdk::sdk::{estimate_fee, get_payment_service_address}; +use aligned_sdk::sdk::{deposit_to_aligned, estimate_fee}; use aligned_sdk::sdk::{get_next_nonce, submit_and_wait_verification}; use clap::Parser; use dialoguer::Confirm; @@ -18,11 +16,8 @@ use sp1_sdk::{ProverClient, SP1Stdin}; abigen!(VerifierContract, "VerifierContract.json",); -const BATCHER_URL: &str = "wss://batcher.alignedlayer.com"; const ELF: &[u8] = include_bytes!("../../program/elf/riscv32im-succinct-zkvm-elf"); -const NETWORK: Network = Network::Holesky; - #[derive(Parser, Debug)] #[command(version, about, long_about = None)] struct Args { @@ -34,6 +29,10 @@ struct Args { default_value = "https://ethereum-holesky-rpc.publicnode.com" )] rpc_url: String, + #[arg(short, long, default_value = "wss://batcher.alignedlayer.com")] + batcher_url: String, + #[arg(short, long, default_value = "holesky")] + network: Network, #[arg(short, long)] verifier_contract_address: H160, } @@ -48,20 +47,27 @@ async fn main() { let keystore_password = rpassword::prompt_password("Enter keystore password: ") .expect("Failed to read keystore password"); - let wallet = LocalWallet::decrypt_keystore(args.keystore_path, &keystore_password) - .expect("Failed to decrypt keystore") - .with_chain_id(17000u64); - let provider = Provider::::try_from(rpc_url.as_str()).expect("Failed to connect to provider"); - let signer = Arc::new(SignerMiddleware::new(provider.clone(), wallet.clone())); + let chain_id = provider + .get_chainid() + .await + .expect("Failed to get chain_id"); + + let wallet = LocalWallet::decrypt_keystore(args.keystore_path, &keystore_password) + .expect("Failed to decrypt keystore") + .with_chain_id(chain_id.as_u64()); + + let signer = SignerMiddleware::new(provider.clone(), wallet.clone()); if Confirm::with_theme(&dialoguer::theme::ColorfulTheme::default()) .with_prompt("Do you want to deposit 0.004eth in Aligned ?\nIf you already deposited Ethereum to Aligned before, this is not needed") .interact() .expect("Failed to read user input") { - deposit_to_batcher(wallet.address(), signer.clone()).await.expect("Failed to pay for proof submission"); + + deposit_to_aligned(U256::from(4000000000000000u128), signer.clone(), args.network).await + .expect("Failed to pay for proof submission"); } // Generate proof. @@ -114,7 +120,7 @@ async fn main() { pub_input: None, }; - let max_fee = estimate_fee(&rpc_url, PriceEstimate::Default) + let max_fee = estimate_fee(&rpc_url, PriceEstimate::Instant) .await .expect("failed to fetch gas price from the blockchain"); @@ -126,14 +132,16 @@ async fn main() { .expect("Failed to read user input") { return; } - let nonce = get_next_nonce(&rpc_url, wallet.address(), NETWORK) + let nonce = get_next_nonce(&rpc_url, wallet.address(), args.network) .await .expect("Failed to get next nonce"); + println!("Submitting your proof..."); + let aligned_verification_data = submit_and_wait_verification( - BATCHER_URL, + &args.batcher_url, &rpc_url, - NETWORK, + args.network, &verification_data, max_fee, wallet.clone(), @@ -143,9 +151,10 @@ async fn main() { .unwrap(); println!( - "Proof submitted and verified successfully on batch {}, claiming prize...", + "Proof submitted and verified successfully on batch {}", hex::encode(aligned_verification_data.batch_merkle_root) ); + println!("Claiming NFT prize..."); claim_nft_with_verified_proof( &aligned_verification_data, @@ -193,43 +202,12 @@ fn read_answer() -> char { } } -async fn deposit_to_batcher( - from: Address, - signer: Arc, LocalWallet>>, -) -> anyhow::Result<()> { - let addr = get_payment_service_address(NETWORK); - - let tx = TransactionRequest::new() - .from(from) - .to(addr) - .value(4000000000000000u128); - - match signer - .send_transaction(tx, None) - .await - .map_err(|e| anyhow::anyhow!("Failed to send tx {}", e))? - .await - .map_err(|e| anyhow::anyhow!("Failed to submit tx {}", e))? - { - Some(receipt) => { - println!( - "Payment sent. Transaction hash: {:x}", - receipt.transaction_hash - ); - Ok(()) - } - None => { - anyhow::bail!("Payment failed"); - } - } -} - async fn claim_nft_with_verified_proof( aligned_verification_data: &AlignedVerificationData, - signer: Arc, LocalWallet>>, + signer: SignerMiddleware, LocalWallet>, verifier_contract_addr: &Address, ) -> anyhow::Result<()> { - let verifier_contract = VerifierContract::new(*verifier_contract_addr, signer); + let verifier_contract = VerifierContract::new(*verifier_contract_addr, signer.into()); let index_in_batch = U256::from(aligned_verification_data.index_in_batch); let merkle_path = Bytes::from( From a6f2fc03422bd6ea1cef2233e5b4b3e37e19d08f Mon Sep 17 00:00:00 2001 From: Marcos Nicolau <76252340+MarcosNicolau@users.noreply.github.com> Date: Tue, 8 Oct 2024 16:21:24 -0300 Subject: [PATCH 11/12] fix: operator commands (#1184) --- Makefile | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index f3f7579b22..338ba4b908 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ .PHONY: help tests +SHELL := /bin/bash OS := $(shell uname -s) CONFIG_FILE?=config-files/config.yaml @@ -15,6 +16,11 @@ ifeq ($(OS),Darwin) BUILD_ALL_FFI = $(MAKE) build_all_ffi_macos endif +ifeq ($(OS),Linux) + export LD_LIBRARY_PATH := $(CURDIR)/operator/risc_zero/lib +endif + + FFI_FOR_RELEASE ?= true ifeq ($(FFI_FOR_RELEASE),true) @@ -32,7 +38,7 @@ submodules: git submodule update --init --recursive @echo "Updated submodules" -deps: submodules build_all_ffi ## Install deps +deps: submodules go_deps build_all_ffi ## Install deps go_deps: @echo "Installing Go dependencies..." @@ -94,6 +100,8 @@ anvil_start_with_block_time: @echo "Starting Anvil..." anvil --load-state contracts/scripts/anvil/state/alignedlayer-deployed-anvil-state.json --block-time 7 +_AGGREGATOR_: + aggregator_start: @echo "Starting Aggregator..." @go run aggregator/cmd/main.go --config $(AGG_CONFIG_FILE) \ @@ -103,16 +111,21 @@ aggregator_send_dummy_responses: @echo "Sending dummy responses to Aggregator..." @cd aggregator && go run dummy/submit_task_responses.go + +__OPERATOR__: + operator_start: @echo "Starting Operator..." go run operator/cmd/main.go start --config $(CONFIG_FILE) \ 2>&1 | zap-pretty +operator_full_registration: operator_get_eth operator_register_with_eigen_layer operator_mint_mock_tokens operator_deposit_into_mock_strategy operator_whitelist_devnet operator_register_with_aligned_layer + operator_register_and_start: operator_full_registration operator_start build_operator: deps @echo "Building Operator..." - @go build -ldflags "-X main.Version=$(OPERATOR_VERSION) -r $(LD_LIBRARY_PATH):$(CURDIR)/operator/risc_zero/lib" -o ./operator/build/aligned-operator ./operator/cmd/main.go + @go build -ldflags "-X main.Version=$(OPERATOR_VERSION) -r $(LD_LIBRARY_PATH)" -o ./operator/build/aligned-operator ./operator/cmd/main.go @echo "Operator built into /operator/build/aligned-operator" update_operator: @@ -126,7 +139,6 @@ operator_valid_marshall_fuzz_macos: operator_valid_marshall_fuzz_linux: @cd operator/pkg && \ - LD_LIBRARY_PATH=$(LD_LIBRARY_PATH):$(CURDIR)/operator/risc_zero/lib \ go test -fuzz=FuzzValidMarshall operator_marshall_unmarshall_fuzz_macos: @@ -134,7 +146,6 @@ operator_marshall_unmarshall_fuzz_macos: operator_marshall_unmarshall_fuzz_linux: @cd operator/pkg && \ - LD_LIBRARY_PATH=$(LD_LIBRARY_PATH):$(CURDIR)/operator/risc_zero/lib \ go test -fuzz=FuzzMarshalUnmarshal bindings: @@ -186,9 +197,8 @@ operator_whitelist: @. contracts/scripts/.env && . contracts/scripts/whitelist_operator.sh $(OPERATOR_ADDRESS) operator_deposit_into_mock_strategy: - @echo "Depositing into strategy" + @echo "Depositing into mock strategy" $(eval STRATEGY_ADDRESS = $(shell jq -r '.addresses.strategies.MOCK' contracts/script/output/devnet/eigenlayer_deployment_output.json)) - @go run operator/cmd/main.go deposit-into-strategy \ --config $(CONFIG_FILE) \ --strategy-address $(STRATEGY_ADDRESS) \ @@ -207,7 +217,6 @@ operator_register_with_aligned_layer: operator_deposit_and_register: operator_deposit_into_strategy operator_register_with_aligned_layer -operator_full_registration: operator_get_eth operator_register_with_eigen_layer operator_mint_mock_tokens operator_deposit_into_mock_strategy operator_whitelist_devnet operator_register_with_aligned_layer __BATCHER__: @@ -504,7 +513,6 @@ test_risc_zero_go_bindings_macos: build_risc_zero_macos test_risc_zero_go_bindings_linux: build_risc_zero_linux @echo "Testing RISC Zero Go bindings..." - LD_LIBRARY_PATH=$(LD_LIBRARY_PATH):$(CURDIR)/operator/risc_zero/lib \ go test ./operator/risc_zero/... -v generate_risc_zero_fibonacci_proof: From a883da19e63652ad9fba7eab1cf00dd54883edf4 Mon Sep 17 00:00:00 2001 From: Marcos Nicolau <76252340+MarcosNicolau@users.noreply.github.com> Date: Tue, 8 Oct 2024 16:37:55 -0300 Subject: [PATCH 12/12] fix: operator resets channel when updating latest block file (#1200) --- operator/pkg/operator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/operator/pkg/operator.go b/operator/pkg/operator.go index 58cec3a6a4..48c82f07b0 100644 --- a/operator/pkg/operator.go +++ b/operator/pkg/operator.go @@ -176,7 +176,7 @@ func (o *Operator) UpdateLastProcessBatch(blockNumber uint32) error { return nil } - o.lastProcessedBatch = OperatorLastProcessedBatch{BlockNumber: blockNumber} + o.lastProcessedBatch.BlockNumber = blockNumber // write to a file so it can be recovered in case of operator outage json, err := json.Marshal(o.lastProcessedBatch)