From 7375575f42cb14a00e3989fda7254002eab9b7d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Tue, 7 Oct 2025 16:49:24 -0300 Subject: [PATCH 01/20] first approach --- crates/common/types/blobs_bundle.rs | 14 ++++--- crates/common/types/transaction.rs | 15 ++++---- crates/l2/Makefile | 10 ++--- crates/l2/based/block_fetcher.rs | 5 ++- crates/l2/monitor/widget/batches.rs | 11 ++++-- crates/l2/networking/rpc/l2/batch.rs | 7 +++- crates/l2/sdk/src/sdk.rs | 4 +- crates/l2/sequencer/l1_committer.rs | 12 ++++-- crates/l2/sequencer/proof_coordinator.rs | 2 +- crates/l2/storage/src/store.rs | 12 ++++-- .../networking/p2p/rlpx/l2/l2_connection.rs | 7 +++- fixtures/genesis/l1-dev.json | 6 +++ fixtures/genesis/l2.json | 38 ++++++++++++------- tooling/genesis/src/genesis.rs | 1 + 14 files changed, 97 insertions(+), 47 deletions(-) diff --git a/crates/common/types/blobs_bundle.rs b/crates/common/types/blobs_bundle.rs index 725a51a3ae..d11d6e4158 100644 --- a/crates/common/types/blobs_bundle.rs +++ b/crates/common/types/blobs_bundle.rs @@ -1,6 +1,8 @@ use std::ops::AddAssign; use crate::serde_utils; +#[cfg(feature = "c-kzg")] +use crate::types::Fork; use crate::types::constants::VERSIONED_HASH_VERSION_KZG; use crate::{Bytes, H256}; @@ -80,7 +82,7 @@ impl BlobsBundle { // In the future we might want to provide a new method that calculates the commitments and proofs using the following. #[cfg(feature = "c-kzg")] - pub fn create_from_blobs(blobs: &Vec) -> Result { + pub fn create_from_blobs(blobs: &Vec, fork: Fork) -> Result { use ethrex_crypto::kzg::blob_to_kzg_commitment_and_proof; let mut commitments = Vec::new(); let mut proofs = Vec::new(); @@ -266,8 +268,9 @@ mod tests { }) .collect(); - let blobs_bundle = crate::types::BlobsBundle::create_from_blobs(&blobs) - .expect("Failed to create blobs bundle"); + let blobs_bundle = + crate::types::BlobsBundle::create_from_blobs(&blobs, crate::types::Fork::Prague) + .expect("Failed to create blobs bundle"); let blob_versioned_hashes = blobs_bundle.generate_versioned_hashes(); @@ -403,8 +406,9 @@ mod tests { let blobs = std::iter::repeat_n(blob, super::MAX_BLOB_COUNT_ELECTRA + 1).collect::>(); - let blobs_bundle = crate::types::BlobsBundle::create_from_blobs(&blobs) - .expect("Failed to create blobs bundle"); + let blobs_bundle = + crate::types::BlobsBundle::create_from_blobs(&blobs, crate::types::Fork::Prague) + .expect("Failed to create blobs bundle"); let blob_versioned_hashes = blobs_bundle.generate_versioned_hashes(); diff --git a/crates/common/types/transaction.rs b/crates/common/types/transaction.rs index a8df1275fb..f81e151640 100644 --- a/crates/common/types/transaction.rs +++ b/crates/common/types/transaction.rs @@ -1498,9 +1498,9 @@ mod serde_impl { use serde_json::Value; use std::{collections::HashMap, str::FromStr}; - #[cfg(feature = "c-kzg")] - use crate::types::BYTES_PER_BLOB; use crate::types::{AccessListItem, AuthorizationTuple, BlobsBundleError}; + #[cfg(feature = "c-kzg")] + use crate::types::{BYTES_PER_BLOB, Fork}; use super::*; @@ -2302,10 +2302,11 @@ mod serde_impl { } #[cfg(feature = "c-kzg")] - impl TryFrom for WrappedEIP4844Transaction { - type Error = GenericTransactionError; - - fn try_from(value: GenericTransaction) -> Result { + impl WrappedEIP4844Transaction { + pub fn from_generic_tx( + value: GenericTransaction, + fork: Fork, + ) -> Result { let blobs = value .blobs .iter() @@ -2320,7 +2321,7 @@ mod serde_impl { Ok(Self { tx: value.try_into()?, wrapper_version: None, - blobs_bundle: BlobsBundle::create_from_blobs(&blobs)?, + blobs_bundle: BlobsBundle::create_from_blobs(&blobs, fork)?, }) } } diff --git a/crates/l2/Makefile b/crates/l2/Makefile index 4c848c7dc3..d827cb2fc4 100644 --- a/crates/l2/Makefile +++ b/crates/l2/Makefile @@ -69,7 +69,7 @@ down-l1-docker: ## 🛑 Shuts down the L1 Lambda ethrex Client restart-l1-docker: down-l1-docker init-l1-docker ## 🔄 Restarts the L1 Lambda ethrex Client init-l1: ## 🚀 Initializes an L1 Lambda ethrex Client - cargo run --release --manifest-path ../../Cargo.toml --bin ethrex -- \ + ../../target/release/ethrex \ --network ${L1_GENESIS_FILE_PATH} \ --http.port ${L1_PORT} \ --http.addr ${L1_RPC_ADDRESS} \ @@ -78,11 +78,11 @@ init-l1: ## 🚀 Initializes an L1 Lambda ethrex Client --datadir ${ethrex_L1_DEV_DB} rm-db-l1: ## 🛑 Removes the DB used by the L1 - cargo run --release --manifest-path ../../Cargo.toml --bin ethrex -- removedb --datadir ${ethrex_L1_DEV_DB} --force + ../../target/release/ethrex removedb --datadir ${ethrex_L1_DEV_DB} --force deploy-l1: ## 📜 Deploys the L1 contracts COMPILE_CONTRACTS=true \ - cargo run --release --bin ethrex --manifest-path ../../Cargo.toml -- l2 deploy \ + ../../target/release/ethrex l2 deploy \ --eth-rpc-url ${L1_RPC_URL} \ --private-key ${L1_PRIVATE_KEY} \ --risc0.verifier-address 0x00000000000000000000000000000000000000aa \ @@ -119,7 +119,7 @@ deploy-l1-sp1: ## 📜 Deploys the L1 contracts init-l2: ## 🚀 Initializes an L2 Lambda ethrex Client export $(shell cat ../../cmd/.env | xargs); \ - cargo run --release --manifest-path ../../Cargo.toml --bin ethrex -- \ + ../../target/release/ethrex \ l2 \ --watcher.block-delay 0 \ --network ${L2_GENESIS_FILE_PATH} \ @@ -155,7 +155,7 @@ down-l2: ## 🛑 Shuts down the L2 Lambda ethrex Client pgrep -a -f "ethrex l2" | awk '!/prover/ {print $1}' | xargs -r kill -s SIGINT rm-db-l2: ## 🛑 Removes the DB used by the L2 - cargo run --release --manifest-path ../../Cargo.toml --bin ethrex -- l2 removedb --datadir ${ethrex_L2_DEV_DB} --force + ../../target/release/ethrex l2 removedb --datadir ${ethrex_L2_DEV_DB} --force restart-l2: down-l2 rm-db-l2 init-l2 ## 🔄 Restarts the L2 Lambda ethrex Client diff --git a/crates/l2/based/block_fetcher.rs b/crates/l2/based/block_fetcher.rs index 15240974da..856f1cce14 100644 --- a/crates/l2/based/block_fetcher.rs +++ b/crates/l2/based/block_fetcher.rs @@ -388,8 +388,9 @@ impl BlockFetcher { ) .map_err(|_| BlockFetcherError::BlobBundleError)?; - let (blobs_bundle, _) = - generate_blobs_bundle(&state_diff).map_err(|_| BlockFetcherError::BlobBundleError)?; + let fork = self.blockchain.current_fork().await?; + let (blobs_bundle, _) = generate_blobs_bundle(&state_diff, fork) + .map_err(|_| BlockFetcherError::BlobBundleError)?; Ok(Batch { number: batch_number.as_u64(), diff --git a/crates/l2/monitor/widget/batches.rs b/crates/l2/monitor/widget/batches.rs index 855298b161..fa928f1473 100644 --- a/crates/l2/monitor/widget/batches.rs +++ b/crates/l2/monitor/widget/batches.rs @@ -1,4 +1,7 @@ -use ethrex_common::{Address, H256, types::batch::Batch}; +use ethrex_common::{ + Address, H256, + types::{Fork, batch::Batch}, +}; use ethrex_l2_sdk::get_last_committed_batch; use ethrex_rpc::EthClient; use ethrex_storage_rollup::StoreRollup; @@ -82,8 +85,9 @@ impl BatchesTable { refreshed_batches.push(batch.clone()); } else { let batch_number = batch.number; + // TODO: change this let new_batch = rollup_store - .get_batch(batch_number) + .get_batch(batch_number, Fork::Prague) .await .map_err(|e| MonitorError::GetBatchByNumber(batch_number, e))? .ok_or(MonitorError::BatchNotFound(batch_number))?; @@ -131,8 +135,9 @@ impl BatchesTable { let mut new_batches = Vec::new(); for batch_number in *from + 1..=to { + // TODO: change this fork let batch = rollup_store - .get_batch(batch_number) + .get_batch(batch_number, Fork::Prague) .await .map_err(|e| MonitorError::GetBatchByNumber(batch_number, e))? .ok_or(MonitorError::BatchNotFound(batch_number))?; diff --git a/crates/l2/networking/rpc/l2/batch.rs b/crates/l2/networking/rpc/l2/batch.rs index 5a1ae0add9..b1e32bd6be 100644 --- a/crates/l2/networking/rpc/l2/batch.rs +++ b/crates/l2/networking/rpc/l2/batch.rs @@ -92,7 +92,12 @@ impl RpcHandler for GetBatchByBatchNumberRequest { async fn handle(&self, context: RpcApiContext) -> Result { debug!("Requested batch with number: {}", self.batch_number); - let Some(batch) = context.rollup_store.get_batch(self.batch_number).await? else { + let fork = context.l1_ctx.blockchain.current_fork().await?; + let Some(batch) = context + .rollup_store + .get_batch(self.batch_number, fork) + .await? + else { return Ok(Value::Null); }; let rpc_batch = RpcBatch::build(batch, self.block_hashes, &context.l1_ctx.storage).await?; diff --git a/crates/l2/sdk/src/sdk.rs b/crates/l2/sdk/src/sdk.rs index 92fe1dd072..40513354ab 100644 --- a/crates/l2/sdk/src/sdk.rs +++ b/crates/l2/sdk/src/sdk.rs @@ -1,6 +1,7 @@ use bytes::Bytes; use calldata::encode_calldata; use ethereum_types::{H160, H256, U256}; +use ethrex_common::types::Fork; use ethrex_common::utils::keccak; use ethrex_common::{ Address, @@ -669,7 +670,8 @@ pub async fn send_generic_transaction( signed_tx.encode(&mut encoded_tx); } TxType::EIP4844 => { - let mut tx: WrappedEIP4844Transaction = generic_tx.try_into()?; + // TODO: see how to check for fork + let mut tx = WrappedEIP4844Transaction::from_generic_tx(generic_tx, Fork::Prague)?; tx.tx .sign_inplace(signer) .await diff --git a/crates/l2/sequencer/l1_committer.rs b/crates/l2/sequencer/l1_committer.rs index d542e4c9d8..db399a691f 100644 --- a/crates/l2/sequencer/l1_committer.rs +++ b/crates/l2/sequencer/l1_committer.rs @@ -12,7 +12,7 @@ use ethrex_blockchain::{Blockchain, vm::StoreVmDatabase}; use ethrex_common::{ Address, H256, U256, types::{ - AccountUpdate, BLOB_BASE_FEE_UPDATE_FRACTION, BlobsBundle, Block, BlockNumber, + AccountUpdate, BLOB_BASE_FEE_UPDATE_FRACTION, BlobsBundle, Block, BlockNumber, Fork, MIN_BASE_FEE_PER_BLOB_GAS, TxType, batch::Batch, blobs_bundle, fake_exponential_checked, }, }; @@ -206,7 +206,8 @@ impl L1Committer { get_last_committed_batch(&self.eth_client, self.on_chain_proposer_address).await?; let batch_to_commit = last_committed_batch_number + 1; - let batch = match self.rollup_store.get_batch(batch_to_commit).await? { + let fork = self.blockchain.current_fork().await?; + let batch = match self.rollup_store.get_batch(batch_to_commit, fork).await? { Some(batch) => batch, None => { let last_committed_blocks = self @@ -448,7 +449,9 @@ impl L1Committer { &acc_privileged_txs, acc_account_updates.clone().into_values().collect(), )?; - generate_blobs_bundle(&state_diff) + // TODO: review if we have to check for fork in the eth_client + let fork = self.blockchain.current_fork().await?; + generate_blobs_bundle(&state_diff, fork) } else { Ok((BlobsBundle::default(), 0_usize)) }; @@ -778,6 +781,7 @@ impl GenServer for L1Committer { /// Generate the blob bundle necessary for the EIP-4844 transaction. pub fn generate_blobs_bundle( state_diff: &StateDiff, + fork: Fork, ) -> Result<(BlobsBundle, usize), CommitterError> { let blob_data = state_diff.encode().map_err(CommitterError::from)?; @@ -786,7 +790,7 @@ pub fn generate_blobs_bundle( let blob = blobs_bundle::blob_from_bytes(blob_data).map_err(CommitterError::from)?; Ok(( - BlobsBundle::create_from_blobs(&vec![blob]).map_err(CommitterError::from)?, + BlobsBundle::create_from_blobs(&vec![blob], fork).map_err(CommitterError::from)?, blob_size, )) } diff --git a/crates/l2/sequencer/proof_coordinator.rs b/crates/l2/sequencer/proof_coordinator.rs index 8eb0073106..08fd90d3d5 100644 --- a/crates/l2/sequencer/proof_coordinator.rs +++ b/crates/l2/sequencer/proof_coordinator.rs @@ -492,7 +492,7 @@ impl ProofCoordinator { mut commitments, mut proofs, .. - } = BlobsBundle::create_from_blobs(&blob)?; + } = BlobsBundle::create_from_blobs(&blob, self.blockchain.current_fork().await?)?; match (commitments.pop(), proofs.pop()) { (Some(commitment), Some(proof)) => (commitment, proof), _ => return Err(ProofCoordinatorError::MissingBlob(batch_number)), diff --git a/crates/l2/storage/src/store.rs b/crates/l2/storage/src/store.rs index 62df78a2a9..8b626e717e 100644 --- a/crates/l2/storage/src/store.rs +++ b/crates/l2/storage/src/store.rs @@ -7,7 +7,7 @@ use crate::store_db::in_memory::Store as InMemoryStore; use crate::store_db::sql::SQLStore; use ethrex_common::{ H256, - types::{AccountUpdate, Blob, BlobsBundle, BlockNumber, batch::Batch}, + types::{AccountUpdate, Blob, BlobsBundle, BlockNumber, Fork, batch::Batch}, }; use ethrex_l2_common::prover::{BatchProof, ProverType}; use tracing::info; @@ -153,7 +153,12 @@ impl Store { self.engine.get_last_batch_number().await } - pub async fn get_batch(&self, batch_number: u64) -> Result, RollupStoreError> { + pub async fn get_batch( + &self, + batch_number: u64, + // TODO: Should we get the fork from the last block of the batch instead? + fork: Fork, + ) -> Result, RollupStoreError> { let Some(blocks) = self.get_block_numbers_by_batch(batch_number).await? else { return Ok(None); }; @@ -181,7 +186,8 @@ impl Store { &self .get_blobs_by_batch(batch_number) .await? - .unwrap_or_default() + .unwrap_or_default(), + fork, ).map_err(|e| { RollupStoreError::Custom(format!("Failed to create blobs bundle from blob while getting batch from database: {e}. This is a bug")) })?; diff --git a/crates/networking/p2p/rlpx/l2/l2_connection.rs b/crates/networking/p2p/rlpx/l2/l2_connection.rs index ffa524ef94..e6acd0588c 100644 --- a/crates/networking/p2p/rlpx/l2/l2_connection.rs +++ b/crates/networking/p2p/rlpx/l2/l2_connection.rs @@ -411,7 +411,12 @@ pub(crate) async fn send_sealed_batch(established: &mut Established) -> Result<( { return Ok(()); } - let Some(batch) = l2_state.store_rollup.get_batch(next_batch_to_send).await? else { + let fork = established.blockchain.current_fork().await?; + let Some(batch) = l2_state + .store_rollup + .get_batch(next_batch_to_send, fork) + .await? + else { return Ok(()); }; match l2_state diff --git a/fixtures/genesis/l1-dev.json b/fixtures/genesis/l1-dev.json index 0de2675f6e..35adc8377f 100644 --- a/fixtures/genesis/l1-dev.json +++ b/fixtures/genesis/l1-dev.json @@ -17,6 +17,7 @@ "shanghaiTime": 0, "cancunTime": 0, "pragueTime": 0, + "osakaTime": 0, "depositContractAddress": "0x00000000219ab540356cbb839cbe05303d7705fa", "blobSchedule": { "cancun": { @@ -28,6 +29,11 @@ "target": 6, "max": 9, "baseFeeUpdateFraction": 5007716 + }, + "osaka": { + "target": 6, + "max": 9, + "baseFeeUpdateFraction": 5007716 } }, "mergeNetsplitBlock": 0 diff --git a/fixtures/genesis/l2.json b/fixtures/genesis/l2.json index 297493b1e6..f04be53cab 100644 --- a/fixtures/genesis/l2.json +++ b/fixtures/genesis/l2.json @@ -20,19 +20,29 @@ "depositContractAddress": "0x00000000219ab540356cbb839cbe05303d7705fa", "blobSchedule": { "cancun": { - "target": 3, + "baseFeeUpdateFraction": 3338477, "max": 6, - "baseFeeUpdateFraction": 3338477 + "target": 3 }, "prague": { - "target": 6, + "baseFeeUpdateFraction": 5007716, "max": 9, - "baseFeeUpdateFraction": 5007716 + "target": 6 }, "osaka": { - "target": 6, + "baseFeeUpdateFraction": 5007716, "max": 9, - "baseFeeUpdateFraction": 5007716 + "target": 6 + }, + "bpo1": { + "baseFeeUpdateFraction": 8346193, + "max": 15, + "target": 10 + }, + "bpo2": { + "baseFeeUpdateFraction": 11684671, + "max": 21, + "target": 14 } }, "mergeNetsplitBlock": 0, @@ -47,19 +57,19 @@ "coinbase": "0x0000000000000000000000000000000000000000", "alloc": { "0x000000000000000000000000000000000000effe": { - "code": "0x60806040526004361015610013575b61016f565b61001d5f3561003b565b8062cffbe514610036576360206aab0361000e5761013a565b610098565b60e01c90565b60405190565b5f80fd5b5f80fd5b90565b61005b8161004f565b0361006257565b5f80fd5b9050359061007382610052565b565b9060208282031261008e5761008b915f01610066565b90565b61004b565b5f0190565b346100c6576100b06100ab366004610075565b610299565b6100b8610041565b806100c281610093565b0390f35b610047565b5f9103126100d557565b61004b565b1c90565b90565b6100f19060086100f693026100da565b6100de565b90565b9061010491546100e1565b90565b6101125f5f906100f9565b90565b90565b61012190610115565b9052565b9190610138905f60208501940190610118565b565b3461016a5761014a3660046100cb565b610166610155610107565b61015d610041565b91829182610125565b0390f35b610047565b5f80fd5b90565b90565b61018d61018861019292610173565b610176565b610115565b90565b5f1c90565b6101a66101ab91610195565b6100de565b90565b6101b8905461019a565b90565b634e487b7160e01b5f52601160045260245ffd5b6101de6101e491939293610115565b92610115565b82018092116101ef57565b6101bb565b5f1b90565b906102055f19916101f4565b9181191691161790565b61022361021e61022892610115565b610176565b610115565b90565b90565b9061024361023e61024a9261020f565b61022b565b82546101f9565b9055565b60018060a01b031690565b61026d6102686102729261024e565b610176565b61024e565b90565b61027e90610259565b90565b61028a90610275565b90565b6102969061004f565b90565b6102bd6102b76102a96001610179565b6102b25f6101ae565b6101cf565b5f61022e565b33906102c85f6101ae565b906103056102ff6102f97f18d7b705344d616d1b61daa6a8ccfcf9f10c27ade007cc45cf870d1e121f1a9d95610281565b9261028d565b9261020f565b9261030e610041565b8061031881610093565b0390a456fea26469706673582212204396f246249f52e780861cf7c8e99ebc34211e11586f573a735d1178cc6f3e8664736f6c634300081d0033", + "code": "0x60806040526004361015610013575b61016f565b61001d5f3561003b565b8062cffbe514610036576360206aab0361000e5761013a565b610098565b60e01c90565b60405190565b5f80fd5b5f80fd5b90565b61005b8161004f565b0361006257565b5f80fd5b9050359061007382610052565b565b9060208282031261008e5761008b915f01610066565b90565b61004b565b5f0190565b346100c6576100b06100ab366004610075565b610299565b6100b8610041565b806100c281610093565b0390f35b610047565b5f9103126100d557565b61004b565b1c90565b90565b6100f19060086100f693026100da565b6100de565b90565b9061010491546100e1565b90565b6101125f5f906100f9565b90565b90565b61012190610115565b9052565b9190610138905f60208501940190610118565b565b3461016a5761014a3660046100cb565b610166610155610107565b61015d610041565b91829182610125565b0390f35b610047565b5f80fd5b90565b90565b61018d61018861019292610173565b610176565b610115565b90565b5f1c90565b6101a66101ab91610195565b6100de565b90565b6101b8905461019a565b90565b634e487b7160e01b5f52601160045260245ffd5b6101de6101e491939293610115565b92610115565b82018092116101ef57565b6101bb565b5f1b90565b906102055f19916101f4565b9181191691161790565b61022361021e61022892610115565b610176565b610115565b90565b90565b9061024361023e61024a9261020f565b61022b565b82546101f9565b9055565b60018060a01b031690565b61026d6102686102729261024e565b610176565b61024e565b90565b61027e90610259565b90565b61028a90610275565b90565b6102969061004f565b90565b6102bd6102b76102a96001610179565b6102b25f6101ae565b6101cf565b5f61022e565b33906102c85f6101ae565b906103056102ff6102f97f18d7b705344d616d1b61daa6a8ccfcf9f10c27ade007cc45cf870d1e121f1a9d95610281565b9261028d565b9261020f565b9261030e610041565b8061031881610093565b0390a456fea264697066735822122085976b05d9410090ae778bab2768fabc3204b3042d036664a6d9276cec95b9d764736f6c634300081d0033", "storage": {}, "balance": "0x0", "nonce": "0x1" }, "0x000000000000000000000000000000000000efff": { - "code": "0x60806040526004361015610013575b610383565b61001d5f3561009c565b806351cff8d91461009757806358bc83371461009257806379204fe01461008d57806379c0cdef146100885780637e1233a914610083578063b0f4d3951461007e578063d23061db146100795763fccc28130361000e5761034e565b610308565b6102df565b6102aa565b610262565b61022b565b61018a565b610109565b60e01c90565b60405190565b5f80fd5b60018060a01b031690565b6100c0906100ac565b90565b6100cc816100b7565b036100d357565b5f80fd5b905035906100e4826100c3565b565b906020828203126100ff576100fc915f016100d7565b90565b6100a8565b5f0190565b61011c6101173660046100e6565b610710565b6101246100a2565b8061012e81610104565b0390f35b5f80fd5b5f91031261014057565b6100a8565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b610165610145565b90565b610171906100b7565b9052565b9190610188905f60208501940190610168565b565b346101ba5761019a366004610136565b6101b66101a561015d565b6101ad6100a2565b91829182610175565b0390f35b610132565b90565b6101cb816101bf565b036101d257565b5f80fd5b905035906101e3826101c2565b565b608081830312610226576101fb825f83016100d7565b9261022361020c84602085016100d7565b9361021a81604086016100d7565b936060016101d6565b90565b6100a8565b3461025d5761024761023e3660046101e5565b92919091610af7565b61024f6100a2565b8061025981610104565b0390f35b610132565b346102945761027e6102753660046101e5565b92919091610ce9565b6102866100a2565b8061029081610104565b0390f35b610132565b61fffe90565b6102a7610299565b90565b346102da576102ba366004610136565b6102d66102c561029f565b6102cd6100a2565b91829182610175565b0390f35b610132565b6102f26102ed3660046100e6565b610cf7565b6102fa6100a2565b8061030481610104565b0390f35b3461033a5761032461031b3660046101e5565b92919091610dfe565b61032c6100a2565b8061033681610104565b0390f35b610132565b5f90565b61034b61033f565b90565b3461037e5761035e366004610136565b61037a610369610343565b6103716100a2565b91829182610175565b0390f35b610132565b5f80fd5b90565b90565b6103a161039c6103a692610387565b61038a565b6101bf565b90565b60209181520190565b60207f7665000000000000000000000000000000000000000000000000000000000000917f5769746864726177616c20616d6f756e74206d75737420626520706f736974695f8201520152565b61040c60226040926103a9565b610415816103b2565b0190565b61042e9060208101905f8183039101526103ff565b90565b1561043857565b6104406100a2565b62461bcd60e51b81528061045660048201610419565b0390fd5b905090565b61046a5f809261045a565b0190565b6104779061045f565b90565b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906104a29061047a565b810190811067ffffffffffffffff8211176104bc57604052565b610484565b906104d46104cd6100a2565b9283610498565b565b67ffffffffffffffff81116104f4576104f060209161047a565b0190565b610484565b9061050b610506836104d6565b6104c1565b918252565b606090565b3d5f14610530576105253d6104f9565b903d5f602084013e5b565b610538610510565b9061052e565b5f7f4661696c656420746f206275726e204574686572000000000000000000000000910152565b61057260146020926103a9565b61057b8161053e565b0190565b6105949060208101905f818303910152610565565b90565b1561059e57565b6105a66100a2565b62461bcd60e51b8152806105bc6004820161057f565b0390fd5b6105d46105cf6105d9926100ac565b61038a565b6100ac565b90565b6105e5906105c0565b90565b6105f1906105dc565b90565b61060861060361060d926101bf565b61038a565b6101bf565b90565b610619906105c0565b90565b61062590610610565b90565b610631906105dc565b90565b60601b90565b61064390610634565b90565b61064f9061063a565b90565b61065e610663916100b7565b610646565b9052565b90565b61067661067b916101bf565b610667565b9052565b926106ac60146106b4946106a4828861069c60209b9a8399610652565b018092610652565b018092610652565b01809261066a565b0190565b60200190565b5190565b5f80fd5b60e01b90565b5f9103126106d657565b6100a8565b90565b6106e7906106db565b9052565b91906106fe905f602085019401906106de565b565b6107086100a2565b3d5f823e3d90fd5b61072c346107266107205f61038d565b916101bf565b11610431565b61075f5f8061073961033f565b346107426100a2565b908161074d8161046e565b03925af1610759610515565b50610597565b3381349061079f6107996107937fbb2689ff876f7ef453cf8865dde5ab10349d222e2e1383c5152fbdb083f02da2956105e8565b926105e8565b926105f4565b926107a86100a2565b806107b281610104565b0390a46107cd6107c86107c3610299565b61061c565b610628565b9062cffbe59061080f6107de610145565b6108006107e9610145565b9334906107f46100a2565b9586946020860161067f565b60208201810382520382610498565b61082161081b826106be565b916106b8565b20823b1561089557610852926108475f809461083b6100a2565b968795869485936106c6565b8352600483016106eb565b03925af1801561089057610864575b50565b610883905f3d8111610889575b61087b8183610498565b8101906106cc565b5f610861565b503d610871565b610700565b6106c2565b6108a3906105dc565b90565b60207f6520627269646765000000000000000000000000000000000000000000000000917f436f6d6d6f6e4272696467654c323a2063616c6c6572206973206e6f742074685f8201520152565b61090060286040926103a9565b610909816108a6565b0190565b6109229060208101905f8183039101526108f3565b90565b1561092c57565b6109346100a2565b62461bcd60e51b81528061094a6004820161090d565b0390fd5b9061097e9392916109793361097361096d6109683061089a565b6100b7565b916100b7565b14610925565b610a16565b565b63ffffffff1690565b63ffffffff60e01b1690565b6109a96109a46109ae92610980565b6106c6565b610989565b90565b6109ba906101bf565b9052565b6109f36109fa946109e96060949897956109df608086019a5f870190610168565b6020850190610168565b6040830190610168565b01906109b1565b565b151590565b9190610a14905f602085019401906109b1565b565b92919092610a855f80610a283061089a565b6004610a6c6379c0cdef610a5d88918b8d610a448d9293610995565b94610a4d6100a2565b97889660208801908152016109be565b60208201810382520382610498565b82602082019151925af1610a7e610515565b50156109fc565b610ae4575b92909192610adf610acd610ac7610ac17ff5353a2477e10b23280de25ca6cea55c17bb48000d8807ee631e514080e7fb4e946105e8565b946105e8565b946105e8565b94610ad66100a2565b91829182610a01565b0390a4565b610af2818584908692610f16565b610a8a565b90610b0393929161094e565b565b90610b35939291610b3033610b2a610b24610b1f3061089a565b6100b7565b916100b7565b14610925565b610bb6565b565b610b40906105c0565b90565b610b4c90610b37565b90565b610b58906105dc565b90565b90505190610b68826100c3565b565b90602082820312610b8357610b80915f01610b5b565b90565b6100a8565b15610b8f57565b5f80fd5b916020610bb4929493610bad60408201965f830190610168565b01906109b1565b565b90610bc090610b43565b610be46020610bce83610b4f565b63c2eeeebd90610bdc6100a2565b9384926106c6565b8252815f81610bf560048201610104565b03925af18015610ce457610c2c93610c27925f92610cac575b50610c1b610c21916100b7565b916100b7565b14610b88565b610b4f565b916318bf5077919092803b15610ca757610c595f8094610c64610c4d6100a2565b978896879586946106c6565b845260048401610b93565b03925af18015610ca257610c76575b50565b610c95905f3d8111610c9b575b610c8d8183610498565b8101906106cc565b5f610c73565b503d610c83565b610700565b6106c2565b610c21919250610cd5610c1b9160203d8111610cdd575b610ccd8183610498565b810190610b6a565b929150610c0e565b503d610cc3565b610700565b90610cf5939291610b05565b565b610d245f808334610d066100a2565b9081610d118161046e565b03925af1610d1d610515565b50156109fc565b610d6f575b3490610d6a610d587f85a190caa61692b36b63a55e069330d18ab9af179fed7a25c16a4262bc63b7d2926105e8565b92610d616100a2565b91829182610a01565b0390a2565b610d783061089a565b6351cff8d934919091908390803b15610df957610da85f93610db395610d9c6100a2565b968795869485936106c6565b835260048301610175565b03925af18015610df457610dc8575b50610d29565b610de7905f3d8111610ded575b610ddf8183610498565b8101906106cc565b5f610dc2565b503d610dd5565b610700565b6106c2565b929091610e1d82610e17610e115f61038d565b916101bf565b11610431565b610e2e610e2984610b43565b610b4f565b93632b8c49e3338496803b15610f1157610e5b5f8094610e66610e4f6100a2565b9b8c96879586946106c6565b845260048401610b93565b03925af1948515610f0c57610ede95610ee0575b50808483908592610ed2610ec0610eba610eb47f54538b93c6e9b3f518076db2d896122f653fac2bb32fa0b6bc75097b9f332e75946105e8565b946105e8565b946105e8565b94610ec96100a2565b91829182610a01565b0390a492909192610f16565b565b610eff905f3d8111610f05575b610ef78183610498565b8101906106cc565b5f610e7a565b503d610eed565b610700565b6106c2565b9190610f6290610f53610f37610f32610f2d610299565b61061c565b610628565b9562cffbe5959294610f476100a2565b9586946020860161067f565b60208201810382520382610498565b610f74610f6e826106be565b916106b8565b20823b15610fe857610fa592610f9a5f8094610f8e6100a2565b968795869485936106c6565b8352600483016106eb565b03925af18015610fe357610fb7575b50565b610fd6905f3d8111610fdc575b610fce8183610498565b8101906106cc565b5f610fb4565b503d610fc4565b610700565b6106c256fea2646970667358221220ba047060ba3574875cd782f062d08240871ba803894074a664b4df16b994741164736f6c634300081d0033", + "code": "0x60806040526004361015610013575b610383565b61001d5f3561009c565b806351cff8d91461009757806358bc83371461009257806379204fe01461008d57806379c0cdef146100885780637e1233a914610083578063b0f4d3951461007e578063d23061db146100795763fccc28130361000e5761034e565b610308565b6102df565b6102aa565b610262565b61022b565b61018a565b610109565b60e01c90565b60405190565b5f80fd5b60018060a01b031690565b6100c0906100ac565b90565b6100cc816100b7565b036100d357565b5f80fd5b905035906100e4826100c3565b565b906020828203126100ff576100fc915f016100d7565b90565b6100a8565b5f0190565b61011c6101173660046100e6565b610710565b6101246100a2565b8061012e81610104565b0390f35b5f80fd5b5f91031261014057565b6100a8565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b610165610145565b90565b610171906100b7565b9052565b9190610188905f60208501940190610168565b565b346101ba5761019a366004610136565b6101b66101a561015d565b6101ad6100a2565b91829182610175565b0390f35b610132565b90565b6101cb816101bf565b036101d257565b5f80fd5b905035906101e3826101c2565b565b608081830312610226576101fb825f83016100d7565b9261022361020c84602085016100d7565b9361021a81604086016100d7565b936060016101d6565b90565b6100a8565b3461025d5761024761023e3660046101e5565b92919091610af7565b61024f6100a2565b8061025981610104565b0390f35b610132565b346102945761027e6102753660046101e5565b92919091610ce9565b6102866100a2565b8061029081610104565b0390f35b610132565b61fffe90565b6102a7610299565b90565b346102da576102ba366004610136565b6102d66102c561029f565b6102cd6100a2565b91829182610175565b0390f35b610132565b6102f26102ed3660046100e6565b610cf7565b6102fa6100a2565b8061030481610104565b0390f35b3461033a5761032461031b3660046101e5565b92919091610dfe565b61032c6100a2565b8061033681610104565b0390f35b610132565b5f90565b61034b61033f565b90565b3461037e5761035e366004610136565b61037a610369610343565b6103716100a2565b91829182610175565b0390f35b610132565b5f80fd5b90565b90565b6103a161039c6103a692610387565b61038a565b6101bf565b90565b60209181520190565b60207f7665000000000000000000000000000000000000000000000000000000000000917f5769746864726177616c20616d6f756e74206d75737420626520706f736974695f8201520152565b61040c60226040926103a9565b610415816103b2565b0190565b61042e9060208101905f8183039101526103ff565b90565b1561043857565b6104406100a2565b62461bcd60e51b81528061045660048201610419565b0390fd5b905090565b61046a5f809261045a565b0190565b6104779061045f565b90565b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906104a29061047a565b810190811067ffffffffffffffff8211176104bc57604052565b610484565b906104d46104cd6100a2565b9283610498565b565b67ffffffffffffffff81116104f4576104f060209161047a565b0190565b610484565b9061050b610506836104d6565b6104c1565b918252565b606090565b3d5f14610530576105253d6104f9565b903d5f602084013e5b565b610538610510565b9061052e565b5f7f4661696c656420746f206275726e204574686572000000000000000000000000910152565b61057260146020926103a9565b61057b8161053e565b0190565b6105949060208101905f818303910152610565565b90565b1561059e57565b6105a66100a2565b62461bcd60e51b8152806105bc6004820161057f565b0390fd5b6105d46105cf6105d9926100ac565b61038a565b6100ac565b90565b6105e5906105c0565b90565b6105f1906105dc565b90565b61060861060361060d926101bf565b61038a565b6101bf565b90565b610619906105c0565b90565b61062590610610565b90565b610631906105dc565b90565b60601b90565b61064390610634565b90565b61064f9061063a565b90565b61065e610663916100b7565b610646565b9052565b90565b61067661067b916101bf565b610667565b9052565b926106ac60146106b4946106a4828861069c60209b9a8399610652565b018092610652565b018092610652565b01809261066a565b0190565b60200190565b5190565b5f80fd5b60e01b90565b5f9103126106d657565b6100a8565b90565b6106e7906106db565b9052565b91906106fe905f602085019401906106de565b565b6107086100a2565b3d5f823e3d90fd5b61072c346107266107205f61038d565b916101bf565b11610431565b61075f5f8061073961033f565b346107426100a2565b908161074d8161046e565b03925af1610759610515565b50610597565b3381349061079f6107996107937fbb2689ff876f7ef453cf8865dde5ab10349d222e2e1383c5152fbdb083f02da2956105e8565b926105e8565b926105f4565b926107a86100a2565b806107b281610104565b0390a46107cd6107c86107c3610299565b61061c565b610628565b9062cffbe59061080f6107de610145565b6108006107e9610145565b9334906107f46100a2565b9586946020860161067f565b60208201810382520382610498565b61082161081b826106be565b916106b8565b20823b1561089557610852926108475f809461083b6100a2565b968795869485936106c6565b8352600483016106eb565b03925af1801561089057610864575b50565b610883905f3d8111610889575b61087b8183610498565b8101906106cc565b5f610861565b503d610871565b610700565b6106c2565b6108a3906105dc565b90565b60207f6520627269646765000000000000000000000000000000000000000000000000917f436f6d6d6f6e4272696467654c323a2063616c6c6572206973206e6f742074685f8201520152565b61090060286040926103a9565b610909816108a6565b0190565b6109229060208101905f8183039101526108f3565b90565b1561092c57565b6109346100a2565b62461bcd60e51b81528061094a6004820161090d565b0390fd5b9061097e9392916109793361097361096d6109683061089a565b6100b7565b916100b7565b14610925565b610a16565b565b63ffffffff1690565b63ffffffff60e01b1690565b6109a96109a46109ae92610980565b6106c6565b610989565b90565b6109ba906101bf565b9052565b6109f36109fa946109e96060949897956109df608086019a5f870190610168565b6020850190610168565b6040830190610168565b01906109b1565b565b151590565b9190610a14905f602085019401906109b1565b565b92919092610a855f80610a283061089a565b6004610a6c6379c0cdef610a5d88918b8d610a448d9293610995565b94610a4d6100a2565b97889660208801908152016109be565b60208201810382520382610498565b82602082019151925af1610a7e610515565b50156109fc565b610ae4575b92909192610adf610acd610ac7610ac17ff5353a2477e10b23280de25ca6cea55c17bb48000d8807ee631e514080e7fb4e946105e8565b946105e8565b946105e8565b94610ad66100a2565b91829182610a01565b0390a4565b610af2818584908692610f16565b610a8a565b90610b0393929161094e565b565b90610b35939291610b3033610b2a610b24610b1f3061089a565b6100b7565b916100b7565b14610925565b610bb6565b565b610b40906105c0565b90565b610b4c90610b37565b90565b610b58906105dc565b90565b90505190610b68826100c3565b565b90602082820312610b8357610b80915f01610b5b565b90565b6100a8565b15610b8f57565b5f80fd5b916020610bb4929493610bad60408201965f830190610168565b01906109b1565b565b90610bc090610b43565b610be46020610bce83610b4f565b63c2eeeebd90610bdc6100a2565b9384926106c6565b8252815f81610bf560048201610104565b03925af18015610ce457610c2c93610c27925f92610cac575b50610c1b610c21916100b7565b916100b7565b14610b88565b610b4f565b916318bf5077919092803b15610ca757610c595f8094610c64610c4d6100a2565b978896879586946106c6565b845260048401610b93565b03925af18015610ca257610c76575b50565b610c95905f3d8111610c9b575b610c8d8183610498565b8101906106cc565b5f610c73565b503d610c83565b610700565b6106c2565b610c21919250610cd5610c1b9160203d8111610cdd575b610ccd8183610498565b810190610b6a565b929150610c0e565b503d610cc3565b610700565b90610cf5939291610b05565b565b610d245f808334610d066100a2565b9081610d118161046e565b03925af1610d1d610515565b50156109fc565b610d6f575b3490610d6a610d587f85a190caa61692b36b63a55e069330d18ab9af179fed7a25c16a4262bc63b7d2926105e8565b92610d616100a2565b91829182610a01565b0390a2565b610d783061089a565b6351cff8d934919091908390803b15610df957610da85f93610db395610d9c6100a2565b968795869485936106c6565b835260048301610175565b03925af18015610df457610dc8575b50610d29565b610de7905f3d8111610ded575b610ddf8183610498565b8101906106cc565b5f610dc2565b503d610dd5565b610700565b6106c2565b929091610e1d82610e17610e115f61038d565b916101bf565b11610431565b610e2e610e2984610b43565b610b4f565b93632b8c49e3338496803b15610f1157610e5b5f8094610e66610e4f6100a2565b9b8c96879586946106c6565b845260048401610b93565b03925af1948515610f0c57610ede95610ee0575b50808483908592610ed2610ec0610eba610eb47f54538b93c6e9b3f518076db2d896122f653fac2bb32fa0b6bc75097b9f332e75946105e8565b946105e8565b946105e8565b94610ec96100a2565b91829182610a01565b0390a492909192610f16565b565b610eff905f3d8111610f05575b610ef78183610498565b8101906106cc565b5f610e7a565b503d610eed565b610700565b6106c2565b9190610f6290610f53610f37610f32610f2d610299565b61061c565b610628565b9562cffbe5959294610f476100a2565b9586946020860161067f565b60208201810382520382610498565b610f74610f6e826106be565b916106b8565b20823b15610fe857610fa592610f9a5f8094610f8e6100a2565b968795869485936106c6565b8352600483016106eb565b03925af18015610fe357610fb7575b50565b610fd6905f3d8111610fdc575b610fce8183610498565b8101906106cc565b5f610fb4565b503d610fc4565b610700565b6106c256fea2646970667358221220c0e9055278c4c6024d176f0113fce2d84d3461cc695bd0fd971ff541d56b834064736f6c634300081d0033", "storage": {}, "balance": "0x0", "nonce": "0x1" }, "0x000000000000000000000000000000000000fffe": { - "code": "0x608060405261000c61000e565b005b610016610040565b565b60018060a01b031690565b61002c90610018565b90565b63ffffffff60e01b1690565b5f0190565b3361005a61005461004f6100c2565b610023565b91610023565b145f146100b35763ffffffff60e01b5f351661008561007f63278f794360e11b61002f565b9161002f565b14155f146100a9575f6334ad5dbb60e21b8152806100a56004820161003b565b0390fd5b6100b16102d9565b565b6100d6565b5f90565b61f00090565b6100ca6100b8565b506100d36100bc565b90565b6100de610318565b61032c565b90565b90565b90565b6101006100fb610105926100e3565b6100e9565b6100e6565b90565b60405190565b5f80fd5b5f80fd5b90939293848311610136578411610131576001820201920390565b610112565b61010e565b91565b5f80fd5b5f80fd5b61014f90610018565b90565b61015b81610146565b0361016257565b5f80fd5b9050359061017382610152565b565b5f80fd5b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906101a59061017d565b810190811067ffffffffffffffff8211176101bf57604052565b610187565b906101d76101d0610108565b928361019b565b565b67ffffffffffffffff81116101f7576101f360209161017d565b0190565b610187565b90825f939282370152565b9092919261021c610217826101d9565b6101c4565b9381855260208501908284011161023857610236926101fc565b565b610179565b9080601f8301121561025b5781602061025893359101610207565b90565b610175565b9190916040818403126102a057610279835f8301610166565b92602082013567ffffffffffffffff811161029b57610298920161023d565b90565b610142565b61013e565b6102b96102b46102be92610018565b6100e9565b610018565b90565b6102ca906102a5565b90565b6102d6906102c1565b90565b61031661031161030a6103026102fc5f366102f460046100ec565b908092610116565b9061013b565b810190610260565b91906102cd565b610379565b565b6103206100b8565b50610329610486565b90565b5f8091368280378136915af43d5f803e5f14610346573d5ff35b3d5ffd5b610353906102c1565b90565b5190565b90565b61037161036c6103769261035a565b6100e9565b6100e6565b90565b906103838261050c565b816103ae7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9161034a565b906103b7610108565b806103c18161003b565b0390a26103cd81610356565b6103df6103d95f61035d565b916100e6565b115f146103f3576103ef9161059c565b505b565b50506103fd610561565b6103f1565b90565b90565b5f1b90565b61042161041c61042692610402565b610408565b610405565b90565b6104527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61040d565b90565b5f1c90565b60018060a01b031690565b61047161047691610455565b61045a565b90565b6104839054610465565b90565b61048e6100b8565b506104a95f6104a361049e610429565b61066f565b01610479565b90565b6104b590610023565b9052565b91906104cc905f602085019401906104ac565b565b906104df60018060a01b0391610408565b9181191691161790565b90565b906105016104fc6105089261034a565b6104e9565b82546104ce565b9055565b803b61052061051a5f61035d565b916100e6565b1461054257610540905f61053a610535610429565b61066f565b016104ec565b565b61055d905f918291634c9c8ce360e01b8352600483016104b9565b0390fd5b3461057461056e5f61035d565b916100e6565b1161057b57565b5f63b398979f60e01b8152806105936004820161003b565b0390fd5b606090565b906105b0906105a9610597565b5082610676565b808061062c575b5f146105ca5750506105c76106ab565b90565b5f146105ef576105eb905f918291639996b31560e01b8352600483016104b9565b0390fd5b6105f7610693565b6106096106035f61035d565b916100e6565b115f036106a0575f63d6bda27560e01b8152806106286004820161003b565b0390fd5b50610635610693565b6106476106415f61035d565b916100e6565b118015610654575b6105b7565b50813b6106696106635f61035d565b916100e6565b1161064f565b90565b5f90565b5f918291610682610672565b50602082519201905af490565b5f90565b61069b61068f565b503d90565b6040513d5f823e3d90fd5b6106b3610597565b50604051903d82523d5f602084013e3d602001820160405256fea2646970667358221220da9f1f29d0ed5131ce1f37bb5f2d1b5c6de637a513f4e6d4cc498b2391c0f6e564736f6c634300081d0033", + "code": "0x608060405261000c61000e565b005b610016610040565b565b60018060a01b031690565b61002c90610018565b90565b63ffffffff60e01b1690565b5f0190565b3361005a61005461004f6100c2565b610023565b91610023565b145f146100b35763ffffffff60e01b5f351661008561007f63278f794360e11b61002f565b9161002f565b14155f146100a9575f6334ad5dbb60e21b8152806100a56004820161003b565b0390fd5b6100b16102d9565b565b6100d6565b5f90565b61f00090565b6100ca6100b8565b506100d36100bc565b90565b6100de610318565b61032c565b90565b90565b90565b6101006100fb610105926100e3565b6100e9565b6100e6565b90565b60405190565b5f80fd5b5f80fd5b90939293848311610136578411610131576001820201920390565b610112565b61010e565b91565b5f80fd5b5f80fd5b61014f90610018565b90565b61015b81610146565b0361016257565b5f80fd5b9050359061017382610152565b565b5f80fd5b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906101a59061017d565b810190811067ffffffffffffffff8211176101bf57604052565b610187565b906101d76101d0610108565b928361019b565b565b67ffffffffffffffff81116101f7576101f360209161017d565b0190565b610187565b90825f939282370152565b9092919261021c610217826101d9565b6101c4565b9381855260208501908284011161023857610236926101fc565b565b610179565b9080601f8301121561025b5781602061025893359101610207565b90565b610175565b9190916040818403126102a057610279835f8301610166565b92602082013567ffffffffffffffff811161029b57610298920161023d565b90565b610142565b61013e565b6102b96102b46102be92610018565b6100e9565b610018565b90565b6102ca906102a5565b90565b6102d6906102c1565b90565b61031661031161030a6103026102fc5f366102f460046100ec565b908092610116565b9061013b565b810190610260565b91906102cd565b610379565b565b6103206100b8565b50610329610486565b90565b5f8091368280378136915af43d5f803e5f14610346573d5ff35b3d5ffd5b610353906102c1565b90565b5190565b90565b61037161036c6103769261035a565b6100e9565b6100e6565b90565b906103838261050c565b816103ae7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9161034a565b906103b7610108565b806103c18161003b565b0390a26103cd81610356565b6103df6103d95f61035d565b916100e6565b115f146103f3576103ef916105dc565b505b565b50506103fd610561565b6103f1565b90565b90565b5f1b90565b61042161041c61042692610402565b610408565b610405565b90565b6104527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61040d565b90565b5f1c90565b60018060a01b031690565b61047161047691610455565b61045a565b90565b6104839054610465565b90565b61048e6100b8565b506104a95f6104a361049e610429565b61060b565b01610479565b90565b6104b590610023565b9052565b91906104cc905f602085019401906104ac565b565b906104df60018060a01b0391610408565b9181191691161790565b90565b906105016104fc6105089261034a565b6104e9565b82546104ce565b9055565b803b61052061051a5f61035d565b916100e6565b1461054257610540905f61053a610535610429565b61060b565b016104ec565b565b61055d905f918291634c9c8ce360e01b8352600483016104b9565b0390fd5b3461057461056e5f61035d565b916100e6565b1161057b57565b5f63b398979f60e01b8152806105936004820161003b565b0390fd5b606090565b906105ae6105a9836101d9565b6101c4565b918252565b3d5f146105ce576105c33d61059c565b903d5f602084013e5b565b6105d6610597565b906105cc565b5f80610608936105ea610597565b508390602081019051915af4906105ff6105b3565b90919091610613565b90565b90565b151590565b9061062790610620610597565b501561060e565b5f146106335750610697565b61063c82610356565b61064e6106485f61035d565b916100e6565b148061067c575b61065d575090565b610678905f918291639996b31560e01b8352600483016104b9565b0390fd5b50803b61069161068b5f61035d565b916100e6565b14610655565b6106a081610356565b6106b26106ac5f61035d565b916100e6565b115f146106c157602081519101fd5b5f63d6bda27560e01b8152806106d96004820161003b565b0390fdfea2646970667358221220907b6c8a04deef3965be3252004e1308a0e952301e3a30cad9c5789c60f521c464736f6c634300081d0033", "storage": { "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xeffe", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xf000" @@ -68,16 +78,16 @@ "nonce": "0x1" }, "0x000000000000000000000000000000000000ffff": { - "code": "0x608060405261000c61000e565b005b610016610040565b565b60018060a01b031690565b61002c90610018565b90565b63ffffffff60e01b1690565b5f0190565b3361005a61005461004f6100c2565b610023565b91610023565b145f146100b35763ffffffff60e01b5f351661008561007f63278f794360e11b61002f565b9161002f565b14155f146100a9575f6334ad5dbb60e21b8152806100a56004820161003b565b0390fd5b6100b16102d9565b565b6100d6565b5f90565b61f00090565b6100ca6100b8565b506100d36100bc565b90565b6100de610318565b61032c565b90565b90565b90565b6101006100fb610105926100e3565b6100e9565b6100e6565b90565b60405190565b5f80fd5b5f80fd5b90939293848311610136578411610131576001820201920390565b610112565b61010e565b91565b5f80fd5b5f80fd5b61014f90610018565b90565b61015b81610146565b0361016257565b5f80fd5b9050359061017382610152565b565b5f80fd5b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906101a59061017d565b810190811067ffffffffffffffff8211176101bf57604052565b610187565b906101d76101d0610108565b928361019b565b565b67ffffffffffffffff81116101f7576101f360209161017d565b0190565b610187565b90825f939282370152565b9092919261021c610217826101d9565b6101c4565b9381855260208501908284011161023857610236926101fc565b565b610179565b9080601f8301121561025b5781602061025893359101610207565b90565b610175565b9190916040818403126102a057610279835f8301610166565b92602082013567ffffffffffffffff811161029b57610298920161023d565b90565b610142565b61013e565b6102b96102b46102be92610018565b6100e9565b610018565b90565b6102ca906102a5565b90565b6102d6906102c1565b90565b61031661031161030a6103026102fc5f366102f460046100ec565b908092610116565b9061013b565b810190610260565b91906102cd565b610379565b565b6103206100b8565b50610329610486565b90565b5f8091368280378136915af43d5f803e5f14610346573d5ff35b3d5ffd5b610353906102c1565b90565b5190565b90565b61037161036c6103769261035a565b6100e9565b6100e6565b90565b906103838261050c565b816103ae7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9161034a565b906103b7610108565b806103c18161003b565b0390a26103cd81610356565b6103df6103d95f61035d565b916100e6565b115f146103f3576103ef9161059c565b505b565b50506103fd610561565b6103f1565b90565b90565b5f1b90565b61042161041c61042692610402565b610408565b610405565b90565b6104527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61040d565b90565b5f1c90565b60018060a01b031690565b61047161047691610455565b61045a565b90565b6104839054610465565b90565b61048e6100b8565b506104a95f6104a361049e610429565b61066f565b01610479565b90565b6104b590610023565b9052565b91906104cc905f602085019401906104ac565b565b906104df60018060a01b0391610408565b9181191691161790565b90565b906105016104fc6105089261034a565b6104e9565b82546104ce565b9055565b803b61052061051a5f61035d565b916100e6565b1461054257610540905f61053a610535610429565b61066f565b016104ec565b565b61055d905f918291634c9c8ce360e01b8352600483016104b9565b0390fd5b3461057461056e5f61035d565b916100e6565b1161057b57565b5f63b398979f60e01b8152806105936004820161003b565b0390fd5b606090565b906105b0906105a9610597565b5082610676565b808061062c575b5f146105ca5750506105c76106ab565b90565b5f146105ef576105eb905f918291639996b31560e01b8352600483016104b9565b0390fd5b6105f7610693565b6106096106035f61035d565b916100e6565b115f036106a0575f63d6bda27560e01b8152806106286004820161003b565b0390fd5b50610635610693565b6106476106415f61035d565b916100e6565b118015610654575b6105b7565b50813b6106696106635f61035d565b916100e6565b1161064f565b90565b5f90565b5f918291610682610672565b50602082519201905af490565b5f90565b61069b61068f565b503d90565b6040513d5f823e3d90fd5b6106b3610597565b50604051903d82523d5f602084013e3d602001820160405256fea2646970667358221220da9f1f29d0ed5131ce1f37bb5f2d1b5c6de637a513f4e6d4cc498b2391c0f6e564736f6c634300081d0033", + "code": "0x608060405261000c61000e565b005b610016610040565b565b60018060a01b031690565b61002c90610018565b90565b63ffffffff60e01b1690565b5f0190565b3361005a61005461004f6100c2565b610023565b91610023565b145f146100b35763ffffffff60e01b5f351661008561007f63278f794360e11b61002f565b9161002f565b14155f146100a9575f6334ad5dbb60e21b8152806100a56004820161003b565b0390fd5b6100b16102d9565b565b6100d6565b5f90565b61f00090565b6100ca6100b8565b506100d36100bc565b90565b6100de610318565b61032c565b90565b90565b90565b6101006100fb610105926100e3565b6100e9565b6100e6565b90565b60405190565b5f80fd5b5f80fd5b90939293848311610136578411610131576001820201920390565b610112565b61010e565b91565b5f80fd5b5f80fd5b61014f90610018565b90565b61015b81610146565b0361016257565b5f80fd5b9050359061017382610152565b565b5f80fd5b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906101a59061017d565b810190811067ffffffffffffffff8211176101bf57604052565b610187565b906101d76101d0610108565b928361019b565b565b67ffffffffffffffff81116101f7576101f360209161017d565b0190565b610187565b90825f939282370152565b9092919261021c610217826101d9565b6101c4565b9381855260208501908284011161023857610236926101fc565b565b610179565b9080601f8301121561025b5781602061025893359101610207565b90565b610175565b9190916040818403126102a057610279835f8301610166565b92602082013567ffffffffffffffff811161029b57610298920161023d565b90565b610142565b61013e565b6102b96102b46102be92610018565b6100e9565b610018565b90565b6102ca906102a5565b90565b6102d6906102c1565b90565b61031661031161030a6103026102fc5f366102f460046100ec565b908092610116565b9061013b565b810190610260565b91906102cd565b610379565b565b6103206100b8565b50610329610486565b90565b5f8091368280378136915af43d5f803e5f14610346573d5ff35b3d5ffd5b610353906102c1565b90565b5190565b90565b61037161036c6103769261035a565b6100e9565b6100e6565b90565b906103838261050c565b816103ae7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9161034a565b906103b7610108565b806103c18161003b565b0390a26103cd81610356565b6103df6103d95f61035d565b916100e6565b115f146103f3576103ef916105dc565b505b565b50506103fd610561565b6103f1565b90565b90565b5f1b90565b61042161041c61042692610402565b610408565b610405565b90565b6104527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61040d565b90565b5f1c90565b60018060a01b031690565b61047161047691610455565b61045a565b90565b6104839054610465565b90565b61048e6100b8565b506104a95f6104a361049e610429565b61060b565b01610479565b90565b6104b590610023565b9052565b91906104cc905f602085019401906104ac565b565b906104df60018060a01b0391610408565b9181191691161790565b90565b906105016104fc6105089261034a565b6104e9565b82546104ce565b9055565b803b61052061051a5f61035d565b916100e6565b1461054257610540905f61053a610535610429565b61060b565b016104ec565b565b61055d905f918291634c9c8ce360e01b8352600483016104b9565b0390fd5b3461057461056e5f61035d565b916100e6565b1161057b57565b5f63b398979f60e01b8152806105936004820161003b565b0390fd5b606090565b906105ae6105a9836101d9565b6101c4565b918252565b3d5f146105ce576105c33d61059c565b903d5f602084013e5b565b6105d6610597565b906105cc565b5f80610608936105ea610597565b508390602081019051915af4906105ff6105b3565b90919091610613565b90565b90565b151590565b9061062790610620610597565b501561060e565b5f146106335750610697565b61063c82610356565b61064e6106485f61035d565b916100e6565b148061067c575b61065d575090565b610678905f918291639996b31560e01b8352600483016104b9565b0390fd5b50803b61069161068b5f61035d565b916100e6565b14610655565b6106a081610356565b6106b26106ac5f61035d565b916100e6565b115f146106c157602081519101fd5b5f63d6bda27560e01b8152806106d96004820161003b565b0390fdfea2646970667358221220907b6c8a04deef3965be3252004e1308a0e952301e3a30cad9c5789c60f521c464736f6c634300081d0033", "storage": { - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xf000", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xefff" + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xefff", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xf000" }, "balance": "0x0", "nonce": "0x1" }, "0x13b0d85ccb8bf860b6b79af3029fca081ae9bef2": { - "code": "0x60806040526004361015610015575b366105b157005b61001f5f356100be565b8063076c37b2146100b95780633f4ba83a146100b4578063481286e6146100af57806356299481146100aa5780635c975abb146100a557806366cfa057146100a0578063715018a61461009b5780638456cb59146100965780638da5cb5b146100915763f2fde38b0361000e5761057e565b61052b565b6104f8565b6104c5565b610491565b610320565b6102c3565b610230565b610197565b610154565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f80fd5b90565b6100e2816100d6565b036100e957565b5f80fd5b905035906100fa826100d9565b565b90565b610108816100fc565b0361010f57565b5f80fd5b90503590610120826100ff565b565b919060408382031261014a578061013e610147925f86016100ed565b93602001610113565b90565b6100ce565b5f0190565b346101835761016d610167366004610122565b906105f3565b6101756100c4565b8061017f8161014f565b0390f35b6100ca565b5f91031261019257565b6100ce565b346101c5576101a7366004610188565b6101af61061b565b6101b76100c4565b806101c18161014f565b0390f35b6100ca565b91906040838203126101f257806101e66101ef925f8601610113565b93602001610113565b90565b6100ce565b60018060a01b031690565b61020b906101f7565b90565b61021790610202565b9052565b919061022e905f6020850194019061020e565b565b346102615761025d61024c6102463660046101ca565b90610629565b6102546100c4565b9182918261021b565b0390f35b6100ca565b61026f81610202565b0361027657565b5f80fd5b9050359061028782610266565b565b90916060828403126102be576102bb6102a4845f8501610113565b936102b28160208601610113565b9360400161027a565b90565b6100ce565b346102f4576102f06102df6102d9366004610289565b9161063f565b6102e76100c4565b9182918261021b565b0390f35b6100ca565b151590565b610307906102f9565b9052565b919061031e905f602085019401906102fe565b565b3461035057610330366004610188565b61034c61033b610689565b6103436100c4565b9182918261030b565b0390f35b6100ca565b5f80fd5b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906103859061035d565b810190811067ffffffffffffffff82111761039f57604052565b610367565b906103b76103b06100c4565b928361037b565b565b67ffffffffffffffff81116103d7576103d360209161035d565b0190565b610367565b90825f939282370152565b909291926103fc6103f7826103b9565b6103a4565b9381855260208501908284011161041857610416926103dc565b565b610359565b9080601f8301121561043b57816020610438933591016103e7565b90565b610355565b9160608383031261048c57610457825f85016100ed565b926104658360208301610113565b92604082013567ffffffffffffffff811161048757610484920161041d565b90565b6100d2565b6100ce565b346104c0576104aa6104a4366004610440565b916106c3565b6104b26100c4565b806104bc8161014f565b0390f35b6100ca565b346104f3576104d5366004610188565b6104dd610723565b6104e56100c4565b806104ef8161014f565b0390f35b6100ca565b3461052657610508366004610188565b610510610749565b6105186100c4565b806105228161014f565b0390f35b6100ca565b3461055b5761053b366004610188565b610557610546610784565b61054e6100c4565b9182918261021b565b0390f35b6100ca565b9060208282031261057957610576915f0161027a565b90565b6100ce565b346105ac57610596610591366004610560565b61088d565b61059e6100c4565b806105a88161014f565b0390f35b6100ca565b5f80fd5b906105c7916105c261091a565b6105c9565b565b906105f091906102b5916105df602084016103a4565b92808452610efd6020850139610b0e565b50565b906105fd916105b5565b565b610607610c16565b61060f610611565b565b610619610cef565b565b6106236105ff565b565b5f90565b9061063c91610636610625565b50610cf9565b90565b916106559261064c610625565b50919091610d1a565b90565b5f90565b60a01c90565b60ff1690565b6106746106799161065c565b610662565b90565b6106869054610668565b90565b610691610658565b5061069b5f61067c565b90565b906106b192916106ac61091a565b6106b3565b565b916106c092919091610b0e565b50565b906106ce929161069e565b565b6106d8610c16565b6106e0610710565b565b90565b90565b6106fc6106f7610701926106e2565b6106e5565b6101f7565b90565b61070d906106e8565b90565b61072161071c5f610704565b610d92565b565b61072b6106d0565b565b610735610c16565b61073d61073f565b565b610747610e51565b565b61075161072d565b565b5f1c90565b60018060a01b031690565b61076f61077491610753565b610758565b90565b6107819054610763565b90565b61078c610625565b506107965f610777565b90565b6107aa906107a5610c16565b61085d565b565b60209181520190565b60207f6464726573730000000000000000000000000000000000000000000000000000917f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201520152565b61080f60266040926107ac565b610818816107b5565b0190565b6108319060208101905f818303910152610802565b90565b1561083b57565b6108436100c4565b62461bcd60e51b8152806108596004820161081c565b0390fd5b61088b906108868161087f6108796108745f610704565b610202565b91610202565b1415610834565b610d92565b565b61089690610799565b565b5f7f5061757361626c653a2070617573656400000000000000000000000000000000910152565b6108cc60106020926107ac565b6108d581610898565b0190565b6108ee9060208101905f8183039101526108bf565b90565b156108f857565b6109006100c4565b62461bcd60e51b815280610916600482016108d9565b0390fd5b61093361092e610928610689565b156102f9565b6108f1565b565b61094961094461094e926101f7565b6106e5565b6101f7565b90565b61095a90610935565b90565b61096690610951565b90565b5f7f437265617465323a20696e73756666696369656e742062616c616e6365000000910152565b61099d601d6020926107ac565b6109a681610969565b0190565b6109bf9060208101905f818303910152610990565b90565b156109c957565b6109d16100c4565b62461bcd60e51b8152806109e7600482016109aa565b0390fd5b5190565b610a036109fe610a08926106e2565b6106e5565b6100d6565b90565b5f7f437265617465323a2062797465636f6465206c656e677468206973207a65726f910152565b610a3e602080926107ac565b610a4781610a0b565b0190565b610a609060208101905f818303910152610a32565b90565b15610a6a57565b610a726100c4565b62461bcd60e51b815280610a8860048201610a4b565b0390fd5b5f7f437265617465323a204661696c6564206f6e206465706c6f7900000000000000910152565b610ac060196020926107ac565b610ac981610a8c565b0190565b610ae29060208101905f818303910152610ab3565b90565b15610aec57565b610af46100c4565b62461bcd60e51b815280610b0a60048201610acd565b0390fd5b919091610b19610625565b50610b40610b263061095d565b31610b39610b33846100d6565b916100d6565b10156109c2565b610b65610b4c836109eb565b610b5e610b585f6109ef565b916100d6565b1415610a63565b60208251920190f590610b9382610b8c610b86610b815f610704565b610202565b91610202565b1415610ae5565b565b5f7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910152565b610bc8602080926107ac565b610bd181610b95565b0190565b610bea9060208101905f818303910152610bbc565b90565b15610bf457565b610bfc6100c4565b62461bcd60e51b815280610c1260048201610bd5565b0390fd5b610c40610c21610784565b610c3a610c34610c2f610e5b565b610202565b91610202565b14610bed565b565b610c4a610eea565b610c52610ca2565b565b60a01b90565b90610c6960ff60a01b91610c54565b9181191691161790565b610c7c906102f9565b90565b90565b90610c97610c92610c9e92610c73565b610c7f565b8254610c5a565b9055565b610cac5f5f610c82565b610cb4610e5b565b610cea7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91610ce16100c4565b9182918261021b565b0390a1565b610cf7610c42565b565b90610d1791610d06610625565b5090610d113061095d565b91610d1a565b90565b90605592600b92610d29610625565b50604051926040840152602083015281520160ff81532090565b5f1b90565b90610d5960018060a01b0391610d43565b9181191691161790565b610d6c90610951565b90565b90565b90610d87610d82610d8e92610d63565b610d6f565b8254610d48565b9055565b610d9b5f610777565b610da5825f610d72565b90610dd9610dd37f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610d63565b91610d63565b91610de26100c4565b80610dec8161014f565b0390a3565b610df961091a565b610e01610e03565b565b610e0e60015f610c82565b610e16610e5b565b610e4c7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610e436100c4565b9182918261021b565b0390a1565b610e59610df1565b565b610e63610625565b503390565b5f7f5061757361626c653a206e6f7420706175736564000000000000000000000000910152565b610e9c60146020926107ac565b610ea581610e68565b0190565b610ebe9060208101905f818303910152610e8f565b90565b15610ec857565b610ed06100c4565b62461bcd60e51b815280610ee660048201610ea9565b0390fd5b610efa610ef5610689565b610ec1565b56fe608060405234601c57600e6020565b61028a61002b823961028a90f35b6026565b60405190565b5f80fdfe60806040526004361015610013575b610125565b61001d5f3561002c565b63249cb3fa0361000e576100ef565b60e01c90565b60405190565b5f80fd5b5f80fd5b90565b61004c81610040565b0361005357565b5f80fd5b9050359061006482610043565b565b60018060a01b031690565b61007a90610066565b90565b61008681610071565b0361008d57565b5f80fd5b9050359061009e8261007d565b565b91906040838203126100c857806100bc6100c5925f8601610057565b93602001610091565b90565b61003c565b6100d690610040565b9052565b91906100ed905f602085019401906100cd565b565b346101205761011c61010b6101053660046100a0565b90610210565b610113610032565b918291826100da565b0390f35b610038565b5f80fd5b5f90565b61013690610040565b90565b906101439061012d565b5f5260205260405f2090565b90565b61016661016161016b92610066565b61014f565b610066565b90565b61017790610152565b90565b6101839061016e565b90565b906101909061017a565b5f5260205260405f2090565b5f1c90565b60ff1690565b6101b36101b89161019c565b6101a1565b90565b6101c590546101a7565b90565b90565b5f1b90565b6101e46101df6101e9926101c8565b6101cb565b610040565b90565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b490565b6102349161022a61022f92610223610129565b505f610139565b610186565b6101bb565b5f14610246576102426101ec565b5b90565b61024f5f6101d0565b61024356fea26469706673582212203dcabd569808849d0e409a052e5e7d1fa1624dd221cdb5cd5d9cbed0d5bd521b64736f6c634300081d0033a2646970667358221220c9ee82b3796a8b1e888ae9b0f1244e703b889a0a49a1fc2f76e48ff4436c7a1564736f6c634300081d0033", + "code": "0x60806040526004361015610015575b366105b157005b61001f5f356100be565b8063076c37b2146100b95780633f4ba83a146100b4578063481286e6146100af57806356299481146100aa5780635c975abb146100a557806366cfa057146100a0578063715018a61461009b5780638456cb59146100965780638da5cb5b146100915763f2fde38b0361000e5761057e565b61052b565b6104f8565b6104c5565b610491565b610320565b6102c3565b610230565b610197565b610154565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f80fd5b90565b6100e2816100d6565b036100e957565b5f80fd5b905035906100fa826100d9565b565b90565b610108816100fc565b0361010f57565b5f80fd5b90503590610120826100ff565b565b919060408382031261014a578061013e610147925f86016100ed565b93602001610113565b90565b6100ce565b5f0190565b346101835761016d610167366004610122565b906105f3565b6101756100c4565b8061017f8161014f565b0390f35b6100ca565b5f91031261019257565b6100ce565b346101c5576101a7366004610188565b6101af61061b565b6101b76100c4565b806101c18161014f565b0390f35b6100ca565b91906040838203126101f257806101e66101ef925f8601610113565b93602001610113565b90565b6100ce565b60018060a01b031690565b61020b906101f7565b90565b61021790610202565b9052565b919061022e905f6020850194019061020e565b565b346102615761025d61024c6102463660046101ca565b90610629565b6102546100c4565b9182918261021b565b0390f35b6100ca565b61026f81610202565b0361027657565b5f80fd5b9050359061028782610266565b565b90916060828403126102be576102bb6102a4845f8501610113565b936102b28160208601610113565b9360400161027a565b90565b6100ce565b346102f4576102f06102df6102d9366004610289565b9161063f565b6102e76100c4565b9182918261021b565b0390f35b6100ca565b151590565b610307906102f9565b9052565b919061031e905f602085019401906102fe565b565b3461035057610330366004610188565b61034c61033b610689565b6103436100c4565b9182918261030b565b0390f35b6100ca565b5f80fd5b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906103859061035d565b810190811067ffffffffffffffff82111761039f57604052565b610367565b906103b76103b06100c4565b928361037b565b565b67ffffffffffffffff81116103d7576103d360209161035d565b0190565b610367565b90825f939282370152565b909291926103fc6103f7826103b9565b6103a4565b9381855260208501908284011161041857610416926103dc565b565b610359565b9080601f8301121561043b57816020610438933591016103e7565b90565b610355565b9160608383031261048c57610457825f85016100ed565b926104658360208301610113565b92604082013567ffffffffffffffff811161048757610484920161041d565b90565b6100d2565b6100ce565b346104c0576104aa6104a4366004610440565b916106c3565b6104b26100c4565b806104bc8161014f565b0390f35b6100ca565b346104f3576104d5366004610188565b6104dd610723565b6104e56100c4565b806104ef8161014f565b0390f35b6100ca565b3461052657610508366004610188565b610510610749565b6105186100c4565b806105228161014f565b0390f35b6100ca565b3461055b5761053b366004610188565b610557610546610784565b61054e6100c4565b9182918261021b565b0390f35b6100ca565b9060208282031261057957610576915f0161027a565b90565b6100ce565b346105ac57610596610591366004610560565b61088d565b61059e6100c4565b806105a88161014f565b0390f35b6100ca565b5f80fd5b906105c7916105c261091a565b6105c9565b565b906105f091906102b5916105df602084016103a4565b92808452610efd6020850139610b0e565b50565b906105fd916105b5565b565b610607610c16565b61060f610611565b565b610619610cef565b565b6106236105ff565b565b5f90565b9061063c91610636610625565b50610cf9565b90565b916106559261064c610625565b50919091610d1a565b90565b5f90565b60a01c90565b60ff1690565b6106746106799161065c565b610662565b90565b6106869054610668565b90565b610691610658565b5061069b5f61067c565b90565b906106b192916106ac61091a565b6106b3565b565b916106c092919091610b0e565b50565b906106ce929161069e565b565b6106d8610c16565b6106e0610710565b565b90565b90565b6106fc6106f7610701926106e2565b6106e5565b6101f7565b90565b61070d906106e8565b90565b61072161071c5f610704565b610d92565b565b61072b6106d0565b565b610735610c16565b61073d61073f565b565b610747610e51565b565b61075161072d565b565b5f1c90565b60018060a01b031690565b61076f61077491610753565b610758565b90565b6107819054610763565b90565b61078c610625565b506107965f610777565b90565b6107aa906107a5610c16565b61085d565b565b60209181520190565b60207f6464726573730000000000000000000000000000000000000000000000000000917f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201520152565b61080f60266040926107ac565b610818816107b5565b0190565b6108319060208101905f818303910152610802565b90565b1561083b57565b6108436100c4565b62461bcd60e51b8152806108596004820161081c565b0390fd5b61088b906108868161087f6108796108745f610704565b610202565b91610202565b1415610834565b610d92565b565b61089690610799565b565b5f7f5061757361626c653a2070617573656400000000000000000000000000000000910152565b6108cc60106020926107ac565b6108d581610898565b0190565b6108ee9060208101905f8183039101526108bf565b90565b156108f857565b6109006100c4565b62461bcd60e51b815280610916600482016108d9565b0390fd5b61093361092e610928610689565b156102f9565b6108f1565b565b61094961094461094e926101f7565b6106e5565b6101f7565b90565b61095a90610935565b90565b61096690610951565b90565b5f7f437265617465323a20696e73756666696369656e742062616c616e6365000000910152565b61099d601d6020926107ac565b6109a681610969565b0190565b6109bf9060208101905f818303910152610990565b90565b156109c957565b6109d16100c4565b62461bcd60e51b8152806109e7600482016109aa565b0390fd5b5190565b610a036109fe610a08926106e2565b6106e5565b6100d6565b90565b5f7f437265617465323a2062797465636f6465206c656e677468206973207a65726f910152565b610a3e602080926107ac565b610a4781610a0b565b0190565b610a609060208101905f818303910152610a32565b90565b15610a6a57565b610a726100c4565b62461bcd60e51b815280610a8860048201610a4b565b0390fd5b5f7f437265617465323a204661696c6564206f6e206465706c6f7900000000000000910152565b610ac060196020926107ac565b610ac981610a8c565b0190565b610ae29060208101905f818303910152610ab3565b90565b15610aec57565b610af46100c4565b62461bcd60e51b815280610b0a60048201610acd565b0390fd5b919091610b19610625565b50610b40610b263061095d565b31610b39610b33846100d6565b916100d6565b10156109c2565b610b65610b4c836109eb565b610b5e610b585f6109ef565b916100d6565b1415610a63565b60208251920190f590610b9382610b8c610b86610b815f610704565b610202565b91610202565b1415610ae5565b565b5f7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910152565b610bc8602080926107ac565b610bd181610b95565b0190565b610bea9060208101905f818303910152610bbc565b90565b15610bf457565b610bfc6100c4565b62461bcd60e51b815280610c1260048201610bd5565b0390fd5b610c40610c21610784565b610c3a610c34610c2f610e5b565b610202565b91610202565b14610bed565b565b610c4a610eea565b610c52610ca2565b565b60a01b90565b90610c6960ff60a01b91610c54565b9181191691161790565b610c7c906102f9565b90565b90565b90610c97610c92610c9e92610c73565b610c7f565b8254610c5a565b9055565b610cac5f5f610c82565b610cb4610e5b565b610cea7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91610ce16100c4565b9182918261021b565b0390a1565b610cf7610c42565b565b90610d1791610d06610625565b5090610d113061095d565b91610d1a565b90565b90605592600b92610d29610625565b50604051926040840152602083015281520160ff81532090565b5f1b90565b90610d5960018060a01b0391610d43565b9181191691161790565b610d6c90610951565b90565b90565b90610d87610d82610d8e92610d63565b610d6f565b8254610d48565b9055565b610d9b5f610777565b610da5825f610d72565b90610dd9610dd37f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610d63565b91610d63565b91610de26100c4565b80610dec8161014f565b0390a3565b610df961091a565b610e01610e03565b565b610e0e60015f610c82565b610e16610e5b565b610e4c7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610e436100c4565b9182918261021b565b0390a1565b610e59610df1565b565b610e63610625565b503390565b5f7f5061757361626c653a206e6f7420706175736564000000000000000000000000910152565b610e9c60146020926107ac565b610ea581610e68565b0190565b610ebe9060208101905f818303910152610e8f565b90565b15610ec857565b610ed06100c4565b62461bcd60e51b815280610ee660048201610ea9565b0390fd5b610efa610ef5610689565b610ec1565b56fe608060405234601c57600e6020565b61028a61002b823961028a90f35b6026565b60405190565b5f80fdfe60806040526004361015610013575b610125565b61001d5f3561002c565b63249cb3fa0361000e576100ef565b60e01c90565b60405190565b5f80fd5b5f80fd5b90565b61004c81610040565b0361005357565b5f80fd5b9050359061006482610043565b565b60018060a01b031690565b61007a90610066565b90565b61008681610071565b0361008d57565b5f80fd5b9050359061009e8261007d565b565b91906040838203126100c857806100bc6100c5925f8601610057565b93602001610091565b90565b61003c565b6100d690610040565b9052565b91906100ed905f602085019401906100cd565b565b346101205761011c61010b6101053660046100a0565b90610210565b610113610032565b918291826100da565b0390f35b610038565b5f80fd5b5f90565b61013690610040565b90565b906101439061012d565b5f5260205260405f2090565b90565b61016661016161016b92610066565b61014f565b610066565b90565b61017790610152565b90565b6101839061016e565b90565b906101909061017a565b5f5260205260405f2090565b5f1c90565b60ff1690565b6101b36101b89161019c565b6101a1565b90565b6101c590546101a7565b90565b90565b5f1b90565b6101e46101df6101e9926101c8565b6101cb565b610040565b90565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b490565b6102349161022a61022f92610223610129565b505f610139565b610186565b6101bb565b5f14610246576102426101ec565b5b90565b61024f5f6101d0565b61024356fea2646970667358221220494229690e367831e3adb9176144dfd7d90d13e5be098719145864318d9069fc64736f6c634300081d0033a26469706673582212204e08d494cd50b04127c498d96ed6fbfdebadf67e6d73a5ae87d2c12a4ae8889364736f6c634300081d0033", "storage": {}, "balance": "0x0", "nonce": "0x1" @@ -95,4 +105,4 @@ "nonce": "0x1" } } -} \ No newline at end of file +} diff --git a/tooling/genesis/src/genesis.rs b/tooling/genesis/src/genesis.rs index 829b9de493..24f1cc0288 100644 --- a/tooling/genesis/src/genesis.rs +++ b/tooling/genesis/src/genesis.rs @@ -27,6 +27,7 @@ fn sort_config(genesis_map: &mut Map) -> Result Date: Wed, 8 Oct 2025 10:33:59 -0300 Subject: [PATCH 02/20] compute cell proofs --- crates/common/types/blobs_bundle.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/crates/common/types/blobs_bundle.rs b/crates/common/types/blobs_bundle.rs index d11d6e4158..47ed944629 100644 --- a/crates/common/types/blobs_bundle.rs +++ b/crates/common/types/blobs_bundle.rs @@ -85,19 +85,31 @@ impl BlobsBundle { pub fn create_from_blobs(blobs: &Vec, fork: Fork) -> Result { use ethrex_crypto::kzg::blob_to_kzg_commitment_and_proof; let mut commitments = Vec::new(); - let mut proofs = Vec::new(); + // let mut proofs = Vec::new(); // Populate the commitments and proofs for blob in blobs { - let (commitment, proof) = blob_to_kzg_commitment_and_proof(blob)?; + let (commitment, _proof) = blob_to_kzg_commitment_and_proof(blob)?; commitments.push(commitment); - proofs.push(proof); + // proofs.push(proof); + } + + // Osaka + let c_kzg_settings = c_kzg::ethereum_kzg_settings(8); + let mut total_proofs = Vec::new(); + for blob in blobs { + let blob: c_kzg::Blob = (*blob).into(); + let (_cells, proofs) = c_kzg_settings + .compute_cells_and_kzg_proofs(&blob) + .map_err(|e| BlobsBundleError::Kzg(ethrex_crypto::kzg::KzgError::CKzg(e)))?; + let proofs = proofs.map(|p| p.to_bytes().into_inner()); + total_proofs.extend(proofs); } Ok(Self { blobs: blobs.clone(), commitments, - proofs, + proofs: total_proofs, version: 0, }) } From 4a86ee211f89d23a1895161023223307cd7674c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Wed, 8 Oct 2025 15:52:45 -0300 Subject: [PATCH 03/20] use version 1 --- crates/common/types/blobs_bundle.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/common/types/blobs_bundle.rs b/crates/common/types/blobs_bundle.rs index 47ed944629..167b55b32a 100644 --- a/crates/common/types/blobs_bundle.rs +++ b/crates/common/types/blobs_bundle.rs @@ -110,7 +110,7 @@ impl BlobsBundle { blobs: blobs.clone(), commitments, proofs: total_proofs, - version: 0, + version: 1, }) } From 934e40798719f9cc21dce205640bd45388f05bde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Wed, 8 Oct 2025 17:27:13 -0300 Subject: [PATCH 04/20] use cell proofs --- crates/common/types/transaction.rs | 2 +- crates/l2/sdk/src/sdk.rs | 2 +- fixtures/genesis/l1-dev.json | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/common/types/transaction.rs b/crates/common/types/transaction.rs index f81e151640..99353ec77e 100644 --- a/crates/common/types/transaction.rs +++ b/crates/common/types/transaction.rs @@ -2320,7 +2320,7 @@ mod serde_impl { Ok(Self { tx: value.try_into()?, - wrapper_version: None, + wrapper_version: Some(1), blobs_bundle: BlobsBundle::create_from_blobs(&blobs, fork)?, }) } diff --git a/crates/l2/sdk/src/sdk.rs b/crates/l2/sdk/src/sdk.rs index 40513354ab..6eaf97461a 100644 --- a/crates/l2/sdk/src/sdk.rs +++ b/crates/l2/sdk/src/sdk.rs @@ -671,7 +671,7 @@ pub async fn send_generic_transaction( } TxType::EIP4844 => { // TODO: see how to check for fork - let mut tx = WrappedEIP4844Transaction::from_generic_tx(generic_tx, Fork::Prague)?; + let mut tx = WrappedEIP4844Transaction::from_generic_tx(generic_tx, Fork::Osaka)?; tx.tx .sign_inplace(signer) .await diff --git a/fixtures/genesis/l1-dev.json b/fixtures/genesis/l1-dev.json index 35adc8377f..d887396657 100644 --- a/fixtures/genesis/l1-dev.json +++ b/fixtures/genesis/l1-dev.json @@ -17,7 +17,6 @@ "shanghaiTime": 0, "cancunTime": 0, "pragueTime": 0, - "osakaTime": 0, "depositContractAddress": "0x00000000219ab540356cbb839cbe05303d7705fa", "blobSchedule": { "cancun": { From 44ceffa350bb512f1e0bfbf02d3e5c6427a3bdbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Thu, 9 Oct 2025 10:15:13 -0300 Subject: [PATCH 05/20] make eth client expose eth_config --- crates/networking/rpc/clients/eth/errors.rs | 12 ++++++++++- crates/networking/rpc/clients/eth/mod.rs | 18 ++++++++++++++++- crates/networking/rpc/eth/client.rs | 22 ++++++++++----------- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/crates/networking/rpc/clients/eth/errors.rs b/crates/networking/rpc/clients/eth/errors.rs index f51ea3eb0b..8345dea0a4 100644 --- a/crates/networking/rpc/clients/eth/errors.rs +++ b/crates/networking/rpc/clients/eth/errors.rs @@ -45,8 +45,10 @@ pub enum EthClientError { GetWitnessError(#[from] GetWitnessError), #[error("eth_maxPriorityFeePerGas request error: {0}")] GetMaxPriorityFeeError(#[from] GetMaxPriorityFeeError), + #[error("eth_config request error: {0}")] + GetEthConfigError(#[from] GetEthConfigError), #[error("Unreachable nonce")] - UnrecheableNonce, + UnreachableNonce, #[error("Error: {0}")] Custom(String), #[error("Failed to encode calldata: {0}")] @@ -302,3 +304,11 @@ pub enum GetBatchByNumberError { #[error("{0}")] RPCError(String), } + +#[derive(Debug, thiserror::Error)] +pub enum GetEthConfigError { + #[error("{0}")] + SerdeJSONError(#[from] serde_json::Error), + #[error("{0}")] + RPCError(String), +} diff --git a/crates/networking/rpc/clients/eth/mod.rs b/crates/networking/rpc/clients/eth/mod.rs index d5595ce11d..493cb17342 100644 --- a/crates/networking/rpc/clients/eth/mod.rs +++ b/crates/networking/rpc/clients/eth/mod.rs @@ -1,8 +1,11 @@ use std::{collections::BTreeMap, fmt}; use crate::{ - clients::eth::errors::{CallError, GetPeerCountError, GetWitnessError, TxPoolContentError}, + clients::eth::errors::{ + CallError, GetEthConfigError, GetPeerCountError, GetWitnessError, TxPoolContentError, + }, debug::execution_witness::RpcExecutionWitness, + eth::client::EthConfigResponse, mempool::MempoolContent, types::{ block::RpcBlock, @@ -579,6 +582,19 @@ impl EthClient { } } + pub async fn get_eth_config(&self) -> Result { + let request = RpcRequest::new("eth_config", None); + + match self.send_request(request).await? { + RpcResponse::Success(result) => serde_json::from_value(result.result) + .map_err(GetEthConfigError::SerdeJSONError) + .map_err(EthClientError::from), + RpcResponse::Error(error_response) => { + Err(GetEthConfigError::RPCError(error_response.error.message).into()) + } + } + } + pub async fn get_code( &self, address: Address, diff --git a/crates/networking/rpc/eth/client.rs b/crates/networking/rpc/eth/client.rs index 4472ceb856..c8282e74bf 100644 --- a/crates/networking/rpc/eth/client.rs +++ b/crates/networking/rpc/eth/client.rs @@ -75,22 +75,22 @@ pub struct Config; #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -struct EthConfigObject { - activation_time: Option, - blob_schedule: Option, +pub struct EthConfigObject { + pub activation_time: Option, + pub blob_schedule: Option, #[serde(with = "serde_utils::u64::hex_str")] - chain_id: u64, - fork_id: H32, - precompiles: BTreeMap, - system_contracts: BTreeMap, + pub chain_id: u64, + pub fork_id: H32, + pub precompiles: BTreeMap, + pub system_contracts: BTreeMap, } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -struct EthConfigResponse { - current: EthConfigObject, - next: Option, - last: Option, +pub struct EthConfigResponse { + pub current: EthConfigObject, + pub next: Option, + pub last: Option, } impl RpcHandler for Config { From c46220a44f84d6a7726fa4ec64439684c13bc24d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Thu, 9 Oct 2025 13:01:51 -0300 Subject: [PATCH 06/20] default to osaka if rpc responds correctly --- crates/common/types/blobs_bundle.rs | 31 ++++++++++++------------ crates/common/types/transaction.rs | 2 +- crates/l2/based/block_fetcher.rs | 4 +-- crates/l2/monitor/widget/batches.rs | 28 +++++++++++++++------ crates/l2/networking/rpc/l2/batch.rs | 1 + crates/l2/sdk/src/sdk.rs | 11 +++++++-- crates/l2/sequencer/l1_committer.rs | 7 +++--- crates/l2/sequencer/proof_coordinator.rs | 4 ++- crates/l2/storage/src/store.rs | 1 - crates/networking/rpc/eth/client.rs | 20 +++++++-------- 10 files changed, 64 insertions(+), 45 deletions(-) diff --git a/crates/common/types/blobs_bundle.rs b/crates/common/types/blobs_bundle.rs index 167b55b32a..3ba612b12b 100644 --- a/crates/common/types/blobs_bundle.rs +++ b/crates/common/types/blobs_bundle.rs @@ -85,32 +85,31 @@ impl BlobsBundle { pub fn create_from_blobs(blobs: &Vec, fork: Fork) -> Result { use ethrex_crypto::kzg::blob_to_kzg_commitment_and_proof; let mut commitments = Vec::new(); - // let mut proofs = Vec::new(); + let mut proofs = Vec::new(); + let c_kzg_settings = c_kzg::ethereum_kzg_settings(8); // Populate the commitments and proofs for blob in blobs { - let (commitment, _proof) = blob_to_kzg_commitment_and_proof(blob)?; + let (commitment, proof) = blob_to_kzg_commitment_and_proof(blob)?; commitments.push(commitment); - // proofs.push(proof); - } - // Osaka - let c_kzg_settings = c_kzg::ethereum_kzg_settings(8); - let mut total_proofs = Vec::new(); - for blob in blobs { - let blob: c_kzg::Blob = (*blob).into(); - let (_cells, proofs) = c_kzg_settings - .compute_cells_and_kzg_proofs(&blob) - .map_err(|e| BlobsBundleError::Kzg(ethrex_crypto::kzg::KzgError::CKzg(e)))?; - let proofs = proofs.map(|p| p.to_bytes().into_inner()); - total_proofs.extend(proofs); + if fork <= Fork::Prague { + proofs.push(proof); + } else { + let blob: c_kzg::Blob = (*blob).into(); + let (_cells, cell_proofs) = c_kzg_settings + .compute_cells_and_kzg_proofs(&blob) + .map_err(|e| BlobsBundleError::Kzg(ethrex_crypto::kzg::KzgError::CKzg(e)))?; + let cell_proofs = cell_proofs.map(|p| p.to_bytes().into_inner()); + proofs.extend(cell_proofs); + } } Ok(Self { blobs: blobs.clone(), commitments, - proofs: total_proofs, - version: 1, + proofs, + version: if fork <= Fork::Prague { 0 } else { 1 }, }) } diff --git a/crates/common/types/transaction.rs b/crates/common/types/transaction.rs index 99353ec77e..7ea6c52058 100644 --- a/crates/common/types/transaction.rs +++ b/crates/common/types/transaction.rs @@ -2320,7 +2320,7 @@ mod serde_impl { Ok(Self { tx: value.try_into()?, - wrapper_version: Some(1), + wrapper_version: (fork > Fork::Prague).then_some(1), blobs_bundle: BlobsBundle::create_from_blobs(&blobs, fork)?, }) } diff --git a/crates/l2/based/block_fetcher.rs b/crates/l2/based/block_fetcher.rs index 856f1cce14..0787f1af81 100644 --- a/crates/l2/based/block_fetcher.rs +++ b/crates/l2/based/block_fetcher.rs @@ -13,7 +13,7 @@ use ethrex_l2_common::{ privileged_transactions::compute_privileged_transactions_hash, state_diff::prepare_state_diff, }; -use ethrex_l2_sdk::{get_last_committed_batch, get_last_fetched_l1_block}; +use ethrex_l2_sdk::{get_l1_fork, get_last_committed_batch, get_last_fetched_l1_block}; use ethrex_rlp::decode::RLPDecode; use ethrex_rpc::{EthClient, types::receipt::RpcLog}; use ethrex_storage::Store; @@ -388,7 +388,7 @@ impl BlockFetcher { ) .map_err(|_| BlockFetcherError::BlobBundleError)?; - let fork = self.blockchain.current_fork().await?; + let fork = get_l1_fork(&self.eth_client).await; let (blobs_bundle, _) = generate_blobs_bundle(&state_diff, fork) .map_err(|_| BlockFetcherError::BlobBundleError)?; diff --git a/crates/l2/monitor/widget/batches.rs b/crates/l2/monitor/widget/batches.rs index fa928f1473..685b17a020 100644 --- a/crates/l2/monitor/widget/batches.rs +++ b/crates/l2/monitor/widget/batches.rs @@ -2,7 +2,7 @@ use ethrex_common::{ Address, H256, types::{Fork, batch::Batch}, }; -use ethrex_l2_sdk::get_last_committed_batch; +use ethrex_l2_sdk::{get_l1_fork, get_last_committed_batch}; use ethrex_rpc::EthClient; use ethrex_storage_rollup::StoreRollup; use ratatui::{ @@ -63,17 +63,23 @@ impl BatchesTable { .await?; new_latest_batches.truncate(BATCH_WINDOW_SIZE); + let fork = get_l1_fork(eth_client).await; + let n_new_latest_batches = new_latest_batches.len(); self.items .truncate(BATCH_WINDOW_SIZE - n_new_latest_batches); - self.refresh_items(rollup_store).await?; + self.refresh_items(rollup_store, fork).await?; self.items.extend_from_slice(&new_latest_batches); self.items.rotate_right(n_new_latest_batches); Ok(()) } - async fn refresh_items(&mut self, rollup_store: &StoreRollup) -> Result<(), MonitorError> { + async fn refresh_items( + &mut self, + rollup_store: &StoreRollup, + fork: Fork, + ) -> Result<(), MonitorError> { if self.items.is_empty() { return Ok(()); } @@ -85,9 +91,8 @@ impl BatchesTable { refreshed_batches.push(batch.clone()); } else { let batch_number = batch.number; - // TODO: change this let new_batch = rollup_store - .get_batch(batch_number, Fork::Prague) + .get_batch(batch_number, fork) .await .map_err(|e| MonitorError::GetBatchByNumber(batch_number, e))? .ok_or(MonitorError::BatchNotFound(batch_number))?; @@ -120,9 +125,15 @@ impl BatchesTable { .map_err(|_| MonitorError::BatchWindow)?, ), ); + let fork = get_l1_fork(eth_client).await; - let new_batches = - Self::get_batches(last_l2_batch_fetched, last_l2_batch_number, rollup_store).await?; + let new_batches = Self::get_batches( + last_l2_batch_fetched, + last_l2_batch_number, + rollup_store, + fork, + ) + .await?; Ok(Self::process_batches(new_batches)) } @@ -131,13 +142,14 @@ impl BatchesTable { from: &mut u64, to: u64, rollup_store: &StoreRollup, + fork: Fork, ) -> Result, MonitorError> { let mut new_batches = Vec::new(); for batch_number in *from + 1..=to { // TODO: change this fork let batch = rollup_store - .get_batch(batch_number, Fork::Prague) + .get_batch(batch_number, fork) .await .map_err(|e| MonitorError::GetBatchByNumber(batch_number, e))? .ok_or(MonitorError::BatchNotFound(batch_number))?; diff --git a/crates/l2/networking/rpc/l2/batch.rs b/crates/l2/networking/rpc/l2/batch.rs index b1e32bd6be..22fd533dd0 100644 --- a/crates/l2/networking/rpc/l2/batch.rs +++ b/crates/l2/networking/rpc/l2/batch.rs @@ -92,6 +92,7 @@ impl RpcHandler for GetBatchByBatchNumberRequest { async fn handle(&self, context: RpcApiContext) -> Result { debug!("Requested batch with number: {}", self.batch_number); + // TODO: review this choice of fork let fork = context.l1_ctx.blockchain.current_fork().await?; let Some(batch) = context .rollup_store diff --git a/crates/l2/sdk/src/sdk.rs b/crates/l2/sdk/src/sdk.rs index 11c334aa26..e80af08458 100644 --- a/crates/l2/sdk/src/sdk.rs +++ b/crates/l2/sdk/src/sdk.rs @@ -670,8 +670,8 @@ pub async fn send_generic_transaction( signed_tx.encode(&mut encoded_tx); } TxType::EIP4844 => { - // TODO: see how to check for fork - let mut tx = WrappedEIP4844Transaction::from_generic_tx(generic_tx, Fork::Osaka)?; + let fork = get_l1_fork(client).await; + let mut tx = WrappedEIP4844Transaction::from_generic_tx(generic_tx, fork)?; tx.tx .sign_inplace(signer) .await @@ -982,6 +982,13 @@ pub async fn get_pending_privileged_transactions( from_hex_string_to_h256_array(&response) } +pub async fn get_l1_fork(client: &EthClient) -> Fork { + match client.get_eth_config().await { + Ok(_) => Fork::Osaka, // This endpoint only supports Osaka and later + Err(_) => Fork::Prague, + } +} + async fn _generic_call( client: &EthClient, selector: &[u8], diff --git a/crates/l2/sequencer/l1_committer.rs b/crates/l2/sequencer/l1_committer.rs index 45e461cc5c..c83de2c183 100644 --- a/crates/l2/sequencer/l1_committer.rs +++ b/crates/l2/sequencer/l1_committer.rs @@ -28,7 +28,7 @@ use ethrex_l2_common::{ }; use ethrex_l2_rpc::signer::{Signer, SignerHealth}; use ethrex_l2_sdk::{ - build_generic_tx, calldata::encode_calldata, get_last_committed_batch, + build_generic_tx, calldata::encode_calldata, get_l1_fork, get_last_committed_batch, send_tx_bump_gas_exponential_backoff, }; #[cfg(feature = "metrics")] @@ -206,7 +206,7 @@ impl L1Committer { get_last_committed_batch(&self.eth_client, self.on_chain_proposer_address).await?; let batch_to_commit = last_committed_batch_number + 1; - let fork = self.blockchain.current_fork().await?; + let fork = get_l1_fork(&self.eth_client).await; let batch = match self.rollup_store.get_batch(batch_to_commit, fork).await? { Some(batch) => batch, None => { @@ -449,8 +449,7 @@ impl L1Committer { &acc_privileged_txs, acc_account_updates.clone().into_values().collect(), )?; - // TODO: review if we have to check for fork in the eth_client - let fork = self.blockchain.current_fork().await?; + let fork = get_l1_fork(&self.eth_client).await; generate_blobs_bundle(&state_diff, fork) } else { Ok((BlobsBundle::default(), 0_usize)) diff --git a/crates/l2/sequencer/proof_coordinator.rs b/crates/l2/sequencer/proof_coordinator.rs index 08fd90d3d5..742aa5eea6 100644 --- a/crates/l2/sequencer/proof_coordinator.rs +++ b/crates/l2/sequencer/proof_coordinator.rs @@ -13,6 +13,7 @@ use ethrex_common::{ types::{Block, blobs_bundle}, }; use ethrex_l2_common::prover::{BatchProof, ProverType}; +use ethrex_l2_sdk::get_l1_fork; use ethrex_metrics::metrics; use ethrex_rpc::clients::eth::EthClient; use ethrex_storage::Store; @@ -488,11 +489,12 @@ impl ProofCoordinator { .get_blobs_by_batch(batch_number) .await? .ok_or(ProofCoordinatorError::MissingBlob(batch_number))?; + let fork = get_l1_fork(&self.eth_client).await; let BlobsBundle { mut commitments, mut proofs, .. - } = BlobsBundle::create_from_blobs(&blob, self.blockchain.current_fork().await?)?; + } = BlobsBundle::create_from_blobs(&blob, fork)?; match (commitments.pop(), proofs.pop()) { (Some(commitment), Some(proof)) => (commitment, proof), _ => return Err(ProofCoordinatorError::MissingBlob(batch_number)), diff --git a/crates/l2/storage/src/store.rs b/crates/l2/storage/src/store.rs index 8b626e717e..873b5ee2c4 100644 --- a/crates/l2/storage/src/store.rs +++ b/crates/l2/storage/src/store.rs @@ -156,7 +156,6 @@ impl Store { pub async fn get_batch( &self, batch_number: u64, - // TODO: Should we get the fork from the last block of the batch instead? fork: Fork, ) -> Result, RollupStoreError> { let Some(blocks) = self.get_block_numbers_by_batch(batch_number).await? else { diff --git a/crates/networking/rpc/eth/client.rs b/crates/networking/rpc/eth/client.rs index c8282e74bf..fdf9e98ed1 100644 --- a/crates/networking/rpc/eth/client.rs +++ b/crates/networking/rpc/eth/client.rs @@ -75,22 +75,22 @@ pub struct Config; #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct EthConfigObject { - pub activation_time: Option, - pub blob_schedule: Option, +struct EthConfigObject { + activation_time: Option, + blob_schedule: Option, #[serde(with = "serde_utils::u64::hex_str")] - pub chain_id: u64, - pub fork_id: H32, - pub precompiles: BTreeMap, - pub system_contracts: BTreeMap, + chain_id: u64, + fork_id: H32, + precompiles: BTreeMap, + system_contracts: BTreeMap, } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct EthConfigResponse { - pub current: EthConfigObject, - pub next: Option, - pub last: Option, + current: EthConfigObject, + next: Option, + last: Option, } impl RpcHandler for Config { From 9c5d320520abb693452bf79d928572922d3a0e43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Thu, 9 Oct 2025 13:04:57 -0300 Subject: [PATCH 07/20] remove comment --- crates/l2/monitor/widget/batches.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/l2/monitor/widget/batches.rs b/crates/l2/monitor/widget/batches.rs index 685b17a020..f8bf243df5 100644 --- a/crates/l2/monitor/widget/batches.rs +++ b/crates/l2/monitor/widget/batches.rs @@ -147,7 +147,6 @@ impl BatchesTable { let mut new_batches = Vec::new(); for batch_number in *from + 1..=to { - // TODO: change this fork let batch = rollup_store .get_batch(batch_number, fork) .await From d4b2b11d01e7f0449f1debb4cbbc0397b4cb6f4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Thu, 9 Oct 2025 13:10:48 -0300 Subject: [PATCH 08/20] add issue link and rever genesis changes --- crates/l2/sdk/src/sdk.rs | 1 + fixtures/genesis/l1-dev.json | 5 ----- fixtures/genesis/l2.json | 38 +++++++++++++----------------------- 3 files changed, 15 insertions(+), 29 deletions(-) diff --git a/crates/l2/sdk/src/sdk.rs b/crates/l2/sdk/src/sdk.rs index e80af08458..dadc79d08e 100644 --- a/crates/l2/sdk/src/sdk.rs +++ b/crates/l2/sdk/src/sdk.rs @@ -982,6 +982,7 @@ pub async fn get_pending_privileged_transactions( from_hex_string_to_h256_array(&response) } +// TODO: This is a work around for now, issue: https://github.com/lambdaclass/ethrex/issues/4828 pub async fn get_l1_fork(client: &EthClient) -> Fork { match client.get_eth_config().await { Ok(_) => Fork::Osaka, // This endpoint only supports Osaka and later diff --git a/fixtures/genesis/l1-dev.json b/fixtures/genesis/l1-dev.json index d887396657..0de2675f6e 100644 --- a/fixtures/genesis/l1-dev.json +++ b/fixtures/genesis/l1-dev.json @@ -28,11 +28,6 @@ "target": 6, "max": 9, "baseFeeUpdateFraction": 5007716 - }, - "osaka": { - "target": 6, - "max": 9, - "baseFeeUpdateFraction": 5007716 } }, "mergeNetsplitBlock": 0 diff --git a/fixtures/genesis/l2.json b/fixtures/genesis/l2.json index f04be53cab..297493b1e6 100644 --- a/fixtures/genesis/l2.json +++ b/fixtures/genesis/l2.json @@ -20,29 +20,19 @@ "depositContractAddress": "0x00000000219ab540356cbb839cbe05303d7705fa", "blobSchedule": { "cancun": { - "baseFeeUpdateFraction": 3338477, + "target": 3, "max": 6, - "target": 3 + "baseFeeUpdateFraction": 3338477 }, "prague": { - "baseFeeUpdateFraction": 5007716, + "target": 6, "max": 9, - "target": 6 + "baseFeeUpdateFraction": 5007716 }, "osaka": { - "baseFeeUpdateFraction": 5007716, + "target": 6, "max": 9, - "target": 6 - }, - "bpo1": { - "baseFeeUpdateFraction": 8346193, - "max": 15, - "target": 10 - }, - "bpo2": { - "baseFeeUpdateFraction": 11684671, - "max": 21, - "target": 14 + "baseFeeUpdateFraction": 5007716 } }, "mergeNetsplitBlock": 0, @@ -57,19 +47,19 @@ "coinbase": "0x0000000000000000000000000000000000000000", "alloc": { "0x000000000000000000000000000000000000effe": { - "code": "0x60806040526004361015610013575b61016f565b61001d5f3561003b565b8062cffbe514610036576360206aab0361000e5761013a565b610098565b60e01c90565b60405190565b5f80fd5b5f80fd5b90565b61005b8161004f565b0361006257565b5f80fd5b9050359061007382610052565b565b9060208282031261008e5761008b915f01610066565b90565b61004b565b5f0190565b346100c6576100b06100ab366004610075565b610299565b6100b8610041565b806100c281610093565b0390f35b610047565b5f9103126100d557565b61004b565b1c90565b90565b6100f19060086100f693026100da565b6100de565b90565b9061010491546100e1565b90565b6101125f5f906100f9565b90565b90565b61012190610115565b9052565b9190610138905f60208501940190610118565b565b3461016a5761014a3660046100cb565b610166610155610107565b61015d610041565b91829182610125565b0390f35b610047565b5f80fd5b90565b90565b61018d61018861019292610173565b610176565b610115565b90565b5f1c90565b6101a66101ab91610195565b6100de565b90565b6101b8905461019a565b90565b634e487b7160e01b5f52601160045260245ffd5b6101de6101e491939293610115565b92610115565b82018092116101ef57565b6101bb565b5f1b90565b906102055f19916101f4565b9181191691161790565b61022361021e61022892610115565b610176565b610115565b90565b90565b9061024361023e61024a9261020f565b61022b565b82546101f9565b9055565b60018060a01b031690565b61026d6102686102729261024e565b610176565b61024e565b90565b61027e90610259565b90565b61028a90610275565b90565b6102969061004f565b90565b6102bd6102b76102a96001610179565b6102b25f6101ae565b6101cf565b5f61022e565b33906102c85f6101ae565b906103056102ff6102f97f18d7b705344d616d1b61daa6a8ccfcf9f10c27ade007cc45cf870d1e121f1a9d95610281565b9261028d565b9261020f565b9261030e610041565b8061031881610093565b0390a456fea264697066735822122085976b05d9410090ae778bab2768fabc3204b3042d036664a6d9276cec95b9d764736f6c634300081d0033", + "code": "0x60806040526004361015610013575b61016f565b61001d5f3561003b565b8062cffbe514610036576360206aab0361000e5761013a565b610098565b60e01c90565b60405190565b5f80fd5b5f80fd5b90565b61005b8161004f565b0361006257565b5f80fd5b9050359061007382610052565b565b9060208282031261008e5761008b915f01610066565b90565b61004b565b5f0190565b346100c6576100b06100ab366004610075565b610299565b6100b8610041565b806100c281610093565b0390f35b610047565b5f9103126100d557565b61004b565b1c90565b90565b6100f19060086100f693026100da565b6100de565b90565b9061010491546100e1565b90565b6101125f5f906100f9565b90565b90565b61012190610115565b9052565b9190610138905f60208501940190610118565b565b3461016a5761014a3660046100cb565b610166610155610107565b61015d610041565b91829182610125565b0390f35b610047565b5f80fd5b90565b90565b61018d61018861019292610173565b610176565b610115565b90565b5f1c90565b6101a66101ab91610195565b6100de565b90565b6101b8905461019a565b90565b634e487b7160e01b5f52601160045260245ffd5b6101de6101e491939293610115565b92610115565b82018092116101ef57565b6101bb565b5f1b90565b906102055f19916101f4565b9181191691161790565b61022361021e61022892610115565b610176565b610115565b90565b90565b9061024361023e61024a9261020f565b61022b565b82546101f9565b9055565b60018060a01b031690565b61026d6102686102729261024e565b610176565b61024e565b90565b61027e90610259565b90565b61028a90610275565b90565b6102969061004f565b90565b6102bd6102b76102a96001610179565b6102b25f6101ae565b6101cf565b5f61022e565b33906102c85f6101ae565b906103056102ff6102f97f18d7b705344d616d1b61daa6a8ccfcf9f10c27ade007cc45cf870d1e121f1a9d95610281565b9261028d565b9261020f565b9261030e610041565b8061031881610093565b0390a456fea26469706673582212204396f246249f52e780861cf7c8e99ebc34211e11586f573a735d1178cc6f3e8664736f6c634300081d0033", "storage": {}, "balance": "0x0", "nonce": "0x1" }, "0x000000000000000000000000000000000000efff": { - "code": "0x60806040526004361015610013575b610383565b61001d5f3561009c565b806351cff8d91461009757806358bc83371461009257806379204fe01461008d57806379c0cdef146100885780637e1233a914610083578063b0f4d3951461007e578063d23061db146100795763fccc28130361000e5761034e565b610308565b6102df565b6102aa565b610262565b61022b565b61018a565b610109565b60e01c90565b60405190565b5f80fd5b60018060a01b031690565b6100c0906100ac565b90565b6100cc816100b7565b036100d357565b5f80fd5b905035906100e4826100c3565b565b906020828203126100ff576100fc915f016100d7565b90565b6100a8565b5f0190565b61011c6101173660046100e6565b610710565b6101246100a2565b8061012e81610104565b0390f35b5f80fd5b5f91031261014057565b6100a8565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b610165610145565b90565b610171906100b7565b9052565b9190610188905f60208501940190610168565b565b346101ba5761019a366004610136565b6101b66101a561015d565b6101ad6100a2565b91829182610175565b0390f35b610132565b90565b6101cb816101bf565b036101d257565b5f80fd5b905035906101e3826101c2565b565b608081830312610226576101fb825f83016100d7565b9261022361020c84602085016100d7565b9361021a81604086016100d7565b936060016101d6565b90565b6100a8565b3461025d5761024761023e3660046101e5565b92919091610af7565b61024f6100a2565b8061025981610104565b0390f35b610132565b346102945761027e6102753660046101e5565b92919091610ce9565b6102866100a2565b8061029081610104565b0390f35b610132565b61fffe90565b6102a7610299565b90565b346102da576102ba366004610136565b6102d66102c561029f565b6102cd6100a2565b91829182610175565b0390f35b610132565b6102f26102ed3660046100e6565b610cf7565b6102fa6100a2565b8061030481610104565b0390f35b3461033a5761032461031b3660046101e5565b92919091610dfe565b61032c6100a2565b8061033681610104565b0390f35b610132565b5f90565b61034b61033f565b90565b3461037e5761035e366004610136565b61037a610369610343565b6103716100a2565b91829182610175565b0390f35b610132565b5f80fd5b90565b90565b6103a161039c6103a692610387565b61038a565b6101bf565b90565b60209181520190565b60207f7665000000000000000000000000000000000000000000000000000000000000917f5769746864726177616c20616d6f756e74206d75737420626520706f736974695f8201520152565b61040c60226040926103a9565b610415816103b2565b0190565b61042e9060208101905f8183039101526103ff565b90565b1561043857565b6104406100a2565b62461bcd60e51b81528061045660048201610419565b0390fd5b905090565b61046a5f809261045a565b0190565b6104779061045f565b90565b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906104a29061047a565b810190811067ffffffffffffffff8211176104bc57604052565b610484565b906104d46104cd6100a2565b9283610498565b565b67ffffffffffffffff81116104f4576104f060209161047a565b0190565b610484565b9061050b610506836104d6565b6104c1565b918252565b606090565b3d5f14610530576105253d6104f9565b903d5f602084013e5b565b610538610510565b9061052e565b5f7f4661696c656420746f206275726e204574686572000000000000000000000000910152565b61057260146020926103a9565b61057b8161053e565b0190565b6105949060208101905f818303910152610565565b90565b1561059e57565b6105a66100a2565b62461bcd60e51b8152806105bc6004820161057f565b0390fd5b6105d46105cf6105d9926100ac565b61038a565b6100ac565b90565b6105e5906105c0565b90565b6105f1906105dc565b90565b61060861060361060d926101bf565b61038a565b6101bf565b90565b610619906105c0565b90565b61062590610610565b90565b610631906105dc565b90565b60601b90565b61064390610634565b90565b61064f9061063a565b90565b61065e610663916100b7565b610646565b9052565b90565b61067661067b916101bf565b610667565b9052565b926106ac60146106b4946106a4828861069c60209b9a8399610652565b018092610652565b018092610652565b01809261066a565b0190565b60200190565b5190565b5f80fd5b60e01b90565b5f9103126106d657565b6100a8565b90565b6106e7906106db565b9052565b91906106fe905f602085019401906106de565b565b6107086100a2565b3d5f823e3d90fd5b61072c346107266107205f61038d565b916101bf565b11610431565b61075f5f8061073961033f565b346107426100a2565b908161074d8161046e565b03925af1610759610515565b50610597565b3381349061079f6107996107937fbb2689ff876f7ef453cf8865dde5ab10349d222e2e1383c5152fbdb083f02da2956105e8565b926105e8565b926105f4565b926107a86100a2565b806107b281610104565b0390a46107cd6107c86107c3610299565b61061c565b610628565b9062cffbe59061080f6107de610145565b6108006107e9610145565b9334906107f46100a2565b9586946020860161067f565b60208201810382520382610498565b61082161081b826106be565b916106b8565b20823b1561089557610852926108475f809461083b6100a2565b968795869485936106c6565b8352600483016106eb565b03925af1801561089057610864575b50565b610883905f3d8111610889575b61087b8183610498565b8101906106cc565b5f610861565b503d610871565b610700565b6106c2565b6108a3906105dc565b90565b60207f6520627269646765000000000000000000000000000000000000000000000000917f436f6d6d6f6e4272696467654c323a2063616c6c6572206973206e6f742074685f8201520152565b61090060286040926103a9565b610909816108a6565b0190565b6109229060208101905f8183039101526108f3565b90565b1561092c57565b6109346100a2565b62461bcd60e51b81528061094a6004820161090d565b0390fd5b9061097e9392916109793361097361096d6109683061089a565b6100b7565b916100b7565b14610925565b610a16565b565b63ffffffff1690565b63ffffffff60e01b1690565b6109a96109a46109ae92610980565b6106c6565b610989565b90565b6109ba906101bf565b9052565b6109f36109fa946109e96060949897956109df608086019a5f870190610168565b6020850190610168565b6040830190610168565b01906109b1565b565b151590565b9190610a14905f602085019401906109b1565b565b92919092610a855f80610a283061089a565b6004610a6c6379c0cdef610a5d88918b8d610a448d9293610995565b94610a4d6100a2565b97889660208801908152016109be565b60208201810382520382610498565b82602082019151925af1610a7e610515565b50156109fc565b610ae4575b92909192610adf610acd610ac7610ac17ff5353a2477e10b23280de25ca6cea55c17bb48000d8807ee631e514080e7fb4e946105e8565b946105e8565b946105e8565b94610ad66100a2565b91829182610a01565b0390a4565b610af2818584908692610f16565b610a8a565b90610b0393929161094e565b565b90610b35939291610b3033610b2a610b24610b1f3061089a565b6100b7565b916100b7565b14610925565b610bb6565b565b610b40906105c0565b90565b610b4c90610b37565b90565b610b58906105dc565b90565b90505190610b68826100c3565b565b90602082820312610b8357610b80915f01610b5b565b90565b6100a8565b15610b8f57565b5f80fd5b916020610bb4929493610bad60408201965f830190610168565b01906109b1565b565b90610bc090610b43565b610be46020610bce83610b4f565b63c2eeeebd90610bdc6100a2565b9384926106c6565b8252815f81610bf560048201610104565b03925af18015610ce457610c2c93610c27925f92610cac575b50610c1b610c21916100b7565b916100b7565b14610b88565b610b4f565b916318bf5077919092803b15610ca757610c595f8094610c64610c4d6100a2565b978896879586946106c6565b845260048401610b93565b03925af18015610ca257610c76575b50565b610c95905f3d8111610c9b575b610c8d8183610498565b8101906106cc565b5f610c73565b503d610c83565b610700565b6106c2565b610c21919250610cd5610c1b9160203d8111610cdd575b610ccd8183610498565b810190610b6a565b929150610c0e565b503d610cc3565b610700565b90610cf5939291610b05565b565b610d245f808334610d066100a2565b9081610d118161046e565b03925af1610d1d610515565b50156109fc565b610d6f575b3490610d6a610d587f85a190caa61692b36b63a55e069330d18ab9af179fed7a25c16a4262bc63b7d2926105e8565b92610d616100a2565b91829182610a01565b0390a2565b610d783061089a565b6351cff8d934919091908390803b15610df957610da85f93610db395610d9c6100a2565b968795869485936106c6565b835260048301610175565b03925af18015610df457610dc8575b50610d29565b610de7905f3d8111610ded575b610ddf8183610498565b8101906106cc565b5f610dc2565b503d610dd5565b610700565b6106c2565b929091610e1d82610e17610e115f61038d565b916101bf565b11610431565b610e2e610e2984610b43565b610b4f565b93632b8c49e3338496803b15610f1157610e5b5f8094610e66610e4f6100a2565b9b8c96879586946106c6565b845260048401610b93565b03925af1948515610f0c57610ede95610ee0575b50808483908592610ed2610ec0610eba610eb47f54538b93c6e9b3f518076db2d896122f653fac2bb32fa0b6bc75097b9f332e75946105e8565b946105e8565b946105e8565b94610ec96100a2565b91829182610a01565b0390a492909192610f16565b565b610eff905f3d8111610f05575b610ef78183610498565b8101906106cc565b5f610e7a565b503d610eed565b610700565b6106c2565b9190610f6290610f53610f37610f32610f2d610299565b61061c565b610628565b9562cffbe5959294610f476100a2565b9586946020860161067f565b60208201810382520382610498565b610f74610f6e826106be565b916106b8565b20823b15610fe857610fa592610f9a5f8094610f8e6100a2565b968795869485936106c6565b8352600483016106eb565b03925af18015610fe357610fb7575b50565b610fd6905f3d8111610fdc575b610fce8183610498565b8101906106cc565b5f610fb4565b503d610fc4565b610700565b6106c256fea2646970667358221220c0e9055278c4c6024d176f0113fce2d84d3461cc695bd0fd971ff541d56b834064736f6c634300081d0033", + "code": "0x60806040526004361015610013575b610383565b61001d5f3561009c565b806351cff8d91461009757806358bc83371461009257806379204fe01461008d57806379c0cdef146100885780637e1233a914610083578063b0f4d3951461007e578063d23061db146100795763fccc28130361000e5761034e565b610308565b6102df565b6102aa565b610262565b61022b565b61018a565b610109565b60e01c90565b60405190565b5f80fd5b60018060a01b031690565b6100c0906100ac565b90565b6100cc816100b7565b036100d357565b5f80fd5b905035906100e4826100c3565b565b906020828203126100ff576100fc915f016100d7565b90565b6100a8565b5f0190565b61011c6101173660046100e6565b610710565b6101246100a2565b8061012e81610104565b0390f35b5f80fd5b5f91031261014057565b6100a8565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b610165610145565b90565b610171906100b7565b9052565b9190610188905f60208501940190610168565b565b346101ba5761019a366004610136565b6101b66101a561015d565b6101ad6100a2565b91829182610175565b0390f35b610132565b90565b6101cb816101bf565b036101d257565b5f80fd5b905035906101e3826101c2565b565b608081830312610226576101fb825f83016100d7565b9261022361020c84602085016100d7565b9361021a81604086016100d7565b936060016101d6565b90565b6100a8565b3461025d5761024761023e3660046101e5565b92919091610af7565b61024f6100a2565b8061025981610104565b0390f35b610132565b346102945761027e6102753660046101e5565b92919091610ce9565b6102866100a2565b8061029081610104565b0390f35b610132565b61fffe90565b6102a7610299565b90565b346102da576102ba366004610136565b6102d66102c561029f565b6102cd6100a2565b91829182610175565b0390f35b610132565b6102f26102ed3660046100e6565b610cf7565b6102fa6100a2565b8061030481610104565b0390f35b3461033a5761032461031b3660046101e5565b92919091610dfe565b61032c6100a2565b8061033681610104565b0390f35b610132565b5f90565b61034b61033f565b90565b3461037e5761035e366004610136565b61037a610369610343565b6103716100a2565b91829182610175565b0390f35b610132565b5f80fd5b90565b90565b6103a161039c6103a692610387565b61038a565b6101bf565b90565b60209181520190565b60207f7665000000000000000000000000000000000000000000000000000000000000917f5769746864726177616c20616d6f756e74206d75737420626520706f736974695f8201520152565b61040c60226040926103a9565b610415816103b2565b0190565b61042e9060208101905f8183039101526103ff565b90565b1561043857565b6104406100a2565b62461bcd60e51b81528061045660048201610419565b0390fd5b905090565b61046a5f809261045a565b0190565b6104779061045f565b90565b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906104a29061047a565b810190811067ffffffffffffffff8211176104bc57604052565b610484565b906104d46104cd6100a2565b9283610498565b565b67ffffffffffffffff81116104f4576104f060209161047a565b0190565b610484565b9061050b610506836104d6565b6104c1565b918252565b606090565b3d5f14610530576105253d6104f9565b903d5f602084013e5b565b610538610510565b9061052e565b5f7f4661696c656420746f206275726e204574686572000000000000000000000000910152565b61057260146020926103a9565b61057b8161053e565b0190565b6105949060208101905f818303910152610565565b90565b1561059e57565b6105a66100a2565b62461bcd60e51b8152806105bc6004820161057f565b0390fd5b6105d46105cf6105d9926100ac565b61038a565b6100ac565b90565b6105e5906105c0565b90565b6105f1906105dc565b90565b61060861060361060d926101bf565b61038a565b6101bf565b90565b610619906105c0565b90565b61062590610610565b90565b610631906105dc565b90565b60601b90565b61064390610634565b90565b61064f9061063a565b90565b61065e610663916100b7565b610646565b9052565b90565b61067661067b916101bf565b610667565b9052565b926106ac60146106b4946106a4828861069c60209b9a8399610652565b018092610652565b018092610652565b01809261066a565b0190565b60200190565b5190565b5f80fd5b60e01b90565b5f9103126106d657565b6100a8565b90565b6106e7906106db565b9052565b91906106fe905f602085019401906106de565b565b6107086100a2565b3d5f823e3d90fd5b61072c346107266107205f61038d565b916101bf565b11610431565b61075f5f8061073961033f565b346107426100a2565b908161074d8161046e565b03925af1610759610515565b50610597565b3381349061079f6107996107937fbb2689ff876f7ef453cf8865dde5ab10349d222e2e1383c5152fbdb083f02da2956105e8565b926105e8565b926105f4565b926107a86100a2565b806107b281610104565b0390a46107cd6107c86107c3610299565b61061c565b610628565b9062cffbe59061080f6107de610145565b6108006107e9610145565b9334906107f46100a2565b9586946020860161067f565b60208201810382520382610498565b61082161081b826106be565b916106b8565b20823b1561089557610852926108475f809461083b6100a2565b968795869485936106c6565b8352600483016106eb565b03925af1801561089057610864575b50565b610883905f3d8111610889575b61087b8183610498565b8101906106cc565b5f610861565b503d610871565b610700565b6106c2565b6108a3906105dc565b90565b60207f6520627269646765000000000000000000000000000000000000000000000000917f436f6d6d6f6e4272696467654c323a2063616c6c6572206973206e6f742074685f8201520152565b61090060286040926103a9565b610909816108a6565b0190565b6109229060208101905f8183039101526108f3565b90565b1561092c57565b6109346100a2565b62461bcd60e51b81528061094a6004820161090d565b0390fd5b9061097e9392916109793361097361096d6109683061089a565b6100b7565b916100b7565b14610925565b610a16565b565b63ffffffff1690565b63ffffffff60e01b1690565b6109a96109a46109ae92610980565b6106c6565b610989565b90565b6109ba906101bf565b9052565b6109f36109fa946109e96060949897956109df608086019a5f870190610168565b6020850190610168565b6040830190610168565b01906109b1565b565b151590565b9190610a14905f602085019401906109b1565b565b92919092610a855f80610a283061089a565b6004610a6c6379c0cdef610a5d88918b8d610a448d9293610995565b94610a4d6100a2565b97889660208801908152016109be565b60208201810382520382610498565b82602082019151925af1610a7e610515565b50156109fc565b610ae4575b92909192610adf610acd610ac7610ac17ff5353a2477e10b23280de25ca6cea55c17bb48000d8807ee631e514080e7fb4e946105e8565b946105e8565b946105e8565b94610ad66100a2565b91829182610a01565b0390a4565b610af2818584908692610f16565b610a8a565b90610b0393929161094e565b565b90610b35939291610b3033610b2a610b24610b1f3061089a565b6100b7565b916100b7565b14610925565b610bb6565b565b610b40906105c0565b90565b610b4c90610b37565b90565b610b58906105dc565b90565b90505190610b68826100c3565b565b90602082820312610b8357610b80915f01610b5b565b90565b6100a8565b15610b8f57565b5f80fd5b916020610bb4929493610bad60408201965f830190610168565b01906109b1565b565b90610bc090610b43565b610be46020610bce83610b4f565b63c2eeeebd90610bdc6100a2565b9384926106c6565b8252815f81610bf560048201610104565b03925af18015610ce457610c2c93610c27925f92610cac575b50610c1b610c21916100b7565b916100b7565b14610b88565b610b4f565b916318bf5077919092803b15610ca757610c595f8094610c64610c4d6100a2565b978896879586946106c6565b845260048401610b93565b03925af18015610ca257610c76575b50565b610c95905f3d8111610c9b575b610c8d8183610498565b8101906106cc565b5f610c73565b503d610c83565b610700565b6106c2565b610c21919250610cd5610c1b9160203d8111610cdd575b610ccd8183610498565b810190610b6a565b929150610c0e565b503d610cc3565b610700565b90610cf5939291610b05565b565b610d245f808334610d066100a2565b9081610d118161046e565b03925af1610d1d610515565b50156109fc565b610d6f575b3490610d6a610d587f85a190caa61692b36b63a55e069330d18ab9af179fed7a25c16a4262bc63b7d2926105e8565b92610d616100a2565b91829182610a01565b0390a2565b610d783061089a565b6351cff8d934919091908390803b15610df957610da85f93610db395610d9c6100a2565b968795869485936106c6565b835260048301610175565b03925af18015610df457610dc8575b50610d29565b610de7905f3d8111610ded575b610ddf8183610498565b8101906106cc565b5f610dc2565b503d610dd5565b610700565b6106c2565b929091610e1d82610e17610e115f61038d565b916101bf565b11610431565b610e2e610e2984610b43565b610b4f565b93632b8c49e3338496803b15610f1157610e5b5f8094610e66610e4f6100a2565b9b8c96879586946106c6565b845260048401610b93565b03925af1948515610f0c57610ede95610ee0575b50808483908592610ed2610ec0610eba610eb47f54538b93c6e9b3f518076db2d896122f653fac2bb32fa0b6bc75097b9f332e75946105e8565b946105e8565b946105e8565b94610ec96100a2565b91829182610a01565b0390a492909192610f16565b565b610eff905f3d8111610f05575b610ef78183610498565b8101906106cc565b5f610e7a565b503d610eed565b610700565b6106c2565b9190610f6290610f53610f37610f32610f2d610299565b61061c565b610628565b9562cffbe5959294610f476100a2565b9586946020860161067f565b60208201810382520382610498565b610f74610f6e826106be565b916106b8565b20823b15610fe857610fa592610f9a5f8094610f8e6100a2565b968795869485936106c6565b8352600483016106eb565b03925af18015610fe357610fb7575b50565b610fd6905f3d8111610fdc575b610fce8183610498565b8101906106cc565b5f610fb4565b503d610fc4565b610700565b6106c256fea2646970667358221220ba047060ba3574875cd782f062d08240871ba803894074a664b4df16b994741164736f6c634300081d0033", "storage": {}, "balance": "0x0", "nonce": "0x1" }, "0x000000000000000000000000000000000000fffe": { - "code": "0x608060405261000c61000e565b005b610016610040565b565b60018060a01b031690565b61002c90610018565b90565b63ffffffff60e01b1690565b5f0190565b3361005a61005461004f6100c2565b610023565b91610023565b145f146100b35763ffffffff60e01b5f351661008561007f63278f794360e11b61002f565b9161002f565b14155f146100a9575f6334ad5dbb60e21b8152806100a56004820161003b565b0390fd5b6100b16102d9565b565b6100d6565b5f90565b61f00090565b6100ca6100b8565b506100d36100bc565b90565b6100de610318565b61032c565b90565b90565b90565b6101006100fb610105926100e3565b6100e9565b6100e6565b90565b60405190565b5f80fd5b5f80fd5b90939293848311610136578411610131576001820201920390565b610112565b61010e565b91565b5f80fd5b5f80fd5b61014f90610018565b90565b61015b81610146565b0361016257565b5f80fd5b9050359061017382610152565b565b5f80fd5b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906101a59061017d565b810190811067ffffffffffffffff8211176101bf57604052565b610187565b906101d76101d0610108565b928361019b565b565b67ffffffffffffffff81116101f7576101f360209161017d565b0190565b610187565b90825f939282370152565b9092919261021c610217826101d9565b6101c4565b9381855260208501908284011161023857610236926101fc565b565b610179565b9080601f8301121561025b5781602061025893359101610207565b90565b610175565b9190916040818403126102a057610279835f8301610166565b92602082013567ffffffffffffffff811161029b57610298920161023d565b90565b610142565b61013e565b6102b96102b46102be92610018565b6100e9565b610018565b90565b6102ca906102a5565b90565b6102d6906102c1565b90565b61031661031161030a6103026102fc5f366102f460046100ec565b908092610116565b9061013b565b810190610260565b91906102cd565b610379565b565b6103206100b8565b50610329610486565b90565b5f8091368280378136915af43d5f803e5f14610346573d5ff35b3d5ffd5b610353906102c1565b90565b5190565b90565b61037161036c6103769261035a565b6100e9565b6100e6565b90565b906103838261050c565b816103ae7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9161034a565b906103b7610108565b806103c18161003b565b0390a26103cd81610356565b6103df6103d95f61035d565b916100e6565b115f146103f3576103ef916105dc565b505b565b50506103fd610561565b6103f1565b90565b90565b5f1b90565b61042161041c61042692610402565b610408565b610405565b90565b6104527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61040d565b90565b5f1c90565b60018060a01b031690565b61047161047691610455565b61045a565b90565b6104839054610465565b90565b61048e6100b8565b506104a95f6104a361049e610429565b61060b565b01610479565b90565b6104b590610023565b9052565b91906104cc905f602085019401906104ac565b565b906104df60018060a01b0391610408565b9181191691161790565b90565b906105016104fc6105089261034a565b6104e9565b82546104ce565b9055565b803b61052061051a5f61035d565b916100e6565b1461054257610540905f61053a610535610429565b61060b565b016104ec565b565b61055d905f918291634c9c8ce360e01b8352600483016104b9565b0390fd5b3461057461056e5f61035d565b916100e6565b1161057b57565b5f63b398979f60e01b8152806105936004820161003b565b0390fd5b606090565b906105ae6105a9836101d9565b6101c4565b918252565b3d5f146105ce576105c33d61059c565b903d5f602084013e5b565b6105d6610597565b906105cc565b5f80610608936105ea610597565b508390602081019051915af4906105ff6105b3565b90919091610613565b90565b90565b151590565b9061062790610620610597565b501561060e565b5f146106335750610697565b61063c82610356565b61064e6106485f61035d565b916100e6565b148061067c575b61065d575090565b610678905f918291639996b31560e01b8352600483016104b9565b0390fd5b50803b61069161068b5f61035d565b916100e6565b14610655565b6106a081610356565b6106b26106ac5f61035d565b916100e6565b115f146106c157602081519101fd5b5f63d6bda27560e01b8152806106d96004820161003b565b0390fdfea2646970667358221220907b6c8a04deef3965be3252004e1308a0e952301e3a30cad9c5789c60f521c464736f6c634300081d0033", + "code": "0x608060405261000c61000e565b005b610016610040565b565b60018060a01b031690565b61002c90610018565b90565b63ffffffff60e01b1690565b5f0190565b3361005a61005461004f6100c2565b610023565b91610023565b145f146100b35763ffffffff60e01b5f351661008561007f63278f794360e11b61002f565b9161002f565b14155f146100a9575f6334ad5dbb60e21b8152806100a56004820161003b565b0390fd5b6100b16102d9565b565b6100d6565b5f90565b61f00090565b6100ca6100b8565b506100d36100bc565b90565b6100de610318565b61032c565b90565b90565b90565b6101006100fb610105926100e3565b6100e9565b6100e6565b90565b60405190565b5f80fd5b5f80fd5b90939293848311610136578411610131576001820201920390565b610112565b61010e565b91565b5f80fd5b5f80fd5b61014f90610018565b90565b61015b81610146565b0361016257565b5f80fd5b9050359061017382610152565b565b5f80fd5b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906101a59061017d565b810190811067ffffffffffffffff8211176101bf57604052565b610187565b906101d76101d0610108565b928361019b565b565b67ffffffffffffffff81116101f7576101f360209161017d565b0190565b610187565b90825f939282370152565b9092919261021c610217826101d9565b6101c4565b9381855260208501908284011161023857610236926101fc565b565b610179565b9080601f8301121561025b5781602061025893359101610207565b90565b610175565b9190916040818403126102a057610279835f8301610166565b92602082013567ffffffffffffffff811161029b57610298920161023d565b90565b610142565b61013e565b6102b96102b46102be92610018565b6100e9565b610018565b90565b6102ca906102a5565b90565b6102d6906102c1565b90565b61031661031161030a6103026102fc5f366102f460046100ec565b908092610116565b9061013b565b810190610260565b91906102cd565b610379565b565b6103206100b8565b50610329610486565b90565b5f8091368280378136915af43d5f803e5f14610346573d5ff35b3d5ffd5b610353906102c1565b90565b5190565b90565b61037161036c6103769261035a565b6100e9565b6100e6565b90565b906103838261050c565b816103ae7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9161034a565b906103b7610108565b806103c18161003b565b0390a26103cd81610356565b6103df6103d95f61035d565b916100e6565b115f146103f3576103ef9161059c565b505b565b50506103fd610561565b6103f1565b90565b90565b5f1b90565b61042161041c61042692610402565b610408565b610405565b90565b6104527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61040d565b90565b5f1c90565b60018060a01b031690565b61047161047691610455565b61045a565b90565b6104839054610465565b90565b61048e6100b8565b506104a95f6104a361049e610429565b61066f565b01610479565b90565b6104b590610023565b9052565b91906104cc905f602085019401906104ac565b565b906104df60018060a01b0391610408565b9181191691161790565b90565b906105016104fc6105089261034a565b6104e9565b82546104ce565b9055565b803b61052061051a5f61035d565b916100e6565b1461054257610540905f61053a610535610429565b61066f565b016104ec565b565b61055d905f918291634c9c8ce360e01b8352600483016104b9565b0390fd5b3461057461056e5f61035d565b916100e6565b1161057b57565b5f63b398979f60e01b8152806105936004820161003b565b0390fd5b606090565b906105b0906105a9610597565b5082610676565b808061062c575b5f146105ca5750506105c76106ab565b90565b5f146105ef576105eb905f918291639996b31560e01b8352600483016104b9565b0390fd5b6105f7610693565b6106096106035f61035d565b916100e6565b115f036106a0575f63d6bda27560e01b8152806106286004820161003b565b0390fd5b50610635610693565b6106476106415f61035d565b916100e6565b118015610654575b6105b7565b50813b6106696106635f61035d565b916100e6565b1161064f565b90565b5f90565b5f918291610682610672565b50602082519201905af490565b5f90565b61069b61068f565b503d90565b6040513d5f823e3d90fd5b6106b3610597565b50604051903d82523d5f602084013e3d602001820160405256fea2646970667358221220da9f1f29d0ed5131ce1f37bb5f2d1b5c6de637a513f4e6d4cc498b2391c0f6e564736f6c634300081d0033", "storage": { "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xeffe", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xf000" @@ -78,16 +68,16 @@ "nonce": "0x1" }, "0x000000000000000000000000000000000000ffff": { - "code": "0x608060405261000c61000e565b005b610016610040565b565b60018060a01b031690565b61002c90610018565b90565b63ffffffff60e01b1690565b5f0190565b3361005a61005461004f6100c2565b610023565b91610023565b145f146100b35763ffffffff60e01b5f351661008561007f63278f794360e11b61002f565b9161002f565b14155f146100a9575f6334ad5dbb60e21b8152806100a56004820161003b565b0390fd5b6100b16102d9565b565b6100d6565b5f90565b61f00090565b6100ca6100b8565b506100d36100bc565b90565b6100de610318565b61032c565b90565b90565b90565b6101006100fb610105926100e3565b6100e9565b6100e6565b90565b60405190565b5f80fd5b5f80fd5b90939293848311610136578411610131576001820201920390565b610112565b61010e565b91565b5f80fd5b5f80fd5b61014f90610018565b90565b61015b81610146565b0361016257565b5f80fd5b9050359061017382610152565b565b5f80fd5b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906101a59061017d565b810190811067ffffffffffffffff8211176101bf57604052565b610187565b906101d76101d0610108565b928361019b565b565b67ffffffffffffffff81116101f7576101f360209161017d565b0190565b610187565b90825f939282370152565b9092919261021c610217826101d9565b6101c4565b9381855260208501908284011161023857610236926101fc565b565b610179565b9080601f8301121561025b5781602061025893359101610207565b90565b610175565b9190916040818403126102a057610279835f8301610166565b92602082013567ffffffffffffffff811161029b57610298920161023d565b90565b610142565b61013e565b6102b96102b46102be92610018565b6100e9565b610018565b90565b6102ca906102a5565b90565b6102d6906102c1565b90565b61031661031161030a6103026102fc5f366102f460046100ec565b908092610116565b9061013b565b810190610260565b91906102cd565b610379565b565b6103206100b8565b50610329610486565b90565b5f8091368280378136915af43d5f803e5f14610346573d5ff35b3d5ffd5b610353906102c1565b90565b5190565b90565b61037161036c6103769261035a565b6100e9565b6100e6565b90565b906103838261050c565b816103ae7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9161034a565b906103b7610108565b806103c18161003b565b0390a26103cd81610356565b6103df6103d95f61035d565b916100e6565b115f146103f3576103ef916105dc565b505b565b50506103fd610561565b6103f1565b90565b90565b5f1b90565b61042161041c61042692610402565b610408565b610405565b90565b6104527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61040d565b90565b5f1c90565b60018060a01b031690565b61047161047691610455565b61045a565b90565b6104839054610465565b90565b61048e6100b8565b506104a95f6104a361049e610429565b61060b565b01610479565b90565b6104b590610023565b9052565b91906104cc905f602085019401906104ac565b565b906104df60018060a01b0391610408565b9181191691161790565b90565b906105016104fc6105089261034a565b6104e9565b82546104ce565b9055565b803b61052061051a5f61035d565b916100e6565b1461054257610540905f61053a610535610429565b61060b565b016104ec565b565b61055d905f918291634c9c8ce360e01b8352600483016104b9565b0390fd5b3461057461056e5f61035d565b916100e6565b1161057b57565b5f63b398979f60e01b8152806105936004820161003b565b0390fd5b606090565b906105ae6105a9836101d9565b6101c4565b918252565b3d5f146105ce576105c33d61059c565b903d5f602084013e5b565b6105d6610597565b906105cc565b5f80610608936105ea610597565b508390602081019051915af4906105ff6105b3565b90919091610613565b90565b90565b151590565b9061062790610620610597565b501561060e565b5f146106335750610697565b61063c82610356565b61064e6106485f61035d565b916100e6565b148061067c575b61065d575090565b610678905f918291639996b31560e01b8352600483016104b9565b0390fd5b50803b61069161068b5f61035d565b916100e6565b14610655565b6106a081610356565b6106b26106ac5f61035d565b916100e6565b115f146106c157602081519101fd5b5f63d6bda27560e01b8152806106d96004820161003b565b0390fdfea2646970667358221220907b6c8a04deef3965be3252004e1308a0e952301e3a30cad9c5789c60f521c464736f6c634300081d0033", + "code": "0x608060405261000c61000e565b005b610016610040565b565b60018060a01b031690565b61002c90610018565b90565b63ffffffff60e01b1690565b5f0190565b3361005a61005461004f6100c2565b610023565b91610023565b145f146100b35763ffffffff60e01b5f351661008561007f63278f794360e11b61002f565b9161002f565b14155f146100a9575f6334ad5dbb60e21b8152806100a56004820161003b565b0390fd5b6100b16102d9565b565b6100d6565b5f90565b61f00090565b6100ca6100b8565b506100d36100bc565b90565b6100de610318565b61032c565b90565b90565b90565b6101006100fb610105926100e3565b6100e9565b6100e6565b90565b60405190565b5f80fd5b5f80fd5b90939293848311610136578411610131576001820201920390565b610112565b61010e565b91565b5f80fd5b5f80fd5b61014f90610018565b90565b61015b81610146565b0361016257565b5f80fd5b9050359061017382610152565b565b5f80fd5b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906101a59061017d565b810190811067ffffffffffffffff8211176101bf57604052565b610187565b906101d76101d0610108565b928361019b565b565b67ffffffffffffffff81116101f7576101f360209161017d565b0190565b610187565b90825f939282370152565b9092919261021c610217826101d9565b6101c4565b9381855260208501908284011161023857610236926101fc565b565b610179565b9080601f8301121561025b5781602061025893359101610207565b90565b610175565b9190916040818403126102a057610279835f8301610166565b92602082013567ffffffffffffffff811161029b57610298920161023d565b90565b610142565b61013e565b6102b96102b46102be92610018565b6100e9565b610018565b90565b6102ca906102a5565b90565b6102d6906102c1565b90565b61031661031161030a6103026102fc5f366102f460046100ec565b908092610116565b9061013b565b810190610260565b91906102cd565b610379565b565b6103206100b8565b50610329610486565b90565b5f8091368280378136915af43d5f803e5f14610346573d5ff35b3d5ffd5b610353906102c1565b90565b5190565b90565b61037161036c6103769261035a565b6100e9565b6100e6565b90565b906103838261050c565b816103ae7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9161034a565b906103b7610108565b806103c18161003b565b0390a26103cd81610356565b6103df6103d95f61035d565b916100e6565b115f146103f3576103ef9161059c565b505b565b50506103fd610561565b6103f1565b90565b90565b5f1b90565b61042161041c61042692610402565b610408565b610405565b90565b6104527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61040d565b90565b5f1c90565b60018060a01b031690565b61047161047691610455565b61045a565b90565b6104839054610465565b90565b61048e6100b8565b506104a95f6104a361049e610429565b61066f565b01610479565b90565b6104b590610023565b9052565b91906104cc905f602085019401906104ac565b565b906104df60018060a01b0391610408565b9181191691161790565b90565b906105016104fc6105089261034a565b6104e9565b82546104ce565b9055565b803b61052061051a5f61035d565b916100e6565b1461054257610540905f61053a610535610429565b61066f565b016104ec565b565b61055d905f918291634c9c8ce360e01b8352600483016104b9565b0390fd5b3461057461056e5f61035d565b916100e6565b1161057b57565b5f63b398979f60e01b8152806105936004820161003b565b0390fd5b606090565b906105b0906105a9610597565b5082610676565b808061062c575b5f146105ca5750506105c76106ab565b90565b5f146105ef576105eb905f918291639996b31560e01b8352600483016104b9565b0390fd5b6105f7610693565b6106096106035f61035d565b916100e6565b115f036106a0575f63d6bda27560e01b8152806106286004820161003b565b0390fd5b50610635610693565b6106476106415f61035d565b916100e6565b118015610654575b6105b7565b50813b6106696106635f61035d565b916100e6565b1161064f565b90565b5f90565b5f918291610682610672565b50602082519201905af490565b5f90565b61069b61068f565b503d90565b6040513d5f823e3d90fd5b6106b3610597565b50604051903d82523d5f602084013e3d602001820160405256fea2646970667358221220da9f1f29d0ed5131ce1f37bb5f2d1b5c6de637a513f4e6d4cc498b2391c0f6e564736f6c634300081d0033", "storage": { - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xefff", - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xf000" + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xf000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xefff" }, "balance": "0x0", "nonce": "0x1" }, "0x13b0d85ccb8bf860b6b79af3029fca081ae9bef2": { - "code": "0x60806040526004361015610015575b366105b157005b61001f5f356100be565b8063076c37b2146100b95780633f4ba83a146100b4578063481286e6146100af57806356299481146100aa5780635c975abb146100a557806366cfa057146100a0578063715018a61461009b5780638456cb59146100965780638da5cb5b146100915763f2fde38b0361000e5761057e565b61052b565b6104f8565b6104c5565b610491565b610320565b6102c3565b610230565b610197565b610154565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f80fd5b90565b6100e2816100d6565b036100e957565b5f80fd5b905035906100fa826100d9565b565b90565b610108816100fc565b0361010f57565b5f80fd5b90503590610120826100ff565b565b919060408382031261014a578061013e610147925f86016100ed565b93602001610113565b90565b6100ce565b5f0190565b346101835761016d610167366004610122565b906105f3565b6101756100c4565b8061017f8161014f565b0390f35b6100ca565b5f91031261019257565b6100ce565b346101c5576101a7366004610188565b6101af61061b565b6101b76100c4565b806101c18161014f565b0390f35b6100ca565b91906040838203126101f257806101e66101ef925f8601610113565b93602001610113565b90565b6100ce565b60018060a01b031690565b61020b906101f7565b90565b61021790610202565b9052565b919061022e905f6020850194019061020e565b565b346102615761025d61024c6102463660046101ca565b90610629565b6102546100c4565b9182918261021b565b0390f35b6100ca565b61026f81610202565b0361027657565b5f80fd5b9050359061028782610266565b565b90916060828403126102be576102bb6102a4845f8501610113565b936102b28160208601610113565b9360400161027a565b90565b6100ce565b346102f4576102f06102df6102d9366004610289565b9161063f565b6102e76100c4565b9182918261021b565b0390f35b6100ca565b151590565b610307906102f9565b9052565b919061031e905f602085019401906102fe565b565b3461035057610330366004610188565b61034c61033b610689565b6103436100c4565b9182918261030b565b0390f35b6100ca565b5f80fd5b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906103859061035d565b810190811067ffffffffffffffff82111761039f57604052565b610367565b906103b76103b06100c4565b928361037b565b565b67ffffffffffffffff81116103d7576103d360209161035d565b0190565b610367565b90825f939282370152565b909291926103fc6103f7826103b9565b6103a4565b9381855260208501908284011161041857610416926103dc565b565b610359565b9080601f8301121561043b57816020610438933591016103e7565b90565b610355565b9160608383031261048c57610457825f85016100ed565b926104658360208301610113565b92604082013567ffffffffffffffff811161048757610484920161041d565b90565b6100d2565b6100ce565b346104c0576104aa6104a4366004610440565b916106c3565b6104b26100c4565b806104bc8161014f565b0390f35b6100ca565b346104f3576104d5366004610188565b6104dd610723565b6104e56100c4565b806104ef8161014f565b0390f35b6100ca565b3461052657610508366004610188565b610510610749565b6105186100c4565b806105228161014f565b0390f35b6100ca565b3461055b5761053b366004610188565b610557610546610784565b61054e6100c4565b9182918261021b565b0390f35b6100ca565b9060208282031261057957610576915f0161027a565b90565b6100ce565b346105ac57610596610591366004610560565b61088d565b61059e6100c4565b806105a88161014f565b0390f35b6100ca565b5f80fd5b906105c7916105c261091a565b6105c9565b565b906105f091906102b5916105df602084016103a4565b92808452610efd6020850139610b0e565b50565b906105fd916105b5565b565b610607610c16565b61060f610611565b565b610619610cef565b565b6106236105ff565b565b5f90565b9061063c91610636610625565b50610cf9565b90565b916106559261064c610625565b50919091610d1a565b90565b5f90565b60a01c90565b60ff1690565b6106746106799161065c565b610662565b90565b6106869054610668565b90565b610691610658565b5061069b5f61067c565b90565b906106b192916106ac61091a565b6106b3565b565b916106c092919091610b0e565b50565b906106ce929161069e565b565b6106d8610c16565b6106e0610710565b565b90565b90565b6106fc6106f7610701926106e2565b6106e5565b6101f7565b90565b61070d906106e8565b90565b61072161071c5f610704565b610d92565b565b61072b6106d0565b565b610735610c16565b61073d61073f565b565b610747610e51565b565b61075161072d565b565b5f1c90565b60018060a01b031690565b61076f61077491610753565b610758565b90565b6107819054610763565b90565b61078c610625565b506107965f610777565b90565b6107aa906107a5610c16565b61085d565b565b60209181520190565b60207f6464726573730000000000000000000000000000000000000000000000000000917f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201520152565b61080f60266040926107ac565b610818816107b5565b0190565b6108319060208101905f818303910152610802565b90565b1561083b57565b6108436100c4565b62461bcd60e51b8152806108596004820161081c565b0390fd5b61088b906108868161087f6108796108745f610704565b610202565b91610202565b1415610834565b610d92565b565b61089690610799565b565b5f7f5061757361626c653a2070617573656400000000000000000000000000000000910152565b6108cc60106020926107ac565b6108d581610898565b0190565b6108ee9060208101905f8183039101526108bf565b90565b156108f857565b6109006100c4565b62461bcd60e51b815280610916600482016108d9565b0390fd5b61093361092e610928610689565b156102f9565b6108f1565b565b61094961094461094e926101f7565b6106e5565b6101f7565b90565b61095a90610935565b90565b61096690610951565b90565b5f7f437265617465323a20696e73756666696369656e742062616c616e6365000000910152565b61099d601d6020926107ac565b6109a681610969565b0190565b6109bf9060208101905f818303910152610990565b90565b156109c957565b6109d16100c4565b62461bcd60e51b8152806109e7600482016109aa565b0390fd5b5190565b610a036109fe610a08926106e2565b6106e5565b6100d6565b90565b5f7f437265617465323a2062797465636f6465206c656e677468206973207a65726f910152565b610a3e602080926107ac565b610a4781610a0b565b0190565b610a609060208101905f818303910152610a32565b90565b15610a6a57565b610a726100c4565b62461bcd60e51b815280610a8860048201610a4b565b0390fd5b5f7f437265617465323a204661696c6564206f6e206465706c6f7900000000000000910152565b610ac060196020926107ac565b610ac981610a8c565b0190565b610ae29060208101905f818303910152610ab3565b90565b15610aec57565b610af46100c4565b62461bcd60e51b815280610b0a60048201610acd565b0390fd5b919091610b19610625565b50610b40610b263061095d565b31610b39610b33846100d6565b916100d6565b10156109c2565b610b65610b4c836109eb565b610b5e610b585f6109ef565b916100d6565b1415610a63565b60208251920190f590610b9382610b8c610b86610b815f610704565b610202565b91610202565b1415610ae5565b565b5f7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910152565b610bc8602080926107ac565b610bd181610b95565b0190565b610bea9060208101905f818303910152610bbc565b90565b15610bf457565b610bfc6100c4565b62461bcd60e51b815280610c1260048201610bd5565b0390fd5b610c40610c21610784565b610c3a610c34610c2f610e5b565b610202565b91610202565b14610bed565b565b610c4a610eea565b610c52610ca2565b565b60a01b90565b90610c6960ff60a01b91610c54565b9181191691161790565b610c7c906102f9565b90565b90565b90610c97610c92610c9e92610c73565b610c7f565b8254610c5a565b9055565b610cac5f5f610c82565b610cb4610e5b565b610cea7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91610ce16100c4565b9182918261021b565b0390a1565b610cf7610c42565b565b90610d1791610d06610625565b5090610d113061095d565b91610d1a565b90565b90605592600b92610d29610625565b50604051926040840152602083015281520160ff81532090565b5f1b90565b90610d5960018060a01b0391610d43565b9181191691161790565b610d6c90610951565b90565b90565b90610d87610d82610d8e92610d63565b610d6f565b8254610d48565b9055565b610d9b5f610777565b610da5825f610d72565b90610dd9610dd37f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610d63565b91610d63565b91610de26100c4565b80610dec8161014f565b0390a3565b610df961091a565b610e01610e03565b565b610e0e60015f610c82565b610e16610e5b565b610e4c7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610e436100c4565b9182918261021b565b0390a1565b610e59610df1565b565b610e63610625565b503390565b5f7f5061757361626c653a206e6f7420706175736564000000000000000000000000910152565b610e9c60146020926107ac565b610ea581610e68565b0190565b610ebe9060208101905f818303910152610e8f565b90565b15610ec857565b610ed06100c4565b62461bcd60e51b815280610ee660048201610ea9565b0390fd5b610efa610ef5610689565b610ec1565b56fe608060405234601c57600e6020565b61028a61002b823961028a90f35b6026565b60405190565b5f80fdfe60806040526004361015610013575b610125565b61001d5f3561002c565b63249cb3fa0361000e576100ef565b60e01c90565b60405190565b5f80fd5b5f80fd5b90565b61004c81610040565b0361005357565b5f80fd5b9050359061006482610043565b565b60018060a01b031690565b61007a90610066565b90565b61008681610071565b0361008d57565b5f80fd5b9050359061009e8261007d565b565b91906040838203126100c857806100bc6100c5925f8601610057565b93602001610091565b90565b61003c565b6100d690610040565b9052565b91906100ed905f602085019401906100cd565b565b346101205761011c61010b6101053660046100a0565b90610210565b610113610032565b918291826100da565b0390f35b610038565b5f80fd5b5f90565b61013690610040565b90565b906101439061012d565b5f5260205260405f2090565b90565b61016661016161016b92610066565b61014f565b610066565b90565b61017790610152565b90565b6101839061016e565b90565b906101909061017a565b5f5260205260405f2090565b5f1c90565b60ff1690565b6101b36101b89161019c565b6101a1565b90565b6101c590546101a7565b90565b90565b5f1b90565b6101e46101df6101e9926101c8565b6101cb565b610040565b90565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b490565b6102349161022a61022f92610223610129565b505f610139565b610186565b6101bb565b5f14610246576102426101ec565b5b90565b61024f5f6101d0565b61024356fea2646970667358221220494229690e367831e3adb9176144dfd7d90d13e5be098719145864318d9069fc64736f6c634300081d0033a26469706673582212204e08d494cd50b04127c498d96ed6fbfdebadf67e6d73a5ae87d2c12a4ae8889364736f6c634300081d0033", + "code": "0x60806040526004361015610015575b366105b157005b61001f5f356100be565b8063076c37b2146100b95780633f4ba83a146100b4578063481286e6146100af57806356299481146100aa5780635c975abb146100a557806366cfa057146100a0578063715018a61461009b5780638456cb59146100965780638da5cb5b146100915763f2fde38b0361000e5761057e565b61052b565b6104f8565b6104c5565b610491565b610320565b6102c3565b610230565b610197565b610154565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f80fd5b90565b6100e2816100d6565b036100e957565b5f80fd5b905035906100fa826100d9565b565b90565b610108816100fc565b0361010f57565b5f80fd5b90503590610120826100ff565b565b919060408382031261014a578061013e610147925f86016100ed565b93602001610113565b90565b6100ce565b5f0190565b346101835761016d610167366004610122565b906105f3565b6101756100c4565b8061017f8161014f565b0390f35b6100ca565b5f91031261019257565b6100ce565b346101c5576101a7366004610188565b6101af61061b565b6101b76100c4565b806101c18161014f565b0390f35b6100ca565b91906040838203126101f257806101e66101ef925f8601610113565b93602001610113565b90565b6100ce565b60018060a01b031690565b61020b906101f7565b90565b61021790610202565b9052565b919061022e905f6020850194019061020e565b565b346102615761025d61024c6102463660046101ca565b90610629565b6102546100c4565b9182918261021b565b0390f35b6100ca565b61026f81610202565b0361027657565b5f80fd5b9050359061028782610266565b565b90916060828403126102be576102bb6102a4845f8501610113565b936102b28160208601610113565b9360400161027a565b90565b6100ce565b346102f4576102f06102df6102d9366004610289565b9161063f565b6102e76100c4565b9182918261021b565b0390f35b6100ca565b151590565b610307906102f9565b9052565b919061031e905f602085019401906102fe565b565b3461035057610330366004610188565b61034c61033b610689565b6103436100c4565b9182918261030b565b0390f35b6100ca565b5f80fd5b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906103859061035d565b810190811067ffffffffffffffff82111761039f57604052565b610367565b906103b76103b06100c4565b928361037b565b565b67ffffffffffffffff81116103d7576103d360209161035d565b0190565b610367565b90825f939282370152565b909291926103fc6103f7826103b9565b6103a4565b9381855260208501908284011161041857610416926103dc565b565b610359565b9080601f8301121561043b57816020610438933591016103e7565b90565b610355565b9160608383031261048c57610457825f85016100ed565b926104658360208301610113565b92604082013567ffffffffffffffff811161048757610484920161041d565b90565b6100d2565b6100ce565b346104c0576104aa6104a4366004610440565b916106c3565b6104b26100c4565b806104bc8161014f565b0390f35b6100ca565b346104f3576104d5366004610188565b6104dd610723565b6104e56100c4565b806104ef8161014f565b0390f35b6100ca565b3461052657610508366004610188565b610510610749565b6105186100c4565b806105228161014f565b0390f35b6100ca565b3461055b5761053b366004610188565b610557610546610784565b61054e6100c4565b9182918261021b565b0390f35b6100ca565b9060208282031261057957610576915f0161027a565b90565b6100ce565b346105ac57610596610591366004610560565b61088d565b61059e6100c4565b806105a88161014f565b0390f35b6100ca565b5f80fd5b906105c7916105c261091a565b6105c9565b565b906105f091906102b5916105df602084016103a4565b92808452610efd6020850139610b0e565b50565b906105fd916105b5565b565b610607610c16565b61060f610611565b565b610619610cef565b565b6106236105ff565b565b5f90565b9061063c91610636610625565b50610cf9565b90565b916106559261064c610625565b50919091610d1a565b90565b5f90565b60a01c90565b60ff1690565b6106746106799161065c565b610662565b90565b6106869054610668565b90565b610691610658565b5061069b5f61067c565b90565b906106b192916106ac61091a565b6106b3565b565b916106c092919091610b0e565b50565b906106ce929161069e565b565b6106d8610c16565b6106e0610710565b565b90565b90565b6106fc6106f7610701926106e2565b6106e5565b6101f7565b90565b61070d906106e8565b90565b61072161071c5f610704565b610d92565b565b61072b6106d0565b565b610735610c16565b61073d61073f565b565b610747610e51565b565b61075161072d565b565b5f1c90565b60018060a01b031690565b61076f61077491610753565b610758565b90565b6107819054610763565b90565b61078c610625565b506107965f610777565b90565b6107aa906107a5610c16565b61085d565b565b60209181520190565b60207f6464726573730000000000000000000000000000000000000000000000000000917f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201520152565b61080f60266040926107ac565b610818816107b5565b0190565b6108319060208101905f818303910152610802565b90565b1561083b57565b6108436100c4565b62461bcd60e51b8152806108596004820161081c565b0390fd5b61088b906108868161087f6108796108745f610704565b610202565b91610202565b1415610834565b610d92565b565b61089690610799565b565b5f7f5061757361626c653a2070617573656400000000000000000000000000000000910152565b6108cc60106020926107ac565b6108d581610898565b0190565b6108ee9060208101905f8183039101526108bf565b90565b156108f857565b6109006100c4565b62461bcd60e51b815280610916600482016108d9565b0390fd5b61093361092e610928610689565b156102f9565b6108f1565b565b61094961094461094e926101f7565b6106e5565b6101f7565b90565b61095a90610935565b90565b61096690610951565b90565b5f7f437265617465323a20696e73756666696369656e742062616c616e6365000000910152565b61099d601d6020926107ac565b6109a681610969565b0190565b6109bf9060208101905f818303910152610990565b90565b156109c957565b6109d16100c4565b62461bcd60e51b8152806109e7600482016109aa565b0390fd5b5190565b610a036109fe610a08926106e2565b6106e5565b6100d6565b90565b5f7f437265617465323a2062797465636f6465206c656e677468206973207a65726f910152565b610a3e602080926107ac565b610a4781610a0b565b0190565b610a609060208101905f818303910152610a32565b90565b15610a6a57565b610a726100c4565b62461bcd60e51b815280610a8860048201610a4b565b0390fd5b5f7f437265617465323a204661696c6564206f6e206465706c6f7900000000000000910152565b610ac060196020926107ac565b610ac981610a8c565b0190565b610ae29060208101905f818303910152610ab3565b90565b15610aec57565b610af46100c4565b62461bcd60e51b815280610b0a60048201610acd565b0390fd5b919091610b19610625565b50610b40610b263061095d565b31610b39610b33846100d6565b916100d6565b10156109c2565b610b65610b4c836109eb565b610b5e610b585f6109ef565b916100d6565b1415610a63565b60208251920190f590610b9382610b8c610b86610b815f610704565b610202565b91610202565b1415610ae5565b565b5f7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910152565b610bc8602080926107ac565b610bd181610b95565b0190565b610bea9060208101905f818303910152610bbc565b90565b15610bf457565b610bfc6100c4565b62461bcd60e51b815280610c1260048201610bd5565b0390fd5b610c40610c21610784565b610c3a610c34610c2f610e5b565b610202565b91610202565b14610bed565b565b610c4a610eea565b610c52610ca2565b565b60a01b90565b90610c6960ff60a01b91610c54565b9181191691161790565b610c7c906102f9565b90565b90565b90610c97610c92610c9e92610c73565b610c7f565b8254610c5a565b9055565b610cac5f5f610c82565b610cb4610e5b565b610cea7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91610ce16100c4565b9182918261021b565b0390a1565b610cf7610c42565b565b90610d1791610d06610625565b5090610d113061095d565b91610d1a565b90565b90605592600b92610d29610625565b50604051926040840152602083015281520160ff81532090565b5f1b90565b90610d5960018060a01b0391610d43565b9181191691161790565b610d6c90610951565b90565b90565b90610d87610d82610d8e92610d63565b610d6f565b8254610d48565b9055565b610d9b5f610777565b610da5825f610d72565b90610dd9610dd37f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610d63565b91610d63565b91610de26100c4565b80610dec8161014f565b0390a3565b610df961091a565b610e01610e03565b565b610e0e60015f610c82565b610e16610e5b565b610e4c7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610e436100c4565b9182918261021b565b0390a1565b610e59610df1565b565b610e63610625565b503390565b5f7f5061757361626c653a206e6f7420706175736564000000000000000000000000910152565b610e9c60146020926107ac565b610ea581610e68565b0190565b610ebe9060208101905f818303910152610e8f565b90565b15610ec857565b610ed06100c4565b62461bcd60e51b815280610ee660048201610ea9565b0390fd5b610efa610ef5610689565b610ec1565b56fe608060405234601c57600e6020565b61028a61002b823961028a90f35b6026565b60405190565b5f80fdfe60806040526004361015610013575b610125565b61001d5f3561002c565b63249cb3fa0361000e576100ef565b60e01c90565b60405190565b5f80fd5b5f80fd5b90565b61004c81610040565b0361005357565b5f80fd5b9050359061006482610043565b565b60018060a01b031690565b61007a90610066565b90565b61008681610071565b0361008d57565b5f80fd5b9050359061009e8261007d565b565b91906040838203126100c857806100bc6100c5925f8601610057565b93602001610091565b90565b61003c565b6100d690610040565b9052565b91906100ed905f602085019401906100cd565b565b346101205761011c61010b6101053660046100a0565b90610210565b610113610032565b918291826100da565b0390f35b610038565b5f80fd5b5f90565b61013690610040565b90565b906101439061012d565b5f5260205260405f2090565b90565b61016661016161016b92610066565b61014f565b610066565b90565b61017790610152565b90565b6101839061016e565b90565b906101909061017a565b5f5260205260405f2090565b5f1c90565b60ff1690565b6101b36101b89161019c565b6101a1565b90565b6101c590546101a7565b90565b90565b5f1b90565b6101e46101df6101e9926101c8565b6101cb565b610040565b90565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b490565b6102349161022a61022f92610223610129565b505f610139565b610186565b6101bb565b5f14610246576102426101ec565b5b90565b61024f5f6101d0565b61024356fea26469706673582212203dcabd569808849d0e409a052e5e7d1fa1624dd221cdb5cd5d9cbed0d5bd521b64736f6c634300081d0033a2646970667358221220c9ee82b3796a8b1e888ae9b0f1244e703b889a0a49a1fc2f76e48ff4436c7a1564736f6c634300081d0033", "storage": {}, "balance": "0x0", "nonce": "0x1" @@ -105,4 +95,4 @@ "nonce": "0x1" } } -} +} \ No newline at end of file From c82d7c898ff6895be49d31b059906bb14e4464ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Thu, 9 Oct 2025 13:16:57 -0300 Subject: [PATCH 09/20] revert makefile changes --- crates/l2/Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/l2/Makefile b/crates/l2/Makefile index d827cb2fc4..4c848c7dc3 100644 --- a/crates/l2/Makefile +++ b/crates/l2/Makefile @@ -69,7 +69,7 @@ down-l1-docker: ## 🛑 Shuts down the L1 Lambda ethrex Client restart-l1-docker: down-l1-docker init-l1-docker ## 🔄 Restarts the L1 Lambda ethrex Client init-l1: ## 🚀 Initializes an L1 Lambda ethrex Client - ../../target/release/ethrex \ + cargo run --release --manifest-path ../../Cargo.toml --bin ethrex -- \ --network ${L1_GENESIS_FILE_PATH} \ --http.port ${L1_PORT} \ --http.addr ${L1_RPC_ADDRESS} \ @@ -78,11 +78,11 @@ init-l1: ## 🚀 Initializes an L1 Lambda ethrex Client --datadir ${ethrex_L1_DEV_DB} rm-db-l1: ## 🛑 Removes the DB used by the L1 - ../../target/release/ethrex removedb --datadir ${ethrex_L1_DEV_DB} --force + cargo run --release --manifest-path ../../Cargo.toml --bin ethrex -- removedb --datadir ${ethrex_L1_DEV_DB} --force deploy-l1: ## 📜 Deploys the L1 contracts COMPILE_CONTRACTS=true \ - ../../target/release/ethrex l2 deploy \ + cargo run --release --bin ethrex --manifest-path ../../Cargo.toml -- l2 deploy \ --eth-rpc-url ${L1_RPC_URL} \ --private-key ${L1_PRIVATE_KEY} \ --risc0.verifier-address 0x00000000000000000000000000000000000000aa \ @@ -119,7 +119,7 @@ deploy-l1-sp1: ## 📜 Deploys the L1 contracts init-l2: ## 🚀 Initializes an L2 Lambda ethrex Client export $(shell cat ../../cmd/.env | xargs); \ - ../../target/release/ethrex \ + cargo run --release --manifest-path ../../Cargo.toml --bin ethrex -- \ l2 \ --watcher.block-delay 0 \ --network ${L2_GENESIS_FILE_PATH} \ @@ -155,7 +155,7 @@ down-l2: ## 🛑 Shuts down the L2 Lambda ethrex Client pgrep -a -f "ethrex l2" | awk '!/prover/ {print $1}' | xargs -r kill -s SIGINT rm-db-l2: ## 🛑 Removes the DB used by the L2 - ../../target/release/ethrex l2 removedb --datadir ${ethrex_L2_DEV_DB} --force + cargo run --release --manifest-path ../../Cargo.toml --bin ethrex -- l2 removedb --datadir ${ethrex_L2_DEV_DB} --force restart-l2: down-l2 rm-db-l2 init-l2 ## 🔄 Restarts the L2 Lambda ethrex Client From a82fe684a7929bdb4af18f9b315f85fdf111bfda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Mon, 13 Oct 2025 10:44:04 -0300 Subject: [PATCH 10/20] first approach to maintain compatibility --- .../prover/src/guest_program/src/execution.rs | 19 ++++++++++++++----- .../l2/prover/src/guest_program/src/input.rs | 6 +++--- crates/l2/sequencer/proof_coordinator.rs | 18 +++++++++++------- crates/networking/rpc/eth/client.rs | 5 +++++ 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/crates/l2/prover/src/guest_program/src/execution.rs b/crates/l2/prover/src/guest_program/src/execution.rs index a9e9aa8319..a15c0ea529 100644 --- a/crates/l2/prover/src/guest_program/src/execution.rs +++ b/crates/l2/prover/src/guest_program/src/execution.rs @@ -155,7 +155,7 @@ pub fn stateless_validation_l2( execution_witness: ExecutionWitness, elasticity_multiplier: u64, blob_commitment: Commitment, - blob_proof: Proof, + blob_proof: Vec, chain_id: u64, ) -> Result { let initial_db = execution_witness.clone(); @@ -183,7 +183,7 @@ pub fn stateless_validation_l2( )?; // TODO: this could be replaced with something like a ProverConfig in the future. - let validium = (blob_commitment, blob_proof) == ([0; 48], [0; 48]); + let validium = (blob_commitment, &blob_proof) == ([0; 48], &vec![[0; 48]]); // Check state diffs are valid let blob_versioned_hash = if !validium { @@ -435,14 +435,23 @@ fn compute_l1messages_and_privileged_transactions_digests( fn verify_blob( state_diff: StateDiff, commitment: Commitment, - proof: Proof, + proof: Vec, ) -> Result { - use ethrex_crypto::kzg::verify_blob_kzg_proof; + use ethrex_crypto::kzg::{verify_blob_kzg_proof, verify_cell_kzg_proof_batch}; let encoded_state_diff = state_diff.encode()?; let blob_data = blob_from_bytes(encoded_state_diff)?; - if !verify_blob_kzg_proof(blob_data, commitment, proof)? { + let proof_is_valid = if proof.len() == 1 { + // Prior to Osaka type proof + verify_blob_kzg_proof(blob_data, commitment, proof[0])? + } else { + // Osaka type proof + + verify_cell_kzg_proof_batch(&[blob_data], &[commitment], &proof)? + }; + + if !proof_is_valid { return Err(StatelessExecutionError::InvalidBlobProof); } diff --git a/crates/l2/prover/src/guest_program/src/input.rs b/crates/l2/prover/src/guest_program/src/input.rs index 79f5b485b0..8d12f397c3 100644 --- a/crates/l2/prover/src/guest_program/src/input.rs +++ b/crates/l2/prover/src/guest_program/src/input.rs @@ -22,8 +22,8 @@ pub struct ProgramInput { pub blob_commitment: blobs_bundle::Commitment, #[cfg(feature = "l2")] /// KZG opening for a challenge over the blob commitment - #[serde_as(as = "[_; 48]")] - pub blob_proof: blobs_bundle::Proof, + #[serde_as(as = "Vec<[_; 48]>")] + pub blob_proof: Vec, } impl Default for ProgramInput { @@ -35,7 +35,7 @@ impl Default for ProgramInput { #[cfg(feature = "l2")] blob_commitment: [0; 48], #[cfg(feature = "l2")] - blob_proof: [0; 48], + blob_proof: vec![[0u8; 48]], } } } diff --git a/crates/l2/sequencer/proof_coordinator.rs b/crates/l2/sequencer/proof_coordinator.rs index 742aa5eea6..6f0b21d70f 100644 --- a/crates/l2/sequencer/proof_coordinator.rs +++ b/crates/l2/sequencer/proof_coordinator.rs @@ -6,8 +6,8 @@ use crate::{ }; use bytes::Bytes; use ethrex_blockchain::Blockchain; -use ethrex_common::types::BlobsBundle; use ethrex_common::types::block_execution_witness::ExecutionWitness; +use ethrex_common::types::{BlobsBundle, Fork}; use ethrex_common::{ Address, types::{Block, blobs_bundle}, @@ -48,8 +48,8 @@ pub struct ProverInputData { #[serde_as(as = "[_; 48]")] pub blob_commitment: blobs_bundle::Commitment, #[cfg(feature = "l2")] - #[serde_as(as = "[_; 48]")] - pub blob_proof: blobs_bundle::Proof, + #[serde_as(as = "Vec<[_; 48]>")] + pub blob_proof: Vec, } /// Enum for the ProverServer <--> ProverClient Communication Protocol. @@ -482,7 +482,7 @@ impl ProofCoordinator { // Get blobs bundle cached by the L1 Committer (blob, commitment, proof) let (blob_commitment, blob_proof) = if self.validium { - ([0; 48], [0; 48]) + ([0; 48], vec![[0; 48]]) } else { let blob = self .rollup_store @@ -495,9 +495,13 @@ impl ProofCoordinator { mut proofs, .. } = BlobsBundle::create_from_blobs(&blob, fork)?; - match (commitments.pop(), proofs.pop()) { - (Some(commitment), Some(proof)) => (commitment, proof), - _ => return Err(ProofCoordinatorError::MissingBlob(batch_number)), + if fork < Fork::Osaka { + match (commitments.pop(), proofs.pop()) { + (Some(commitment), Some(proof)) => (commitment, vec![proof]), + _ => return Err(ProofCoordinatorError::MissingBlob(batch_number)), + } + } else { + todo!() } }; diff --git a/crates/networking/rpc/eth/client.rs b/crates/networking/rpc/eth/client.rs index fdf9e98ed1..8c3ceaf716 100644 --- a/crates/networking/rpc/eth/client.rs +++ b/crates/networking/rpc/eth/client.rs @@ -99,6 +99,11 @@ impl RpcHandler for Config { } async fn handle(&self, context: RpcApiContext) -> Result { + if context.blockchain.current_fork().await? < Fork::Osaka { + return Err(RpcErr::UnsuportedFork( + "eth-config is not supported for forks prior to Osaka".to_owned(), + )); + } let chain_config = context.storage.get_chain_config()?; let Some(latest_block) = context .storage From 184aab6082c376f66d00b96bfedb6e553f23ab6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Mon, 13 Oct 2025 11:03:04 -0300 Subject: [PATCH 11/20] handle osaka proof --- crates/l2/sequencer/proof_coordinator.rs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/crates/l2/sequencer/proof_coordinator.rs b/crates/l2/sequencer/proof_coordinator.rs index 6f0b21d70f..cecee2d11f 100644 --- a/crates/l2/sequencer/proof_coordinator.rs +++ b/crates/l2/sequencer/proof_coordinator.rs @@ -7,7 +7,7 @@ use crate::{ use bytes::Bytes; use ethrex_blockchain::Blockchain; use ethrex_common::types::block_execution_witness::ExecutionWitness; -use ethrex_common::types::{BlobsBundle, Fork}; +use ethrex_common::types::{BlobsBundle, CELLS_PER_EXT_BLOB, Fork}; use ethrex_common::{ Address, types::{Block, blobs_bundle}, @@ -495,14 +495,22 @@ impl ProofCoordinator { mut proofs, .. } = BlobsBundle::create_from_blobs(&blob, fork)?; - if fork < Fork::Osaka { - match (commitments.pop(), proofs.pop()) { - (Some(commitment), Some(proof)) => (commitment, vec![proof]), - _ => return Err(ProofCoordinatorError::MissingBlob(batch_number)), - } + let proof_count = if fork < Fork::Osaka { + 1 } else { - todo!() + CELLS_PER_EXT_BLOB + }; + let commitment = commitments + .pop() + .ok_or_else(|| ProofCoordinatorError::MissingBlob(batch_number))?; + + if proofs.len() < proof_count { + return Err(ProofCoordinatorError::MissingBlob(batch_number)); } + + let proof = proofs.split_off(proofs.len() - proof_count); + + (commitment, proof) }; debug!("Created prover input for batch {batch_number}"); From 1fc0c28e6f78bc8a121f3c7aebf429a633236abb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Mon, 13 Oct 2025 11:50:44 -0300 Subject: [PATCH 12/20] fix compile c_kzg --- crates/common/crypto/kzg.rs | 17 +++++++++++++++++ crates/common/types/blobs_bundle.rs | 19 ++++++++----------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/crates/common/crypto/kzg.rs b/crates/common/crypto/kzg.rs index 5f87483c2d..5090424383 100644 --- a/crates/common/crypto/kzg.rs +++ b/crates/common/crypto/kzg.rs @@ -148,3 +148,20 @@ pub fn blob_to_kzg_commitment_and_proof(blob: &Blob) -> Result<(Commitment, Proo Ok((commitment_bytes.into_inner(), proof_bytes.into_inner())) } + +#[cfg(feature = "c-kzg")] +pub fn blob_to_commitment_and_cell_proofs( + blob: &Blob, +) -> Result<(Commitment, Vec), KzgError> { + let c_kzg_settings = c_kzg::ethereum_kzg_settings(8); + let blob: c_kzg::Blob = (*blob).into(); + let commitment = + c_kzg::KzgSettings::blob_to_kzg_commitment(c_kzg::ethereum_kzg_settings(8), &blob)?; + let commitment_bytes = commitment.to_bytes(); + + let (_cells, cell_proofs) = c_kzg_settings + .compute_cells_and_kzg_proofs(&blob) + .map_err(KzgError::CKzg)?; + let cell_proofs = cell_proofs.map(|p| p.to_bytes().into_inner()); + Ok((commitment_bytes.into_inner(), cell_proofs.to_vec())) +} diff --git a/crates/common/types/blobs_bundle.rs b/crates/common/types/blobs_bundle.rs index 3ba612b12b..1cfd4bda17 100644 --- a/crates/common/types/blobs_bundle.rs +++ b/crates/common/types/blobs_bundle.rs @@ -83,24 +83,21 @@ impl BlobsBundle { // In the future we might want to provide a new method that calculates the commitments and proofs using the following. #[cfg(feature = "c-kzg")] pub fn create_from_blobs(blobs: &Vec, fork: Fork) -> Result { - use ethrex_crypto::kzg::blob_to_kzg_commitment_and_proof; + use ethrex_crypto::kzg::{ + blob_to_commitment_and_cell_proofs, blob_to_kzg_commitment_and_proof, + }; let mut commitments = Vec::new(); let mut proofs = Vec::new(); - let c_kzg_settings = c_kzg::ethereum_kzg_settings(8); // Populate the commitments and proofs for blob in blobs { - let (commitment, proof) = blob_to_kzg_commitment_and_proof(blob)?; - commitments.push(commitment); - - if fork <= Fork::Prague { + if fork < Fork::Osaka { + let (commitment, proof) = blob_to_kzg_commitment_and_proof(blob)?; + commitments.push(commitment); proofs.push(proof); } else { - let blob: c_kzg::Blob = (*blob).into(); - let (_cells, cell_proofs) = c_kzg_settings - .compute_cells_and_kzg_proofs(&blob) - .map_err(|e| BlobsBundleError::Kzg(ethrex_crypto::kzg::KzgError::CKzg(e)))?; - let cell_proofs = cell_proofs.map(|p| p.to_bytes().into_inner()); + let (commitment, cell_proofs) = blob_to_commitment_and_cell_proofs(blob)?; + commitments.push(commitment); proofs.extend(cell_proofs); } } From 5145ba5c2330de1dc573ee8207e98656d44f7dd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Mon, 13 Oct 2025 18:11:26 -0300 Subject: [PATCH 13/20] use flag --- cmd/ethrex/l2/options.rs | 11 ++++++++++ crates/l2/based/block_fetcher.rs | 10 +++++++-- crates/l2/monitor/app.rs | 9 +++++++- crates/l2/monitor/widget/batches.rs | 13 ++++++++--- .../prover/src/guest_program/src/execution.rs | 1 - crates/l2/sdk/src/sdk.rs | 22 ++++++++++++++----- crates/l2/sequencer/configs.rs | 5 +++++ crates/l2/sequencer/l1_committer.rs | 14 ++++++++---- crates/l2/sequencer/proof_coordinator.rs | 8 +++++-- crates/networking/rpc/eth/client.rs | 5 ----- 10 files changed, 75 insertions(+), 23 deletions(-) diff --git a/cmd/ethrex/l2/options.rs b/cmd/ethrex/l2/options.rs index 518fb42268..45a09c898e 100644 --- a/cmd/ethrex/l2/options.rs +++ b/cmd/ethrex/l2/options.rs @@ -103,6 +103,13 @@ pub struct SequencerOptions { help_heading = "Monitor options" )] pub no_monitor: bool, + #[clap( + long, + value_name = "UINT64", + env = "ETHREX_OSAKA_ACTIVATION_TIME", + help = "Block timestamp at which the Osaka fork activates. If not set, it will assume Osaka is already active." + )] + pub osaka_activation_time: Option, } pub fn parse_signer( @@ -174,6 +181,7 @@ impl TryFrom for SequencerConfig { arbitrary_base_blob_gas_price: opts.committer_opts.arbitrary_base_blob_gas_price, signer: committer_signer, validium: opts.validium, + osaka_activation_time: opts.osaka_activation_time, }, eth: EthConfig { rpc_url: opts.eth_opts.rpc_url, @@ -205,6 +213,7 @@ impl TryFrom for SequencerConfig { .proof_coordinator_tdx_private_key, qpl_tool_path: opts.proof_coordinator_opts.proof_coordinator_qpl_tool_path, validium: opts.validium, + osaka_activation_time: opts.osaka_activation_time, }, based: BasedConfig { enabled: opts.based, @@ -219,6 +228,7 @@ impl TryFrom for SequencerConfig { block_fetcher: BlockFetcherConfig { fetch_interval_ms: opts.based_opts.block_fetcher.fetch_interval_ms, fetch_block_step: opts.based_opts.block_fetcher.fetch_block_step, + osaka_activation_time: opts.osaka_activation_time, }, }, aligned: AlignedConfig { @@ -235,6 +245,7 @@ impl TryFrom for SequencerConfig { enabled: !opts.no_monitor, tick_rate: opts.monitor_opts.tick_rate, batch_widget_height: opts.monitor_opts.batch_widget_height, + osaka_activation_time: opts.osaka_activation_time, }, admin_server: AdminConfig { listen_ip: opts.admin_opts.admin_listen_ip, diff --git a/crates/l2/based/block_fetcher.rs b/crates/l2/based/block_fetcher.rs index 0787f1af81..2db237b6db 100644 --- a/crates/l2/based/block_fetcher.rs +++ b/crates/l2/based/block_fetcher.rs @@ -13,7 +13,9 @@ use ethrex_l2_common::{ privileged_transactions::compute_privileged_transactions_hash, state_diff::prepare_state_diff, }; -use ethrex_l2_sdk::{get_l1_fork, get_last_committed_batch, get_last_fetched_l1_block}; +use ethrex_l2_sdk::{ + get_last_committed_batch, get_last_fetched_l1_block, is_osaka_activated_on_l1, +}; use ethrex_rlp::decode::RLPDecode; use ethrex_rpc::{EthClient, types::receipt::RpcLog}; use ethrex_storage::Store; @@ -93,6 +95,7 @@ pub struct BlockFetcher { fetch_interval_ms: u64, last_l1_block_fetched: U256, fetch_block_step: U256, + osaka_activation_time: Option, } impl BlockFetcher { @@ -118,6 +121,7 @@ impl BlockFetcher { fetch_interval_ms: cfg.based.block_fetcher.fetch_interval_ms, last_l1_block_fetched, fetch_block_step: cfg.based.block_fetcher.fetch_block_step.into(), + osaka_activation_time: cfg.based.block_fetcher.osaka_activation_time, }) } @@ -388,7 +392,9 @@ impl BlockFetcher { ) .map_err(|_| BlockFetcherError::BlobBundleError)?; - let fork = get_l1_fork(&self.eth_client).await; + let fork = is_osaka_activated_on_l1(&self.eth_client, self.osaka_activation_time) + .await + .map_err(BlockFetcherError::EthClientError)?; let (blobs_bundle, _) = generate_blobs_bundle(&state_diff, fork) .map_err(|_| BlockFetcherError::BlobBundleError)?; diff --git a/crates/l2/monitor/app.rs b/crates/l2/monitor/app.rs index 3cb1bd28a7..793c36a39c 100644 --- a/crates/l2/monitor/app.rs +++ b/crates/l2/monitor/app.rs @@ -71,6 +71,8 @@ pub struct EthrexMonitorWidget { pub rollup_store: StoreRollup, pub last_scroll: Instant, pub overview_selected_widget: usize, + + pub osaka_activation_time: Option, } #[derive(Clone, Debug)] @@ -215,6 +217,7 @@ impl EthrexMonitorWidget { rollup_store, last_scroll: Instant::now(), overview_selected_widget: 0, + osaka_activation_time: cfg.monitor.osaka_activation_time, }; monitor_widget.selected_table().selected(true); monitor_widget.on_tick().await?; @@ -324,7 +327,11 @@ impl EthrexMonitorWidget { .await?; self.mempool.on_tick(&self.rollup_client).await?; self.batches_table - .on_tick(&self.eth_client, &self.rollup_store) + .on_tick( + &self.eth_client, + &self.rollup_store, + self.osaka_activation_time, + ) .await?; self.blocks_table.on_tick(&self.store).await?; self.l1_to_l2_messages diff --git a/crates/l2/monitor/widget/batches.rs b/crates/l2/monitor/widget/batches.rs index f8bf243df5..6fb7ff4610 100644 --- a/crates/l2/monitor/widget/batches.rs +++ b/crates/l2/monitor/widget/batches.rs @@ -2,7 +2,7 @@ use ethrex_common::{ Address, H256, types::{Fork, batch::Batch}, }; -use ethrex_l2_sdk::{get_l1_fork, get_last_committed_batch}; +use ethrex_l2_sdk::{get_last_committed_batch, is_osaka_activated_on_l1}; use ethrex_rpc::EthClient; use ethrex_storage_rollup::StoreRollup; use ratatui::{ @@ -53,17 +53,21 @@ impl BatchesTable { &mut self, eth_client: &EthClient, rollup_store: &StoreRollup, + osaka_activation_time: Option, ) -> Result<(), MonitorError> { let mut new_latest_batches = Self::fetch_new_items( &mut self.last_l1_block_fetched, self.on_chain_proposer_address, eth_client, rollup_store, + osaka_activation_time, ) .await?; new_latest_batches.truncate(BATCH_WINDOW_SIZE); - let fork = get_l1_fork(eth_client).await; + let fork = is_osaka_activated_on_l1(eth_client, osaka_activation_time) + .await + .map_err(MonitorError::EthClientError)?; let n_new_latest_batches = new_latest_batches.len(); self.items @@ -113,6 +117,7 @@ impl BatchesTable { on_chain_proposer_address: Address, eth_client: &EthClient, rollup_store: &StoreRollup, + osaka_activation_time: Option, ) -> Result, MonitorError> { let last_l2_batch_number = get_last_committed_batch(eth_client, on_chain_proposer_address) .await @@ -125,7 +130,9 @@ impl BatchesTable { .map_err(|_| MonitorError::BatchWindow)?, ), ); - let fork = get_l1_fork(eth_client).await; + let fork = is_osaka_activated_on_l1(eth_client, osaka_activation_time) + .await + .map_err(MonitorError::EthClientError)?; let new_batches = Self::get_batches( last_l2_batch_fetched, diff --git a/crates/l2/prover/src/guest_program/src/execution.rs b/crates/l2/prover/src/guest_program/src/execution.rs index a15c0ea529..3ec9cd5100 100644 --- a/crates/l2/prover/src/guest_program/src/execution.rs +++ b/crates/l2/prover/src/guest_program/src/execution.rs @@ -447,7 +447,6 @@ fn verify_blob( verify_blob_kzg_proof(blob_data, commitment, proof[0])? } else { // Osaka type proof - verify_cell_kzg_proof_batch(&[blob_data], &[commitment], &proof)? }; diff --git a/crates/l2/sdk/src/sdk.rs b/crates/l2/sdk/src/sdk.rs index c3ecb446a0..1a4378d719 100644 --- a/crates/l2/sdk/src/sdk.rs +++ b/crates/l2/sdk/src/sdk.rs @@ -670,7 +670,7 @@ pub async fn send_generic_transaction( signed_tx.encode(&mut encoded_tx); } TxType::EIP4844 => { - let fork = get_l1_fork(client).await; + let fork = is_osaka_activated_on_l1(client, None).await?; // TODO: Change this let mut tx = WrappedEIP4844Transaction::from_generic_tx(generic_tx, fork)?; tx.tx .sign_inplace(signer) @@ -983,10 +983,22 @@ pub async fn get_pending_privileged_transactions( } // TODO: This is a work around for now, issue: https://github.com/lambdaclass/ethrex/issues/4828 -pub async fn get_l1_fork(client: &EthClient) -> Fork { - match client.get_eth_config().await { - Ok(_) => Fork::Osaka, // This endpoint only supports Osaka and later - Err(_) => Fork::Prague, +pub async fn is_osaka_activated_on_l1( + client: &EthClient, + activation_time: Option, +) -> Result { + let Some(osaka_activation_time) = activation_time else { + return Ok(Fork::Osaka); + }; + let current_timestamp = client + .get_block_by_number(BlockIdentifier::Tag(BlockTag::Latest), false) + .await? + .header + .timestamp; + if current_timestamp < osaka_activation_time { + Ok(Fork::Prague) + } else { + Ok(Fork::Osaka) } } diff --git a/crates/l2/sequencer/configs.rs b/crates/l2/sequencer/configs.rs index a16890eaf0..3fecd4d89e 100644 --- a/crates/l2/sequencer/configs.rs +++ b/crates/l2/sequencer/configs.rs @@ -36,6 +36,7 @@ pub struct CommitterConfig { pub arbitrary_base_blob_gas_price: u64, pub validium: bool, pub signer: Signer, + pub osaka_activation_time: Option, } #[derive(Clone, Debug)] @@ -66,6 +67,7 @@ pub struct ProofCoordinatorConfig { pub validium: bool, pub tdx_private_key: Option, pub qpl_tool_path: Option, + pub osaka_activation_time: Option, } #[derive(Clone, Debug)] @@ -85,6 +87,7 @@ pub struct StateUpdaterConfig { pub struct BlockFetcherConfig { pub fetch_interval_ms: u64, pub fetch_block_step: u64, + pub osaka_activation_time: Option, } #[derive(Clone, Debug)] @@ -104,6 +107,8 @@ pub struct MonitorConfig { pub tick_rate: u64, /// height in lines of the batch widget pub batch_widget_height: Option, + /// Timestamp at which the Osaka fork activates. If not set, it will assume Osaka is already active. + pub osaka_activation_time: Option, } #[derive(Clone, Debug)] diff --git a/crates/l2/sequencer/l1_committer.rs b/crates/l2/sequencer/l1_committer.rs index c83de2c183..845c7adbf8 100644 --- a/crates/l2/sequencer/l1_committer.rs +++ b/crates/l2/sequencer/l1_committer.rs @@ -28,8 +28,8 @@ use ethrex_l2_common::{ }; use ethrex_l2_rpc::signer::{Signer, SignerHealth}; use ethrex_l2_sdk::{ - build_generic_tx, calldata::encode_calldata, get_l1_fork, get_last_committed_batch, - send_tx_bump_gas_exponential_backoff, + build_generic_tx, calldata::encode_calldata, get_last_committed_batch, + is_osaka_activated_on_l1, send_tx_bump_gas_exponential_backoff, }; #[cfg(feature = "metrics")] use ethrex_metrics::l2::metrics::{METRICS, MetricsBlockType}; @@ -103,6 +103,7 @@ pub struct L1Committer { last_committed_batch: u64, /// Cancellation token for the next inbound InMessage::Commit cancellation_token: Option, + osaka_activation_time: Option, } #[derive(Clone, Serialize)] @@ -163,6 +164,7 @@ impl L1Committer { last_committed_batch_timestamp: 0, last_committed_batch, cancellation_token: None, + osaka_activation_time: committer_config.osaka_activation_time, }) } @@ -206,7 +208,9 @@ impl L1Committer { get_last_committed_batch(&self.eth_client, self.on_chain_proposer_address).await?; let batch_to_commit = last_committed_batch_number + 1; - let fork = get_l1_fork(&self.eth_client).await; + let fork = is_osaka_activated_on_l1(&self.eth_client, self.osaka_activation_time) + .await + .map_err(CommitterError::EthClientError)?; let batch = match self.rollup_store.get_batch(batch_to_commit, fork).await? { Some(batch) => batch, None => { @@ -449,7 +453,9 @@ impl L1Committer { &acc_privileged_txs, acc_account_updates.clone().into_values().collect(), )?; - let fork = get_l1_fork(&self.eth_client).await; + let fork = is_osaka_activated_on_l1(&self.eth_client, self.osaka_activation_time) + .await + .map_err(CommitterError::EthClientError)?; generate_blobs_bundle(&state_diff, fork) } else { Ok((BlobsBundle::default(), 0_usize)) diff --git a/crates/l2/sequencer/proof_coordinator.rs b/crates/l2/sequencer/proof_coordinator.rs index cecee2d11f..f1aa2f78a8 100644 --- a/crates/l2/sequencer/proof_coordinator.rs +++ b/crates/l2/sequencer/proof_coordinator.rs @@ -13,7 +13,7 @@ use ethrex_common::{ types::{Block, blobs_bundle}, }; use ethrex_l2_common::prover::{BatchProof, ProverType}; -use ethrex_l2_sdk::get_l1_fork; +use ethrex_l2_sdk::is_osaka_activated_on_l1; use ethrex_metrics::metrics; use ethrex_rpc::clients::eth::EthClient; use ethrex_storage::Store; @@ -185,6 +185,7 @@ pub struct ProofCoordinator { #[cfg(feature = "metrics")] request_timestamp: Arc>>, qpl_tool_path: Option, + osaka_activation_time: Option, } impl ProofCoordinator { @@ -235,6 +236,7 @@ impl ProofCoordinator { #[cfg(feature = "metrics")] request_timestamp: Arc::new(Mutex::new(HashMap::new())), qpl_tool_path: config.qpl_tool_path.clone(), + osaka_activation_time: config.osaka_activation_time, }) } @@ -489,7 +491,9 @@ impl ProofCoordinator { .get_blobs_by_batch(batch_number) .await? .ok_or(ProofCoordinatorError::MissingBlob(batch_number))?; - let fork = get_l1_fork(&self.eth_client).await; + let fork = is_osaka_activated_on_l1(&self.eth_client, self.osaka_activation_time) + .await + .map_err(ProofCoordinatorError::EthClientError)?; let BlobsBundle { mut commitments, mut proofs, diff --git a/crates/networking/rpc/eth/client.rs b/crates/networking/rpc/eth/client.rs index 8c3ceaf716..fdf9e98ed1 100644 --- a/crates/networking/rpc/eth/client.rs +++ b/crates/networking/rpc/eth/client.rs @@ -99,11 +99,6 @@ impl RpcHandler for Config { } async fn handle(&self, context: RpcApiContext) -> Result { - if context.blockchain.current_fork().await? < Fork::Osaka { - return Err(RpcErr::UnsuportedFork( - "eth-config is not supported for forks prior to Osaka".to_owned(), - )); - } let chain_config = context.storage.get_chain_config()?; let Some(latest_block) = context .storage From 41ed5e72b81756fc73cc4ef66693efc6b3869d55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Tue, 14 Oct 2025 11:14:56 -0300 Subject: [PATCH 14/20] use another crate for verification --- Cargo.lock | 143 +++++++++++++++++++++++++- crates/common/crypto/Cargo.toml | 2 + crates/common/crypto/kzg.rs | 39 ++++++-- crates/l2/tee/quote-gen/Cargo.lock | 156 +++++++++++++++++++++++++++-- 4 files changed, 327 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 141b9b2ac1..b7ff543bc9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1226,6 +1226,22 @@ dependencies = [ "zeroize", ] +[[package]] +name = "blstrs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a8a8ed6fefbeef4a8c7b460e4110e12c5e22a5b7cf32621aae6ad650c4dcf29" +dependencies = [ + "blst", + "byte-slice-cast", + "ff 0.13.1", + "group 0.13.0", + "pairing 0.23.0", + "rand_core 0.6.4", + "serde", + "subtle", +] + [[package]] name = "bonsai-sdk" version = "1.4.1" @@ -2940,12 +2956,108 @@ dependencies = [ "tokio", ] +[[package]] +name = "eip4844" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "ekzg-bls12-381", + "ekzg-maybe-rayon", + "ekzg-polynomial", + "ekzg-serialization", + "ekzg-single-open", + "ekzg-trusted-setup", + "hex", + "itertools 0.14.0", + "serde", + "serde_json", + "sha2", +] + [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "ekzg-bls12-381" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "blst", + "blstrs", + "ff 0.13.1", + "group 0.13.0", + "pairing 0.23.0", + "subtle", +] + +[[package]] +name = "ekzg-erasure-codes" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "ekzg-bls12-381", + "ekzg-polynomial", +] + +[[package]] +name = "ekzg-maybe-rayon" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" + +[[package]] +name = "ekzg-multi-open" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "ekzg-bls12-381", + "ekzg-maybe-rayon", + "ekzg-polynomial", + "sha2", +] + +[[package]] +name = "ekzg-polynomial" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "ekzg-bls12-381", + "ekzg-maybe-rayon", +] + +[[package]] +name = "ekzg-serialization" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "ekzg-bls12-381", + "hex", +] + +[[package]] +name = "ekzg-single-open" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "ekzg-bls12-381", + "ekzg-polynomial", + "itertools 0.14.0", +] + +[[package]] +name = "ekzg-trusted-setup" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "ekzg-bls12-381", + "ekzg-serialization", + "hex", + "serde", + "serde_json", +] + [[package]] name = "elf" version = "0.7.4" @@ -3643,7 +3755,9 @@ name = "ethrex-crypto" version = "0.1.0" dependencies = [ "c-kzg", + "ekzg-bls12-381", "kzg-rs", + "rust_eth_kzg", "thiserror 2.0.17", ] @@ -4755,7 +4869,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff 0.13.1", + "rand 0.8.5", "rand_core 0.6.4", + "rand_xorshift 0.3.0", "subtle", ] @@ -8146,7 +8262,7 @@ dependencies = [ "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", - "rand_xorshift", + "rand_xorshift 0.4.0", "regex-syntax", "rusty-fork", "tempfile", @@ -8449,6 +8565,15 @@ dependencies = [ "serde", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "rand_xorshift" version = "0.4.0" @@ -9390,6 +9515,22 @@ dependencies = [ "serde_json", ] +[[package]] +name = "rust_eth_kzg" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "eip4844", + "ekzg-bls12-381", + "ekzg-erasure-codes", + "ekzg-multi-open", + "ekzg-serialization", + "ekzg-trusted-setup", + "hex", + "serde", + "serde_json", +] + [[package]] name = "rustc-demangle" version = "0.1.26" diff --git a/crates/common/crypto/Cargo.toml b/crates/common/crypto/Cargo.toml index d1de2c2e5b..410e8bc4d4 100644 --- a/crates/common/crypto/Cargo.toml +++ b/crates/common/crypto/Cargo.toml @@ -12,6 +12,8 @@ path = "./lib.rs" # TODO(#1102): Move to Lambdaworks in the future c-kzg = { version = "2.1.1", optional = true } kzg-rs.workspace = true +rust_eth_kzg = { git = "https://github.com/crate-crypto/rust-eth-kzg", tag = "v0.8.0" } +bls12_381 = { git = "https://github.com/crate-crypto/rust-eth-kzg", package = "ekzg-bls12-381", tag = "v0.8.0" } thiserror.workspace = true diff --git a/crates/common/crypto/kzg.rs b/crates/common/crypto/kzg.rs index 5090424383..ae1dccef3a 100644 --- a/crates/common/crypto/kzg.rs +++ b/crates/common/crypto/kzg.rs @@ -22,9 +22,6 @@ pub enum KzgError { CKzg(#[from] c_kzg::Error), #[error("kzg-rs error: {0}")] KzgRs(kzg_rs::KzgError), - #[cfg(not(feature = "c-kzg"))] - #[error("{0} is not supported without c-kzg feature enabled")] - NotSupportedWithoutCKZG(String), } impl From for KzgError { @@ -41,9 +38,39 @@ pub fn verify_cell_kzg_proof_batch( cell_proof: &[Proof], ) -> Result { #[cfg(not(feature = "c-kzg"))] - return Err(KzgError::NotSupportedWithoutCKZG(String::from( - "Cell proof verification", - ))); + { + use rust_eth_kzg::{DASContext, TrustedSetup}; + let trusted_setup = TrustedSetup::default(); + + // Initialize the data availability sampling context with precomputed fixed-base MSM + let ctx = DASContext::new( + &trusted_setup, + bls12_381::fixed_base_msm::UsePrecomp::Yes { width: 8 }, + ); + let mut cells = Vec::new(); + for blob in blobs { + let computed_cells = ctx.compute_cells(blob).expect("TODO: add new error"); + cells.extend(computed_cells.into_iter().map(|cell| *cell)); + } + let res = ctx.verify_cell_kzg_proof_batch( + commitments + .iter() + .flat_map(|commitment| repeat_n(commitment as &[u8; 48], CELLS_PER_EXT_BLOB)) + .collect::>(), + &repeat_n(0..CELLS_PER_EXT_BLOB as u64, blobs.len()) + .flatten() + .collect::>(), + cells + .iter() + .map(|cell| cell as &[u8; 2048]) + .collect::>(), + cell_proof + .iter() + .map(|proof| proof as &[u8; 48]) + .collect::>(), + ); + if res.is_err() { Ok(false) } else { Ok(true) } + } #[cfg(feature = "c-kzg")] { let c_kzg_settings = c_kzg::ethereum_kzg_settings(8); diff --git a/crates/l2/tee/quote-gen/Cargo.lock b/crates/l2/tee/quote-gen/Cargo.lock index 6d5e9f4a05..8702ab2484 100644 --- a/crates/l2/tee/quote-gen/Cargo.lock +++ b/crates/l2/tee/quote-gen/Cargo.lock @@ -607,6 +607,22 @@ dependencies = [ "zeroize", ] +[[package]] +name = "blstrs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a8a8ed6fefbeef4a8c7b460e4110e12c5e22a5b7cf32621aae6ad650c4dcf29" +dependencies = [ + "blst", + "byte-slice-cast", + "ff", + "group", + "pairing", + "rand_core 0.6.4", + "serde", + "subtle", +] + [[package]] name = "bs58" version = "0.5.1" @@ -1591,12 +1607,108 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "eip4844" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "ekzg-bls12-381", + "ekzg-maybe-rayon", + "ekzg-polynomial", + "ekzg-serialization", + "ekzg-single-open", + "ekzg-trusted-setup", + "hex", + "itertools 0.14.0", + "serde", + "serde_json", + "sha2", +] + [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "ekzg-bls12-381" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "blst", + "blstrs", + "ff", + "group", + "pairing", + "subtle", +] + +[[package]] +name = "ekzg-erasure-codes" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "ekzg-bls12-381", + "ekzg-polynomial", +] + +[[package]] +name = "ekzg-maybe-rayon" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" + +[[package]] +name = "ekzg-multi-open" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "ekzg-bls12-381", + "ekzg-maybe-rayon", + "ekzg-polynomial", + "sha2", +] + +[[package]] +name = "ekzg-polynomial" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "ekzg-bls12-381", + "ekzg-maybe-rayon", +] + +[[package]] +name = "ekzg-serialization" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "ekzg-bls12-381", + "hex", +] + +[[package]] +name = "ekzg-single-open" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "ekzg-bls12-381", + "ekzg-polynomial", + "itertools 0.14.0", +] + +[[package]] +name = "ekzg-trusted-setup" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "ekzg-bls12-381", + "ekzg-serialization", + "hex", + "serde", + "serde_json", +] + [[package]] name = "elliptic-curve" version = "0.13.8" @@ -2071,7 +2183,6 @@ name = "ethrex-blockchain" version = "0.1.0" dependencies = [ "bytes", - "cfg-if 1.0.3", "ethrex-common", "ethrex-metrics", "ethrex-rlp", @@ -2090,14 +2201,15 @@ name = "ethrex-common" version = "0.1.0" dependencies = [ "bytes", - "c-kzg", "crc32fast", "ethereum-types 0.15.1", + "ethrex-crypto", "ethrex-rlp", "ethrex-trie", "hex", "kzg-rs", "lazy_static", + "libc", "once_cell", "rayon", "rkyv", @@ -2126,6 +2238,13 @@ dependencies = [ [[package]] name = "ethrex-crypto" version = "0.1.0" +dependencies = [ + "c-kzg", + "ekzg-bls12-381", + "kzg-rs", + "rust_eth_kzg", + "thiserror 2.0.16", +] [[package]] name = "ethrex-dev" @@ -2154,7 +2273,6 @@ dependencies = [ "axum", "bincode", "bytes", - "cfg-if 1.0.3", "chrono", "clap", "color-eyre", @@ -2352,7 +2470,6 @@ dependencies = [ "axum", "axum-extra", "bytes", - "cfg-if 1.0.3", "envy", "ethereum-types 0.15.1", "ethrex-blockchain", @@ -2485,7 +2602,6 @@ version = "0.1.0" dependencies = [ "bincode", "bytes", - "cfg-if 1.0.3", "derive_more 1.0.0", "dyn-clone", "ethereum-types 0.15.1", @@ -2853,7 +2969,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", + "rand 0.8.5", "rand_core 0.6.4", + "rand_xorshift 0.3.0", "subtle", ] @@ -2864,6 +2982,7 @@ dependencies = [ "bytes", "ethrex-blockchain", "ethrex-common", + "ethrex-crypto", "ethrex-l2-common", "ethrex-rlp", "ethrex-storage", @@ -4683,7 +4802,7 @@ dependencies = [ "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", - "rand_xorshift", + "rand_xorshift 0.4.0", "regex-syntax", "unarray", ] @@ -4839,6 +4958,15 @@ dependencies = [ "getrandom 0.3.3", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "rand_xorshift" version = "0.4.0" @@ -5194,6 +5322,22 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "rust_eth_kzg" +version = "0.8.0" +source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" +dependencies = [ + "eip4844", + "ekzg-bls12-381", + "ekzg-erasure-codes", + "ekzg-multi-open", + "ekzg-serialization", + "ekzg-trusted-setup", + "hex", + "serde", + "serde_json", +] + [[package]] name = "rustc-demangle" version = "0.1.26" From 1a781533f6779c7be822aa892576f808ca461278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Tue, 14 Oct 2025 14:17:21 -0300 Subject: [PATCH 15/20] Revert "use another crate for verification" This reverts commit 41ed5e72b81756fc73cc4ef66693efc6b3869d55. --- Cargo.lock | 143 +------------------------- crates/common/crypto/Cargo.toml | 2 - crates/common/crypto/kzg.rs | 39 ++------ crates/l2/tee/quote-gen/Cargo.lock | 156 ++--------------------------- 4 files changed, 13 insertions(+), 327 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 173f266b55..638eab7df8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1226,22 +1226,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "blstrs" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a8a8ed6fefbeef4a8c7b460e4110e12c5e22a5b7cf32621aae6ad650c4dcf29" -dependencies = [ - "blst", - "byte-slice-cast", - "ff 0.13.1", - "group 0.13.0", - "pairing 0.23.0", - "rand_core 0.6.4", - "serde", - "subtle", -] - [[package]] name = "bonsai-sdk" version = "1.4.1" @@ -2956,108 +2940,12 @@ dependencies = [ "tokio", ] -[[package]] -name = "eip4844" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "ekzg-bls12-381", - "ekzg-maybe-rayon", - "ekzg-polynomial", - "ekzg-serialization", - "ekzg-single-open", - "ekzg-trusted-setup", - "hex", - "itertools 0.14.0", - "serde", - "serde_json", - "sha2", -] - [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -[[package]] -name = "ekzg-bls12-381" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "blst", - "blstrs", - "ff 0.13.1", - "group 0.13.0", - "pairing 0.23.0", - "subtle", -] - -[[package]] -name = "ekzg-erasure-codes" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "ekzg-bls12-381", - "ekzg-polynomial", -] - -[[package]] -name = "ekzg-maybe-rayon" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" - -[[package]] -name = "ekzg-multi-open" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "ekzg-bls12-381", - "ekzg-maybe-rayon", - "ekzg-polynomial", - "sha2", -] - -[[package]] -name = "ekzg-polynomial" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "ekzg-bls12-381", - "ekzg-maybe-rayon", -] - -[[package]] -name = "ekzg-serialization" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "ekzg-bls12-381", - "hex", -] - -[[package]] -name = "ekzg-single-open" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "ekzg-bls12-381", - "ekzg-polynomial", - "itertools 0.14.0", -] - -[[package]] -name = "ekzg-trusted-setup" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "ekzg-bls12-381", - "ekzg-serialization", - "hex", - "serde", - "serde_json", -] - [[package]] name = "elf" version = "0.7.4" @@ -3755,9 +3643,7 @@ name = "ethrex-crypto" version = "0.1.0" dependencies = [ "c-kzg", - "ekzg-bls12-381", "kzg-rs", - "rust_eth_kzg", "thiserror 2.0.17", ] @@ -4869,9 +4755,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff 0.13.1", - "rand 0.8.5", "rand_core 0.6.4", - "rand_xorshift 0.3.0", "subtle", ] @@ -8263,7 +8147,7 @@ dependencies = [ "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", - "rand_xorshift 0.4.0", + "rand_xorshift", "regex-syntax", "rusty-fork", "tempfile", @@ -8566,15 +8450,6 @@ dependencies = [ "serde", ] -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core 0.6.4", -] - [[package]] name = "rand_xorshift" version = "0.4.0" @@ -9516,22 +9391,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "rust_eth_kzg" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "eip4844", - "ekzg-bls12-381", - "ekzg-erasure-codes", - "ekzg-multi-open", - "ekzg-serialization", - "ekzg-trusted-setup", - "hex", - "serde", - "serde_json", -] - [[package]] name = "rustc-demangle" version = "0.1.26" diff --git a/crates/common/crypto/Cargo.toml b/crates/common/crypto/Cargo.toml index 410e8bc4d4..d1de2c2e5b 100644 --- a/crates/common/crypto/Cargo.toml +++ b/crates/common/crypto/Cargo.toml @@ -12,8 +12,6 @@ path = "./lib.rs" # TODO(#1102): Move to Lambdaworks in the future c-kzg = { version = "2.1.1", optional = true } kzg-rs.workspace = true -rust_eth_kzg = { git = "https://github.com/crate-crypto/rust-eth-kzg", tag = "v0.8.0" } -bls12_381 = { git = "https://github.com/crate-crypto/rust-eth-kzg", package = "ekzg-bls12-381", tag = "v0.8.0" } thiserror.workspace = true diff --git a/crates/common/crypto/kzg.rs b/crates/common/crypto/kzg.rs index ae1dccef3a..5090424383 100644 --- a/crates/common/crypto/kzg.rs +++ b/crates/common/crypto/kzg.rs @@ -22,6 +22,9 @@ pub enum KzgError { CKzg(#[from] c_kzg::Error), #[error("kzg-rs error: {0}")] KzgRs(kzg_rs::KzgError), + #[cfg(not(feature = "c-kzg"))] + #[error("{0} is not supported without c-kzg feature enabled")] + NotSupportedWithoutCKZG(String), } impl From for KzgError { @@ -38,39 +41,9 @@ pub fn verify_cell_kzg_proof_batch( cell_proof: &[Proof], ) -> Result { #[cfg(not(feature = "c-kzg"))] - { - use rust_eth_kzg::{DASContext, TrustedSetup}; - let trusted_setup = TrustedSetup::default(); - - // Initialize the data availability sampling context with precomputed fixed-base MSM - let ctx = DASContext::new( - &trusted_setup, - bls12_381::fixed_base_msm::UsePrecomp::Yes { width: 8 }, - ); - let mut cells = Vec::new(); - for blob in blobs { - let computed_cells = ctx.compute_cells(blob).expect("TODO: add new error"); - cells.extend(computed_cells.into_iter().map(|cell| *cell)); - } - let res = ctx.verify_cell_kzg_proof_batch( - commitments - .iter() - .flat_map(|commitment| repeat_n(commitment as &[u8; 48], CELLS_PER_EXT_BLOB)) - .collect::>(), - &repeat_n(0..CELLS_PER_EXT_BLOB as u64, blobs.len()) - .flatten() - .collect::>(), - cells - .iter() - .map(|cell| cell as &[u8; 2048]) - .collect::>(), - cell_proof - .iter() - .map(|proof| proof as &[u8; 48]) - .collect::>(), - ); - if res.is_err() { Ok(false) } else { Ok(true) } - } + return Err(KzgError::NotSupportedWithoutCKZG(String::from( + "Cell proof verification", + ))); #[cfg(feature = "c-kzg")] { let c_kzg_settings = c_kzg::ethereum_kzg_settings(8); diff --git a/crates/l2/tee/quote-gen/Cargo.lock b/crates/l2/tee/quote-gen/Cargo.lock index 104e0aa2a0..011602868a 100644 --- a/crates/l2/tee/quote-gen/Cargo.lock +++ b/crates/l2/tee/quote-gen/Cargo.lock @@ -607,22 +607,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "blstrs" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a8a8ed6fefbeef4a8c7b460e4110e12c5e22a5b7cf32621aae6ad650c4dcf29" -dependencies = [ - "blst", - "byte-slice-cast", - "ff", - "group", - "pairing", - "rand_core 0.6.4", - "serde", - "subtle", -] - [[package]] name = "bs58" version = "0.5.1" @@ -1607,108 +1591,12 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "eip4844" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "ekzg-bls12-381", - "ekzg-maybe-rayon", - "ekzg-polynomial", - "ekzg-serialization", - "ekzg-single-open", - "ekzg-trusted-setup", - "hex", - "itertools 0.14.0", - "serde", - "serde_json", - "sha2", -] - [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -[[package]] -name = "ekzg-bls12-381" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "blst", - "blstrs", - "ff", - "group", - "pairing", - "subtle", -] - -[[package]] -name = "ekzg-erasure-codes" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "ekzg-bls12-381", - "ekzg-polynomial", -] - -[[package]] -name = "ekzg-maybe-rayon" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" - -[[package]] -name = "ekzg-multi-open" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "ekzg-bls12-381", - "ekzg-maybe-rayon", - "ekzg-polynomial", - "sha2", -] - -[[package]] -name = "ekzg-polynomial" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "ekzg-bls12-381", - "ekzg-maybe-rayon", -] - -[[package]] -name = "ekzg-serialization" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "ekzg-bls12-381", - "hex", -] - -[[package]] -name = "ekzg-single-open" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "ekzg-bls12-381", - "ekzg-polynomial", - "itertools 0.14.0", -] - -[[package]] -name = "ekzg-trusted-setup" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "ekzg-bls12-381", - "ekzg-serialization", - "hex", - "serde", - "serde_json", -] - [[package]] name = "elliptic-curve" version = "0.13.8" @@ -2183,6 +2071,7 @@ name = "ethrex-blockchain" version = "0.1.0" dependencies = [ "bytes", + "cfg-if 1.0.3", "ethrex-common", "ethrex-metrics", "ethrex-rlp", @@ -2201,15 +2090,14 @@ name = "ethrex-common" version = "0.1.0" dependencies = [ "bytes", + "c-kzg", "crc32fast", "ethereum-types 0.15.1", - "ethrex-crypto", "ethrex-rlp", "ethrex-trie", "hex", "kzg-rs", "lazy_static", - "libc", "once_cell", "rayon", "rkyv", @@ -2238,13 +2126,6 @@ dependencies = [ [[package]] name = "ethrex-crypto" version = "0.1.0" -dependencies = [ - "c-kzg", - "ekzg-bls12-381", - "kzg-rs", - "rust_eth_kzg", - "thiserror 2.0.16", -] [[package]] name = "ethrex-dev" @@ -2273,6 +2154,7 @@ dependencies = [ "axum", "bincode", "bytes", + "cfg-if 1.0.3", "chrono", "clap", "color-eyre", @@ -2470,6 +2352,7 @@ dependencies = [ "axum", "axum-extra", "bytes", + "cfg-if 1.0.3", "envy", "ethereum-types 0.15.1", "ethrex-blockchain", @@ -2602,6 +2485,7 @@ version = "0.1.0" dependencies = [ "bincode", "bytes", + "cfg-if 1.0.3", "derive_more 1.0.0", "dyn-clone", "ethereum-types 0.15.1", @@ -2969,9 +2853,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand 0.8.5", "rand_core 0.6.4", - "rand_xorshift 0.3.0", "subtle", ] @@ -2982,7 +2864,6 @@ dependencies = [ "bytes", "ethrex-blockchain", "ethrex-common", - "ethrex-crypto", "ethrex-l2-common", "ethrex-rlp", "ethrex-storage", @@ -4802,7 +4683,7 @@ dependencies = [ "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", - "rand_xorshift 0.4.0", + "rand_xorshift", "regex-syntax", "unarray", ] @@ -4958,15 +4839,6 @@ dependencies = [ "getrandom 0.3.3", ] -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core 0.6.4", -] - [[package]] name = "rand_xorshift" version = "0.4.0" @@ -5322,22 +5194,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "rust_eth_kzg" -version = "0.8.0" -source = "git+https://github.com/crate-crypto/rust-eth-kzg?tag=v0.8.0#d49e9057ebce035e6a6024f32ae920fb20819ff8" -dependencies = [ - "eip4844", - "ekzg-bls12-381", - "ekzg-erasure-codes", - "ekzg-multi-open", - "ekzg-serialization", - "ekzg-trusted-setup", - "hex", - "serde", - "serde_json", -] - [[package]] name = "rustc-demangle" version = "0.1.26" From e17483e0262fefc54b98913201259ca7ba48d5f8 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Mon, 13 Oct 2025 18:01:59 -0300 Subject: [PATCH 16/20] Change precompute to 0 --- crates/common/crypto/kzg.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/common/crypto/kzg.rs b/crates/common/crypto/kzg.rs index 5f87483c2d..968b64e9e8 100644 --- a/crates/common/crypto/kzg.rs +++ b/crates/common/crypto/kzg.rs @@ -46,7 +46,7 @@ pub fn verify_cell_kzg_proof_batch( ))); #[cfg(feature = "c-kzg")] { - let c_kzg_settings = c_kzg::ethereum_kzg_settings(8); + let c_kzg_settings = c_kzg::ethereum_kzg_settings(0); let mut cells = Vec::new(); for blob in blobs { cells.extend(c_kzg_settings.compute_cells(&(*blob).into())?.into_iter()); @@ -90,7 +90,7 @@ pub fn verify_blob_kzg_proof( #[cfg(feature = "c-kzg")] { c_kzg::KzgSettings::verify_blob_kzg_proof( - c_kzg::ethereum_kzg_settings(8), + c_kzg::ethereum_kzg_settings(0), &blob.into(), &commitment.into(), &proof.into(), @@ -120,7 +120,7 @@ pub fn verify_kzg_proof( #[cfg(feature = "c-kzg")] { c_kzg::KzgSettings::verify_kzg_proof( - c_kzg::ethereum_kzg_settings(8), + c_kzg::ethereum_kzg_settings(0), &commitment_bytes.into(), &z.into(), &y.into(), @@ -135,11 +135,11 @@ pub fn blob_to_kzg_commitment_and_proof(blob: &Blob) -> Result<(Commitment, Proo let blob: c_kzg::Blob = (*blob).into(); let commitment = - c_kzg::KzgSettings::blob_to_kzg_commitment(c_kzg::ethereum_kzg_settings(8), &blob)?; + c_kzg::KzgSettings::blob_to_kzg_commitment(c_kzg::ethereum_kzg_settings(0), &blob)?; let commitment_bytes = commitment.to_bytes(); let proof = c_kzg::KzgSettings::compute_blob_kzg_proof( - c_kzg::ethereum_kzg_settings(8), + c_kzg::ethereum_kzg_settings(0), &blob, &commitment_bytes, )?; From ca2c4d7623d07ef78e8e360dc69d53773e828e76 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Tue, 14 Oct 2025 17:51:41 -0300 Subject: [PATCH 17/20] Add risc0 feature to kzg --- crates/common/Cargo.toml | 3 ++- crates/common/crypto/Cargo.toml | 1 + crates/common/crypto/kzg.rs | 19 ++++++++++++++----- .../src/guest_program/src/risc0/Cargo.toml | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml index 7931d285e5..aa2a517578 100644 --- a/crates/common/Cargo.toml +++ b/crates/common/Cargo.toml @@ -38,7 +38,8 @@ hex-literal.workspace = true [features] default = [] c-kzg = ["ethrex-crypto/c-kzg"] - +risc0 = ["ethrex-crypto/risc0"] + [lib] path = "./common.rs" diff --git a/crates/common/crypto/Cargo.toml b/crates/common/crypto/Cargo.toml index d1de2c2e5b..7975810c9b 100644 --- a/crates/common/crypto/Cargo.toml +++ b/crates/common/crypto/Cargo.toml @@ -18,3 +18,4 @@ thiserror.workspace = true [features] default = [] c-kzg = ["dep:c-kzg"] +risc0 = [] diff --git a/crates/common/crypto/kzg.rs b/crates/common/crypto/kzg.rs index 968b64e9e8..8ed0245b46 100644 --- a/crates/common/crypto/kzg.rs +++ b/crates/common/crypto/kzg.rs @@ -10,6 +10,15 @@ pub const FIELD_ELEMENTS_PER_EXT_BLOB: usize = 2 * FIELD_ELEMENTS_PER_BLOB; pub const FIELD_ELEMENTS_PER_CELL: usize = 64; pub const BYTES_PER_CELL: usize = FIELD_ELEMENTS_PER_CELL * BYTES_PER_FIELD_ELEMENT; pub const CELLS_PER_EXT_BLOB: usize = FIELD_ELEMENTS_PER_EXT_BLOB / FIELD_ELEMENTS_PER_CELL; + +// https://github.com/ethereum/c-kzg-4844?tab=readme-ov-file#precompute +// For Risc0 we need this parameter to be 0. +// For the rest we keep the value 8 due to optimizations. +#[cfg(not(feature = "risc0"))] +pub const KZG_PRECOMPUTE: u64 = 8; +#[cfg(feature = "risc0")] +pub const KZG_PRECOMPUTE: u64 = 0; + type Bytes48 = [u8; 48]; type Blob = [u8; BYTES_PER_BLOB]; type Commitment = Bytes48; @@ -46,7 +55,7 @@ pub fn verify_cell_kzg_proof_batch( ))); #[cfg(feature = "c-kzg")] { - let c_kzg_settings = c_kzg::ethereum_kzg_settings(0); + let c_kzg_settings = c_kzg::ethereum_kzg_settings(KZG_PRECOMPUTE); let mut cells = Vec::new(); for blob in blobs { cells.extend(c_kzg_settings.compute_cells(&(*blob).into())?.into_iter()); @@ -90,7 +99,7 @@ pub fn verify_blob_kzg_proof( #[cfg(feature = "c-kzg")] { c_kzg::KzgSettings::verify_blob_kzg_proof( - c_kzg::ethereum_kzg_settings(0), + c_kzg::ethereum_kzg_settings(KZG_PRECOMPUTE), &blob.into(), &commitment.into(), &proof.into(), @@ -120,7 +129,7 @@ pub fn verify_kzg_proof( #[cfg(feature = "c-kzg")] { c_kzg::KzgSettings::verify_kzg_proof( - c_kzg::ethereum_kzg_settings(0), + c_kzg::ethereum_kzg_settings(KZG_PRECOMPUTE), &commitment_bytes.into(), &z.into(), &y.into(), @@ -135,11 +144,11 @@ pub fn blob_to_kzg_commitment_and_proof(blob: &Blob) -> Result<(Commitment, Proo let blob: c_kzg::Blob = (*blob).into(); let commitment = - c_kzg::KzgSettings::blob_to_kzg_commitment(c_kzg::ethereum_kzg_settings(0), &blob)?; + c_kzg::KzgSettings::blob_to_kzg_commitment(c_kzg::ethereum_kzg_settings(KZG_PRECOMPUTE), &blob)?; let commitment_bytes = commitment.to_bytes(); let proof = c_kzg::KzgSettings::compute_blob_kzg_proof( - c_kzg::ethereum_kzg_settings(0), + c_kzg::ethereum_kzg_settings(KZG_PRECOMPUTE), &blob, &commitment_bytes, )?; diff --git a/crates/l2/prover/src/guest_program/src/risc0/Cargo.toml b/crates/l2/prover/src/guest_program/src/risc0/Cargo.toml index f4b0cea8ce..1878b88565 100644 --- a/crates/l2/prover/src/guest_program/src/risc0/Cargo.toml +++ b/crates/l2/prover/src/guest_program/src/risc0/Cargo.toml @@ -20,7 +20,7 @@ guest_program = { path = "../../", default-features = false, features = [ rkyv = { version = "0.8.10", features = ["unaligned"] } -ethrex-common = { path = "../../../../../../common", default-features = false } +ethrex-common = { path = "../../../../../../common", default-features = false, features = ["risc0"] } ethrex-storage = { path = "../../../../../../storage", default-features = false } ethrex-rlp = { path = "../../../../../../common/rlp" } ethrex-vm = { path = "../../../../../../vm", default-features = false, features = [ From 2c5b849fd8db10749f02e7cb046861fe33f8b399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Wed, 15 Oct 2025 19:46:37 -0300 Subject: [PATCH 18/20] include c-kzg risc0 --- crates/common/crypto/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/common/crypto/Cargo.toml b/crates/common/crypto/Cargo.toml index 7975810c9b..346f99cf22 100644 --- a/crates/common/crypto/Cargo.toml +++ b/crates/common/crypto/Cargo.toml @@ -18,4 +18,4 @@ thiserror.workspace = true [features] default = [] c-kzg = ["dep:c-kzg"] -risc0 = [] +risc0 = ["c-kzg"] From 36be0a2ee2925aecc26048a3ba070c380cf25c6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Wed, 15 Oct 2025 19:47:31 -0300 Subject: [PATCH 19/20] fix lint --- crates/common/crypto/kzg.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/common/crypto/kzg.rs b/crates/common/crypto/kzg.rs index 8ed0245b46..72c6d43e0b 100644 --- a/crates/common/crypto/kzg.rs +++ b/crates/common/crypto/kzg.rs @@ -143,8 +143,10 @@ pub fn verify_kzg_proof( pub fn blob_to_kzg_commitment_and_proof(blob: &Blob) -> Result<(Commitment, Proof), KzgError> { let blob: c_kzg::Blob = (*blob).into(); - let commitment = - c_kzg::KzgSettings::blob_to_kzg_commitment(c_kzg::ethereum_kzg_settings(KZG_PRECOMPUTE), &blob)?; + let commitment = c_kzg::KzgSettings::blob_to_kzg_commitment( + c_kzg::ethereum_kzg_settings(KZG_PRECOMPUTE), + &blob, + )?; let commitment_bytes = commitment.to_bytes(); let proof = c_kzg::KzgSettings::compute_blob_kzg_proof( From 7270ab68f4aeaab970126ec60a533ba10738cb81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Thu, 16 Oct 2025 14:57:42 -0300 Subject: [PATCH 20/20] use correct method? --- crates/common/crypto/kzg.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/common/crypto/kzg.rs b/crates/common/crypto/kzg.rs index f4d9d12fbd..fb3b043889 100644 --- a/crates/common/crypto/kzg.rs +++ b/crates/common/crypto/kzg.rs @@ -58,7 +58,11 @@ pub fn verify_cell_kzg_proof_batch( let c_kzg_settings = c_kzg::ethereum_kzg_settings(KZG_PRECOMPUTE); let mut cells = Vec::new(); for blob in blobs { - cells.extend(c_kzg_settings.compute_cells(&(*blob).into())?.into_iter()); + let blob: c_kzg::Blob = (*blob).into(); + let (cells_blob, _cell_proofs) = c_kzg_settings + .compute_cells_and_kzg_proofs(&blob) + .map_err(KzgError::CKzg)?; + cells.extend(*cells_blob); } c_kzg::KzgSettings::verify_cell_kzg_proof_batch( c_kzg_settings,