From ed290b2bc60372fbe7f640a350836839000c0851 Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Thu, 14 Aug 2025 13:51:55 +0100 Subject: [PATCH 01/36] modify txns type to have is_gasless field --- crates/ethereum/primitives/src/transaction.rs | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/crates/ethereum/primitives/src/transaction.rs b/crates/ethereum/primitives/src/transaction.rs index c6de2521a03..c62fa70e804 100644 --- a/crates/ethereum/primitives/src/transaction.rs +++ b/crates/ethereum/primitives/src/transaction.rs @@ -323,6 +323,20 @@ impl TransactionSigned { keccak256(self.encoded_2718()) } } +impl TransactionSigned { + /// return true if the transaction is gasless as per the gas station spec. + /// i.e. + /// - legacy: gas_price == 0 + /// - or 1559: max_fee_per_gas == 0 and max_priority_fee_per_gas == 0 + pub fn is_gasless(&self) -> bool { + match &self.transaction { + Transaction::Legacy(tx) => tx.gas_price == 0, + Transaction::Eip1559(tx) => tx.max_fee_per_gas == 0 && tx.max_priority_fee_per_gas == 0, + // only legacy and 1559 are gasless so we return false for other types + _ => false, // <- matches all other types + } + } +} impl Hash for TransactionSigned { fn hash(&self, state: &mut H) { @@ -333,9 +347,9 @@ impl Hash for TransactionSigned { impl PartialEq for TransactionSigned { fn eq(&self, other: &Self) -> bool { - self.signature == other.signature && - self.transaction == other.transaction && - self.tx_hash() == other.tx_hash() + self.signature == other.signature + && self.transaction == other.transaction + && self.tx_hash() == other.tx_hash() } } From d36240432a1a5d2e2af460de542727a7a67ae8d4 Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Thu, 14 Aug 2025 14:27:09 +0100 Subject: [PATCH 02/36] add gas-station crate --- .gitignore | 2 + Cargo.lock | 11 ++ Cargo.toml | 1 + crates/gas-station/Cargo.toml | 20 ++ crates/gas-station/src/lib.rs | 340 ++++++++++++++++++++++++++++++++++ 5 files changed, 374 insertions(+) create mode 100644 crates/gas-station/Cargo.toml create mode 100644 crates/gas-station/src/lib.rs diff --git a/.gitignore b/.gitignore index a9b9f4768d5..e0e615bfbe8 100644 --- a/.gitignore +++ b/.gitignore @@ -72,3 +72,5 @@ __pycache__/ # direnv .envrc .direnv/ +# Random place to put references +/references/ diff --git a/Cargo.lock b/Cargo.lock index 623c187277f..96f2fcea0b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8548,6 +8548,17 @@ dependencies = [ "thiserror 2.0.15", ] +[[package]] +name = "reth-gas-station" +version = "0.0.1" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "hex", + "reth-storage-api", + "thiserror 2.0.12", +] + [[package]] name = "reth-invalid-block-hooks" version = "1.6.0" diff --git a/Cargo.toml b/Cargo.toml index 072fe9649fa..1c2a45c4e88 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,6 +42,7 @@ members = [ "crates/ethereum/payload/", "crates/ethereum/primitives/", "crates/ethereum/reth/", + "crates/gas-station/", "crates/etl/", "crates/evm/evm", "crates/evm/execution-errors", diff --git a/crates/gas-station/Cargo.toml b/crates/gas-station/Cargo.toml new file mode 100644 index 00000000000..6c771e46f08 --- /dev/null +++ b/crates/gas-station/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "reth-gas-station" +version = "0.0.1" +authors = ["LightLink "] +edition = "2021" +license = "MIT OR Apache-2.0" + +[lib] +name = "reth_gas_station" +path = "src/lib.rs" + +[dependencies] +alloy-primitives = { workspace = true } +alloy-rlp = { workspace = true } +reth-storage-api = { workspace = true } +thiserror = { workspace = true } + +[dev-dependencies] +hex = "0.4" + diff --git a/crates/gas-station/src/lib.rs b/crates/gas-station/src/lib.rs new file mode 100644 index 00000000000..eec59918932 --- /dev/null +++ b/crates/gas-station/src/lib.rs @@ -0,0 +1,340 @@ +// a rough port of https://github.com/lightlink-network/ll-geth/blob/5fc91fa5288a54b3761f43126655fc5e30923ab7/core/gas_station.go +// CalculateGasStationStorageSlots -> calculate_slots +// ValidateGaslessTx -> validate_gasless_tx + +use alloy_primitives::{address, b256, keccak256, Address, B256, U256}; +use reth_storage_api::StateProvider; + +#[derive(Clone, Debug)] // lets us clone (.clone()) and print debug info ("{:?}") +pub struct GasStationConfig { + pub enabled: bool, + pub address: Address, +} + +// pub const CREDITS_USED_TOPIC0: B256 = keccak256(b"CreditsUsed(address,address,uint256,uint256)"); + +/// Topic0 for CreditsUsed event. +pub fn credits_used_topic0() -> B256 { + // GUESS WE CAN PRECOMPUTE THIS AND HAVE IT A CONSTANT + keccak256(b"CreditsUsed(address,address,uint256,uint256)") +} + +/// predeploy local for GasStation by default +pub const GAS_STATION_PREDEPLOY: Address = address!("0x4300000000000000000000000000000000000001"); + +impl Default for GasStationConfig { + fn default() -> Self { + // Set it as disabled by default + // TODO: make it enabled by default?? idk. + Self { enabled: false, address: GAS_STATION_PREDEPLOY } + } +} + +/// Result of keccak256(abi.encode(uint256(keccak256("gasstation.main")) - 1)) & ~bytes32(uint256(0xff)); +pub const GAS_STATION_STORAGE_LOCATION: B256 = + b256!("0x64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e000"); + +/// Storage slots used by the GasStation contract for a given `to` (recipient) +/// and optional `from`. +#[derive(Clone, Debug)] +pub struct GasStationStorageSlots { + pub contracts_slot: B256, + pub contract_slot: B256, + pub registered_slot: B256, + pub active_slot: B256, + pub admin_slot: B256, + pub credits_slot: B256, + pub whitelist_enabled_slot: B256, + pub single_use_enabled_slot: B256, + pub whitelist_user_slot: Option, + pub used_addresses_user_slot: Option, +} + +/// computes storage slots according to solidity layout for +/// mapping(address => GaslessContract) contracts +/// and fields of GaslessContract etc +pub fn calculate_slots( + gas_station_storage_location: B256, + to: Address, + from: Option
, +) -> GasStationStorageSlots { + // GasStationStorage Layout: + // 0: dao + // 1: contracts (mapping) -> mapping slot index 1 within the struct + // 2: creditPackages (mapping) + // 3: nextPackageId (u256) + // We need base slot for `contracts` to compute keccak(key . slot). + + // contracts mapping position within the struct + let contracts_field_index = U256::from(1u64); + + // Step 1.derive the slot representing `contracts`. + let mut buf = [0u8; 64]; + // – keccak256(abi.encode(field_index, storage_location)) + buf[..32].copy_from_slice(B256::from(contracts_field_index).as_slice()); // add field_index to buf + buf[32..].copy_from_slice(gas_station_storage_location.as_slice()); // add storage_location to buf + let contracts_slot = keccak256(buf); // hash it + + // Step 2. derive the slot for key `to` in the `contracts` mapping. + let mut elem_buf = [0u8; 64]; + // left-pad address to 32 bytes + elem_buf[12..32].copy_from_slice(to.as_slice()); + elem_buf[32..].copy_from_slice(contracts_slot.as_slice()); + let contract_slot = keccak256(elem_buf); + + // fields of GaslessContract layout (packed sequentially starting at contract_slot): + // 0: bool registered + // 1: bool active + // 2: address admin + // 3: uint256 credits + // 4: bool whitelistEnabled + // 5: mapping(address => bool) whitelist (slot index 5) + // 6: bool singleUseEnabled + // 7: mapping(address => bool) usedAddresses (slot index 7) + // Note: Booleans may be bit-packed but solidity puts each bool in its own slot when followed by mappings. + + // Step 3. derive the slots for the fields of GaslessContract. + let registered_slot = contract_slot; + let active_slot = add_u64_to_b256(contract_slot, 1); + let admin_slot = add_u64_to_b256(contract_slot, 2); + let credits_slot = add_u64_to_b256(contract_slot, 3); + let whitelist_enabled_slot = add_u64_to_b256(contract_slot, 4); + let whitelist_mapping_slot = add_u64_to_b256(contract_slot, 5); + let single_use_enabled_slot = add_u64_to_b256(contract_slot, 6); + let used_addresses_mapping_slot = add_u64_to_b256(contract_slot, 7); + + // Step 4. If `from` provided, compute nested mapping keys + let whitelist_user_slot = from.map(|addr| { + let mut buf = [0u8; 64]; + buf[12..32].copy_from_slice(addr.as_slice()); + buf[32..].copy_from_slice(whitelist_mapping_slot.as_slice()); + keccak256(buf) + }); + let used_addresses_user_slot = from.map(|addr| { + let mut buf = [0u8; 64]; + buf[12..32].copy_from_slice(addr.as_slice()); + buf[32..].copy_from_slice(used_addresses_mapping_slot.as_slice()); + keccak256(buf) + }); + + // Step 5. return the slots + GasStationStorageSlots { + contracts_slot, + contract_slot, + registered_slot, + active_slot, + admin_slot, + credits_slot, + whitelist_enabled_slot, + single_use_enabled_slot, + whitelist_user_slot, + used_addresses_user_slot, + } +} + +#[derive(Clone, Debug)] +pub struct GaslessValidation { + pub available_credits: U256, + pub required_credits: U256, + pub slots: GasStationStorageSlots, +} + +#[derive(thiserror::Error, Clone, Debug)] +pub enum GaslessValidationError { + #[error("gas station feature disabled")] + Disabled, + #[error("destination is create transaction")] + Create, + #[error("gas station contract not configured")] + NoAddress, + #[error("not registered for gasless")] + NotRegistered, + #[error("contract inactive for gasless")] + Inactive, + #[error("insufficient credits: have {available}, need {needed}")] + InsufficientCredits { available: U256, needed: U256 }, + #[error("whitelist required")] + NotWhitelisted, + #[error("single-use already used")] + SingleUseConsumed, +} + +/// A provider of pending credit usage, ... used by the txpool. +pub trait PendingCreditUsageProvider { + fn pending_credits_for_destination(&self, destination: &Address) -> U256; +} + +/// In-memory pending credit usage map keyed by destination address. +#[derive(Default, Debug)] +pub struct PendingCreditUsageMap { + inner: std::collections::HashMap, +} + +impl PendingCreditUsageMap { + pub fn new() -> Self { + Self { inner: Default::default() } + } + pub fn add_usage(&mut self, destination: Address, amount: U256) { + let entry = self.inner.entry(destination).or_insert(U256::ZERO); + *entry = *entry + amount; + } + pub fn remove_usage(&mut self, destination: Address, amount: U256) { + let entry = self.inner.entry(destination).or_insert(U256::ZERO); + *entry = entry.saturating_sub(amount); + } +} + +impl PendingCreditUsageProvider for PendingCreditUsageMap { + fn pending_credits_for_destination(&self, destination: &Address) -> U256 { + self.inner.get(destination).copied().unwrap_or(U256::ZERO) + } +} + +/// Validates a gasless transaction against on-chain gas station storage and pending usage. +pub fn validate_gasless_tx( + cfg: &GasStationConfig, + state: &SP, + gas_station_storage_location: B256, + to: Address, + from: Address, + gas_limit: u64, + pending_provider: Option<&dyn PendingCreditUsageProvider>, +) -> Result { + if !cfg.enabled { + return Err(GaslessValidationError::Disabled); + } + if cfg.address.is_zero() { + return Err(GaslessValidationError::NoAddress); + } + + // 1. compute slots + let slots = calculate_slots(gas_station_storage_location, to, Some(from)); + + // 2. read a storage slot + // - helper to read a storage slot at gas station address + let read_slot = + |slot: B256| -> Option { state.storage(cfg.address, slot.into()).ok().flatten() }; + + // -> read GaslessContract.registered + let registered = read_slot(slots.registered_slot).unwrap_or_default() != U256::ZERO; + if !registered { + return Err(GaslessValidationError::NotRegistered); + } + + // -> read GaslessContract.active + let active = read_slot(slots.active_slot).unwrap_or_default() != U256::ZERO; + if !active { + return Err(GaslessValidationError::Inactive); + } + + // 3. read credits + let available_credits = read_slot(slots.credits_slot).unwrap_or_default(); + + // 4. calculate required credits + let mut required = U256::from(gas_limit); + // Include pool pending usage if provided + if let Some(p) = pending_provider { + required = required + p.pending_credits_for_destination(&to); + } + + // 5. check if we have enough credits + if available_credits < required { + return Err(GaslessValidationError::InsufficientCredits { + available: available_credits, + needed: required, + }); + } + + // 6. check whitelist + let whitelist_enabled = + read_slot(slots.whitelist_enabled_slot).unwrap_or_default() != U256::ZERO; + if whitelist_enabled { + // basically read whitelist[from] and check if it's true + let ok = slots + .whitelist_user_slot + .and_then(|s| read_slot(s)) + .map(|v| v != U256::ZERO) + .unwrap_or(false); + if !ok { + return Err(GaslessValidationError::NotWhitelisted); + } + } + + // 7. check for single-use + let single_use_enabled = + read_slot(slots.single_use_enabled_slot).unwrap_or_default() != U256::ZERO; + if single_use_enabled { + let used = slots + .used_addresses_user_slot + .and_then(|s| read_slot(s)) + .map(|v| v != U256::ZERO) + .unwrap_or(false); + if used { + return Err(GaslessValidationError::SingleUseConsumed); + } + } + + Ok(GaslessValidation { available_credits, required_credits: required, slots }) +} + +/// encodes the CreditsUsed event log data payload (topics are computed by caller). +/// event CreditsUsed(address indexed contractAddress, address indexed caller, uint256 gasUsed, uint256 creditsDeducted) +pub fn encode_credits_used_log_data(gas_used: U256, credits_deducted: U256) -> [u8; 64] { + let mut out = [0u8; 64]; + out[..32].copy_from_slice(B256::from(gas_used).as_slice()); + out[32..].copy_from_slice(B256::from(credits_deducted).as_slice()); + out +} + +/// Add a small u64 delta to a B256 interpreted as a big endian integer. +/// TODO: VERIFY THIS IS CORRECT. +/// In future we should use https://crates.io/crates/num ??? +fn add_u64_to_b256(value: B256, delta: u64) -> B256 { + if delta == 0 { + return value; + } + let mut bytes = [0u8; 32]; + bytes.copy_from_slice(value.as_slice()); + // add delta in big endian + let mut i = 31usize; + let mut carry = delta as u128; // up to 64 bits fits into u128 + while carry > 0 && i < 32 { + let sum = bytes[i] as u128 + (carry & 0xFF); + bytes[i] = (sum & 0xFF) as u8; + carry = (carry >> 8) + (sum >> 8); + if i == 0 { + break; + } + i -= 1; + } + B256::from(bytes) +} + +// ??? +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn topic0_signature_hash() { + let t = credits_used_topic0(); + assert_eq!(t, keccak256(b"CreditsUsed(address,address,uint256,uint256)")); + } + + #[test] + fn add_delta_to_b256() { + let base = B256::ZERO; + assert_eq!(add_u64_to_b256(base, 0), base); + assert_eq!( + add_u64_to_b256(base, 1), + B256::from_slice(&[0u8; 31].iter().cloned().chain([1u8]).collect::>()) + ); + let max_low = + B256::from_slice(&[0u8; 24].iter().cloned().chain([0xFFu8; 8]).collect::>()); + let res = add_u64_to_b256(max_low, 1); + // expect carry into next byte + let mut expect = [0u8; 32]; + expect[23] = 1; + assert_eq!(res, B256::from(expect)); + } +} From 0a53035b485a18abaaa218a6ca3bfe010e1b5d6a Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Thu, 14 Aug 2025 15:41:58 +0100 Subject: [PATCH 03/36] added the gas station predeploy to dev.json --- crates/chainspec/res/genesis/dev.json | 79 ++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/crates/chainspec/res/genesis/dev.json b/crates/chainspec/res/genesis/dev.json index ed0522167b0..e12037ab44b 100644 --- a/crates/chainspec/res/genesis/dev.json +++ b/crates/chainspec/res/genesis/dev.json @@ -1 +1,78 @@ -{"nonce":"0x0","timestamp":"0x6490fdd2","extraData":"0x","gasLimit":"0x1c9c380","difficulty":"0x0","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","coinbase":"0x0000000000000000000000000000000000000000","stateRoot":"0x5eb6e371a698b8d68f665192350ffcecbbbf322916f4b51bd79bb6887da3f494","alloc":{"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266":{"balance":"0xD3C21BCECCEDA1000000"},"0x70997970C51812dc3A010C7d01b50e0d17dc79C8":{"balance":"0xD3C21BCECCEDA1000000"},"0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC":{"balance":"0xD3C21BCECCEDA1000000"},"0x90F79bf6EB2c4f870365E785982E1f101E93b906":{"balance":"0xD3C21BCECCEDA1000000"},"0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65":{"balance":"0xD3C21BCECCEDA1000000"},"0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc":{"balance":"0xD3C21BCECCEDA1000000"},"0x976EA74026E726554dB657fA54763abd0C3a0aa9":{"balance":"0xD3C21BCECCEDA1000000"},"0x14dC79964da2C08b23698B3D3cc7Ca32193d9955":{"balance":"0xD3C21BCECCEDA1000000"},"0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f":{"balance":"0xD3C21BCECCEDA1000000"},"0xa0Ee7A142d267C1f36714E4a8F75612F20a79720":{"balance":"0xD3C21BCECCEDA1000000"},"0xBcd4042DE499D14e55001CcbB24a551F3b954096":{"balance":"0xD3C21BCECCEDA1000000"},"0x71bE63f3384f5fb98995898A86B02Fb2426c5788":{"balance":"0xD3C21BCECCEDA1000000"},"0xFABB0ac9d68B0B445fB7357272Ff202C5651694a":{"balance":"0xD3C21BCECCEDA1000000"},"0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec":{"balance":"0xD3C21BCECCEDA1000000"},"0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097":{"balance":"0xD3C21BCECCEDA1000000"},"0xcd3B766CCDd6AE721141F452C550Ca635964ce71":{"balance":"0xD3C21BCECCEDA1000000"},"0x2546BcD3c84621e976D8185a91A922aE77ECEc30":{"balance":"0xD3C21BCECCEDA1000000"},"0xbDA5747bFD65F08deb54cb465eB87D40e51B197E":{"balance":"0xD3C21BCECCEDA1000000"},"0xdD2FD4581271e230360230F9337D5c0430Bf44C0":{"balance":"0xD3C21BCECCEDA1000000"},"0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199":{"balance":"0xD3C21BCECCEDA1000000"}},"number":"0x0","gasUsed":"0x0","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000"} \ No newline at end of file +{ + "nonce": "0x0", + "timestamp": "0x6490fdd2", + "extraData": "0x", + "gasLimit": "0x1c9c380", + "difficulty": "0x0", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x5eb6e371a698b8d68f665192350ffcecbbbf322916f4b51bd79bb6887da3f494", + "alloc": { + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x90F79bf6EB2c4f870365E785982E1f101E93b906": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x976EA74026E726554dB657fA54763abd0C3a0aa9": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xBcd4042DE499D14e55001CcbB24a551F3b954096": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x71bE63f3384f5fb98995898A86B02Fb2426c5788": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xcd3B766CCDd6AE721141F452C550Ca635964ce71": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x2546BcD3c84621e976D8185a91A922aE77ECEc30": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xbDA5747bFD65F08deb54cb465eB87D40e51B197E": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xdD2FD4581271e230360230F9337D5c0430Bf44C0": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x4300000000000000000000000000000000000001": { + "code": "0x6080604052600436106101c8575f3560e01c806399c6066c116100f2578063c55b6bb711610092578063e559afd911610062578063e559afd9146107c3578063e73a914c146107e2578063f6e4b62b14610801578063fac2c62114610820575f80fd5b8063c55b6bb7146106ee578063d124d1bc1461070d578063d7e5fbf31461073e578063d9ba32fc1461075d575f80fd5b8063ad3e080a116100cd578063ad3e080a1461062e578063b6b352721461064d578063c375c2ef1461066c578063c3c5a5471461068b575f80fd5b806399c6066c146105865780639e4f8ab8146105a55780639f8a13d7146105c6575f80fd5b80633b66e9f61161016857806364efb22b1161013857806364efb22b1461040e57806369dc9ff3146104775780637901868e14610548578063871ff40514610567575f80fd5b80633b66e9f6146103035780634162169f146103665780634782f779146103d05780635e35359e146103ef575f80fd5b806315ea16ad116101a357806315ea16ad146102695780631c5d647c146102a65780632ce962cf146102c5578063368da168146102e4575f80fd5b8063108f5c69146101d3578063139e0aa7146101f457806314695ea414610207575f80fd5b366101cf57005b5f80fd5b3480156101de575f80fd5b506101f26101ed366004612e30565b61083f565b005b6101f2610202366004612ea8565b610a4f565b348015610212575f80fd5b50610254610221366004612ed2565b5f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db02602052604090205460ff1690565b60405190151581526020015b60405180910390f35b348015610274575f80fd5b507fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db03545b604051908152602001610260565b3480156102b1575f80fd5b506101f26102c0366004612ef6565b610cb6565b3480156102d0575f80fd5b506101f26102df366004612f24565b610e02565b3480156102ef575f80fd5b506101f26102fe366004612ea8565b611000565b34801561030e575f80fd5b5061029861031d366004612f50565b73ffffffffffffffffffffffffffffffffffffffff165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090206001015490565b348015610371575f80fd5b507fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610260565b3480156103db575f80fd5b506101f26103ea366004612ea8565b611200565b3480156103fa575f80fd5b506101f2610409366004612f72565b611352565b348015610419575f80fd5b506103ab610428366004612f50565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0160205260409020546201000090041690565b348015610482575f80fd5b50610501610491366004612f50565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090208054600182015460029092015460ff808316956101008404821695620100009094049093169392911690565b604080519515158652931515602086015273ffffffffffffffffffffffffffffffffffffffff9092169284019290925260608301919091521515608082015260a001610260565b348015610553575f80fd5b506101f2610562366004612fb0565b611672565b348015610572575f80fd5b506101f2610581366004612ea8565b6118bc565b348015610591575f80fd5b506101f26105a0366004612ea8565b6119d7565b3480156105b0575f80fd5b506105b9611ac1565b604051610260919061301e565b3480156105d1575f80fd5b506102546105e0366004612f50565b73ffffffffffffffffffffffffffffffffffffffff165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054610100900460ff1690565b348015610639575f80fd5b506101f2610648366004613061565b611bcf565b348015610658575f80fd5b506102546106673660046130e2565b611d6e565b348015610677575f80fd5b506101f2610686366004612f50565b611e21565b348015610696575f80fd5b506102546106a5366004612f50565b73ffffffffffffffffffffffffffffffffffffffff165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205460ff1690565b3480156106f9575f80fd5b506101f26107083660046130e2565b611f53565b348015610718575f80fd5b5061072c610727366004612ed2565b6121a0565b6040516102609695949392919061310e565b348015610749575f80fd5b506101f26107583660046130e2565b6122b6565b348015610768575f80fd5b50610254610777366004612f50565b73ffffffffffffffffffffffffffffffffffffffff165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090206002015460ff1690565b3480156107ce575f80fd5b506101f26107dd366004613061565b6124ee565b3480156107ed575f80fd5b506101f26107fc366004612f50565b612692565b34801561080c575f80fd5b506101f261081b366004612f24565b6127e6565b34801561082b575f80fd5b506101f261083a366004612f50565b612957565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff1633146108af576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8590036108e9576040517f8dad8de600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710811115610925576040517fe05f723400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8781527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db02602052604090206001810180546109609061319c565b90505f0361099a576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181016109a9878983613265565b5060028101859055600381018490556004810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790556005810182905560405188907f73d628d7a9f63d75ab3f23c4bf349bfec022e61cc2ad8dc72f7ca093b45723e890610a3d908a908a908a908a908a908a9061337b565b60405180910390a25050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054829060ff16610ace576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0260205260409020600181018054610b099061319c565b90505f03610b43576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff16610b7e576040517fd1d5af5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600481015473ffffffffffffffffffffffffffffffffffffffff16610bab57610ba681612a89565b610bec565b3415610be3576040517ffbccebae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bec81612b12565b600381015473ffffffffffffffffffffffffffffffffffffffff85165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604081206001018054909190610c47908490613428565b92505081905550828473ffffffffffffffffffffffffffffffffffffffff167f7852f393fd6a99c61648e39af92ae0e784b77281fc2af871edce1b51304ecd7c83600301548460020154604051610ca8929190918252602082015260400190565b60405180910390a350505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314610d26576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0260205260409020600181018054610d619061319c565b90505f03610d9b576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016821515908117825560405190815283907f10ae08733732b5e10d63d501510950b2a5967607149b3608881ecde96515780c906020015b60405180910390a2505050565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205483917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0091620100009004163314801590610e985750805473ffffffffffffffffffffffffffffffffffffffff163314155b15610ecf576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054849060ff16610f4e576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101008915159081029190911790915591519182527fa5ab8b72c18a722b7e92b557d227ba48dc2985b22fce6d0f95804be26703b595910160405180910390a25050505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314611070576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054829060ff166110ef576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090206001015482811015611170576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117a838261343b565b73ffffffffffffffffffffffffffffffffffffffff85165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020908152604091829020600101939093555185815290917f30a9d8d098632f590e4953b6171a6c999d2b1c4170ebde38136c9e27e6976b8191015b60405180910390a250505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314611270576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff81166112be576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b475f83156112cc57836112ce565b815b90508181111561130a576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff86169082156108fc029083905f818181858888f1935050505015801561134a573d5f803e3d5ffd5b505050505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff1633146113c2576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff8116611410576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166114bf57475f8315611439578361143b565b815b905081811115611477576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff86169082156108fc029083905f818181858888f193505050501580156114b7573d5f803e3d5ffd5b50505061166c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015284905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561152b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154f919061344e565b90505f841561155e5784611560565b815b90508181111561159c576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af115801561160e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116329190613465565b611668576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505b50505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff1633146116e2576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f85900361171c576040517f8dad8de600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710811115611758576040517fe05f723400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db03545f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811782557fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db009291908101611802898b83613265565b506002810187905560038082018790556004820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790556005820185905583018054905f61186a83613480565b9190505550817f85855a4353e16703440df33dd6903f8689955fe665d2ed5b918f7a272286c8b98a8a8a8a8a8a6040516118a99695949392919061337b565b60405180910390a2505050505050505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff16331461192c576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604081206001018054839290611982908490613428565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316907fed46984c46e11f42ec323727ba7d99dc16be2d248a8aaa8982d492688497f09d906020015b60405180910390a25050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314611a47576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602090815260409182902060010184905590518381527fc2748283b871105da37ea4bdc2cc08eff4b3b0f472f66f2728cdf4a1b845ef7791016119cb565b60607fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005f60015b8260030154811015611b22575f81815260028401602052604090205460ff1615611b1a5781611b1681613480565b9250505b600101611ae8565b505f8167ffffffffffffffff811115611b3d57611b3d6131ed565b604051908082528060200260200182016040528015611b66578160200160208202803683370190505b5090505f60015b8460030154811015611bc5575f81815260028601602052604090205460ff1615611bbd5780838381518110611ba457611ba46134b7565b602090810291909101015281611bb981613480565b9250505b600101611b6d565b5090949350505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205484917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0091620100009004163314801590611c655750805473ffffffffffffffffffffffffffffffffffffffff163314155b15611c9c576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8381101561134a5773ffffffffffffffffffffffffffffffffffffffff86165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040812060030181878785818110611cff57611cff6134b7565b9050602002016020810190611d149190612f50565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101611c9e565b73ffffffffffffffffffffffffffffffffffffffff82165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604081206002015460ff161580611e18575073ffffffffffffffffffffffffffffffffffffffff8381165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0160209081526040808320938616835260039093019052205460ff165b90505b92915050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314611e91576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604080822080547fffffffffffffffffffff000000000000000000000000000000000000000000001681556001810183905560020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f8d30d41865a0b811b9545d879520d2dde9f4cc49e4241f486ad9752bc904b5659190a250565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205483917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0091620100009004163314801590611fe95750805473ffffffffffffffffffffffffffffffffffffffff163314155b15612020576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054849060ff1661209f576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff81166120ed576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8681165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0160205260408082208054620100008b87168181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff84161790935592519290049094169392849290917f4eb572e99196bed0270fbd5b17a948e19c3f50a97838cb0d2a75a823ff8e6c509190a450505050505050565b5f606081808080807fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005f89815260029182016020526040902080549181015460038201546004830154600584015460018501805495975060ff909616959473ffffffffffffffffffffffffffffffffffffffff9092169185906122229061319c565b80601f016020809104026020016040519081016040528092919081815260200182805461224e9061319c565b80156122995780601f1061227057610100808354040283529160200191612299565b820191905f5260205f20905b81548152906001019060200180831161227c57829003601f168201915b505050505094509650965096509650965096505091939550919395565b8173ffffffffffffffffffffffffffffffffffffffff8116612304576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff8116612352576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205460ff16156123d0576040517f3a81d6fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b833b5f81900361240c576040517f6eefed2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8581165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604080822080546101017fffffffffffffffffffff0000000000000000000000000000000000000000000090911662010000968b169687021717815560018082018490556002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790559051909392917f768fb430a0d4b201cb764ab221c316dd14d8babf2e4b2348e05964c6565318b691a3505050505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205484917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db00916201000090041633148015906125845750805473ffffffffffffffffffffffffffffffffffffffff163314155b156125bb576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8381101561134a5773ffffffffffffffffffffffffffffffffffffffff86165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0160205260408120600191600390910190878785818110612623576126236134b7565b90506020020160208101906126389190612f50565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556001016125bd565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314612702576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff8116612750576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db00805473ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f0429168a83556e356cd18563753346b9c9567cbf0fbea148d40aeb84a76cc5b9905f90a3505050565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205483917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db009162010000900416331480159061287c5750805473ffffffffffffffffffffffffffffffffffffffff163314155b156128b3576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602090815260409182902060020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f8daaf060c3306c38e068a75c054bf96ecd85a3db1252712c4d93632744c42e0d91016111f2565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff1633146129c7576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604080822080547fffffffffffffffffffff000000000000000000000000000000000000000000001681556001810183905560020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f3475b9891ecf29e996feed01eeb42a860ec225283a439d214ffaeac5e006be7d9190a250565b8060020154341015612ac7576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020154341115612b0f57600281015433906108fc90612ae8903461343b565b6040518115909202915f818181858888f19350505050158015612b0d573d5f803e3d5ffd5b505b50565b60048181015460028301546040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152339381019390935230602484015273ffffffffffffffffffffffffffffffffffffffff90911691829063dd62ed3e90604401602060405180830381865afa158015612b90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bb4919061344e565b1015612bec576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028201546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff8216906323b872dd906064016020604051808303815f875af1158015612c68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c8c9190613465565b612cc2576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600582015415612b0d575f61271083600501548460020154612ce491906134e4565b612cee91906134fb565b6004808501546040517f42966c6800000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff16916342966c6891612d4a9185910190815260200190565b5f604051808303815f87803b158015612d61575f80fd5b505af1925050508015612d72575060015b15612dc557600483015460405182815273ffffffffffffffffffffffffffffffffffffffff909116907ffd38818f5291bf0bb3a2a48aadc06ba8757865d1dabd804585338aab3009dcb690602001610df5565b505050565b5f8083601f840112612dda575f80fd5b50813567ffffffffffffffff811115612df1575f80fd5b602083019150836020828501011115612e08575f80fd5b9250929050565b73ffffffffffffffffffffffffffffffffffffffff81168114612b0f575f80fd5b5f805f805f805f60c0888a031215612e46575f80fd5b87359650602088013567ffffffffffffffff811115612e63575f80fd5b612e6f8a828b01612dca565b90975095505060408801359350606088013592506080880135612e9181612e0f565b8092505060a0880135905092959891949750929550565b5f8060408385031215612eb9575f80fd5b8235612ec481612e0f565b946020939093013593505050565b5f60208284031215612ee2575f80fd5b5035919050565b8015158114612b0f575f80fd5b5f8060408385031215612f07575f80fd5b823591506020830135612f1981612ee9565b809150509250929050565b5f8060408385031215612f35575f80fd5b8235612f4081612e0f565b91506020830135612f1981612ee9565b5f60208284031215612f60575f80fd5b8135612f6b81612e0f565b9392505050565b5f805f60608486031215612f84575f80fd5b8335612f8f81612e0f565b92506020840135612f9f81612e0f565b929592945050506040919091013590565b5f805f805f8060a08789031215612fc5575f80fd5b863567ffffffffffffffff811115612fdb575f80fd5b612fe789828a01612dca565b9097509550506020870135935060408701359250606087013561300981612e0f565b80925050608087013590509295509295509295565b602080825282518282018190525f9190848201906040850190845b8181101561305557835183529284019291840191600101613039565b50909695505050505050565b5f805f60408486031215613073575f80fd5b833561307e81612e0f565b9250602084013567ffffffffffffffff8082111561309a575f80fd5b818601915086601f8301126130ad575f80fd5b8135818111156130bb575f80fd5b8760208260051b85010111156130cf575f80fd5b6020830194508093505050509250925092565b5f80604083850312156130f3575f80fd5b82356130fe81612e0f565b91506020830135612f1981612e0f565b861515815260c060208201525f86518060c0840152806020890160e085015e5f60e0828501015260e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505085604083015284606083015273ffffffffffffffffffffffffffffffffffffffff841660808301528260a0830152979650505050505050565b600181811c908216806131b057607f821691505b6020821081036131e7577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b601f821115612dc557805f5260205f20601f840160051c8101602085101561323f5750805b601f840160051c820191505b8181101561325e575f815560010161324b565b5050505050565b67ffffffffffffffff83111561327d5761327d6131ed565b6132918361328b835461319c565b8361321a565b5f601f8411600181146132e1575f85156132ab5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561325e565b5f838152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08716915b8281101561332e578685013582556020948501946001909201910161330e565b5086821015613369577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60a081528560a0820152858760c08301375f60c087830101525f60c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f890116830101905085602083015284604083015273ffffffffffffffffffffffffffffffffffffffff84166060830152826080830152979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611e1b57611e1b6133fb565b81810381811115611e1b57611e1b6133fb565b5f6020828403121561345e575f80fd5b5051919050565b5f60208284031215613475575f80fd5b8151612f6b81612ee9565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134b0576134b06133fb565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417611e1b57611e1b6133fb565b5f8261352e577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000819000a" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} From 65d82c9a7f0ddaa22e6e8a875f9bd237fde23353 Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Thu, 14 Aug 2025 16:07:23 +0100 Subject: [PATCH 04/36] added gas-station precompile to op-reth dev too --- .../optimism/chainspec/res/genesis/dev.json | 80 ++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/crates/optimism/chainspec/res/genesis/dev.json b/crates/optimism/chainspec/res/genesis/dev.json index ed0522167b0..f97e19fe872 100644 --- a/crates/optimism/chainspec/res/genesis/dev.json +++ b/crates/optimism/chainspec/res/genesis/dev.json @@ -1 +1,79 @@ -{"nonce":"0x0","timestamp":"0x6490fdd2","extraData":"0x","gasLimit":"0x1c9c380","difficulty":"0x0","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","coinbase":"0x0000000000000000000000000000000000000000","stateRoot":"0x5eb6e371a698b8d68f665192350ffcecbbbf322916f4b51bd79bb6887da3f494","alloc":{"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266":{"balance":"0xD3C21BCECCEDA1000000"},"0x70997970C51812dc3A010C7d01b50e0d17dc79C8":{"balance":"0xD3C21BCECCEDA1000000"},"0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC":{"balance":"0xD3C21BCECCEDA1000000"},"0x90F79bf6EB2c4f870365E785982E1f101E93b906":{"balance":"0xD3C21BCECCEDA1000000"},"0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65":{"balance":"0xD3C21BCECCEDA1000000"},"0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc":{"balance":"0xD3C21BCECCEDA1000000"},"0x976EA74026E726554dB657fA54763abd0C3a0aa9":{"balance":"0xD3C21BCECCEDA1000000"},"0x14dC79964da2C08b23698B3D3cc7Ca32193d9955":{"balance":"0xD3C21BCECCEDA1000000"},"0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f":{"balance":"0xD3C21BCECCEDA1000000"},"0xa0Ee7A142d267C1f36714E4a8F75612F20a79720":{"balance":"0xD3C21BCECCEDA1000000"},"0xBcd4042DE499D14e55001CcbB24a551F3b954096":{"balance":"0xD3C21BCECCEDA1000000"},"0x71bE63f3384f5fb98995898A86B02Fb2426c5788":{"balance":"0xD3C21BCECCEDA1000000"},"0xFABB0ac9d68B0B445fB7357272Ff202C5651694a":{"balance":"0xD3C21BCECCEDA1000000"},"0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec":{"balance":"0xD3C21BCECCEDA1000000"},"0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097":{"balance":"0xD3C21BCECCEDA1000000"},"0xcd3B766CCDd6AE721141F452C550Ca635964ce71":{"balance":"0xD3C21BCECCEDA1000000"},"0x2546BcD3c84621e976D8185a91A922aE77ECEc30":{"balance":"0xD3C21BCECCEDA1000000"},"0xbDA5747bFD65F08deb54cb465eB87D40e51B197E":{"balance":"0xD3C21BCECCEDA1000000"},"0xdD2FD4581271e230360230F9337D5c0430Bf44C0":{"balance":"0xD3C21BCECCEDA1000000"},"0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199":{"balance":"0xD3C21BCECCEDA1000000"}},"number":"0x0","gasUsed":"0x0","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000"} \ No newline at end of file +{ + "nonce": "0x0", + "timestamp": "0x6490fdd2", + "extraData": "0x", + "gasLimit": "0x1c9c380", + "difficulty": "0x0", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x5eb6e371a698b8d68f665192350ffcecbbbf322916f4b51bd79bb6887da3f494", + "alloc": { + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x90F79bf6EB2c4f870365E785982E1f101E93b906": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x976EA74026E726554dB657fA54763abd0C3a0aa9": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xBcd4042DE499D14e55001CcbB24a551F3b954096": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x71bE63f3384f5fb98995898A86B02Fb2426c5788": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xcd3B766CCDd6AE721141F452C550Ca635964ce71": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x2546BcD3c84621e976D8185a91A922aE77ECEc30": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xbDA5747bFD65F08deb54cb465eB87D40e51B197E": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xdD2FD4581271e230360230F9337D5c0430Bf44C0": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x4300000000000000000000000000000000000001": { + "balance": "0x0", + "code": "0x6080604052600436106101c8575f3560e01c806399c6066c116100f2578063c55b6bb711610092578063e559afd911610062578063e559afd9146107c3578063e73a914c146107e2578063f6e4b62b14610801578063fac2c62114610820575f80fd5b8063c55b6bb7146106ee578063d124d1bc1461070d578063d7e5fbf31461073e578063d9ba32fc1461075d575f80fd5b8063ad3e080a116100cd578063ad3e080a1461062e578063b6b352721461064d578063c375c2ef1461066c578063c3c5a5471461068b575f80fd5b806399c6066c146105865780639e4f8ab8146105a55780639f8a13d7146105c6575f80fd5b80633b66e9f61161016857806364efb22b1161013857806364efb22b1461040e57806369dc9ff3146104775780637901868e14610548578063871ff40514610567575f80fd5b80633b66e9f6146103035780634162169f146103665780634782f779146103d05780635e35359e146103ef575f80fd5b806315ea16ad116101a357806315ea16ad146102695780631c5d647c146102a65780632ce962cf146102c5578063368da168146102e4575f80fd5b8063108f5c69146101d3578063139e0aa7146101f457806314695ea414610207575f80fd5b366101cf57005b5f80fd5b3480156101de575f80fd5b506101f26101ed366004612e30565b61083f565b005b6101f2610202366004612ea8565b610a4f565b348015610212575f80fd5b50610254610221366004612ed2565b5f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db02602052604090205460ff1690565b60405190151581526020015b60405180910390f35b348015610274575f80fd5b507fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db03545b604051908152602001610260565b3480156102b1575f80fd5b506101f26102c0366004612ef6565b610cb6565b3480156102d0575f80fd5b506101f26102df366004612f24565b610e02565b3480156102ef575f80fd5b506101f26102fe366004612ea8565b611000565b34801561030e575f80fd5b5061029861031d366004612f50565b73ffffffffffffffffffffffffffffffffffffffff165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090206001015490565b348015610371575f80fd5b507fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610260565b3480156103db575f80fd5b506101f26103ea366004612ea8565b611200565b3480156103fa575f80fd5b506101f2610409366004612f72565b611352565b348015610419575f80fd5b506103ab610428366004612f50565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0160205260409020546201000090041690565b348015610482575f80fd5b50610501610491366004612f50565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090208054600182015460029092015460ff808316956101008404821695620100009094049093169392911690565b604080519515158652931515602086015273ffffffffffffffffffffffffffffffffffffffff9092169284019290925260608301919091521515608082015260a001610260565b348015610553575f80fd5b506101f2610562366004612fb0565b611672565b348015610572575f80fd5b506101f2610581366004612ea8565b6118bc565b348015610591575f80fd5b506101f26105a0366004612ea8565b6119d7565b3480156105b0575f80fd5b506105b9611ac1565b604051610260919061301e565b3480156105d1575f80fd5b506102546105e0366004612f50565b73ffffffffffffffffffffffffffffffffffffffff165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054610100900460ff1690565b348015610639575f80fd5b506101f2610648366004613061565b611bcf565b348015610658575f80fd5b506102546106673660046130e2565b611d6e565b348015610677575f80fd5b506101f2610686366004612f50565b611e21565b348015610696575f80fd5b506102546106a5366004612f50565b73ffffffffffffffffffffffffffffffffffffffff165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205460ff1690565b3480156106f9575f80fd5b506101f26107083660046130e2565b611f53565b348015610718575f80fd5b5061072c610727366004612ed2565b6121a0565b6040516102609695949392919061310e565b348015610749575f80fd5b506101f26107583660046130e2565b6122b6565b348015610768575f80fd5b50610254610777366004612f50565b73ffffffffffffffffffffffffffffffffffffffff165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090206002015460ff1690565b3480156107ce575f80fd5b506101f26107dd366004613061565b6124ee565b3480156107ed575f80fd5b506101f26107fc366004612f50565b612692565b34801561080c575f80fd5b506101f261081b366004612f24565b6127e6565b34801561082b575f80fd5b506101f261083a366004612f50565b612957565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff1633146108af576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8590036108e9576040517f8dad8de600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710811115610925576040517fe05f723400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8781527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db02602052604090206001810180546109609061319c565b90505f0361099a576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181016109a9878983613265565b5060028101859055600381018490556004810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790556005810182905560405188907f73d628d7a9f63d75ab3f23c4bf349bfec022e61cc2ad8dc72f7ca093b45723e890610a3d908a908a908a908a908a908a9061337b565b60405180910390a25050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054829060ff16610ace576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0260205260409020600181018054610b099061319c565b90505f03610b43576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff16610b7e576040517fd1d5af5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600481015473ffffffffffffffffffffffffffffffffffffffff16610bab57610ba681612a89565b610bec565b3415610be3576040517ffbccebae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bec81612b12565b600381015473ffffffffffffffffffffffffffffffffffffffff85165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604081206001018054909190610c47908490613428565b92505081905550828473ffffffffffffffffffffffffffffffffffffffff167f7852f393fd6a99c61648e39af92ae0e784b77281fc2af871edce1b51304ecd7c83600301548460020154604051610ca8929190918252602082015260400190565b60405180910390a350505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314610d26576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0260205260409020600181018054610d619061319c565b90505f03610d9b576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016821515908117825560405190815283907f10ae08733732b5e10d63d501510950b2a5967607149b3608881ecde96515780c906020015b60405180910390a2505050565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205483917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0091620100009004163314801590610e985750805473ffffffffffffffffffffffffffffffffffffffff163314155b15610ecf576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054849060ff16610f4e576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101008915159081029190911790915591519182527fa5ab8b72c18a722b7e92b557d227ba48dc2985b22fce6d0f95804be26703b595910160405180910390a25050505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314611070576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054829060ff166110ef576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090206001015482811015611170576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117a838261343b565b73ffffffffffffffffffffffffffffffffffffffff85165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020908152604091829020600101939093555185815290917f30a9d8d098632f590e4953b6171a6c999d2b1c4170ebde38136c9e27e6976b8191015b60405180910390a250505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314611270576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff81166112be576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b475f83156112cc57836112ce565b815b90508181111561130a576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff86169082156108fc029083905f818181858888f1935050505015801561134a573d5f803e3d5ffd5b505050505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff1633146113c2576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff8116611410576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166114bf57475f8315611439578361143b565b815b905081811115611477576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff86169082156108fc029083905f818181858888f193505050501580156114b7573d5f803e3d5ffd5b50505061166c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015284905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561152b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154f919061344e565b90505f841561155e5784611560565b815b90508181111561159c576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af115801561160e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116329190613465565b611668576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505b50505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff1633146116e2576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f85900361171c576040517f8dad8de600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710811115611758576040517fe05f723400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db03545f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811782557fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db009291908101611802898b83613265565b506002810187905560038082018790556004820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790556005820185905583018054905f61186a83613480565b9190505550817f85855a4353e16703440df33dd6903f8689955fe665d2ed5b918f7a272286c8b98a8a8a8a8a8a6040516118a99695949392919061337b565b60405180910390a2505050505050505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff16331461192c576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604081206001018054839290611982908490613428565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316907fed46984c46e11f42ec323727ba7d99dc16be2d248a8aaa8982d492688497f09d906020015b60405180910390a25050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314611a47576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602090815260409182902060010184905590518381527fc2748283b871105da37ea4bdc2cc08eff4b3b0f472f66f2728cdf4a1b845ef7791016119cb565b60607fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005f60015b8260030154811015611b22575f81815260028401602052604090205460ff1615611b1a5781611b1681613480565b9250505b600101611ae8565b505f8167ffffffffffffffff811115611b3d57611b3d6131ed565b604051908082528060200260200182016040528015611b66578160200160208202803683370190505b5090505f60015b8460030154811015611bc5575f81815260028601602052604090205460ff1615611bbd5780838381518110611ba457611ba46134b7565b602090810291909101015281611bb981613480565b9250505b600101611b6d565b5090949350505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205484917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0091620100009004163314801590611c655750805473ffffffffffffffffffffffffffffffffffffffff163314155b15611c9c576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8381101561134a5773ffffffffffffffffffffffffffffffffffffffff86165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040812060030181878785818110611cff57611cff6134b7565b9050602002016020810190611d149190612f50565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101611c9e565b73ffffffffffffffffffffffffffffffffffffffff82165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604081206002015460ff161580611e18575073ffffffffffffffffffffffffffffffffffffffff8381165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0160209081526040808320938616835260039093019052205460ff165b90505b92915050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314611e91576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604080822080547fffffffffffffffffffff000000000000000000000000000000000000000000001681556001810183905560020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f8d30d41865a0b811b9545d879520d2dde9f4cc49e4241f486ad9752bc904b5659190a250565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205483917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0091620100009004163314801590611fe95750805473ffffffffffffffffffffffffffffffffffffffff163314155b15612020576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054849060ff1661209f576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff81166120ed576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8681165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0160205260408082208054620100008b87168181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff84161790935592519290049094169392849290917f4eb572e99196bed0270fbd5b17a948e19c3f50a97838cb0d2a75a823ff8e6c509190a450505050505050565b5f606081808080807fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005f89815260029182016020526040902080549181015460038201546004830154600584015460018501805495975060ff909616959473ffffffffffffffffffffffffffffffffffffffff9092169185906122229061319c565b80601f016020809104026020016040519081016040528092919081815260200182805461224e9061319c565b80156122995780601f1061227057610100808354040283529160200191612299565b820191905f5260205f20905b81548152906001019060200180831161227c57829003601f168201915b505050505094509650965096509650965096505091939550919395565b8173ffffffffffffffffffffffffffffffffffffffff8116612304576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff8116612352576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205460ff16156123d0576040517f3a81d6fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b833b5f81900361240c576040517f6eefed2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8581165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604080822080546101017fffffffffffffffffffff0000000000000000000000000000000000000000000090911662010000968b169687021717815560018082018490556002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790559051909392917f768fb430a0d4b201cb764ab221c316dd14d8babf2e4b2348e05964c6565318b691a3505050505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205484917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db00916201000090041633148015906125845750805473ffffffffffffffffffffffffffffffffffffffff163314155b156125bb576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8381101561134a5773ffffffffffffffffffffffffffffffffffffffff86165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0160205260408120600191600390910190878785818110612623576126236134b7565b90506020020160208101906126389190612f50565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556001016125bd565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314612702576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff8116612750576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db00805473ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f0429168a83556e356cd18563753346b9c9567cbf0fbea148d40aeb84a76cc5b9905f90a3505050565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205483917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db009162010000900416331480159061287c5750805473ffffffffffffffffffffffffffffffffffffffff163314155b156128b3576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602090815260409182902060020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f8daaf060c3306c38e068a75c054bf96ecd85a3db1252712c4d93632744c42e0d91016111f2565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff1633146129c7576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604080822080547fffffffffffffffffffff000000000000000000000000000000000000000000001681556001810183905560020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f3475b9891ecf29e996feed01eeb42a860ec225283a439d214ffaeac5e006be7d9190a250565b8060020154341015612ac7576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020154341115612b0f57600281015433906108fc90612ae8903461343b565b6040518115909202915f818181858888f19350505050158015612b0d573d5f803e3d5ffd5b505b50565b60048181015460028301546040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152339381019390935230602484015273ffffffffffffffffffffffffffffffffffffffff90911691829063dd62ed3e90604401602060405180830381865afa158015612b90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bb4919061344e565b1015612bec576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028201546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff8216906323b872dd906064016020604051808303815f875af1158015612c68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c8c9190613465565b612cc2576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600582015415612b0d575f61271083600501548460020154612ce491906134e4565b612cee91906134fb565b6004808501546040517f42966c6800000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff16916342966c6891612d4a9185910190815260200190565b5f604051808303815f87803b158015612d61575f80fd5b505af1925050508015612d72575060015b15612dc557600483015460405182815273ffffffffffffffffffffffffffffffffffffffff909116907ffd38818f5291bf0bb3a2a48aadc06ba8757865d1dabd804585338aab3009dcb690602001610df5565b505050565b5f8083601f840112612dda575f80fd5b50813567ffffffffffffffff811115612df1575f80fd5b602083019150836020828501011115612e08575f80fd5b9250929050565b73ffffffffffffffffffffffffffffffffffffffff81168114612b0f575f80fd5b5f805f805f805f60c0888a031215612e46575f80fd5b87359650602088013567ffffffffffffffff811115612e63575f80fd5b612e6f8a828b01612dca565b90975095505060408801359350606088013592506080880135612e9181612e0f565b8092505060a0880135905092959891949750929550565b5f8060408385031215612eb9575f80fd5b8235612ec481612e0f565b946020939093013593505050565b5f60208284031215612ee2575f80fd5b5035919050565b8015158114612b0f575f80fd5b5f8060408385031215612f07575f80fd5b823591506020830135612f1981612ee9565b809150509250929050565b5f8060408385031215612f35575f80fd5b8235612f4081612e0f565b91506020830135612f1981612ee9565b5f60208284031215612f60575f80fd5b8135612f6b81612e0f565b9392505050565b5f805f60608486031215612f84575f80fd5b8335612f8f81612e0f565b92506020840135612f9f81612e0f565b929592945050506040919091013590565b5f805f805f8060a08789031215612fc5575f80fd5b863567ffffffffffffffff811115612fdb575f80fd5b612fe789828a01612dca565b9097509550506020870135935060408701359250606087013561300981612e0f565b80925050608087013590509295509295509295565b602080825282518282018190525f9190848201906040850190845b8181101561305557835183529284019291840191600101613039565b50909695505050505050565b5f805f60408486031215613073575f80fd5b833561307e81612e0f565b9250602084013567ffffffffffffffff8082111561309a575f80fd5b818601915086601f8301126130ad575f80fd5b8135818111156130bb575f80fd5b8760208260051b85010111156130cf575f80fd5b6020830194508093505050509250925092565b5f80604083850312156130f3575f80fd5b82356130fe81612e0f565b91506020830135612f1981612e0f565b861515815260c060208201525f86518060c0840152806020890160e085015e5f60e0828501015260e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505085604083015284606083015273ffffffffffffffffffffffffffffffffffffffff841660808301528260a0830152979650505050505050565b600181811c908216806131b057607f821691505b6020821081036131e7577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b601f821115612dc557805f5260205f20601f840160051c8101602085101561323f5750805b601f840160051c820191505b8181101561325e575f815560010161324b565b5050505050565b67ffffffffffffffff83111561327d5761327d6131ed565b6132918361328b835461319c565b8361321a565b5f601f8411600181146132e1575f85156132ab5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561325e565b5f838152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08716915b8281101561332e578685013582556020948501946001909201910161330e565b5086821015613369577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60a081528560a0820152858760c08301375f60c087830101525f60c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f890116830101905085602083015284604083015273ffffffffffffffffffffffffffffffffffffffff84166060830152826080830152979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611e1b57611e1b6133fb565b81810381811115611e1b57611e1b6133fb565b5f6020828403121561345e575f80fd5b5051919050565b5f60208284031215613475575f80fd5b8151612f6b81612ee9565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134b0576134b06133fb565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417611e1b57611e1b6133fb565b5f8261352e577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000819000a" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} From fc03abc42bc22e9cdba7f9a540e16caccb167242 Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Thu, 14 Aug 2025 16:33:12 +0100 Subject: [PATCH 05/36] included gasstation precompile state --- crates/optimism/chainspec/res/genesis/dev.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/crates/optimism/chainspec/res/genesis/dev.json b/crates/optimism/chainspec/res/genesis/dev.json index f97e19fe872..2cca537c68c 100644 --- a/crates/optimism/chainspec/res/genesis/dev.json +++ b/crates/optimism/chainspec/res/genesis/dev.json @@ -69,8 +69,15 @@ "balance": "0xD3C21BCECCEDA1000000" }, "0x4300000000000000000000000000000000000001": { - "balance": "0x0", - "code": "0x6080604052600436106101c8575f3560e01c806399c6066c116100f2578063c55b6bb711610092578063e559afd911610062578063e559afd9146107c3578063e73a914c146107e2578063f6e4b62b14610801578063fac2c62114610820575f80fd5b8063c55b6bb7146106ee578063d124d1bc1461070d578063d7e5fbf31461073e578063d9ba32fc1461075d575f80fd5b8063ad3e080a116100cd578063ad3e080a1461062e578063b6b352721461064d578063c375c2ef1461066c578063c3c5a5471461068b575f80fd5b806399c6066c146105865780639e4f8ab8146105a55780639f8a13d7146105c6575f80fd5b80633b66e9f61161016857806364efb22b1161013857806364efb22b1461040e57806369dc9ff3146104775780637901868e14610548578063871ff40514610567575f80fd5b80633b66e9f6146103035780634162169f146103665780634782f779146103d05780635e35359e146103ef575f80fd5b806315ea16ad116101a357806315ea16ad146102695780631c5d647c146102a65780632ce962cf146102c5578063368da168146102e4575f80fd5b8063108f5c69146101d3578063139e0aa7146101f457806314695ea414610207575f80fd5b366101cf57005b5f80fd5b3480156101de575f80fd5b506101f26101ed366004612e30565b61083f565b005b6101f2610202366004612ea8565b610a4f565b348015610212575f80fd5b50610254610221366004612ed2565b5f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db02602052604090205460ff1690565b60405190151581526020015b60405180910390f35b348015610274575f80fd5b507fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db03545b604051908152602001610260565b3480156102b1575f80fd5b506101f26102c0366004612ef6565b610cb6565b3480156102d0575f80fd5b506101f26102df366004612f24565b610e02565b3480156102ef575f80fd5b506101f26102fe366004612ea8565b611000565b34801561030e575f80fd5b5061029861031d366004612f50565b73ffffffffffffffffffffffffffffffffffffffff165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090206001015490565b348015610371575f80fd5b507fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610260565b3480156103db575f80fd5b506101f26103ea366004612ea8565b611200565b3480156103fa575f80fd5b506101f2610409366004612f72565b611352565b348015610419575f80fd5b506103ab610428366004612f50565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0160205260409020546201000090041690565b348015610482575f80fd5b50610501610491366004612f50565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090208054600182015460029092015460ff808316956101008404821695620100009094049093169392911690565b604080519515158652931515602086015273ffffffffffffffffffffffffffffffffffffffff9092169284019290925260608301919091521515608082015260a001610260565b348015610553575f80fd5b506101f2610562366004612fb0565b611672565b348015610572575f80fd5b506101f2610581366004612ea8565b6118bc565b348015610591575f80fd5b506101f26105a0366004612ea8565b6119d7565b3480156105b0575f80fd5b506105b9611ac1565b604051610260919061301e565b3480156105d1575f80fd5b506102546105e0366004612f50565b73ffffffffffffffffffffffffffffffffffffffff165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054610100900460ff1690565b348015610639575f80fd5b506101f2610648366004613061565b611bcf565b348015610658575f80fd5b506102546106673660046130e2565b611d6e565b348015610677575f80fd5b506101f2610686366004612f50565b611e21565b348015610696575f80fd5b506102546106a5366004612f50565b73ffffffffffffffffffffffffffffffffffffffff165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205460ff1690565b3480156106f9575f80fd5b506101f26107083660046130e2565b611f53565b348015610718575f80fd5b5061072c610727366004612ed2565b6121a0565b6040516102609695949392919061310e565b348015610749575f80fd5b506101f26107583660046130e2565b6122b6565b348015610768575f80fd5b50610254610777366004612f50565b73ffffffffffffffffffffffffffffffffffffffff165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090206002015460ff1690565b3480156107ce575f80fd5b506101f26107dd366004613061565b6124ee565b3480156107ed575f80fd5b506101f26107fc366004612f50565b612692565b34801561080c575f80fd5b506101f261081b366004612f24565b6127e6565b34801561082b575f80fd5b506101f261083a366004612f50565b612957565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff1633146108af576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8590036108e9576040517f8dad8de600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710811115610925576040517fe05f723400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8781527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db02602052604090206001810180546109609061319c565b90505f0361099a576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181016109a9878983613265565b5060028101859055600381018490556004810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790556005810182905560405188907f73d628d7a9f63d75ab3f23c4bf349bfec022e61cc2ad8dc72f7ca093b45723e890610a3d908a908a908a908a908a908a9061337b565b60405180910390a25050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054829060ff16610ace576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0260205260409020600181018054610b099061319c565b90505f03610b43576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff16610b7e576040517fd1d5af5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600481015473ffffffffffffffffffffffffffffffffffffffff16610bab57610ba681612a89565b610bec565b3415610be3576040517ffbccebae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bec81612b12565b600381015473ffffffffffffffffffffffffffffffffffffffff85165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604081206001018054909190610c47908490613428565b92505081905550828473ffffffffffffffffffffffffffffffffffffffff167f7852f393fd6a99c61648e39af92ae0e784b77281fc2af871edce1b51304ecd7c83600301548460020154604051610ca8929190918252602082015260400190565b60405180910390a350505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314610d26576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0260205260409020600181018054610d619061319c565b90505f03610d9b576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016821515908117825560405190815283907f10ae08733732b5e10d63d501510950b2a5967607149b3608881ecde96515780c906020015b60405180910390a2505050565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205483917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0091620100009004163314801590610e985750805473ffffffffffffffffffffffffffffffffffffffff163314155b15610ecf576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054849060ff16610f4e576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101008915159081029190911790915591519182527fa5ab8b72c18a722b7e92b557d227ba48dc2985b22fce6d0f95804be26703b595910160405180910390a25050505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314611070576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054829060ff166110ef576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090206001015482811015611170576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117a838261343b565b73ffffffffffffffffffffffffffffffffffffffff85165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020908152604091829020600101939093555185815290917f30a9d8d098632f590e4953b6171a6c999d2b1c4170ebde38136c9e27e6976b8191015b60405180910390a250505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314611270576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff81166112be576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b475f83156112cc57836112ce565b815b90508181111561130a576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff86169082156108fc029083905f818181858888f1935050505015801561134a573d5f803e3d5ffd5b505050505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff1633146113c2576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff8116611410576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166114bf57475f8315611439578361143b565b815b905081811115611477576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff86169082156108fc029083905f818181858888f193505050501580156114b7573d5f803e3d5ffd5b50505061166c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015284905f9073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561152b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154f919061344e565b90505f841561155e5784611560565b815b90508181111561159c576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af115801561160e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116329190613465565b611668576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505b50505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff1633146116e2576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f85900361171c576040517f8dad8de600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710811115611758576040517fe05f723400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db03545f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811782557fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db009291908101611802898b83613265565b506002810187905560038082018790556004820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790556005820185905583018054905f61186a83613480565b9190505550817f85855a4353e16703440df33dd6903f8689955fe665d2ed5b918f7a272286c8b98a8a8a8a8a8a6040516118a99695949392919061337b565b60405180910390a2505050505050505050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff16331461192c576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604081206001018054839290611982908490613428565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316907fed46984c46e11f42ec323727ba7d99dc16be2d248a8aaa8982d492688497f09d906020015b60405180910390a25050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314611a47576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602090815260409182902060010184905590518381527fc2748283b871105da37ea4bdc2cc08eff4b3b0f472f66f2728cdf4a1b845ef7791016119cb565b60607fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005f60015b8260030154811015611b22575f81815260028401602052604090205460ff1615611b1a5781611b1681613480565b9250505b600101611ae8565b505f8167ffffffffffffffff811115611b3d57611b3d6131ed565b604051908082528060200260200182016040528015611b66578160200160208202803683370190505b5090505f60015b8460030154811015611bc5575f81815260028601602052604090205460ff1615611bbd5780838381518110611ba457611ba46134b7565b602090810291909101015281611bb981613480565b9250505b600101611b6d565b5090949350505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205484917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0091620100009004163314801590611c655750805473ffffffffffffffffffffffffffffffffffffffff163314155b15611c9c576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8381101561134a5773ffffffffffffffffffffffffffffffffffffffff86165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040812060030181878785818110611cff57611cff6134b7565b9050602002016020810190611d149190612f50565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101611c9e565b73ffffffffffffffffffffffffffffffffffffffff82165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604081206002015460ff161580611e18575073ffffffffffffffffffffffffffffffffffffffff8381165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0160209081526040808320938616835260039093019052205460ff165b90505b92915050565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314611e91576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604080822080547fffffffffffffffffffff000000000000000000000000000000000000000000001681556001810183905560020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f8d30d41865a0b811b9545d879520d2dde9f4cc49e4241f486ad9752bc904b5659190a250565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205483917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0091620100009004163314801590611fe95750805473ffffffffffffffffffffffffffffffffffffffff163314155b15612020576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db016020526040902054849060ff1661209f576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff81166120ed576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8681165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0160205260408082208054620100008b87168181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff84161790935592519290049094169392849290917f4eb572e99196bed0270fbd5b17a948e19c3f50a97838cb0d2a75a823ff8e6c509190a450505050505050565b5f606081808080807fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005f89815260029182016020526040902080549181015460038201546004830154600584015460018501805495975060ff909616959473ffffffffffffffffffffffffffffffffffffffff9092169185906122229061319c565b80601f016020809104026020016040519081016040528092919081815260200182805461224e9061319c565b80156122995780601f1061227057610100808354040283529160200191612299565b820191905f5260205f20905b81548152906001019060200180831161227c57829003601f168201915b505050505094509650965096509650965096505091939550919395565b8173ffffffffffffffffffffffffffffffffffffffff8116612304576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff8116612352576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205460ff16156123d0576040517f3a81d6fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b833b5f81900361240c576040517f6eefed2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8581165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604080822080546101017fffffffffffffffffffff0000000000000000000000000000000000000000000090911662010000968b169687021717815560018082018490556002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790559051909392917f768fb430a0d4b201cb764ab221c316dd14d8babf2e4b2348e05964c6565318b691a3505050505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205484917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db00916201000090041633148015906125845750805473ffffffffffffffffffffffffffffffffffffffff163314155b156125bb576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8381101561134a5773ffffffffffffffffffffffffffffffffffffffff86165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db0160205260408120600191600390910190878785818110612623576126236134b7565b90506020020160208101906126389190612f50565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556001016125bd565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff163314612702576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff8116612750576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db00805473ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f0429168a83556e356cd18563753346b9c9567cbf0fbea148d40aeb84a76cc5b9905f90a3505050565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604090205483917fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db009162010000900416331480159061287c5750805473ffffffffffffffffffffffffffffffffffffffff163314155b156128b3576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602090815260409182902060020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f8daaf060c3306c38e068a75c054bf96ecd85a3db1252712c4d93632744c42e0d91016111f2565b7fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db005473ffffffffffffffffffffffffffffffffffffffff1633146129c7576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f8181527fc2eaf2cedf9e23687c6eb7c4717aa3eacbd015cc86eaad3f51aae2d3c955db01602052604080822080547fffffffffffffffffffff000000000000000000000000000000000000000000001681556001810183905560020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f3475b9891ecf29e996feed01eeb42a860ec225283a439d214ffaeac5e006be7d9190a250565b8060020154341015612ac7576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020154341115612b0f57600281015433906108fc90612ae8903461343b565b6040518115909202915f818181858888f19350505050158015612b0d573d5f803e3d5ffd5b505b50565b60048181015460028301546040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152339381019390935230602484015273ffffffffffffffffffffffffffffffffffffffff90911691829063dd62ed3e90604401602060405180830381865afa158015612b90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bb4919061344e565b1015612bec576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028201546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff8216906323b872dd906064016020604051808303815f875af1158015612c68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c8c9190613465565b612cc2576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600582015415612b0d575f61271083600501548460020154612ce491906134e4565b612cee91906134fb565b6004808501546040517f42966c6800000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff16916342966c6891612d4a9185910190815260200190565b5f604051808303815f87803b158015612d61575f80fd5b505af1925050508015612d72575060015b15612dc557600483015460405182815273ffffffffffffffffffffffffffffffffffffffff909116907ffd38818f5291bf0bb3a2a48aadc06ba8757865d1dabd804585338aab3009dcb690602001610df5565b505050565b5f8083601f840112612dda575f80fd5b50813567ffffffffffffffff811115612df1575f80fd5b602083019150836020828501011115612e08575f80fd5b9250929050565b73ffffffffffffffffffffffffffffffffffffffff81168114612b0f575f80fd5b5f805f805f805f60c0888a031215612e46575f80fd5b87359650602088013567ffffffffffffffff811115612e63575f80fd5b612e6f8a828b01612dca565b90975095505060408801359350606088013592506080880135612e9181612e0f565b8092505060a0880135905092959891949750929550565b5f8060408385031215612eb9575f80fd5b8235612ec481612e0f565b946020939093013593505050565b5f60208284031215612ee2575f80fd5b5035919050565b8015158114612b0f575f80fd5b5f8060408385031215612f07575f80fd5b823591506020830135612f1981612ee9565b809150509250929050565b5f8060408385031215612f35575f80fd5b8235612f4081612e0f565b91506020830135612f1981612ee9565b5f60208284031215612f60575f80fd5b8135612f6b81612e0f565b9392505050565b5f805f60608486031215612f84575f80fd5b8335612f8f81612e0f565b92506020840135612f9f81612e0f565b929592945050506040919091013590565b5f805f805f8060a08789031215612fc5575f80fd5b863567ffffffffffffffff811115612fdb575f80fd5b612fe789828a01612dca565b9097509550506020870135935060408701359250606087013561300981612e0f565b80925050608087013590509295509295509295565b602080825282518282018190525f9190848201906040850190845b8181101561305557835183529284019291840191600101613039565b50909695505050505050565b5f805f60408486031215613073575f80fd5b833561307e81612e0f565b9250602084013567ffffffffffffffff8082111561309a575f80fd5b818601915086601f8301126130ad575f80fd5b8135818111156130bb575f80fd5b8760208260051b85010111156130cf575f80fd5b6020830194508093505050509250925092565b5f80604083850312156130f3575f80fd5b82356130fe81612e0f565b91506020830135612f1981612e0f565b861515815260c060208201525f86518060c0840152806020890160e085015e5f60e0828501015260e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505085604083015284606083015273ffffffffffffffffffffffffffffffffffffffff841660808301528260a0830152979650505050505050565b600181811c908216806131b057607f821691505b6020821081036131e7577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b601f821115612dc557805f5260205f20601f840160051c8101602085101561323f5750805b601f840160051c820191505b8181101561325e575f815560010161324b565b5050505050565b67ffffffffffffffff83111561327d5761327d6131ed565b6132918361328b835461319c565b8361321a565b5f601f8411600181146132e1575f85156132ab5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561325e565b5f838152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08716915b8281101561332e578685013582556020948501946001909201910161330e565b5086821015613369577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60a081528560a0820152858760c08301375f60c087830101525f60c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f890116830101905085602083015284604083015273ffffffffffffffffffffffffffffffffffffffff84166060830152826080830152979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611e1b57611e1b6133fb565b81810381811115611e1b57611e1b6133fb565b5f6020828403121561345e575f80fd5b5051919050565b5f60208284031215613475575f80fd5b8151612f6b81612ee9565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134b0576134b06133fb565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417611e1b57611e1b6133fb565b5f8261352e577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000819000a" + "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30001", + "0x64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e000": "0x000000000000000000000000974e1a6b0d3a6853f66c8044c946f32684e6433e", + "0x64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e003": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000004200000000000000000000000000000000000018" + }, + "balance": "0x0" } }, "number": "0x0", From 79964e41f5795e73fd6696ee123e1609d6284368 Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Mon, 18 Aug 2025 18:56:42 +0100 Subject: [PATCH 06/36] bypass gas requirements for gasless --- crates/optimism/txpool/src/validator.rs | 31 ++++- crates/transaction-pool/src/pool/txpool.rs | 126 +++++++++++++++----- crates/transaction-pool/src/validate/eth.rs | 85 ++++++------- 3 files changed, 166 insertions(+), 76 deletions(-) diff --git a/crates/optimism/txpool/src/validator.rs b/crates/optimism/txpool/src/validator.rs index 6c986e9498f..c791b0d1c50 100644 --- a/crates/optimism/txpool/src/validator.rs +++ b/crates/optimism/txpool/src/validator.rs @@ -187,7 +187,7 @@ where return TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::TxTypeNotSupported.into(), - ) + ); } // Interop cross tx validation @@ -199,7 +199,7 @@ where } err => InvalidPoolTransactionError::Other(Box::new(err)), }; - return TransactionValidationOutcome::Invalid(transaction, err) + return TransactionValidationOutcome::Invalid(transaction, err); } Some(Ok(_)) => { // valid interop tx @@ -222,7 +222,7 @@ where ) -> TransactionValidationOutcome { if !self.requires_l1_data_gas_fee() { // no need to check L1 gas fee - return outcome + return outcome; } // ensure that the account has enough balance to cover the L1 gas cost if let TransactionValidationOutcome::Valid { @@ -234,6 +234,27 @@ where authorities, } = outcome { + // Bypass L1 data gas cost requirement for gasless transactions + let tx = valid_tx.transaction(); + let is_gasless = match tx.ty() { + alloy_consensus::constants::LEGACY_TX_TYPE_ID => tx.priority_fee_or_price() == 0, + alloy_consensus::constants::EIP1559_TX_TYPE_ID => { + tx.max_fee_per_gas() == 0 && tx.max_priority_fee_per_gas() == Some(0) + } + _ => false, + }; + + if is_gasless { + return TransactionValidationOutcome::Valid { + balance, + state_nonce, + transaction: valid_tx, + propagate, + bytecode_hash, + authorities, + }; + } + let mut l1_block_info = self.block_info.l1_block_info.read().clone(); let encoded = valid_tx.transaction().encoded_2718(); @@ -259,7 +280,7 @@ where GotExpected { got: balance, expected: cost }.into(), ) .into(), - ) + ); } return TransactionValidationOutcome::Valid { @@ -269,7 +290,7 @@ where propagate, bytecode_hash, authorities, - } + }; } outcome } diff --git a/crates/transaction-pool/src/pool/txpool.rs b/crates/transaction-pool/src/pool/txpool.rs index c3f2233f442..8c7cb0fea0f 100644 --- a/crates/transaction-pool/src/pool/txpool.rs +++ b/crates/transaction-pool/src/pool/txpool.rs @@ -118,6 +118,9 @@ pub struct TxPool { metrics: TxPoolMetrics, /// The last update kind that was applied to the pool. latest_update_kind: Option, + /// Pending credit usage for gasless transactions by destination contract. + /// This is increased when a gasless tx to `to` is inserted and decreased when removed. + pending_credit_usage: FxHashMap, } // === impl TxPool === @@ -138,6 +141,7 @@ impl TxPool { config, metrics: Default::default(), latest_update_kind: None, + pending_credit_usage: Default::default(), } } @@ -175,7 +179,7 @@ impl TxPool { let mut next_expected_nonce = on_chain.nonce; for (id, tx) in self.all().descendant_txs_inclusive(&on_chain) { if next_expected_nonce != id.nonce { - break + break; } next_expected_nonce = id.next_nonce(); last_consecutive_tx = Some(tx); @@ -209,6 +213,45 @@ impl TxPool { } } + /// Increment pending usage for gasless txs + fn maybe_inc_gasless_pending_usage(&mut self, tx: &Arc>) { + // destination address + let to = match tx.to() { + Some(addr) => addr, + None => return, + }; + // detect gasless + let is_gasless = match tx.tx_type() { + LEGACY_TX_TYPE_ID => tx.priority_fee_or_price() == 0, + EIP1559_TX_TYPE_ID => tx.max_fee_per_gas() == 0 && tx.priority_fee_or_price() == 0, + _ => false, + }; + if !is_gasless { + return; + } + let entry = self.pending_credit_usage.entry(to).or_insert(U256::ZERO); + *entry = (*entry).saturating_add(U256::from(tx.gas_limit())); + } + + /// Decrement pending usage for gasless txs + fn maybe_dec_gasless_pending_usage(&mut self, tx: &Arc>) { + let to = match tx.to() { + Some(addr) => addr, + None => return, + }; + let is_gasless = match tx.tx_type() { + LEGACY_TX_TYPE_ID => tx.priority_fee_or_price() == 0, + EIP1559_TX_TYPE_ID => tx.max_fee_per_gas() == 0 && tx.priority_fee_or_price() == 0, + _ => false, + }; + if !is_gasless { + return; + } + if let Some(entry) = self.pending_credit_usage.get_mut(&to) { + *entry = entry.saturating_sub(U256::from(tx.gas_limit())); + } + } + /// Returns the currently tracked block values pub const fn block_info(&self) -> BlockInfo { BlockInfo { @@ -662,7 +705,7 @@ impl TxPool { on_chain_code_hash: Option, ) -> PoolResult> { if self.contains(tx.hash()) { - return Err(PoolError::new(*tx.hash(), PoolErrorKind::AlreadyImported)) + return Err(PoolError::new(*tx.hash(), PoolErrorKind::AlreadyImported)); } self.validate_auth(&tx, on_chain_nonce, on_chain_code_hash)?; @@ -683,6 +726,15 @@ impl TxPool { let replaced = replaced_tx.map(|(tx, _)| tx); + // Track pending credit usage for gasless transactions + self.maybe_inc_gasless_pending_usage(&transaction); + if let Some(ref r) = replaced { + self.maybe_dec_gasless_pending_usage(r); + } + for d in &discarded { + self.maybe_dec_gasless_pending_usage(d); + } + // This transaction was moved to the pending pool. let res = if move_to.is_pending() { AddedTransaction::Pending(AddedPendingTransaction { @@ -768,10 +820,10 @@ impl TxPool { on_chain_code_hash: Option, ) -> Result<(), PoolError> { // Short circuit if the sender has neither delegation nor pending delegation. - if (on_chain_code_hash.is_none() || on_chain_code_hash == Some(KECCAK_EMPTY)) && - !self.all_transactions.auths.contains_key(&transaction.sender_id()) + if (on_chain_code_hash.is_none() || on_chain_code_hash == Some(KECCAK_EMPTY)) + && !self.all_transactions.auths.contains_key(&transaction.sender_id()) { - return Ok(()) + return Ok(()); } let mut txs_by_sender = @@ -785,14 +837,14 @@ impl TxPool { PoolErrorKind::InvalidTransaction(InvalidPoolTransactionError::Eip7702( Eip7702PoolTransactionError::OutOfOrderTxFromDelegated, )), - )) + )); } - return Ok(()) + return Ok(()); } if txs_by_sender.any(|id| id == &transaction.transaction_id) { // Transaction replacement is supported - return Ok(()) + return Ok(()); } Err(PoolError::new( @@ -829,7 +881,7 @@ impl TxPool { PoolErrorKind::InvalidTransaction(InvalidPoolTransactionError::Eip7702( Eip7702PoolTransactionError::AuthorityReserved, )), - )) + )); } } } @@ -996,6 +1048,11 @@ impl TxPool { SubPool::Blob => self.blob_pool.remove_transaction(tx), }; + if let Some(ref arc_tx) = tx { + // Update pending usage for gasless transactions on any removal path + self.maybe_dec_gasless_pending_usage(arc_tx); + } + if let Some(ref tx) = tx { // We trace here instead of in subpool structs directly, because the `ParkedPool` type // is generic and it would not be possible to distinguish whether a transaction is @@ -1026,7 +1083,7 @@ impl TxPool { } id = descendant; } else { - return + return; } } } @@ -1295,7 +1352,7 @@ impl AllTransactions { if *count == 1 { entry.remove(); self.metrics.all_transactions_by_all_senders.decrement(1.0); - return + return; } *count -= 1; self.metrics.all_transactions_by_all_senders.decrement(1.0); @@ -1370,7 +1427,7 @@ impl AllTransactions { ($iter:ident) => { 'this: while let Some((peek, _)) = iter.peek() { if peek.sender != id.sender { - break 'this + break 'this; } iter.next(); } @@ -1387,7 +1444,7 @@ impl AllTransactions { current: tx.subpool, destination: Destination::Discard, }); - continue 'transactions + continue 'transactions; } let ancestor = TransactionId::ancestor(id.nonce, info.state_nonce, id.sender); @@ -1412,7 +1469,7 @@ impl AllTransactions { // If there's a nonce gap, we can shortcircuit, because there's nothing to update yet. if tx.state.has_nonce_gap() { next_sender!(iter); - continue 'transactions + continue 'transactions; } // Since this is the first transaction of the sender, it has no parked ancestors @@ -1435,7 +1492,7 @@ impl AllTransactions { while let Some((peek, tx)) = iter.peek_mut() { if peek.sender != id.sender { // Found the next sender we need to check - continue 'transactions + continue 'transactions; } if tx.transaction.nonce() == next_nonce_in_line { @@ -1444,7 +1501,7 @@ impl AllTransactions { } else { // can short circuit if there's still a nonce gap next_sender!(iter); - continue 'transactions + continue 'transactions; } // update for next iteration of this sender's loop @@ -1699,7 +1756,7 @@ impl AllTransactions { if current_txs >= self.max_account_slots && transaction.nonce() > on_chain_nonce { return Err(InsertErr::ExceededSenderTransactionsCapacity { transaction: Arc::new(transaction), - }) + }); } } if transaction.gas_limit() > self.block_gas_limit { @@ -1707,12 +1764,12 @@ impl AllTransactions { block_gas_limit: self.block_gas_limit, tx_gas_limit: transaction.gas_limit(), transaction: Arc::new(transaction), - }) + }); } if self.contains_conflicting_transaction(&transaction) { // blob vs non blob transactions are mutually exclusive for the same sender - return Err(InsertErr::TxTypeConflict { transaction: Arc::new(transaction) }) + return Err(InsertErr::TxTypeConflict { transaction: Arc::new(transaction) }); } Ok(transaction) @@ -1733,13 +1790,13 @@ impl AllTransactions { let Some(ancestor_tx) = self.txs.get(&ancestor) else { // ancestor tx is missing, so we can't insert the new blob self.metrics.blob_transactions_nonce_gaps.increment(1); - return Err(InsertErr::BlobTxHasNonceGap { transaction: Arc::new(new_blob_tx) }) + return Err(InsertErr::BlobTxHasNonceGap { transaction: Arc::new(new_blob_tx) }); }; if ancestor_tx.state.has_nonce_gap() { // the ancestor transaction already has a nonce gap, so we can't insert the new // blob self.metrics.blob_transactions_nonce_gaps.increment(1); - return Err(InsertErr::BlobTxHasNonceGap { transaction: Arc::new(new_blob_tx) }) + return Err(InsertErr::BlobTxHasNonceGap { transaction: Arc::new(new_blob_tx) }); } // the max cost executing this transaction requires @@ -1748,7 +1805,7 @@ impl AllTransactions { // check if the new blob would go into overdraft if cumulative_cost > on_chain_balance { // the transaction would go into overdraft - return Err(InsertErr::Overdraft { transaction: Arc::new(new_blob_tx) }) + return Err(InsertErr::Overdraft { transaction: Arc::new(new_blob_tx) }); } // ensure that a replacement would not shift already propagated blob transactions into @@ -1765,14 +1822,16 @@ impl AllTransactions { cumulative_cost += tx.transaction.cost(); if tx.transaction.is_eip4844() && cumulative_cost > on_chain_balance { // the transaction would shift - return Err(InsertErr::Overdraft { transaction: Arc::new(new_blob_tx) }) + return Err(InsertErr::Overdraft { + transaction: Arc::new(new_blob_tx), + }); } } } } } else if new_blob_tx.cost() > &on_chain_balance { // the transaction would go into overdraft - return Err(InsertErr::Overdraft { transaction: Arc::new(new_blob_tx) }) + return Err(InsertErr::Overdraft { transaction: Arc::new(new_blob_tx) }); } Ok(new_blob_tx) @@ -1859,13 +1918,20 @@ impl AllTransactions { state.insert(TxState::NO_PARKED_ANCESTORS); } - // Check dynamic fee + // Check dynamic fee. Bypass protocol basefee check for gasless transactions (0/0 or legacy 0). let fee_cap = transaction.max_fee_per_gas(); + let is_gasless = match transaction.tx_type() { + LEGACY_TX_TYPE_ID => transaction.priority_fee_or_price() == 0, + EIP1559_TX_TYPE_ID => { + transaction.max_fee_per_gas() == 0 && transaction.priority_fee_or_price() == 0 + } + _ => false, + }; - if fee_cap < self.minimal_protocol_basefee as u128 { - return Err(InsertErr::FeeCapBelowMinimumProtocolFeeCap { transaction, fee_cap }) + if !is_gasless && fee_cap < self.minimal_protocol_basefee as u128 { + return Err(InsertErr::FeeCapBelowMinimumProtocolFeeCap { transaction, fee_cap }); } - if fee_cap >= self.pending_fees.base_fee as u128 { + if is_gasless || fee_cap >= self.pending_fees.base_fee as u128 { state.insert(TxState::ENOUGH_FEE_CAP_BLOCK); } @@ -1896,7 +1962,7 @@ impl AllTransactions { return Err(InsertErr::Underpriced { transaction: pool_tx.transaction, existing: *entry.get().transaction.hash(), - }) + }); } let new_hash = *pool_tx.transaction.hash(); let new_transaction = pool_tx.transaction.clone(); @@ -1936,7 +2002,7 @@ impl AllTransactions { // If there's a nonce gap, we can shortcircuit if next_nonce != id.nonce { - break + break; } // close the nonce gap diff --git a/crates/transaction-pool/src/validate/eth.rs b/crates/transaction-pool/src/validate/eth.rs index b32401f2cbb..e901831da4b 100644 --- a/crates/transaction-pool/src/validate/eth.rs +++ b/crates/transaction-pool/src/validate/eth.rs @@ -312,7 +312,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::Eip2930Disabled.into(), - )) + )); } } EIP1559_TX_TYPE_ID => { @@ -321,7 +321,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::Eip1559Disabled.into(), - )) + )); } } EIP4844_TX_TYPE_ID => { @@ -330,7 +330,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::Eip4844Disabled.into(), - )) + )); } } EIP7702_TX_TYPE_ID => { @@ -339,7 +339,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::Eip7702Disabled.into(), - )) + )); } } @@ -357,7 +357,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidPoolTransactionError::Eip2681, - )) + )); } // Reject transactions over defined size to prevent DOS attacks @@ -390,7 +390,7 @@ where // Check whether the init code size has been exceeded. if self.fork_tracker.is_shanghai_activated() { if let Err(err) = transaction.ensure_max_init_code_size(MAX_INIT_CODE_BYTE_SIZE) { - return Err(TransactionValidationOutcome::Invalid(transaction, err)) + return Err(TransactionValidationOutcome::Invalid(transaction, err)); } } @@ -404,7 +404,7 @@ where transaction_gas_limit, block_gas_limit, ), - )) + )); } // Check individual transaction gas limit if configured @@ -416,7 +416,7 @@ where transaction_gas_limit, max_tx_gas_limit, ), - )) + )); } } @@ -425,7 +425,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::TipAboveFeeCap.into(), - )) + )); } // determine whether the transaction should be treated as local @@ -448,26 +448,29 @@ where max_tx_fee_wei, tx_fee_cap_wei, }, - )) + )); } } } } // Drop non-local transactions with a fee lower than the configured fee for acceptance into - // the pool. - if !is_local && - transaction.is_dynamic_fee() && - transaction.max_priority_fee_per_gas() < self.minimum_priority_fee - { - return Err(TransactionValidationOutcome::Invalid( - transaction, - InvalidPoolTransactionError::PriorityFeeBelowMinimum { - minimum_priority_fee: self - .minimum_priority_fee - .expect("minimum priority fee is expected inside if statement"), - }, - )) + // the pool. Bypass for gasless transactions (legacy gas_price == 0 or 1559 caps == 0). + if !is_local && transaction.is_dynamic_fee() { + let is_gasless_1559 = transaction.max_fee_per_gas() == 0 + && transaction.max_priority_fee_per_gas() == Some(0); + if !is_gasless_1559 + && transaction.max_priority_fee_per_gas() < self.minimum_priority_fee + { + return Err(TransactionValidationOutcome::Invalid( + transaction, + InvalidPoolTransactionError::PriorityFeeBelowMinimum { + minimum_priority_fee: self + .minimum_priority_fee + .expect("minimum priority fee is expected inside if statement"), + }, + )); + } } // Checks for chainid @@ -476,7 +479,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::ChainIdMismatch.into(), - )) + )); } } @@ -486,19 +489,19 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::TxTypeNotSupported.into(), - )) + )); } if transaction.authorization_list().is_none_or(|l| l.is_empty()) { return Err(TransactionValidationOutcome::Invalid( transaction, Eip7702PoolTransactionError::MissingEip7702AuthorizationList.into(), - )) + )); } } if let Err(err) = ensure_intrinsic_gas(&transaction, &self.fork_tracker) { - return Err(TransactionValidationOutcome::Invalid(transaction, err)) + return Err(TransactionValidationOutcome::Invalid(transaction, err)); } // light blob tx pre-checks @@ -508,7 +511,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::TxTypeNotSupported.into(), - )) + )); } let blob_count = transaction.blob_count().unwrap_or(0); @@ -519,7 +522,7 @@ where InvalidPoolTransactionError::Eip4844( Eip4844PoolTransactionError::NoEip4844Blobs, ), - )) + )); } let max_blob_count = self.fork_tracker.max_blob_count(); @@ -532,18 +535,18 @@ where permitted: max_blob_count, }, ), - )) + )); } } // Osaka validation of max tx gas. - if self.fork_tracker.is_osaka_activated() && - transaction.gas_limit() > MAX_TX_GAS_LIMIT_OSAKA + if self.fork_tracker.is_osaka_activated() + && transaction.gas_limit() > MAX_TX_GAS_LIMIT_OSAKA { return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::GasLimitTooHigh.into(), - )) + )); } Ok(transaction) @@ -592,7 +595,7 @@ where return TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::SignerAccountHasBytecode.into(), - ) + ); } } @@ -604,7 +607,7 @@ where transaction, InvalidTransactionError::NonceNotConsistent { tx: tx_nonce, state: account.nonce } .into(), - ) + ); } let cost = transaction.cost(); @@ -618,7 +621,7 @@ where GotExpected { got: account.balance, expected }.into(), ) .into(), - ) + ); } let mut maybe_blob_sidecar = None; @@ -632,7 +635,7 @@ where return TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::TxTypeNotSupported.into(), - ) + ); } EthBlobTransactionSidecar::Missing => { // This can happen for re-injected blob transactions (on re-org), since the blob @@ -647,7 +650,7 @@ where InvalidPoolTransactionError::Eip4844( Eip4844PoolTransactionError::MissingEip4844BlobSidecar, ), - ) + ); } } EthBlobTransactionSidecar::Present(sidecar) => { @@ -660,7 +663,7 @@ where InvalidPoolTransactionError::Eip4844( Eip4844PoolTransactionError::UnexpectedEip4844SidecarAfterOsaka, ), - ) + ); } } else if sidecar.is_eip7594() { return TransactionValidationOutcome::Invalid( @@ -668,7 +671,7 @@ where InvalidPoolTransactionError::Eip4844( Eip4844PoolTransactionError::UnexpectedEip7594SidecarBeforeOsaka, ), - ) + ); } // validate the blob @@ -678,7 +681,7 @@ where InvalidPoolTransactionError::Eip4844( Eip4844PoolTransactionError::InvalidEip4844Blob(err), ), - ) + ); } // Record the duration of successful blob validation as histogram self.validation_metrics.blob_validation_duration.record(now.elapsed()); From a8c1116d0f03fa8632950eb96714ae053065d745 Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Mon, 18 Aug 2025 18:57:05 +0100 Subject: [PATCH 07/36] use custom reth --- Cargo.lock | 14 ++++++++------ Cargo.toml | 13 +++++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 96f2fcea0b9..30078601e13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2355,9 +2355,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.14.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" +checksum = "dccd746bf9b1038c0507b7cec21eb2b11222db96a2902c96e8c185d6d20fb9c4" dependencies = [ "cfg-if", "cpufeatures", @@ -4386,13 +4386,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2", "http", "http-body", @@ -4400,6 +4401,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -8556,7 +8558,7 @@ dependencies = [ "alloy-rlp", "hex", "reth-storage-api", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 1c2a45c4e88..105f2637397 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -709,6 +709,19 @@ visibility = "0.1.1" walkdir = "2.3.3" vergen-git2 = "1.0.5" +[patch.crates-io] +revm = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-primitives = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless" } +revm-interpreter = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-handler = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless" } +revm-context = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-context-interface = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-state = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-database = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-database-interface = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-bytecode = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-inspector = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} + # [patch.crates-io] # alloy-consensus = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" } # alloy-contract = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" } From 8368163a3edb2c709a821e6fc212afc630447d28 Mon Sep 17 00:00:00 2001 From: sledro Date: Mon, 18 Aug 2025 17:27:36 +0100 Subject: [PATCH 08/36] feat (WIP): implement gasless transaction support in optimismn - Added support for gasless transactions across various components, including transaction validation and receipt generation. - Updated `revm` dependency to include optional gasless features. - Enhanced transaction pool logic to prioritize gasless transactions and ensure they are accepted without fees. - Introduced utility functions in `reth-optimism-primitives` for gasless transaction checks. - Modified EVM environment configuration to allow gasless validation bypass. This update improves the handling of gasless transactions, ensuring they are processed efficiently within the optimism framework. --- Cargo.lock | 1 + Cargo.toml | 6 +-- crates/optimism/evm/src/lib.rs | 9 ++++- crates/optimism/payload/src/builder.rs | 28 ++++++++++---- crates/optimism/primitives/src/lib.rs | 3 ++ crates/optimism/primitives/src/utils.rs | 14 +++++++ crates/optimism/rpc/src/eth/receipt.rs | 17 +++++++- crates/optimism/txpool/src/validator.rs | 24 +++++++----- crates/rpc/rpc-eth-api/Cargo.toml | 2 +- crates/transaction-pool/Cargo.toml | 2 + crates/transaction-pool/src/ordering.rs | 7 ++++ crates/transaction-pool/src/pool/best.rs | 7 +++- crates/transaction-pool/src/pool/txpool.rs | 45 ++++++++++++++++------ 13 files changed, 128 insertions(+), 37 deletions(-) create mode 100644 crates/optimism/primitives/src/utils.rs diff --git a/Cargo.lock b/Cargo.lock index 30078601e13..a8c5e4435ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10530,6 +10530,7 @@ dependencies = [ "reth-execution-types", "reth-fs-util", "reth-metrics", + "reth-optimism-primitives", "reth-primitives-traits", "reth-provider", "reth-storage-api", diff --git a/Cargo.toml b/Cargo.toml index 105f2637397..b96f6f3dfd4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -281,8 +281,8 @@ too_long_first_doc_paragraph = "allow" # NOTE: Debuggers may provide less useful information with this setting. # Uncomment this section if you're using a debugger. [profile.dev] -# https://davidlattimore.github.io/posts/2024/02/04/speeding-up-the-rust-edit-build-run-cycle.html -debug = "line-tables-only" +# Use full debug info so debuggers (LLDB/CodeLLDB) can show local variables and complex types. +debug = "full" split-debuginfo = "unpacked" # Speed up tests. @@ -457,7 +457,7 @@ reth-ress-protocol = { path = "crates/ress/protocol" } reth-ress-provider = { path = "crates/ress/provider" } # revm -revm = { version = "28.0.1", default-features = false } +revm = { version = "28.0.1", default-features = false, features = ["optional_gasless"] } revm-bytecode = { version = "6.0.1", default-features = false } revm-database = { version = "7.0.1", default-features = false } revm-state = { version = "7.0.1", default-features = false } diff --git a/crates/optimism/evm/src/lib.rs b/crates/optimism/evm/src/lib.rs index 7e5ae9e5b4c..6acc374ea8c 100644 --- a/crates/optimism/evm/src/lib.rs +++ b/crates/optimism/evm/src/lib.rs @@ -136,7 +136,10 @@ where fn evm_env(&self, header: &Header) -> EvmEnv { let spec = config::revm_spec(self.chain_spec(), header); - let cfg_env = CfgEnv::new().with_chain_id(self.chain_spec().chain().id()).with_spec(spec); + let mut cfg_env = CfgEnv::new().with_chain_id(self.chain_spec().chain().id()).with_spec(spec); + + // Enable per-tx gasless validation bypass in lightlink revm + cfg_env.allow_gasless = true; let blob_excess_gas_and_price = spec .into_eth_spec() @@ -175,8 +178,10 @@ where let spec_id = revm_spec_by_timestamp_after_bedrock(self.chain_spec(), attributes.timestamp); // configure evm env based on parent block - let cfg_env = + let mut cfg_env = CfgEnv::new().with_chain_id(self.chain_spec().chain().id()).with_spec(spec_id); + // Enable per-tx gasless validation bypass in forked revm + cfg_env.allow_gasless = true; // if the parent block did not have excess blob gas (i.e. it was pre-cancun), but it is // cancun now, we need to set the excess blob gas to the default value(0) diff --git a/crates/optimism/payload/src/builder.rs b/crates/optimism/payload/src/builder.rs index d511b17392f..705f7091b5f 100644 --- a/crates/optimism/payload/src/builder.rs +++ b/crates/optimism/payload/src/builder.rs @@ -42,6 +42,7 @@ use reth_transaction_pool::{BestTransactionsAttributes, PoolTransaction, Transac use revm::context::{Block, BlockEnv}; use std::{marker::PhantomData, sync::Arc}; use tracing::{debug, trace, warn}; +use reth_optimism_primitives::is_gasless; /// Optimism's payload builder #[derive(Debug)] @@ -359,7 +360,8 @@ impl OpBuilder<'_, Txs> { } // check if the new payload is even more valuable - if !ctx.is_better_payload(info.total_fees) { + // if fees are equal but we included any mempool transactions (e.g. gasless), still proceed + if !ctx.is_better_payload(info.total_fees) && !info.included_any_mempool_tx { // can skip building the block return Ok(BuildOutcomeKind::Aborted { fees: info.total_fees }) } @@ -490,12 +492,19 @@ pub struct ExecutionInfo { pub cumulative_da_bytes_used: u64, /// Tracks fees from executed mempool transactions pub total_fees: U256, + /// True if at least one mempool transaction was executed in this payload attempt + pub included_any_mempool_tx: bool, } impl ExecutionInfo { /// Create a new instance with allocated slots. pub const fn new() -> Self { - Self { cumulative_gas_used: 0, cumulative_da_bytes_used: 0, total_fees: U256::ZERO } + Self { + cumulative_gas_used: 0, + cumulative_da_bytes_used: 0, + total_fees: U256::ZERO, + included_any_mempool_tx: false, + } } /// Returns true if the transaction would exceed the block limits: @@ -729,11 +738,16 @@ where info.cumulative_gas_used += gas_used; info.cumulative_da_bytes_used += tx_da_size; - // update add to total fees - let miner_fee = tx - .effective_tip_per_gas(base_fee) - .expect("fee is always valid; execution succeeded"); - info.total_fees += U256::from(miner_fee) * U256::from(gas_used); + if !is_gasless(tx.as_ref()) { + // update add to total fees; gasless transactions pay no miner fee + let miner_fee = tx + .effective_tip_per_gas(base_fee) + .expect("fee is always valid; execution succeeded"); + info.total_fees += U256::from(miner_fee) * U256::from(gas_used); + } + + // mark that we executed at least one mempool transaction + info.included_any_mempool_tx = true; } Ok(None) diff --git a/crates/optimism/primitives/src/lib.rs b/crates/optimism/primitives/src/lib.rs index 8a447ffc2fa..54598bfd5aa 100644 --- a/crates/optimism/primitives/src/lib.rs +++ b/crates/optimism/primitives/src/lib.rs @@ -19,6 +19,9 @@ pub use predeploys::ADDRESS_L2_TO_L1_MESSAGE_PASSER; pub mod transaction; pub use transaction::*; +pub mod utils; +pub use utils::*; + mod receipt; pub use receipt::{DepositReceipt, OpReceipt}; diff --git a/crates/optimism/primitives/src/utils.rs b/crates/optimism/primitives/src/utils.rs new file mode 100644 index 00000000000..6ecb800dcf1 --- /dev/null +++ b/crates/optimism/primitives/src/utils.rs @@ -0,0 +1,14 @@ +//! Optimism utility functions + +/// Returns true if the transaction is a zero-fee transaction. +/// +/// Rules: +/// - Legacy/EIP-2930: gas_price == 0 +/// - EIP-1559/EIP-4844/EIP-7702: max_fee_per_gas == 0 +pub fn is_gasless(tx: &T) -> bool { + match tx.ty() { + 0 | 1 => tx.gas_price().unwrap_or(0) == 0, // Legacy/EIP-2930 + 2 | 3 | 4 => tx.max_fee_per_gas() == 0, // EIP-1559/EIP-4844/EIP-7702 + _ => false, + } +} diff --git a/crates/optimism/rpc/src/eth/receipt.rs b/crates/optimism/rpc/src/eth/receipt.rs index edf16900f04..2630dbf21b8 100644 --- a/crates/optimism/rpc/src/eth/receipt.rs +++ b/crates/optimism/rpc/src/eth/receipt.rs @@ -11,7 +11,7 @@ use reth_chainspec::ChainSpecProvider; use reth_node_api::NodePrimitives; use reth_optimism_evm::RethL1BlockInfo; use reth_optimism_forks::OpHardforks; -use reth_optimism_primitives::OpReceipt; +use reth_optimism_primitives::{is_gasless, OpReceipt}; use reth_primitives_traits::Block; use reth_rpc_eth_api::{ helpers::LoadReceipt, @@ -288,10 +288,23 @@ impl OpReceiptBuilder { } }); - let op_receipt_fields = OpReceiptFieldsBuilder::new(timestamp, block_number) + let mut op_receipt_fields = OpReceiptFieldsBuilder::new(timestamp, block_number) .l1_block_info(chain_spec, tx_signed, l1_block_info)? .build(); + if is_gasless(tx_signed) { + op_receipt_fields.l1_block_info.l1_base_fee_scalar = Some(0); + op_receipt_fields.l1_block_info.l1_blob_base_fee_scalar = Some(0); + op_receipt_fields.l1_block_info.operator_fee_scalar = Some(0); + op_receipt_fields.l1_block_info.operator_fee_constant = Some(0); + op_receipt_fields.l1_block_info.l1_gas_price = Some(0); + op_receipt_fields.l1_block_info.l1_gas_used = Some(0); + op_receipt_fields.l1_block_info.l1_fee = Some(0); + op_receipt_fields.l1_block_info.l1_fee_scalar = None; + op_receipt_fields.l1_block_info.l1_blob_base_fee = Some(0); + op_receipt_fields.l1_block_info.l1_blob_base_fee_scalar = Some(0); + } + Ok(Self { core_receipt, op_receipt_fields }) } diff --git a/crates/optimism/txpool/src/validator.rs b/crates/optimism/txpool/src/validator.rs index c791b0d1c50..81b96825217 100644 --- a/crates/optimism/txpool/src/validator.rs +++ b/crates/optimism/txpool/src/validator.rs @@ -1,5 +1,6 @@ use crate::{supervisor::SupervisorClient, InvalidCrossTx, OpPooledTx}; use alloy_consensus::{BlockHeader, Transaction}; +use alloy_primitives::U256; use op_revm::L1BlockInfo; use parking_lot::RwLock; use reth_chainspec::ChainSpecProvider; @@ -13,6 +14,7 @@ use reth_transaction_pool::{ error::InvalidPoolTransactionError, EthPoolTransaction, EthTransactionValidator, TransactionOrigin, TransactionValidationOutcome, TransactionValidator, }; +use reth_optimism_primitives::is_gasless; use std::sync::{ atomic::{AtomicBool, AtomicU64, Ordering}, Arc, @@ -259,15 +261,19 @@ where let encoded = valid_tx.transaction().encoded_2718(); - let cost_addition = match l1_block_info.l1_tx_data_fee( - self.chain_spec(), - self.block_timestamp(), - &encoded, - false, - ) { - Ok(cost) => cost, - Err(err) => { - return TransactionValidationOutcome::Error(*valid_tx.hash(), Box::new(err)) + let cost_addition = if is_gasless(valid_tx.transaction()) { + U256::ZERO + } else { + match l1_block_info.l1_tx_data_fee( + self.chain_spec(), + self.block_timestamp(), + &encoded, + false, + ) { + Ok(cost) => cost, + Err(err) => { + return TransactionValidationOutcome::Error(*valid_tx.hash(), Box::new(err)) + } } }; let cost = valid_tx.transaction().cost().saturating_add(cost_addition); diff --git a/crates/rpc/rpc-eth-api/Cargo.toml b/crates/rpc/rpc-eth-api/Cargo.toml index 44637d1931c..adc07dd0582 100644 --- a/crates/rpc/rpc-eth-api/Cargo.toml +++ b/crates/rpc/rpc-eth-api/Cargo.toml @@ -13,7 +13,7 @@ workspace = true [dependencies] # reth -revm = { workspace = true, features = ["optional_block_gas_limit", "optional_eip3607", "optional_no_base_fee"] } +revm = { workspace = true, features = ["optional_block_gas_limit", "optional_eip3607", "optional_no_base_fee", "optional_gasless"] } reth-chain-state.workspace = true revm-inspectors.workspace = true reth-primitives-traits = { workspace = true, features = ["rpc-compat"] } diff --git a/crates/transaction-pool/Cargo.toml b/crates/transaction-pool/Cargo.toml index 02030719840..919f15f0b38 100644 --- a/crates/transaction-pool/Cargo.toml +++ b/crates/transaction-pool/Cargo.toml @@ -15,6 +15,7 @@ workspace = true # reth reth-chain-state.workspace = true reth-ethereum-primitives.workspace = true +reth-optimism-primitives.workspace = true reth-chainspec.workspace = true reth-eth-wire-types.workspace = true reth-primitives-traits.workspace = true @@ -90,6 +91,7 @@ serde = [ "revm-primitives/serde", "reth-primitives-traits/serde", "reth-ethereum-primitives/serde", + "reth-optimism-primitives/serde", "reth-chain-state/serde", "reth-storage-api/serde", ] diff --git a/crates/transaction-pool/src/ordering.rs b/crates/transaction-pool/src/ordering.rs index c6554220336..ae0afe34f2a 100644 --- a/crates/transaction-pool/src/ordering.rs +++ b/crates/transaction-pool/src/ordering.rs @@ -83,6 +83,13 @@ where base_fee: u64, ) -> Priority { transaction.effective_tip_per_gas(base_fee).map(U256::from).into() + // TODO: give top priority to gasless transactions + // match transaction.effective_tip_per_gas(base_fee) { + // Some(tip) => Priority::Value(U256::from(tip)), + // // Gasless transactions (no effective tip) get the highest priority to ensure they are + // // selected for inclusion. + // Some(0) => Priority::Value(U256::MAX), + // } } } diff --git a/crates/transaction-pool/src/pool/best.rs b/crates/transaction-pool/src/pool/best.rs index 0066a51aaf6..3d085412a0f 100644 --- a/crates/transaction-pool/src/pool/best.rs +++ b/crates/transaction-pool/src/pool/best.rs @@ -15,6 +15,7 @@ use std::{ }; use tokio::sync::broadcast::{error::TryRecvError, Receiver}; use tracing::debug; +use reth_optimism_primitives::is_gasless; /// An iterator that returns transactions that can be executed on the current state (*best* /// transactions). @@ -54,8 +55,10 @@ impl Iterator for BestTransactionsWithFees { loop { let best = Iterator::next(&mut self.best)?; // If both the base fee and blob fee (if applicable for EIP-4844) are satisfied, return - // the transaction - if best.transaction.max_fee_per_gas() >= self.base_fee as u128 && + // the transaction. For gasless transactions (priority fee or legacy price == 0) we + // bypass base fee filtering entirely so they can be considered for inclusion. + if (is_gasless(&best.transaction) || + best.transaction.max_fee_per_gas() >= self.base_fee as u128) && best.transaction .max_fee_per_blob_gas() .is_none_or(|fee| fee >= self.base_fee_per_blob_gas as u128) diff --git a/crates/transaction-pool/src/pool/txpool.rs b/crates/transaction-pool/src/pool/txpool.rs index 8c7cb0fea0f..c258d932509 100644 --- a/crates/transaction-pool/src/pool/txpool.rs +++ b/crates/transaction-pool/src/pool/txpool.rs @@ -41,6 +41,7 @@ use std::{ sync::Arc, }; use tracing::trace; +use reth_optimism_primitives::is_gasless; #[cfg_attr(doc, aquamarine::aquamarine)] // TODO: Inlined diagram due to a bug in aquamarine library, should become an include when it's @@ -1561,6 +1562,12 @@ impl AllTransactions { /// Rechecks the transaction's dynamic fee condition. fn update_tx_base_fee(pending_block_base_fee: u64, tx: &mut PoolInternalTransaction) { // Recheck dynamic fee condition. + // Gasless transactions (no effective tip) should always satisfy fee-cap for selection. + if is_gasless(&tx.transaction.transaction) { + tx.state.insert(TxState::ENOUGH_FEE_CAP_BLOCK); + return + } + match tx.transaction.max_fee_per_gas().cmp(&(pending_block_base_fee as u128)) { Ordering::Greater | Ordering::Equal => { tx.state.insert(TxState::ENOUGH_FEE_CAP_BLOCK); @@ -1920,19 +1927,20 @@ impl AllTransactions { // Check dynamic fee. Bypass protocol basefee check for gasless transactions (0/0 or legacy 0). let fee_cap = transaction.max_fee_per_gas(); - let is_gasless = match transaction.tx_type() { - LEGACY_TX_TYPE_ID => transaction.priority_fee_or_price() == 0, - EIP1559_TX_TYPE_ID => { - transaction.max_fee_per_gas() == 0 && transaction.priority_fee_or_price() == 0 - } - _ => false, - }; - if !is_gasless && fee_cap < self.minimal_protocol_basefee as u128 { - return Err(InsertErr::FeeCapBelowMinimumProtocolFeeCap { transaction, fee_cap }); - } - if is_gasless || fee_cap >= self.pending_fees.base_fee as u128 { + // Gasless transactions (no effective tip) should always be eligible with respect to + // basefee, provided they meet the minimal protocol fee cap requirement. This ensures they + // are returned by best_transactions. + if is_gasless(&transaction.transaction) { + // Mark as satisfying fee cap regardless of current pending base fee. state.insert(TxState::ENOUGH_FEE_CAP_BLOCK); + } else { + if fee_cap < self.minimal_protocol_basefee as u128 { + return Err(InsertErr::FeeCapBelowMinimumProtocolFeeCap { transaction, fee_cap }) + } + if fee_cap >= self.pending_fees.base_fee as u128 { + state.insert(TxState::ENOUGH_FEE_CAP_BLOCK); + } } // placeholder for the replaced transaction, if any @@ -2986,6 +2994,21 @@ mod tests { assert!(state.contains(TxState::NOT_TOO_MUCH_GAS)); } + #[test] + fn accept_legacy_zero_gas_price() { + let on_chain_balance = U256::ZERO; + let on_chain_nonce = 0; + let mut f = MockTransactionFactory::default(); + let mut pool = AllTransactions::default(); + + // Legacy (type 0) tx with gas price 0 and sufficient gas limit for a simple call + let tx = + MockTransaction::legacy().with_gas_price(0).with_gas_limit(21_000).with_value(U256::ZERO); + + // Should be accepted by the pool + let _ok = pool.insert_tx(f.validated(tx), on_chain_balance, on_chain_nonce).unwrap(); + } + #[test] fn update_basefee_subpools() { let mut f = MockTransactionFactory::default(); From 428c30d49f9cedc1bdd2c301d03f12814a761633 Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Tue, 19 Aug 2025 19:59:57 +0100 Subject: [PATCH 09/36] fix overwrite is_gasless --- crates/optimism/txpool/src/validator.rs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/crates/optimism/txpool/src/validator.rs b/crates/optimism/txpool/src/validator.rs index 81b96825217..904862ffe25 100644 --- a/crates/optimism/txpool/src/validator.rs +++ b/crates/optimism/txpool/src/validator.rs @@ -238,15 +238,7 @@ where { // Bypass L1 data gas cost requirement for gasless transactions let tx = valid_tx.transaction(); - let is_gasless = match tx.ty() { - alloy_consensus::constants::LEGACY_TX_TYPE_ID => tx.priority_fee_or_price() == 0, - alloy_consensus::constants::EIP1559_TX_TYPE_ID => { - tx.max_fee_per_gas() == 0 && tx.max_priority_fee_per_gas() == Some(0) - } - _ => false, - }; - - if is_gasless { + if is_gasless(tx) { return TransactionValidationOutcome::Valid { balance, state_nonce, From bef47fcdebc64db6d8d832cb528cad8c1baa1bcb Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Tue, 19 Aug 2025 20:37:42 +0100 Subject: [PATCH 10/36] add gas-station to workspace dependencies --- Cargo.lock | 1 + Cargo.toml | 1 + crates/optimism/payload/Cargo.toml | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index a8c5e4435ca..07902128d9c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9367,6 +9367,7 @@ dependencies = [ "reth-chainspec", "reth-evm", "reth-execution-types", + "reth-gas-station", "reth-optimism-evm", "reth-optimism-forks", "reth-optimism-primitives", diff --git a/Cargo.toml b/Cargo.toml index b96f6f3dfd4..16c66ee2d4f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -379,6 +379,7 @@ reth-exex = { path = "crates/exex/exex" } reth-exex-test-utils = { path = "crates/exex/test-utils" } reth-exex-types = { path = "crates/exex/types" } reth-fs-util = { path = "crates/fs-util" } +reth-gas-station = { path = "crates/gas-station" } reth-invalid-block-hooks = { path = "crates/engine/invalid-block-hooks" } reth-ipc = { path = "crates/rpc/ipc" } reth-libmdbx = { path = "crates/storage/libmdbx-rs" } diff --git a/crates/optimism/payload/Cargo.toml b/crates/optimism/payload/Cargo.toml index 8d1875fe753..44206c99f71 100644 --- a/crates/optimism/payload/Cargo.toml +++ b/crates/optimism/payload/Cargo.toml @@ -27,6 +27,8 @@ reth-payload-primitives = { workspace = true, features = ["op"] } reth-basic-payload-builder.workspace = true reth-chain-state.workspace = true reth-payload-validator.workspace = true +reth-gas-station.workspace = true + # op-reth reth-optimism-evm.workspace = true @@ -50,4 +52,4 @@ derive_more.workspace = true tracing.workspace = true thiserror.workspace = true sha2.workspace = true -serde.workspace = true +serde.workspace = true \ No newline at end of file From 109246654508c79f167a20d7c28d930b64beab44 Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Wed, 20 Aug 2025 13:15:41 +0100 Subject: [PATCH 11/36] validate gasless --- crates/optimism/payload/src/builder.rs | 42 ++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/crates/optimism/payload/src/builder.rs b/crates/optimism/payload/src/builder.rs index 705f7091b5f..8af414278bf 100644 --- a/crates/optimism/payload/src/builder.rs +++ b/crates/optimism/payload/src/builder.rs @@ -41,8 +41,9 @@ use reth_storage_api::{errors::ProviderError, StateProvider, StateProviderFactor use reth_transaction_pool::{BestTransactionsAttributes, PoolTransaction, TransactionPool}; use revm::context::{Block, BlockEnv}; use std::{marker::PhantomData, sync::Arc}; -use tracing::{debug, trace, warn}; +use tracing::{info, debug, trace, warn}; use reth_optimism_primitives::is_gasless; +use reth_gas_station::{validate_gasless_tx, GasStationConfig, GAS_STATION_PREDEPLOY, GAS_STATION_STORAGE_LOCATION}; /// Optimism's payload builder #[derive(Debug)] @@ -355,7 +356,10 @@ impl OpBuilder<'_, Txs> { // 3. if mem pool transactions are requested we execute them if !ctx.attributes().no_tx_pool() { let best_txs = best(ctx.best_transaction_attributes(builder.evm_mut().block())); - if ctx.execute_best_transactions(&mut info, &mut builder, best_txs)?.is_some() { + if ctx + .execute_best_transactions(&mut info, &mut builder, &state_provider, best_txs)? + .is_some() + { return Ok(BuildOutcomeKind::Cancelled) } @@ -664,6 +668,7 @@ where &self, info: &mut ExecutionInfo, builder: &mut impl BlockBuilder, + state_provider: &impl StateProvider, mut best_txs: impl PayloadTransactions< Transaction: PoolTransaction> + OpPooledTx, >, @@ -710,6 +715,39 @@ where return Ok(Some(())) } + // validate the gasless transaction + if is_gasless(tx.as_ref()) { + // do we allow create transactions??? + let to = match tx.kind() { + alloy_primitives::TxKind::Call(to) => to, + alloy_primitives::TxKind::Create => { + info!("gasless transaction is a create transaction, skipping"); + best_txs.mark_invalid(tx.signer(), tx.nonce()); + continue + } + }; + let from = tx.signer(); + let gas_limit = tx.gas_limit(); + let mut gas_cfg = GasStationConfig::default(); + // temporary enable gasless transactions + // Idk where to put this config, it can be a run time flag??? + gas_cfg.enabled = true; + gas_cfg.address = GAS_STATION_PREDEPLOY; + if let Err(_e) = validate_gasless_tx( + &gas_cfg, + state_provider, + GAS_STATION_STORAGE_LOCATION, + to, + from, + gas_limit, + None, + ) { + info!("gasless transaction validation failed: {:?}", _e); + best_txs.mark_invalid(tx.signer(), tx.nonce()); + continue + } + } + let gas_used = match builder.execute_transaction(tx.clone()) { Ok(gas_used) => gas_used, Err(BlockExecutionError::Validation(BlockValidationError::InvalidTx { From 2de401ee040815c5ca51046ad34967c636935c31 Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Wed, 20 Aug 2025 19:15:51 +0100 Subject: [PATCH 12/36] add missing contract impl address to dev json --- .../optimism/chainspec/res/genesis/dev.json | 140 +++++++++++++++++- 1 file changed, 139 insertions(+), 1 deletion(-) diff --git a/crates/optimism/chainspec/res/genesis/dev.json b/crates/optimism/chainspec/res/genesis/dev.json index 2cca537c68c..01718fd8b8c 100644 --- a/crates/optimism/chainspec/res/genesis/dev.json +++ b/crates/optimism/chainspec/res/genesis/dev.json @@ -73,11 +73,149 @@ "storage": { "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000001", "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30001", - "0x64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e000": "0x000000000000000000000000974e1a6b0d3a6853f66c8044c946f32684e6433e", + "0x64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", "0x64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e003": "0x0000000000000000000000000000000000000000000000000000000000000001", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000004200000000000000000000000000000000000018" }, "balance": "0x0" + }, + "4e59b44847b379578588920ca78fbf26c0b4956c": { + "code": "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3", + "balance": "0x0", + "nonce": "0x1" + }, + "5ff137d4b0fdcd49dca30c7cf57e578a026d2789": { + "code": "0x60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000007fc98430eaedbb6070b35b39d798725049088348165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033", + "balance": "0x0", + "nonce": "0x1" + }, + "69f4d1788e39c87893c980c06edf4b7f686e2938": { + "code": "0x6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506127d7565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b81019080803590602001909291908035906020019092919050505061280d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b8101908080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ac565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612c3e565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d78565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132b5565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506132da565b005b348015610d3457600080fd5b50610d3d613369565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613512565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613518565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061353a565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff1690602001909291905050506136f8565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613820565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613a12565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613bb1565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bde565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f6f565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ff3565b005b34801561148957600080fd5b50611492614665565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061466f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614817565b005b3480156116a457600080fd5b506116ad614878565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506148f6565b005b34801561174a57600080fd5b50611753614d29565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612c3e565b5b5050565b611bd2604182614e0590919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614e3f565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614e0590919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614e6e90919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614e6e90919063ffffffff16565b614e6e90919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156126bc5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61272e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61273b858585855a614e8d565b9050801561278b573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a26127cf565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b600060606127e7868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561282b57600080fd5b506040519080825280601f01601f19166020018201604052801561285e5781602001600182028036833780820191505090505b50905060005b8381101561288957808501548060208302602085010152508080600101915050612864565b508091505092915050565b60076020528060005260406000206000915090505481565b6128b4614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561291e5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612c46614d62565b600354811115612cbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806000612d928e8e8e8e8e8e8e8e8e8e60055461466f565b905060056000815480929190600101919050555080805190602001209150612dbb8282866132da565b506000612dc6614ed9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fac578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612e6957fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015612f3b578082015181840152602081019050612f20565b50505050905090810190601f168015612f685780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505050505b6101f4612fd36109c48b01603f60408d0281612fc457fe5b04614f0a90919063ffffffff16565b015a1015613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506130b28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146130a7578e6130ad565b6109c45a035b614e8d565b93506130c75a82614f2490919063ffffffff16565b905083806130d6575060008a14155b806130e2575060008814155b613154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008089111561316e5761316b828b8b8b8b614f44565b90505b84156131b8577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a16131f8565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146132a4578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111613357576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61336384848484611bbe565b50505050565b6060600060035467ffffffffffffffff8111801561338657600080fd5b506040519080825280602002602001820160405280156133b55781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613509578083838151811061346057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818060010192505061341f565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6135858a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961514a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135c3576135c28461564a565b5b6136118787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615679565b600082111561362b5761362982600060018685614f44565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a905061374f878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a614e8d565b61375857600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137e55780820151818401526020810190506137ca565b50505050905090810190601f1680156138125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561383b57600080fd5b5060405190808252806020026020018201604052801561386a5781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561393d5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561394857508482105b15613a03578084838151811061395a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506138d3565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613bc68c8c8c8c8c8c8c8c8c8c8c61466f565b8051906020012090509b9a5050505050505050505050565b613be6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c505750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613f77614d62565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613ffb614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156140655750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561409d57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61410f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561427a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6142ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146143ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561470057fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b61478c614878565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b61481f614d62565b6148288161564a565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6148a66125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b6148fe614d62565b806001600354031015614979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149e35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414614d2457614d2381612c3e565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614e03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614e185760009050614e39565b6000828402905082848281614e2957fe5b0414614e3457600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614e8357600080fd5b8091505092915050565b6000600180811115614e9b57fe5b836001811115614ea757fe5b1415614ec0576000808551602087018986f49050614ed0565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015614f1a5781614f1c565b825b905092915050565b600082821115614f3357600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614f815782614f83565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561509b57614fed3a8610614fca573a614fcc565b855b614fdf888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615140565b6150c0856150b2888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91506150cd8482846158b4565b61513f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146151c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8151811115615239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018110156152b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156155b65760008482815181106152d057fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153445750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561537c57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156153b457508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506152b9565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461577b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158b05761583d8260008360015a614e8d565b6158af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d6000811461595b5760208114615963576000935061596e565b81935061596e565b600051158215171593505b505050939250505056fea26469706673582212203874bcf92e1722cc7bfa0cef1a0985cf0dc3485ba0663db3747ccdf1605df53464736f6c63430007060033", + "balance": "0x0", + "nonce": "0x1" + }, + "7fc98430eaedbb6070b35b39d798725049088348": { + "code": "0x6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033", + "balance": "0x0", + "nonce": "0x1" + }, + "914d7fec6aac8cd542e72bca78b30650d45643d7": { + "code": "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3", + "balance": "0x0", + "nonce": "0x1" + }, + "998739bfdaadde7c933b942a68053933098f9eda": { + "code": "0x60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b7f000000000000000000000000998739bfdaadde7c933b942a68053933098f9eda73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610183576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806102106030913960400191505060405180910390fd5b805160205b8181101561020a578083015160f81c6001820184015160601c6015830185015160358401860151605585018701600085600081146101cd57600181146101dd576101e8565b6000808585888a5af191506101e8565b6000808585895af491505b5060008114156101f757600080fd5b8260550187019650505050505050610188565b50505056fe4d756c746953656e642073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca26469706673582212205c784303626eec02b71940b551976170b500a8a36cc5adcbeb2c19751a76d05464736f6c63430007060033", + "balance": "0x0", + "nonce": "0x1" + }, + "a1dabef33b3b82c7814b6d82a79e50f4ac44102b": { + "code": "0x60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b805160205b8181101561015f578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811461012857600181146101385761013d565b6000808585888a5af1915061013d565b600080fd5b50600081141561014c57600080fd5b82605501870196505050505050506100e3565b50505056fea264697066735822122035246402746c96964495cae5b36461fd44dfb89f8e6cf6f6b8d60c0aa89f414864736f6c63430007060033", + "balance": "0x0", + "nonce": "0x1" + }, + "ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed": { + "code": "0x60806040526004361061018a5760003560e01c806381503da1116100d6578063d323826a1161007f578063e96deee411610059578063e96deee414610395578063f5745aba146103a8578063f9664498146103bb57600080fd5b8063d323826a1461034f578063ddda0acb1461036f578063e437252a1461038257600080fd5b80639c36a286116100b05780639c36a28614610316578063a7db93f214610329578063c3fe107b1461033c57600080fd5b806381503da1146102d0578063890c283b146102e357806398e810771461030357600080fd5b80632f990e3f116101385780636cec2536116101125780636cec25361461027d57806374637a7a1461029d5780637f565360146102bd57600080fd5b80632f990e3f1461023757806331a7c8c81461024a57806342d654fc1461025d57600080fd5b806327fe18221161016957806327fe1822146101f15780632852527a1461020457806328ddd0461461021757600080fd5b8062d84acb1461018f57806326307668146101cb57806326a32fc7146101de575b600080fd5b6101a261019d366004612915565b6103ce565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6101a26101d9366004612994565b6103e6565b6101a26101ec3660046129db565b610452565b6101a26101ff3660046129db565b6104de565b6101a2610212366004612a39565b610539565b34801561022357600080fd5b506101a2610232366004612a90565b6106fe565b6101a2610245366004612aa9565b61072a565b6101a2610258366004612aa9565b6107bb565b34801561026957600080fd5b506101a2610278366004612b1e565b6107c9565b34801561028957600080fd5b506101a2610298366004612a90565b610823565b3480156102a957600080fd5b506101a26102b8366004612b4a565b61084f565b6101a26102cb3660046129db565b611162565b6101a26102de366004612b74565b6111e8565b3480156102ef57600080fd5b506101a26102fe366004612bac565b611276565b6101a2610311366004612bce565b6112a3565b6101a2610324366004612994565b611505565b6101a2610337366004612c49565b6116f1565b6101a261034a366004612aa9565b611964565b34801561035b57600080fd5b506101a261036a366004612cd9565b6119ed565b6101a261037d366004612c49565b611a17565b6101a2610390366004612bce565b611e0c565b6101a26103a3366004612915565b611e95565b6101a26103b6366004612bce565b611ea4565b6101a26103c9366004612b74565b611f2d565b60006103dd8585858533611a17565b95945050505050565b6000806103f2846120db565b90508083516020850134f59150610408826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a35092915050565b60006104d86104d260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b836103e6565b92915050565b600081516020830134f090506104f3816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a2919050565b600080610545856120db565b905060008460601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f593505073ffffffffffffffffffffffffffffffffffffffff8316610635576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed1660048201526024015b60405180910390fd5b604051829073ffffffffffffffffffffffffffffffffffffffff8516907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808473ffffffffffffffffffffffffffffffffffffffff1634876040516106a19190612d29565b60006040518083038185875af1925050503d80600081146106de576040519150601f19603f3d011682016040523d82523d6000602084013e6106e3565b606091505b50915091506106f382828961247d565b505050509392505050565b60006104d87f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed8361084f565b60006107b36107aa60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b85858533611a17565b949350505050565b60006107b3848484336112a3565b60006040518260005260ff600b53836020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b20601452806040525061d694600052600160345350506017601e20919050565b60006104d8827f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed6107c9565b600060607f9400000000000000000000000000000000000000000000000000000000000000610887600167ffffffffffffffff612d45565b67ffffffffffffffff16841115610902576040517f3c55ab3b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b836000036109c7576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f800000000000000000000000000000000000000000000000000000000000000060368201526037015b6040516020818303038152906040529150611152565b607f8411610a60576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b16602283015260f886901b1660368201526037016109b1565b60ff8411610b1f576040517fd70000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660228301527f8100000000000000000000000000000000000000000000000000000000000000603683015260f886901b1660378201526038016109b1565b61ffff8411610bff576040517fd80000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f820000000000000000000000000000000000000000000000000000000000000060368201527fffff00000000000000000000000000000000000000000000000000000000000060f086901b1660378201526039016109b1565b62ffffff8411610ce0576040517fd90000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f830000000000000000000000000000000000000000000000000000000000000060368201527fffffff000000000000000000000000000000000000000000000000000000000060e886901b166037820152603a016109b1565b63ffffffff8411610dc2576040517fda0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f840000000000000000000000000000000000000000000000000000000000000060368201527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b166037820152603b016109b1565b64ffffffffff8411610ea5576040517fdb0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f850000000000000000000000000000000000000000000000000000000000000060368201527fffffffffff00000000000000000000000000000000000000000000000000000060d886901b166037820152603c016109b1565b65ffffffffffff8411610f89576040517fdc0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f860000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffff000000000000000000000000000000000000000000000000000060d086901b166037820152603d016109b1565b66ffffffffffffff841161106e576040517fdd0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f870000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffff0000000000000000000000000000000000000000000000000060c886901b166037820152603e016109b1565b6040517fde0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f880000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b166037820152603f0160405160208183030381529060405291505b5080516020909101209392505050565b60006104d86111e260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b83611505565b600061126f61126860408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b8484610539565b9392505050565b600061126f83837f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed6119ed565b60008451602086018451f090506112b9816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808273ffffffffffffffffffffffffffffffffffffffff168560200151876040516113279190612d29565b60006040518083038185875af1925050503d8060008114611364576040519150601f19603f3d011682016040523d82523d6000602084013e611369565b606091505b5091509150816113c9577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed1631156114fb578373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611495576040519150601f19603f3d011682016040523d82523d6000602084013e61149a565b606091505b509092509050816114fb577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b5050949350505050565b600080611511846120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166115e0576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a361162c83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1634876040516116569190612d29565b60006040518083038185875af1925050503d8060008114611693576040519150601f19603f3d011682016040523d82523d6000602084013e611698565b606091505b505090506116a681866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a25050505092915050565b6000806116fd876120db565b9050808651602088018651f59150611714826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808373ffffffffffffffffffffffffffffffffffffffff168660200151886040516117849190612d29565b60006040518083038185875af1925050503d80600081146117c1576040519150601f19603f3d011682016040523d82523d6000602084013e6117c6565b606091505b509150915081611826577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed163115611958578473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d80600081146118f2576040519150601f19603f3d011682016040523d82523d6000602084013e6118f7565b606091505b50909250905081611958577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b50505095945050505050565b60006107b36119e460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b858585336116f1565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b600080611a23876120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff8116611af2576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a3611b3e83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1687600001518a604051611b6c9190612d29565b60006040518083038185875af1925050503d8060008114611ba9576040519150601f19603f3d011682016040523d82523d6000602084013e611bae565b606091505b50509050611bbc81866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a260608573ffffffffffffffffffffffffffffffffffffffff1688602001518a604051611c299190612d29565b60006040518083038185875af1925050503d8060008114611c66576040519150601f19603f3d011682016040523d82523d6000602084013e611c6b565b606091505b50909250905081611ccc577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed163115611dfe578673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611d98576040519150601f19603f3d011682016040523d82523d6000602084013e611d9d565b606091505b50909250905081611dfe577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050505095945050505050565b60006103dd611e8c60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b868686866116f1565b60006103dd85858585336116f1565b60006103dd611f2460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b86868686611a17565b6000808360601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f092505073ffffffffffffffffffffffffffffffffffffffff8216612016576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808373ffffffffffffffffffffffffffffffffffffffff1634866040516120809190612d29565b60006040518083038185875af1925050503d80600081146120bd576040519150601f19603f3d011682016040523d82523d6000602084013e6120c2565b606091505b50915091506120d282828861247d565b50505092915050565b60008060006120e9846125b3565b9092509050600082600281111561210257612102612e02565b1480156121205750600081600281111561211e5761211e612e02565b145b1561215e57604080513360208201524691810191909152606081018590526080016040516020818303038152906040528051906020012092506123cc565b600082600281111561217257612172612e02565b1480156121905750600181600281111561218e5761218e612e02565b145b156121b0576121a9338560009182526020526040902090565b92506123cc565b60008260028111156121c4576121c4612e02565b03612233576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b600182600281111561224757612247612e02565b1480156122655750600081600281111561226357612263612e02565b145b1561227e576121a9468560009182526020526040902090565b600182600281111561229257612292612e02565b1480156122b0575060028160028111156122ae576122ae612e02565b145b1561231f576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b61239a60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b84036123a657836123c9565b604080516020810186905201604051602081830303815290604052805190602001205b92505b5050919050565b73ffffffffffffffffffffffffffffffffffffffff8116158061240b575073ffffffffffffffffffffffffffffffffffffffff81163b155b1561247a576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b50565b82158061249f575073ffffffffffffffffffffffffffffffffffffffff81163b155b156124fa577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed826040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050565b811580612520575073ffffffffffffffffffffffffffffffffffffffff8116155b80612540575073ffffffffffffffffffffffffffffffffffffffff81163b155b156125af576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b5050565b600080606083901c3314801561261057508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b1561262057506000905080915091565b606083901c3314801561265a57507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561266b5750600090506001915091565b33606084901c036126825750600090506002915091565b606083901c1580156126db57508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b156126ec5750600190506000915091565b606083901c15801561272557507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561273557506001905080915091565b606083901c61274a5750600190506002915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000036127a55750600290506000915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166000036127e15750600290506001915091565b506002905080915091565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261282c57600080fd5b813567ffffffffffffffff80821115612847576128476127ec565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561288d5761288d6127ec565b816040528381528660208588010111156128a657600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000604082840312156128d857600080fd5b6040516040810181811067ffffffffffffffff821117156128fb576128fb6127ec565b604052823581526020928301359281019290925250919050565b60008060008060a0858703121561292b57600080fd5b84359350602085013567ffffffffffffffff8082111561294a57600080fd5b6129568883890161281b565b9450604087013591508082111561296c57600080fd5b506129798782880161281b565b92505061298986606087016128c6565b905092959194509250565b600080604083850312156129a757600080fd5b82359150602083013567ffffffffffffffff8111156129c557600080fd5b6129d18582860161281b565b9150509250929050565b6000602082840312156129ed57600080fd5b813567ffffffffffffffff811115612a0457600080fd5b6107b38482850161281b565b803573ffffffffffffffffffffffffffffffffffffffff81168114612a3457600080fd5b919050565b600080600060608486031215612a4e57600080fd5b83359250612a5e60208501612a10565b9150604084013567ffffffffffffffff811115612a7a57600080fd5b612a868682870161281b565b9150509250925092565b600060208284031215612aa257600080fd5b5035919050565b600080600060808486031215612abe57600080fd5b833567ffffffffffffffff80821115612ad657600080fd5b612ae28783880161281b565b94506020860135915080821115612af857600080fd5b50612b058682870161281b565b925050612b1585604086016128c6565b90509250925092565b60008060408385031215612b3157600080fd5b82359150612b4160208401612a10565b90509250929050565b60008060408385031215612b5d57600080fd5b612b6683612a10565b946020939093013593505050565b60008060408385031215612b8757600080fd5b612b9083612a10565b9150602083013567ffffffffffffffff8111156129c557600080fd5b60008060408385031215612bbf57600080fd5b50508035926020909101359150565b60008060008060a08587031215612be457600080fd5b843567ffffffffffffffff80821115612bfc57600080fd5b612c088883890161281b565b95506020870135915080821115612c1e57600080fd5b50612c2b8782880161281b565b935050612c3b86604087016128c6565b915061298960808601612a10565b600080600080600060c08688031215612c6157600080fd5b85359450602086013567ffffffffffffffff80821115612c8057600080fd5b612c8c89838a0161281b565b95506040880135915080821115612ca257600080fd5b50612caf8882890161281b565b935050612cbf87606088016128c6565b9150612ccd60a08701612a10565b90509295509295909350565b600080600060608486031215612cee57600080fd5b8335925060208401359150612b1560408501612a10565b60005b83811015612d20578181015183820152602001612d08565b50506000910152565b60008251612d3b818460208701612d05565b9190910192915050565b67ffffffffffffffff828116828216039080821115612d8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260008251806040840152612dcf816060850160208701612d05565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000817000a", + "balance": "0x0", + "nonce": "0x1" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30000": { + "code": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d501461004657806382e3702d14610098578063cafa81dc146100cb575b600080fd5b6100826040518060400160405280600c81526020017f312e312e312d626574612e33000000000000000000000000000000000000000081525081565b60405161008f919061019b565b60405180910390f35b6100bb6100a63660046101ec565b60006020819052908152604090205460ff1681565b604051901515815260200161008f565b6100de6100d9366004610234565b6100e0565b005b600160008083336040516020016100f8929190610303565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301208352908201929092520160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550565b60005b8381101561018657818101518382015260200161016e565b83811115610195576000848401525b50505050565b60208152600082518060208401526101ba81604085016020870161016b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000602082840312156101fe57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561024657600080fd5b813567ffffffffffffffff8082111561025e57600080fd5b818401915084601f83011261027257600080fd5b81358181111561028457610284610205565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156102ca576102ca610205565b816040528281528760208487010111156102e357600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000835161031581846020880161016b565b60609390931b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014019291505056fea164736f6c634300080f000a", + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30001": { + "code": "0x6080604052600436106102385760003560e01c806386a0003c11610138578063c3c5a547116100b0578063d9ba32fc1161007f578063e73a914c11610064578063e73a914c146109b7578063f6e4b62b146109d7578063fac2c621146109f757600080fd5b8063d9ba32fc1461092f578063e559afd91461099757600080fd5b8063c3c5a54714610858578063c4d66de8146108bd578063c55b6bb7146108dd578063d124d1bc146108fd57600080fd5b80639e4f8ab811610107578063ad3e080a116100ec578063ad3e080a146107f8578063b6b3527214610818578063c375c2ef1461083857600080fd5b80639e4f8ab81461076c5780639f8a13d71461078e57600080fd5b806386a0003c146106a4578063871ff4051461070c5780638f4842da1461072c57806399c6066c1461074c57600080fd5b80633b66e9f6116101cb5780635cfbd78b1161019a57806364efb22b1161017f57806364efb22b1461053757806369dc9ff3146105a25780637901868e1461068457600080fd5b80635cfbd78b146105045780635e35359e1461051757600080fd5b80633b66e9f61461039b5780634162169f146104005780634782f7791461046b5780634f4e2e211461048b57600080fd5b80631c5d647c116102075780631c5d647c1461031b5780632be0a2951461033b5780632ce962cf1461035b578063368da1681461037b57600080fd5b8063108f5c6914610244578063139e0aa71461026657806314695ea41461027957806315ea16ad146102dd57600080fd5b3661023f57005b600080fd5b34801561025057600080fd5b5061026461025f366004613af3565b610a17565b005b610264610274366004613b71565b610c2e565b34801561028557600080fd5b506102c8610294366004613b9d565b60009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e002602052604090205460ff1690565b60405190151581526020015b60405180910390f35b3480156102e957600080fd5b507f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e003545b6040519081526020016102d4565b34801561032757600080fd5b50610264610336366004613bc4565b610e1f565b34801561034757600080fd5b50610264610356366004613bf4565b610f6f565b34801561036757600080fd5b50610264610376366004613bf4565b6110ef565b34801561038757600080fd5b50610264610396366004613b71565b6112f4565b3480156103a757600080fd5b5061030d6103b6366004613c22565b73ffffffffffffffffffffffffffffffffffffffff1660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604090206001015490565b34801561040c57600080fd5b507f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d4565b34801561047757600080fd5b50610264610486366004613b71565b6114ed565b34801561049757600080fd5b506102c86104a6366004613c3f565b73ffffffffffffffffffffffffffffffffffffffff91821660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602090815260408083209390941682526005909201909152205460ff1690565b610264610512366004613c6d565b611707565b34801561052357600080fd5b50610264610532366004613c6d565b611a4d565b34801561054357600080fd5b50610446610552366004613c22565b73ffffffffffffffffffffffffffffffffffffffff90811660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e00160205260409020546201000090041690565b3480156105ae57600080fd5b506106386105bd366004613c22565b73ffffffffffffffffffffffffffffffffffffffff90811660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0016020526040902080546001820154600283015460049093015460ff8084169661010085048216966201000090950490941694929392811692911690565b604080519615158752941515602087015273ffffffffffffffffffffffffffffffffffffffff9093169385019390935260608401529015156080830152151560a082015260c0016102d4565b34801561069057600080fd5b5061026461069f366004613cae565b611e05565b3480156106b057600080fd5b506102c86106bf366004613c22565b73ffffffffffffffffffffffffffffffffffffffff1660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604090206004015460ff1690565b34801561071857600080fd5b50610264610727366004613b71565b61207e565b34801561073857600080fd5b50610264610747366004613d21565b61219b565b34801561075857600080fd5b50610264610767366004613b71565b6123a8565b34801561077857600080fd5b506107816124a1565b6040516102d49190613da9565b34801561079a57600080fd5b506102c86107a9366004613c22565b73ffffffffffffffffffffffffffffffffffffffff1660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0016020526040902054610100900460ff1690565b34801561080457600080fd5b50610264610813366004613d21565b6125c8565b34801561082457600080fd5b506102c8610833366004613c3f565b6127d5565b34801561084457600080fd5b50610264610853366004613c22565b612888565b34801561086457600080fd5b506102c8610873366004613c22565b73ffffffffffffffffffffffffffffffffffffffff1660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604090205460ff1690565b3480156108c957600080fd5b506102646108d8366004613c22565b6129cd565b3480156108e957600080fd5b506102646108f8366004613c3f565b612bd5565b34801561090957600080fd5b5061091d610918366004613b9d565b612e32565b6040516102d496959493929190613ded565b34801561093b57600080fd5b506102c861094a366004613c22565b73ffffffffffffffffffffffffffffffffffffffff1660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604090206002015460ff1690565b3480156109a357600080fd5b506102646109b2366004613d21565b612f4c565b3480156109c357600080fd5b506102646109d2366004613c22565b61315e565b3480156109e357600080fd5b506102646109f2366004613bf4565b6132b3565b348015610a0357600080fd5b50610264610a12366004613c22565b613429565b7f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0005473ffffffffffffffffffffffffffffffffffffffff163314610a87576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000859003610ac2576040517f8dad8de600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710811115610afe576040517fe05f723400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008781527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e00260205260409020600181018054610b3a90613ea4565b9050600003610b75576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018101610b84878983613f75565b5060028101859055600381018490556004810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8516908117909155600582018390556040513391908a907f9b9245463835a6078680163f22703695356642f8cf6b65a6665a0882356334e890610c1c908c908c908c908c908b90614090565b60405180910390a45050505050505050565b600260005403610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600090815573ffffffffffffffffffffffffffffffffffffffff831681527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0016020526040902054829060ff16610d23576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d2e8361356e565b73ffffffffffffffffffffffffffffffffffffffff851660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0016020526040812060010180549293508392909190610d8a908490614124565b909155505060008381527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0026020908152604091829020600201548251848152918201523391859173ffffffffffffffffffffffffffffffffffffffff8816917f318bfca88e13e58196e4ede6142ef537ca3ef795b1decbb9e3de152a9952e5cc910160405180910390a4505060016000555050565b7f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0005473ffffffffffffffffffffffffffffffffffffffff163314610e8f576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e00260205260409020600181018054610ecb90613ea4565b9050600003610f06576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081178255604051908152339084907f2f4957288ef5019fe3f7a1074da21d82cdc2f8013c1ebba73450b423b493f525906020015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff80831660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604090205483917f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e000916201000090041633148015906110065750805473ffffffffffffffffffffffffffffffffffffffff163314155b1561103d576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841660008181527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602090815260409182902060040180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182523392917f82edf7f53728f732b3bcd1a19a1aaac6707e859838b247c07a8c90a199b0e32491015b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff80831660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604090205483917f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e000916201000090041633148015906111865750805473ffffffffffffffffffffffffffffffffffffffff163314155b156111bd576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0016020526040902054849060ff1661123d576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101008915159081029190911790915591519182523392917f173d95bbb28cfff9cf71289e1103c552da7a097c5d49798a535ed3756de8b8db91015b60405180910390a35050505050565b7f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0005473ffffffffffffffffffffffffffffffffffffffff163314611364576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0016020526040902054829060ff166113e4576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604090206001015482811015611466576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611470838261413c565b73ffffffffffffffffffffffffffffffffffffffff851660008181527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0016020908152604091829020600101939093555185815233927fd9875ab458eea009b6a28a26de3f99493da0f8e26f57e0f90ae77011e29b455191016110e1565b7f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0005473ffffffffffffffffffffffffffffffffffffffff16331461155d576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff81166115ab576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260005403611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c96565b600260009081554790831561162c578361162e565b815b90508181111561166a576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff86169082156108fc029083906000818181858888f193505050501580156116ad573d6000803e3d6000fd5b50604051818152339073ffffffffffffffffffffffffffffffffffffffff8716907f134d6e96840903022b8e4b57aa0644e9eb6ca6fe65a25205b0857fe918c2bcc69060200160405180910390a350506001600055505050565b8273ffffffffffffffffffffffffffffffffffffffff8116611755576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff81166117a3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026000540361180f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c96565b6002600090815573ffffffffffffffffffffffffffffffffffffffff861681527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604090205460ff1615611892576040517f3a81d6fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b843b60008190036118cf576040517f6eefed2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118da8561356e565b73ffffffffffffffffffffffffffffffffffffffff88811660008181527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604080822080546101017fffffffffffffffffffff0000000000000000000000000000000000000000000090911662010000968e169687021717815560018082018790556002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169091179055905194955093339392917f32cbeaec3f2fc4b88cd5d5b5ec778111e585d882f052b859822f696f5f7294da91a460008681527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0026020908152604091829020600201548251858152918201523391889173ffffffffffffffffffffffffffffffffffffffff8c16917f318bfca88e13e58196e4ede6142ef537ca3ef795b1decbb9e3de152a9952e5cc910160405180910390a450506001600055505050505050565b7f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0005473ffffffffffffffffffffffffffffffffffffffff163314611abd576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff8116611b0b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260005403611b77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c96565b600260005573ffffffffffffffffffffffffffffffffffffffff8416611bc9576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152849060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015611c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5c9190614153565b905060008415611c6c5784611c6e565b815b905081811115611caa576040517f43fb945300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015611d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d43919061416c565b611d79576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f4e5ba90310f16273bb12f3c33f23905e573b86df58a2895a525285d083bf043f84604051611def91815260200190565b60405180910390a4505060016000555050505050565b7f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0005473ffffffffffffffffffffffffffffffffffffffff163314611e75576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000859003611eb0576040517f8dad8de600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710811115611eec576040517fe05f723400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0035460008181527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811782557f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0009291908101611f97898b83613f75565b506002810187905560038082018790556004820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055600582018590558301805490600061200083614189565b91905055503373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16837fb85b834acc25b187c94ca1f210162af04e6c101f009bfa1f4375aa54604c30d08c8c8c8c8b60405161206b959493929190614090565b60405180910390a4505050505050505050565b7f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0005473ffffffffffffffffffffffffffffffffffffffff1633146120ee576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604081206001018054839290612145908490614124565b9091555050604051818152339073ffffffffffffffffffffffffffffffffffffffff8416907f037e75534584e8d0666405b1b62900a56de166245a53fca8675ef45f5365dcd29060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff80841660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604090205484917f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e000916201000090041633148015906122325750805473ffffffffffffffffffffffffffffffffffffffff163314155b15612269576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b838110156123485773ffffffffffffffffffffffffffffffffffffffff861660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e00160205260408120600501818787858181106122ce576122ce6141c1565b90506020020160208101906122e39190613c22565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790558061234081614189565b91505061226c565b503373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fad4278b4de5cef070d03d25a62128ea84e003c2f4328bdb44b971e8fa9fd0b0c86866040516112e59291906141f0565b7f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0005473ffffffffffffffffffffffffffffffffffffffff163314612418576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0016020908152604091829020600101805490859055825181815291820185905292339290917f90135813691c23bc6463dd8c2046f71d2b9a7878436bfbdd198dcbc5f776ea959101610f62565b60607f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e000600060015b826003015481101561250e57600081815260028401602052604090205460ff16156124fc57816124f881614189565b9250505b8061250681614189565b9150506124c9565b5060008167ffffffffffffffff81111561252a5761252a613ef7565b604051908082528060200260200182016040528015612553578160200160208202803683370190505b509050600060015b84600301548110156125be57600081815260028601602052604090205460ff16156125ac5780838381518110612593576125936141c1565b6020908102919091010152816125a881614189565b9250505b806125b681614189565b91505061255b565b5090949350505050565b73ffffffffffffffffffffffffffffffffffffffff80841660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604090205484917f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0009162010000900416331480159061265f5750805473ffffffffffffffffffffffffffffffffffffffff163314155b15612696576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b838110156127755773ffffffffffffffffffffffffffffffffffffffff861660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e00160205260408120600301818787858181106126fb576126fb6141c1565b90506020020160208101906127109190613c22565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790558061276d81614189565b915050612699565b503373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f6eb2830031dee414085447e3d1d03e5bd0c2271d79b033d098cfd444dccd33b986866040516112e59291906141f0565b73ffffffffffffffffffffffffffffffffffffffff821660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604081206002015460ff161580612881575073ffffffffffffffffffffffffffffffffffffffff83811660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e00160209081526040808320938616835260039093019052205460ff165b9392505050565b7f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0005473ffffffffffffffffffffffffffffffffffffffff1633146128f8576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604080822080547fffffffffffffffffffff00000000000000000000000000000000000000000000168155600181018390556002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116909155600490910180549091169055513392917f1de42a421eef953b12e8dffca9f7ba12e7962c982fc649e5e2c32ea0e7e3ca6491a350565b600154610100900460ff16158080156129ea57506001805460ff16105b80612a035750303b158015612a0357506001805460ff16145b612a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610c96565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790558015612aec57600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b7f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e00080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905560017f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e003558015612bd157600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1681556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff80831660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604090205483917f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e00091620100009004163314801590612c6c5750805473ffffffffffffffffffffffffffffffffffffffff163314155b15612ca3576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0016020526040902054849060ff16612d23576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff8116612d71576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86811660008181527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e00160209081526040918290208054620100008b87168181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff841617909355845133815294519104909516949093859390927f69feba90503661246e4691cb2fe465cc9acb27d5ae05f8b48a57eefa7c726fb192918290030190a450505050505050565b6000606081808080807f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e000600089815260029182016020526040902080549181015460038201546004830154600584015460018501805495975060ff909616959473ffffffffffffffffffffffffffffffffffffffff909216918590612eb690613ea4565b80601f0160208091040260200160405190810160405280929190818152602001828054612ee290613ea4565b8015612f2f5780601f10612f0457610100808354040283529160200191612f2f565b820191906000526020600020905b815481529060010190602001808311612f1257829003601f168201915b505050505094509650965096509650965096505091939550919395565b73ffffffffffffffffffffffffffffffffffffffff80841660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604090205484917f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e00091620100009004163314801590612fe35750805473ffffffffffffffffffffffffffffffffffffffff163314155b1561301a576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b838110156130fe5773ffffffffffffffffffffffffffffffffffffffff861660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e00160205260408120600191600390910190878785818110613084576130846141c1565b90506020020160208101906130999190613c22565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806130f681614189565b91505061301d565b503373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f0921dd4ce99f391e92d1907d1dafbc0ae9f95645171e132a4b0ec09863d4e30786866040516112e59291906141f0565b7f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0005473ffffffffffffffffffffffffffffffffffffffff1633146131ce576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff811661321c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e000805473ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f0429168a83556e356cd18563753346b9c9567cbf0fbea148d40aeb84a76cc5b990600090a3505050565b73ffffffffffffffffffffffffffffffffffffffff80831660009081527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604090205483917f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0009162010000900416331480159061334a5750805473ffffffffffffffffffffffffffffffffffffffff163314155b15613381576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841660008181527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602090815260409182902060020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182523392917fc216c05736611219062f8c847b62cd125972df155448dab8f40dbe52478c667f91016110e1565b7f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e0005473ffffffffffffffffffffffffffffffffffffffff163314613499576040517f4ead1a5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e001602052604080822080547fffffffffffffffffffff00000000000000000000000000000000000000000000168155600181018390556002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116909155600490910180549091169055513392917f6c0b8518b86a3f2aab1a16148ee99e9cce485dfb40b2c510326a696b577a6f4391a350565b60008181527f64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e002602052604081206001810180546135aa90613ea4565b90506000036135e5576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff16613620576040517fd1d5af5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600481015473ffffffffffffffffffffffffffffffffffffffff1661364d5761364881613698565b61368e565b3415613685576040517ffbccebae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61368e81613769565b6003015492915050565b80600201543410156136d6576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081600201543411156137255760028201546136f3903461413c565b604051909150339082156108fc029083906000818181858888f19350505050158015613723573d6000803e3d6000fd5b505b6002820154604080519182526020820183905233917fafac85d422e5be6fde01b75ba6728f402efe8347cac64dff6bb333b206af7f4a910160405180910390a25050565b60048181015460028301546040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152339381019390935230602484015273ffffffffffffffffffffffffffffffffffffffff90911691829063dd62ed3e90604401602060405180830381865afa1580156137e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061380d9190614153565b1015613845576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028201546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff8216906323b872dd906064016020604051808303816000875af11580156138c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e8919061416c565b61391e576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600582015460009015613a2a5761271083600501548460020154613942919061424b565b61394c9190614288565b6004808501546040517f42966c6800000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff16916342966c68916139a89185910190815260200190565b600060405180830381600087803b1580156139c257600080fd5b505af19250505080156139d3575060015b15613a2a57600483015460405182815273ffffffffffffffffffffffffffffffffffffffff909116907ffd38818f5291bf0bb3a2a48aadc06ba8757865d1dabd804585338aab3009dcb69060200160405180910390a25b60048301546002840154604080519182526020820184905273ffffffffffffffffffffffffffffffffffffffff9092169133917fd3d68b58dfdd3a4aa0e0c5b89a7baff1e842c8aa696a7bc16b941ab72022236a9101610f62565b60008083601f840112613a9757600080fd5b50813567ffffffffffffffff811115613aaf57600080fd5b602083019150836020828501011115613ac757600080fd5b9250929050565b73ffffffffffffffffffffffffffffffffffffffff81168114613af057600080fd5b50565b600080600080600080600060c0888a031215613b0e57600080fd5b87359650602088013567ffffffffffffffff811115613b2c57600080fd5b613b388a828b01613a85565b90975095505060408801359350606088013592506080880135613b5a81613ace565b8092505060a0880135905092959891949750929550565b60008060408385031215613b8457600080fd5b8235613b8f81613ace565b946020939093013593505050565b600060208284031215613baf57600080fd5b5035919050565b8015158114613af057600080fd5b60008060408385031215613bd757600080fd5b823591506020830135613be981613bb6565b809150509250929050565b60008060408385031215613c0757600080fd5b8235613c1281613ace565b91506020830135613be981613bb6565b600060208284031215613c3457600080fd5b813561288181613ace565b60008060408385031215613c5257600080fd5b8235613c5d81613ace565b91506020830135613be981613ace565b600080600060608486031215613c8257600080fd5b8335613c8d81613ace565b92506020840135613c9d81613ace565b929592945050506040919091013590565b60008060008060008060a08789031215613cc757600080fd5b863567ffffffffffffffff811115613cde57600080fd5b613cea89828a01613a85565b90975095505060208701359350604087013592506060870135613d0c81613ace565b80925050608087013590509295509295509295565b600080600060408486031215613d3657600080fd5b8335613d4181613ace565b9250602084013567ffffffffffffffff80821115613d5e57600080fd5b818601915086601f830112613d7257600080fd5b813581811115613d8157600080fd5b8760208260051b8501011115613d9657600080fd5b6020830194508093505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015613de157835183529284019291840191600101613dc5565b50909695505050505050565b86151581526000602060c08184015287518060c085015260005b81811015613e235789810183015185820160e001528201613e07565b81811115613e3557600060e083870101525b5060e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050856040830152846060830152613e93608083018573ffffffffffffffffffffffffffffffffffffffff169052565b8260a0830152979650505050505050565b600181811c90821680613eb857607f821691505b602082108103613ef1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f821115613f7057600081815260208120601f850160051c81016020861015613f4d5750805b601f850160051c820191505b81811015613f6c57828155600101613f59565b5050505b505050565b67ffffffffffffffff831115613f8d57613f8d613ef7565b613fa183613f9b8354613ea4565b83613f26565b6000601f841160018114613ff35760008515613fbd5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614089565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156140425786850135825560209485019460019092019101614022565b508682101561407d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60808152846080820152848660a0830137600060a08683010152600060a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f88011683010190508460208301528360408301528260608301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115614137576141376140f5565b500190565b60008282101561414e5761414e6140f5565b500390565b60006020828403121561416557600080fd5b5051919050565b60006020828403121561417e57600080fd5b815161288181613bb6565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141ba576141ba6140f5565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60208082528181018390526000908460408401835b8681101561424057823561421881613ace565b73ffffffffffffffffffffffffffffffffffffffff1682529183019190830190600101614205565b509695505050505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614283576142836140f5565b500290565b6000826142be577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea164736f6c634300080f000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x64d1d9a8a451551a9514a2c08ad4e1552ed316d7dd2778a4b9494de741d8e003": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30002": { + "code": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80638da5cb5b1161005b5780638da5cb5b146100fc5780639b19251a14610141578063b1540a0114610174578063bdc7b54f1461018757600080fd5b806308fd63221461008257806313af40351461009757806354fd4d50146100aa575b600080fd5b6100956100903660046106de565b61018f565b005b6100956100a536600461071a565b6102ef565b6100e66040518060400160405280600c81526020017f312e312e312d626574612e33000000000000000000000000000000000000000081525081565b6040516100f3919061073c565b60405180910390f35b60005461011c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f3565b61016461014f36600461071a565b60016020526000908152604090205460ff1681565b60405190151581526020016100f3565b61016461018236600461071a565b610520565b610095610571565b60005473ffffffffffffffffffffffffffffffffffffffff163314610261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4465706c6f79657257686974656c6973743a2066756e6374696f6e2063616e2060448201527f6f6e6c792062652063616c6c656420627920746865206f776e6572206f66207460648201527f68697320636f6e74726163740000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f8daaf060c3306c38e068a75c054bf96ecd85a3db1252712c4d93632744c42e0d910160405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4465706c6f79657257686974656c6973743a2066756e6374696f6e2063616e2060448201527f6f6e6c792062652063616c6c656420627920746865206f776e6572206f66207460648201527f68697320636f6e74726163740000000000000000000000000000000000000000608482015260a401610258565b73ffffffffffffffffffffffffffffffffffffffff8116610485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4465706c6f79657257686974656c6973743a2063616e206f6e6c79206265206460448201527f697361626c65642076696120656e61626c65417262697472617279436f6e747260648201527f6163744465706c6f796d656e7400000000000000000000000000000000000000608482015260a401610258565b6000546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000805473ffffffffffffffffffffffffffffffffffffffff16158061056b575073ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff165b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461063e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4465706c6f79657257686974656c6973743a2066756e6374696f6e2063616e2060448201527f6f6e6c792062652063616c6c656420627920746865206f776e6572206f66207460648201527f68697320636f6e74726163740000000000000000000000000000000000000000608482015260a401610258565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681527fc0e106cf568e50698fdbde1eff56f5a5c966cc7958e37e276918e9e4ccdf8cd49060200160405180910390a1600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d957600080fd5b919050565b600080604083850312156106f157600080fd5b6106fa836106b5565b91506020830135801515811461070f57600080fd5b809150509250929050565b60006020828403121561072c57600080fd5b610735826106b5565b9392505050565b600060208083528351808285015260005b818110156107695785810183015185820160400152820161074d565b8181111561077b576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea164736f6c634300080f000a", + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30007": { + "code": "0x60806040526004361061018b5760003560e01c80638cbeeef2116100d6578063c4d66de81161007f578063ddd5a40f11610059578063ddd5a40f1461043e578063e46e245a14610454578063ecc704281461046957600080fd5b8063c4d66de8146103de578063d764ad0b146103fe578063db505d801461041157600080fd5b8063a7119869116100b0578063a711986914610333578063b1b1b2091461038e578063b28ade25146103be57600080fd5b80638cbeeef2146102405780639fce812c14610333578063a4e7f8bd1461035e57600080fd5b80634c1d6a69116101385780635c975abb116101125780635c975abb146102c25780636e296e45146102e257806383a740741461031c57600080fd5b80634c1d6a691461024057806354fd4d50146102565780635644cfdf146102ac57600080fd5b80632f7d3922116101695780632f7d3922146101ed5780633dbb202b146102035780633f827a5a1461021857600080fd5b8063028f85f7146101905780630c568498146101c35780632828d7e8146101d8575b600080fd5b34801561019c57600080fd5b506101a5601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101cf57600080fd5b506101a5603f81565b3480156101e457600080fd5b506101a5604081565b3480156101f957600080fd5b506101a561520881565b610216610211366004611861565b6104ce565b005b34801561022457600080fd5b5061022d600181565b60405161ffff90911681526020016101ba565b34801561024c57600080fd5b506101a5619c4081565b34801561026257600080fd5b5061029f6040518060400160405280600581526020017f322e322e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ba9190611933565b3480156102b857600080fd5b506101a561138881565b3480156102ce57600080fd5b5060005b60405190151581526020016101ba565b3480156102ee57600080fd5b506102f7610761565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b34801561032857600080fd5b506101a562030d4081565b34801561033f57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166102f7565b34801561036a57600080fd5b506102d2610379366004611946565b60ce6020526000908152604090205460ff1681565b34801561039a57600080fd5b506102d26103a9366004611946565b60cb6020526000908152604090205460ff1681565b3480156103ca57600080fd5b506101a56103d936600461198e565b61084d565b3480156103ea57600080fd5b506102166103f9366004611a6e565b61090e565b61021661040c366004611a8b565b610b0d565b34801561041d57600080fd5b5060cf546102f79073ffffffffffffffffffffffffffffffffffffffff1681565b34801561044a57600080fd5b506101a561010481565b34801561046057600080fd5b506101a5602881565b34801561047557600080fd5b506104c060cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ba565b60cf54604080516020601f86018190048102820181019092528481526106369273ffffffffffffffffffffffffffffffffffffffff169161052c9190879087908190840183828082843760009201919091525087925061084d915050565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061059860cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016105b49796959493929190611b5a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526113f2565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385856106bb60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516106cd959493929190611bb9565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084015b60405180910390fd5b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b600080603f610863604063ffffffff8616611c36565b61086d9190611c66565b611388619c406108808162030d40611cb4565b61088a9190611cb4565b6108949190611cb4565b61089e9190611cb4565b9050600061010467ffffffffffffffff1685516108bb9190611ce0565b90506108f96108cb601083611c36565b6108d59084611cb4565b67ffffffffffffffff166108ea602884611c36565b67ffffffffffffffff16611480565b61090590615208611cb4565b95945050505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610959575060005460017401000000000000000000000000000000000000000090910460ff16105b8061098b5750303b15801561098b575060005474010000000000000000000000000000000000000000900460ff166001145b610a17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610827565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610a9d57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b610aa682611499565b8015610b0957600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b60f087901c60028110610bc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a401610827565b8061ffff16600003610cbd576000610c19878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506115d5915050565b600081815260cb602052604090205490915060ff1615610cbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c617965640000000000000000006064820152608401610827565b505b6000610d03898989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506115f492505050565b9050610d4c60cf54337fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef0173ffffffffffffffffffffffffffffffffffffffff90811691161490565b15610d8457853414610d6057610d60611cf8565b600081815260ce602052604090205460ff1615610d7f57610d7f611cf8565b610ed6565b3415610e38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a401610827565b600081815260ce602052604090205460ff16610ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c61796564000000000000000000000000000000006064820152608401610827565b610edf87611617565b15610f92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a401610827565b600081815260cb602052604090205460ff1615611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c61796564000000000000000000006064820152608401610827565b61105285611043611388619c40611cb4565b67ffffffffffffffff1661166c565b1580611078575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561119157600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161118a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d657373616765000000000000000000000000000000000000006064820152608401610827565b50506113e9565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061122288619c405a6111e59190611d27565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061168a92505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156112d857600082815260cb602052604090205460ff161561127557611275611cf8565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26113e5565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016113e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d657373616765000000000000000000000000000000000000006064820152608401610827565b5050505b50505050505050565b6040517fc2b3e5ac0000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000169063c2b3e5ac90849061144890889088908790600401611d3e565b6000604051808303818588803b15801561146157600080fd5b505af1158015611475573d6000803e3d6000fd5b505050505050505050565b6000818310156114905781611492565b825b9392505050565b6000547501000000000000000000000000000000000000000000900460ff16611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610827565b60cc5473ffffffffffffffffffffffffffffffffffffffff1661158e5760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006115e3858585856116a2565b805190602001209050949350505050565b600061160487878787878761173b565b8051906020012090509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611666575073ffffffffffffffffffffffffffffffffffffffff8216734200000000000000000000000000000000000016145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000806000835160208501868989f195945050505050565b6060848484846040516024016116bb9493929190611d7d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161175896959493929190611dc7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146117fc57600080fd5b50565b60008083601f84011261181157600080fd5b50813567ffffffffffffffff81111561182957600080fd5b60208301915083602082850101111561184157600080fd5b9250929050565b803563ffffffff8116811461185c57600080fd5b919050565b6000806000806060858703121561187757600080fd5b8435611882816117da565b9350602085013567ffffffffffffffff81111561189e57600080fd5b6118aa878288016117ff565b90945092506118bd905060408601611848565b905092959194509250565b6000815180845260005b818110156118ee576020818501810151868301820152016118d2565b81811115611900576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061149260208301846118c8565b60006020828403121561195857600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156119a157600080fd5b823567ffffffffffffffff808211156119b957600080fd5b818501915085601f8301126119cd57600080fd5b8135818111156119df576119df61195f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611a2557611a2561195f565b81604052828152886020848701011115611a3e57600080fd5b826020860160208301376000602084830101528096505050505050611a6560208401611848565b90509250929050565b600060208284031215611a8057600080fd5b8135611492816117da565b600080600080600080600060c0888a031215611aa657600080fd5b873596506020880135611ab8816117da565b95506040880135611ac8816117da565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611af257600080fd5b611afe8a828b016117ff565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611bac60c083018486611b11565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611be9608083018688611b11565b905083604083015263ffffffff831660608301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611c5d57611c5d611c07565b02949350505050565b600067ffffffffffffffff80841680611ca8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611cd757611cd7611c07565b01949350505050565b60008219821115611cf357611cf3611c07565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611d3957611d39611c07565b500390565b73ffffffffffffffffffffffffffffffffffffffff8416815267ffffffffffffffff8316602082015260606040820152600061090560608301846118c8565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152611db660808301856118c8565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611e1260c08301846118c8565b9897505050505050505056fea164736f6c634300080f000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000010000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000000cc": "0x000000000000000000000000000000000000000000000000000000000000dead" + }, + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3000f": { + "code": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c806368d5dca6116100d8578063c59859181161008c578063f45e65d811610066578063f45e65d8146102ca578063f8206140146102d2578063fe173b971461026957600080fd5b8063c59859181461029c578063de26c4a1146102a4578063f1c7a58b146102b757600080fd5b80638e98b106116100bd5780638e98b1061461026f578063960e3a2314610277578063b54501bc1461028957600080fd5b806368d5dca61461024c5780636ef25c3a1461026957600080fd5b8063313ce5671161012f5780634ef6e224116101145780634ef6e224146101de578063519b4bd3146101fb57806354fd4d501461020357600080fd5b8063313ce567146101c457806349948e0e146101cb57600080fd5b8063275aedd211610160578063275aedd2146101a1578063291b0383146101b45780632e0f2625146101bc57600080fd5b80630c18c1621461017c57806322b90ab314610197575b600080fd5b6101846102da565b6040519081526020015b60405180910390f35b61019f6103fb565b005b6101846101af36600461168e565b610584565b61019f61070f565b610184600681565b6006610184565b6101846101d93660046116d6565b610937565b6000546101eb9060ff1681565b604051901515815260200161018e565b61018461096e565b61023f6040518060400160405280600581526020017f312e342e3000000000000000000000000000000000000000000000000000000081525081565b60405161018e91906117a5565b6102546109cf565b60405163ffffffff909116815260200161018e565b48610184565b61019f610a54565b6000546101eb90610100900460ff1681565b6000546101eb9062010000900460ff1681565b610254610c4e565b6101846102b23660046116d6565b610caf565b6101846102c536600461168e565b610da9565b610184610e85565b610184610f78565b6000805460ff1615610373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f47617350726963654f7261636c653a206f76657268656164282920697320646560448201527f707265636174656400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f69190611818565b905090565b3373deaddeaddeaddeaddeaddeaddeaddeaddead0001146104c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e2073657420697345636f746f6e6520666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a40161036a565b60005460ff1615610557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a2045636f746f6e6520616c72656164792060448201527f6163746976650000000000000000000000000000000000000000000000000000606482015260840161036a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000805462010000900460ff1661059d57506000919050565b610709620f42406106668473420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16634d5d9a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610607573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062b9190611831565b63ffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821583830293840490921491909117011790565b6106709190611886565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166316d3bc7f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f391906118c1565b67ffffffffffffffff1681019081106000031790565b92915050565b3373deaddeaddeaddeaddeaddeaddeaddeaddead0001146107d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e20736574206973497374686d757320666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a40161036a565b600054610100900460ff1661086f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f47617350726963654f7261636c653a20497374686d75732063616e206f6e6c7960448201527f2062652061637469766174656420616674657220466a6f726400000000000000606482015260840161036a565b60005462010000900460ff1615610908576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a20497374686d757320616c72656164792060448201527f6163746976650000000000000000000000000000000000000000000000000000606482015260840161036a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000179055565b60008054610100900460ff16156109515761070982610fd9565b60005460ff16156109655761070982610ff8565b6107098261109c565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16635cf249696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103d2573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166368d5dca66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a30573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f69190611831565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610af7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e20736574206973466a6f726420666c616700606482015260840161036a565b60005460ff16610b89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f47617350726963654f7261636c653a20466a6f72642063616e206f6e6c79206260448201527f65206163746976617465642061667465722045636f746f6e6500000000000000606482015260840161036a565b600054610100900460ff1615610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f47617350726963654f7261636c653a20466a6f726420616c726561647920616360448201527f7469766500000000000000000000000000000000000000000000000000000000606482015260840161036a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663c59859186040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a30573d6000803e3d6000fd5b60008054610100900460ff1615610cf657620f4240610ce1610cd0846111f0565b51610cdc9060446118eb565b61150d565b610cec906010611903565b6107099190611886565b6000610d018361156c565b60005490915060ff1615610d155792915050565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d989190611818565b610da290826118eb565b9392505050565b60008054610100900460ff16610e41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f47617350726963654f7261636c653a206765744c314665655570706572426f7560448201527f6e64206f6e6c7920737570706f72747320466a6f726400000000000000000000606482015260840161036a565b6000610e4e8360446118eb565b90506000610e5d60ff83611886565b610e6790836118eb565b610e729060106118eb565b9050610e7d816115fc565b949350505050565b6000805460ff1615610f19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a207363616c61722829206973206465707260448201527f6563617465640000000000000000000000000000000000000000000000000000606482015260840161036a565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103d2573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663f82061406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103d2573d6000803e3d6000fd5b6000610709610fe7836111f0565b51610ff39060446118eb565b6115fc565b6000806110048361156c565b9050600061101061096e565b611018610c4e565b611023906010611940565b63ffffffff166110339190611903565b9050600061103f610f78565b6110476109cf565b63ffffffff166110579190611903565b9050600061106582846118eb565b61106f9085611903565b905061107d6006600a611a8c565b611088906010611903565b6110929082611886565b9695505050505050565b6000806110a88361156c565b9050600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa15801561110b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112f9190611818565b61113761096e565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611196573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ba9190611818565b6111c490856118eb565b6111ce9190611903565b6111d89190611903565b90506111e66006600a611a8c565b610e7d9082611886565b606061137f565b818153600101919050565b600082840393505b83811015610da25782810151828201511860001a159093029260010161120a565b825b60208210611277578251611242601f836111f7565b52602092909201917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09091019060210161122d565b8115610da257825161128c60018403836111f7565b520160010192915050565b60006001830392505b61010782106112d8576112ca8360ff166112c560fd6112c58760081c60e001896111f7565b6111f7565b9350610106820391506112a0565b60078210611305576112fe8360ff166112c5600785036112c58760081c60e001896111f7565b9050610da2565b610e7d8360ff166112c58560081c8560051b01876111f7565b61137782820361135b61134b84600081518060001a8160011a60081b178160021a60101b17915050919050565b639e3779b90260131c611fff1690565b8060021b6040510182815160e01c1860e01b8151188152505050565b600101919050565b6180003860405139618000604051016020830180600d8551820103826002015b818110156114b2576000805b50508051604051600082901a600183901a60081b1760029290921a60101b91909117639e3779b9810260111c617ffc16909101805160e081811c878603811890911b909118909152840190818303908484106114075750611442565b600184019350611fff821161143c578251600081901a600182901a60081b1760029190911a60101b17810361143c5750611442565b506113ab565b8383106114505750506114b2565b6001830392508583111561146e5761146b878788860361122b565b96505b611482600985016003850160038501611202565b915061148f878284611297565b9650506114a7846114a28684860161131e565b61131e565b91505080935061139f565b50506114c4838384885185010361122b565b925050506040519150618000820180820391508183526020830160005b838110156114f95782810151828201526020016114e1565b506000920191825250602001604052919050565b60008061151d83620cc394611903565b611547907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd763200611a98565b90506115576064620f4240611b0c565b81121561070957610da26064620f4240611b0c565b80516000908190815b818110156115ef5784818151811061158f5761158f611bc8565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166000036115cf576115c86004846118eb565b92506115dd565b6115da6010846118eb565b92505b806115e781611bf7565b915050611575565b50610e7d826104406118eb565b6000806116088361150d565b90506000611614610f78565b61161c6109cf565b63ffffffff1661162c9190611903565b61163461096e565b61163c610c4e565b611647906010611940565b63ffffffff166116579190611903565b61166191906118eb565b905061166f60066002611903565b61167a90600a611a8c565b6116848284611903565b610e7d9190611886565b6000602082840312156116a057600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156116e857600080fd5b813567ffffffffffffffff8082111561170057600080fd5b818401915084601f83011261171457600080fd5b813581811115611726576117266116a7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561176c5761176c6116a7565b8160405282815287602084870101111561178557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b818110156117d2578581018301518582016040015282016117b6565b818111156117e4576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561182a57600080fd5b5051919050565b60006020828403121561184357600080fd5b815163ffffffff81168114610da257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000826118bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000602082840312156118d357600080fd5b815167ffffffffffffffff81168114610da257600080fd5b600082198211156118fe576118fe611857565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561193b5761193b611857565b500290565b600063ffffffff8083168185168183048111821515161561196357611963611857565b02949350505050565b600181815b808511156119c557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156119ab576119ab611857565b808516156119b857918102915b93841c9390800290611971565b509250929050565b6000826119dc57506001610709565b816119e957506000610709565b81600181146119ff5760028114611a0957611a25565b6001915050610709565b60ff841115611a1a57611a1a611857565b50506001821b610709565b5060208310610133831016604e8410600b8410161715611a48575081810a610709565b611a52838361196c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611a8457611a84611857565b029392505050565b6000610da283836119cd565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615611ad257611ad2611857565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615611b0657611b06611857565b50500190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615611b4d57611b4d611857565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615611b8857611b88611857565b60008712925087820587128484161615611ba457611ba4611857565b87850587128184161615611bba57611bba611857565b505050929093029392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611c2857611c28611857565b506001019056fea164736f6c634300080f000a", + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30010": { + "code": "0x6080604052600436106101125760003560e01c80635c975abb116100a5578063927ede2d11610074578063c4d66de811610059578063c4d66de8146103ee578063c89701a21461040e578063e11013dd1461043b57600080fd5b8063927ede2d146103b0578063a3a79548146103db57600080fd5b80635c975abb1461032e5780637f46ddb214610244578063870876231461034a5780638f601f661461036a57600080fd5b806336c717c1116100e157806336c717c1146102445780633cb747bf14610295578063540abf73146102c257806354fd4d50146102e257600080fd5b80630166a07a146101eb57806309fc88431461020b5780631635f5fd1461021e57806332b7006d1461023157600080fd5b366101e65761011f61044e565b6101b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b6101e473deaddeaddeaddeaddeaddeaddeaddeaddead000033333462030d406040518060200160405280600081525061048b565b005b600080fd5b3480156101f757600080fd5b506101e461020636600461248c565b610566565b6101e461021936600461253d565b610908565b6101e461022c366004612590565b6109e4565b6101e461023f366004612603565b610e36565b34801561025057600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102a157600080fd5b5060035461026b9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102ce57600080fd5b506101e46102dd366004612657565b610f15565b3480156102ee57600080fd5b50604080518082018252600681527f312e31332e3000000000000000000000000000000000000000000000000000006020820152905161028c9190612744565b34801561033a57600080fd5b506040516000815260200161028c565b34801561035657600080fd5b506101e4610365366004612757565b610f5a565b34801561037657600080fd5b506103a26103853660046127da565b600260209081526000928352604080842090915290825290205481565b60405190815260200161028c565b3480156103bc57600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff1661026b565b6101e46103e9366004612757565b611033565b3480156103fa57600080fd5b506101e4610409366004612813565b611077565b34801561041a57600080fd5b5060045461026b9073ffffffffffffffffffffffffffffffffffffffff1681565b6101e4610449366004612830565b611220565b600032330361045d5750600190565b333b60170361048557604051602081016040526020600082333c5160e81c62ef010014905090565b50600090565b7fffffffffffffffffffffffff215221522152215221522152215221522153000073ffffffffffffffffffffffffffffffffffffffff8716016104da576104d58585858585611269565b61055e565b60008673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610527573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054b9190612893565b905061055c87828888888888611433565b505b505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610639575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa1580156105fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106219190612893565b73ffffffffffffffffffffffffffffffffffffffff16145b6106eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016101a7565b6106f4876117ec565b1561084257610703878761184e565b6107b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a4016101a7565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b15801561082557600080fd5b505af1158015610839573d6000803e3d6000fd5b505050506108c4565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a16835292905220546108809084906128df565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c16835293905291909120919091556108c490858561196e565b61055c878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a4292505050565b61091061044e565b61099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101a7565b6109df3333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061126992505050565b505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610ab7575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9f9190612893565b73ffffffffffffffffffffffffffffffffffffffff16145b610b69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016101a7565b823414610bf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e7420726571756972656400000000000060648201526084016101a7565b3073ffffffffffffffffffffffffffffffffffffffff851603610c9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c66000000000000000000000000000000000000000000000000000000000060648201526084016101a7565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610d48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e67657200000000000000000000000000000000000000000000000060648201526084016101a7565b610d8a85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ad092505050565b6000610da7855a8660405180602001604052806000815250611b71565b90508061055e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c6564000000000000000000000000000000000000000000000000000000000060648201526084016101a7565b610e3e61044e565b610eca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101a7565b610f0e853333878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061048b92505050565b5050505050565b61055c87873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061143392505050565b610f6261044e565b610fee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101a7565b61055e86863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061143392505050565b61055e863387878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061048b92505050565b600054610100900460ff16158080156110975750600054600160ff909116105b806110b15750303b1580156110b1575060005460ff166001145b61113d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016101a7565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561119b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6111b973420000000000000000000000000000000000000783611b89565b801561121c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6112633385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061126992505050565b50505050565b8234146112f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c7565000060648201526084016101a7565b61130485858584611c73565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd0000000000000000000000000000000000000000000000000000000090611367908b908b9086908a906024016128f6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526113fa9291889060040161293f565b6000604051808303818588803b15801561141357600080fd5b505af1158015611427573d6000803e3d6000fd5b50505050505050505050565b34156114c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5374616e646172644272696467653a2063616e6e6f742073656e642076616c7560448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016101a7565b6114ca876117ec565b15611618576114d9878761184e565b61158b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a4016101a7565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b1580156115fb57600080fd5b505af115801561160f573d6000803e3d6000fd5b505050506116ac565b61163a73ffffffffffffffffffffffffffffffffffffffff8816863086611d14565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611678908490612984565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b6116ba878787878786611d72565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a000000000000000000000000000000000000000000000000000000009061171e908b908d908c908c908c908b9060240161299c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b90921682526117b19291879060040161293f565b600060405180830381600087803b1580156117cb57600080fd5b505af11580156117df573d6000803e3d6000fd5b5050505050505050505050565b6000611818827f1d1d8b6300000000000000000000000000000000000000000000000000000000611e00565b806118485750611848827fec4fc8e300000000000000000000000000000000000000000000000000000000611e00565b92915050565b600061187a837f1d1d8b6300000000000000000000000000000000000000000000000000000000611e00565b15611923578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ee9190612893565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611848565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118ca573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109df9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611e23565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89868686604051611aba939291906129f7565b60405180910390a461055e868686868686611f2f565b8373ffffffffffffffffffffffffffffffffffffffff1673deaddeaddeaddeaddeaddeaddeaddeaddead000073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89868686604051611b5d939291906129f7565b60405180910390a461126384848484611fb7565b6000806000835160208501868989f195945050505050565b600054610100900460ff16611c20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016101a7565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8373ffffffffffffffffffffffffffffffffffffffff1673deaddeaddeaddeaddeaddeaddeaddeaddead000073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e868686604051611d00939291906129f7565b60405180910390a461126384848484612024565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526112639085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016119c0565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e868686604051611dea939291906129f7565b60405180910390a461055e868686868686612083565b6000611e0b836120fb565b8015611e1c5750611e1c838361215f565b9392505050565b6000611e85826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661222e9092919063ffffffff16565b8051909150156109df5780806020019051810190611ea39190612a35565b6109df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016101a7565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd868686604051611fa7939291906129f7565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612016929190612a57565b60405180910390a350505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612016929190612a57565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf868686604051611fa7939291906129f7565b6000612127827f01ffc9a70000000000000000000000000000000000000000000000000000000061215f565b80156118485750612158827fffffffff0000000000000000000000000000000000000000000000000000000061215f565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015612217575060208210155b80156122235750600081115b979650505050505050565b606061223d8484600085612245565b949350505050565b6060824710156122d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016101a7565b73ffffffffffffffffffffffffffffffffffffffff85163b612355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101a7565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161237e9190612a70565b60006040518083038185875af1925050503d80600081146123bb576040519150601f19603f3d011682016040523d82523d6000602084013e6123c0565b606091505b5091509150612223828286606083156123da575081611e1c565b8251156123ea5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101a79190612744565b73ffffffffffffffffffffffffffffffffffffffff8116811461244057600080fd5b50565b60008083601f84011261245557600080fd5b50813567ffffffffffffffff81111561246d57600080fd5b60208301915083602082850101111561248557600080fd5b9250929050565b600080600080600080600060c0888a0312156124a757600080fd5b87356124b28161241e565b965060208801356124c28161241e565b955060408801356124d28161241e565b945060608801356124e28161241e565b93506080880135925060a088013567ffffffffffffffff81111561250557600080fd5b6125118a828b01612443565b989b979a50959850939692959293505050565b803563ffffffff8116811461253857600080fd5b919050565b60008060006040848603121561255257600080fd5b61255b84612524565b9250602084013567ffffffffffffffff81111561257757600080fd5b61258386828701612443565b9497909650939450505050565b6000806000806000608086880312156125a857600080fd5b85356125b38161241e565b945060208601356125c38161241e565b935060408601359250606086013567ffffffffffffffff8111156125e657600080fd5b6125f288828901612443565b969995985093965092949392505050565b60008060008060006080868803121561261b57600080fd5b85356126268161241e565b94506020860135935061263b60408701612524565b9250606086013567ffffffffffffffff8111156125e657600080fd5b600080600080600080600060c0888a03121561267257600080fd5b873561267d8161241e565b9650602088013561268d8161241e565b9550604088013561269d8161241e565b9450606088013593506126b260808901612524565b925060a088013567ffffffffffffffff81111561250557600080fd5b60005b838110156126e95781810151838201526020016126d1565b838111156112635750506000910152565b600081518084526127128160208601602086016126ce565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611e1c60208301846126fa565b60008060008060008060a0878903121561277057600080fd5b863561277b8161241e565b9550602087013561278b8161241e565b9450604087013593506127a060608801612524565b9250608087013567ffffffffffffffff8111156127bc57600080fd5b6127c889828a01612443565b979a9699509497509295939492505050565b600080604083850312156127ed57600080fd5b82356127f88161241e565b915060208301356128088161241e565b809150509250929050565b60006020828403121561282557600080fd5b8135611e1c8161241e565b6000806000806060858703121561284657600080fd5b84356128518161241e565b935061285f60208601612524565b9250604085013567ffffffffffffffff81111561287b57600080fd5b61288787828801612443565b95989497509550505050565b6000602082840312156128a557600080fd5b8151611e1c8161241e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156128f1576128f16128b0565b500390565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261293560808301846126fa565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815260606020820152600061296e60608301856126fa565b905063ffffffff83166040830152949350505050565b60008219821115612997576129976128b0565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a08301526129eb60c08301846126fa565b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612a2c60608301846126fa565b95945050505050565b600060208284031215612a4757600080fd5b81518015158114611e1c57600080fd5b82815260406020820152600061223d60408301846126fa565b60008251612a828184602087016126ce565b919091019291505056fea164736f6c634300080f000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000004200000000000000000000000000000000000007" + }, + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30011": { + "code": "0x6080604052600436106100b55760003560e01c80638312f14911610069578063d0e12f901161004e578063d0e12f901461024e578063d3e5792b14610282578063d4ff92181461018c57600080fd5b80638312f149146101fb57806384411d651461023857600080fd5b806354fd4d501161009a57806354fd4d501461013657806366d003ac1461018c57806382356d8a146101bf57600080fd5b80630d9019e1146100c15780633ccfd60b1461011f57600080fd5b366100bc57005b600080fd5b3480156100cd57600080fd5b506100f57f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561012b57600080fd5b506101346102b6565b005b34801561014257600080fd5b5061017f6040518060400160405280600c81526020017f312e352e302d626574612e35000000000000000000000000000000000000000081525081565b604051610116919061068c565b34801561019857600080fd5b507f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb922666100f5565b3480156101cb57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000015b6040516101169190610769565b34801561020757600080fd5b507f0000000000000000000000000000000000000000000000008ac7230489e800005b604051908152602001610116565b34801561024457600080fd5b5061022a60005481565b34801561025a57600080fd5b506101ee7f000000000000000000000000000000000000000000000000000000000000000181565b34801561028e57600080fd5b5061022a7f0000000000000000000000000000000000000000000000008ac7230489e8000081565b7f0000000000000000000000000000000000000000000000008ac7230489e80000471015610391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6000479050806000808282546103a7919061077d565b9091555050604080518281527f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226673ffffffffffffffffffffffffffffffffffffffff166020820152338183015290517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee817f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266337f000000000000000000000000000000000000000000000000000000000000000160405161049594939291906107bc565b60405180910390a160017f000000000000000000000000000000000000000000000000000000000000000160018111156104d1576104d16106ff565b036105955760006105027f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226683610664565b905080610591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610388565b5050565b6040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226616600482015262061a80602482015260606044820152600060648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084016000604051808303818588803b15801561064857600080fd5b505af115801561065c573d6000803e3d6000fd5b505050505050565b6000610671835a84610678565b9392505050565b6000806000806000858888f1949350505050565b600060208083528351808285015260005b818110156106b95785810183015185820160400152820161069d565b818111156106cb576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610765577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610777828461072e565b92915050565b600082198211156107b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff848116602083015283166040820152608081016107f4606083018461072e565b9594505050505056fea164736f6c634300080f000a", + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30012": { + "code": "0x60806040523480156200001157600080fd5b5060043610620000935760003560e01c8063c4d66de81162000062578063c4d66de81462000175578063ce5ac90f146200018e578063e78cea9214620001a5578063ee9a31a214620001c657600080fd5b8063316b3739146200009857806354fd4d5014620000fb578063896f93d114620001475780638cf0629c146200015e575b600080fd5b620000d1620000a936600462000636565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b620001386040518060400160405280600681526020017f312e31302e31000000000000000000000000000000000000000000000000000081525081565b604051620000f29190620006c9565b620000d162000158366004620007c0565b620001e5565b620000d16200016f3660046200083d565b620001fc565b6200018c6200018636600462000636565b6200041b565b005b620000d16200019f366004620007c0565b620005ed565b600154620000d19073ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff16620000d1565b6000620001f4848484620005ed565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8516620002a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d4d696e7461626c654552433230466163746f72793a206d7560448201527f73742070726f766964652072656d6f746520746f6b656e20616464726573730060648201526084015b60405180910390fd5b600085858585604051602001620002c29493929190620008d4565b604051602081830303815290604052805190602001209050600081600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16888888886040516200031290620005fe565b620003229594939291906200092e565b8190604051809103906000f590508015801562000343573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff81811660008181526002602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016948d1694851790555193945090927fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf9190a360405133815273ffffffffffffffffffffffffffffffffffffffff80891691908316907f52fe89dd5930f343d25650b62fd367bae47088bcddffd2a88350a6ecdd620cdb9060200160405180910390a39695505050505050565b600054610100900460ff16158080156200043c5750600054600160ff909116105b80620004585750303b15801562000458575060005460ff166001145b620004e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016200029e565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200054557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015620005e957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000620001f48484846012620001fc565b6120e0806200099483390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146200063157600080fd5b919050565b6000602082840312156200064957600080fd5b62000654826200060c565b9392505050565b6000815180845260005b81811015620006835760208185018101518683018201520162000665565b8181111562000696576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006200065460208301846200065b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126200071f57600080fd5b813567ffffffffffffffff808211156200073d576200073d620006de565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715620007865762000786620006de565b81604052838152866020858801011115620007a057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215620007d657600080fd5b620007e1846200060c565b9250602084013567ffffffffffffffff80821115620007ff57600080fd5b6200080d878388016200070d565b935060408601359150808211156200082457600080fd5b5062000833868287016200070d565b9150509250925092565b600080600080608085870312156200085457600080fd5b6200085f856200060c565b9350602085013567ffffffffffffffff808211156200087d57600080fd5b6200088b888389016200070d565b94506040870135915080821115620008a257600080fd5b50620008b1878288016200070d565b925050606085013560ff81168114620008c957600080fd5b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff851681526080602082015260006200090560808301866200065b565b82810360408401526200091981866200065b565b91505060ff8316606083015295945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526200096960a08301866200065b565b82810360608401526200097d81866200065b565b91505060ff83166080830152969550505050505056fe6101a06040523480156200001257600080fd5b50604051620020e0380380620020e0833981016040819052620000359162000215565b6040805180820190915260018152603160f81b6020820152839081908185600362000061838262000350565b50600462000070828262000350565b5050825160208085019190912083518483012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c0019052805194019390932091935091906080523060c05261012052505050506001600160a01b0394851661014052509390921661016052505060ff16610180526200041c565b80516001600160a01b03811681146200014357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200017057600080fd5b81516001600160401b03808211156200018d576200018d62000148565b604051601f8301601f19908116603f01168101908282118183101715620001b857620001b862000148565b81604052838152602092508683858801011115620001d557600080fd5b600091505b83821015620001f95785820183015181830184015290820190620001da565b838211156200020b5760008385830101525b9695505050505050565b600080600080600060a086880312156200022e57600080fd5b62000239866200012b565b945062000249602087016200012b565b60408701519094506001600160401b03808211156200026757600080fd5b6200027589838a016200015e565b945060608801519150808211156200028c57600080fd5b506200029b888289016200015e565b925050608086015160ff81168114620002b357600080fd5b809150509295509295909350565b600181811c90821680620002d657607f821691505b602082108103620002f757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200034b57600081815260208120601f850160051c81016020861015620003265750805b601f850160051c820191505b81811015620003475782815560010162000332565b5050505b505050565b81516001600160401b038111156200036c576200036c62000148565b62000384816200037d8454620002c1565b84620002fd565b602080601f831160018114620003bc5760008415620003a35750858301515b600019600386901b1c1916600185901b17855562000347565b600085815260208120601f198616915b82811015620003ed57888601518255948401946001909101908401620003cc565b50858210156200040c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516101005161012051610140516101605161018051611c37620004a960003960006102700152600081816103a70152818161041c0152818161064801526107aa0152600081816101d501526103cd01526000611174015260006111c30152600061119e015260006110f7015260006111210152600061114b0152611c376000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c806370a08231116100ee578063ae1f6aaf11610097578063d6c0b2c411610071578063d6c0b2c4146103cb578063dd62ed3e14610404578063e78cea92146103a5578063ee9a31a21461041757600080fd5b8063ae1f6aaf146103a5578063c01e1bd6146103cb578063d505accf146103f157600080fd5b80639dc29fac116100c85780639dc29fac1461036c578063a457c2d71461037f578063a9059cbb1461039257600080fd5b806370a082311461031b5780637ecebe001461035157806395d89b411461036457600080fd5b8063313ce5671161015057806340c10f191161012a57806340c10f19146102b557806354fd4d50146102ca5780636afdd8501461030657600080fd5b8063313ce567146102695780633644e5151461029a57806339509351146102a257600080fd5b8063095ea7b311610181578063095ea7b31461023157806318160ddd1461024457806323b872dd1461025657600080fd5b806301ffc9a7146101a8578063033964be146101d057806306fdde031461021c575b600080fd5b6101bb6101b636600461194b565b61043e565b60405190151581526020015b60405180910390f35b6101f77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c7565b61022461052f565b6040516101c7919061198d565b6101bb61023f366004611a29565b6105c1565b6002545b6040519081526020016101c7565b6101bb610264366004611a53565b6105db565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101c7565b6102486105ff565b6101bb6102b0366004611a29565b61060e565b6102c86102c3366004611a29565b610630565b005b6102246040518060400160405280600c81526020017f312e342e302d626574612e35000000000000000000000000000000000000000081525081565b6e22d473030f116ddee9f6b43ac78ba36101f7565b610248610329366004611a8f565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61024861035f366004611a8f565b610758565b610224610783565b6102c861037a366004611a29565b610792565b6101bb61038d366004611a29565b6108a9565b6101bb6103a0366004611a29565b610956565b7f00000000000000000000000000000000000000000000000000000000000000006101f7565b7f00000000000000000000000000000000000000000000000000000000000000006101f7565b6102c86103ff366004611aaa565b610964565b610248610412366004611b1d565b610b23565b6101f77f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000085168314806104f757507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b8061052657507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b60606003805461053e90611b50565b80601f016020809104026020016040519081016040528092919081815260200182805461056a90611b50565b80156105b75780601f1061058c576101008083540402835291602001916105b7565b820191906000526020600020905b81548152906001019060200180831161059a57829003601f168201915b5050505050905090565b6000336105cf818585610bc4565b60019150505b92915050565b6000336105e9858285610d78565b6105f4858585610e2a565b506001949350505050565b60006106096110dd565b905090565b6000336105cf8185856106218383610b23565b61062b9190611bcc565b610bc4565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b6107048282611211565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161074c91815260200190565b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260408120546105d5565b60606004805461053e90611b50565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084016106f1565b6108618282611331565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161074c91815260200190565b600033816108b78286610b23565b905083811015610949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016106f1565b6105f48286868403610bc4565b6000336105cf818585610e2a565b834211156109ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016106f1565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109fd8c611516565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610a658261154b565b90506000610a75828787876115b4565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016106f1565b610b178a8a8a610bc4565b50505050505050505050565b60007fffffffffffffffffffffffffffffffffffdd2b8cfcf0ee922116094bc538745d73ffffffffffffffffffffffffffffffffffffffff831601610b8957507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6105d5565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600160209081526040808320938616835292905220545b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff8216610d09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000610d848484610b23565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e245781811015610e17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106f1565b610e248484848403610bc4565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ecd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff8216610f70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526020819052604080822085850390559185168152908120805484929061106a908490611bcc565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516110d091815260200190565b60405180910390a3610e24565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561114357507f000000000000000000000000000000000000000000000000000000000000000046145b1561116d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b73ffffffffffffffffffffffffffffffffffffffff821661128e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106f1565b80600260008282546112a09190611bcc565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040812080548392906112da908490611bcc565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166113d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020548181101561148a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604081208383039055600280548492906114c6908490611be4565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610d6b565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090208054600181018255905b50919050565b60006105d56115586110dd565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006115c5878787876115dc565b915091506115d2816116f4565b5095945050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561161357506000905060036116eb565b8460ff16601b1415801561162b57508460ff16601c14155b1561163c57506000905060046116eb565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611690573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166116e4576000600192509250506116eb565b9150600090505b94509492505050565b600081600481111561170857611708611bfb565b036117105750565b600181600481111561172457611724611bfb565b0361178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106f1565b600281600481111561179f5761179f611bfb565b03611806576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106f1565b600381600481111561181a5761181a611bfb565b036118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b60048160048111156118bb576118bb611bfb565b03611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016106f1565b50565b60006020828403121561195d57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610bbd57600080fd5b600060208083528351808285015260005b818110156119ba5785810183015185820160400152820161199e565b818111156119cc576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a2457600080fd5b919050565b60008060408385031215611a3c57600080fd5b611a4583611a00565b946020939093013593505050565b600080600060608486031215611a6857600080fd5b611a7184611a00565b9250611a7f60208501611a00565b9150604084013590509250925092565b600060208284031215611aa157600080fd5b610bbd82611a00565b600080600080600080600060e0888a031215611ac557600080fd5b611ace88611a00565b9650611adc60208901611a00565b95506040880135945060608801359350608088013560ff81168114611b0057600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611b3057600080fd5b611b3983611a00565b9150611b4760208401611a00565b90509250929050565b600181811c90821680611b6457607f821691505b602082108103611545577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611bdf57611bdf611b9d565b500190565b600082821015611bf657611bf6611b9d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000aa164736f6c634300080f000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30013": { + "code": "0x60806040526004361061002d5760003560e01c806354fd4d5014610052578063b9b3efe9146100b157610048565b3661004857600061003c6100d4565b90508060005260206000f35b600061003c6100d4565b34801561005e57600080fd5b5061009b6040518060400160405280600c81526020017f312e312e312d626574612e33000000000000000000000000000000000000000081525081565b6040516100a89190610168565b60405180910390f35b3480156100bd57600080fd5b506100c66100d4565b6040519081526020016100a8565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638381f58a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610135573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015991906101db565b67ffffffffffffffff16905090565b600060208083528351808285015260005b8181101561019557858101830151858201604001528201610179565b818111156101a7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156101ed57600080fd5b815167ffffffffffffffff8116811461020557600080fd5b939250505056fea164736f6c634300080f000a", + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30014": { + "code": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c80637f46ddb211610076578063aa5574521161005b578063aa557452146101c9578063c4d66de8146101dc578063c89701a2146101ef57600080fd5b80637f46ddb21461018d578063927ede2d146101ab57600080fd5b806354fd4d50116100a757806354fd4d50146101225780635c975abb1461016b578063761f44931461017a57600080fd5b80633687011a146100c35780633cb747bf146100d8575b600080fd5b6100d66100d136600461129e565b61020f565b005b6001546100f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61015e6040518060400160405280600681526020017f312e31302e30000000000000000000000000000000000000000000000000000081525081565b604051610119919061138c565b60405160008152602001610119565b6100d661018836600461139f565b6102c0565b60025473ffffffffffffffffffffffffffffffffffffffff166100f8565b60015473ffffffffffffffffffffffffffffffffffffffff166100f8565b6100d66101d7366004611437565b6107de565b6100d66101ea3660046114ae565b61089a565b6002546100f89073ffffffffffffffffffffffffffffffffffffffff1681565b610217610a43565b6102a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102b88686333388888888610a80565b505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156103955750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d91906114cb565b73ffffffffffffffffffffffffffffffffffffffff16145b610421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161029f565b3073ffffffffffffffffffffffffffffffffffffffff8816036104c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c324552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161029f565b6104f0877faecafc2300000000000000000000000000000000000000000000000000000000610fd6565b61057c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324552433732314272696467653a206c6f63616c20746f6b656e20696e746560448201527f7266616365206973206e6f7420636f6d706c69616e7400000000000000000000606482015260840161029f565b8673ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105eb91906114cb565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146106cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4c324552433732314272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433732312060648201527f6c6f63616c20746f6b656e000000000000000000000000000000000000000000608482015260a40161029f565b6040517fa144819400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301526024820185905288169063a144819490604401600060405180830381600087803b15801561073b57600080fd5b505af115801561074f573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac878787876040516107cd9493929190611531565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161029f565b6108918787338888888888610a80565b50505050505050565b600054610100900460ff16158080156108ba5750600054600160ff909116105b806108d45750303b1580156108d4575060005460ff166001145b610960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161029f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156109be57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6109dc73420000000000000000000000000000000000000783610ff9565b8015610a3f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000323303610a525750600190565b333b601703610a7a57604051602081016040526020600082333c5160e81c62ef010014905090565b50600090565b73ffffffffffffffffffffffffffffffffffffffff8716610b23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c324552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161029f565b6040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff891690636352211e90602401602060405180830381865afa158015610b8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb291906114cb565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610c6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324552433732314272696467653a205769746864726177616c206973206e6f60448201527f74206265696e6720696e69746961746564206279204e4654206f776e65720000606482015260840161029f565b60008873ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdd91906114cb565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c324552433732314272696467653a2072656d6f746520746f6b656e20646f6560448201527f73206e6f74206d6174636820676976656e2076616c7565000000000000000000606482015260840161029f565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018790528a1690639dc29fac90604401600060405180830381600087803b158015610e0a57600080fd5b505af1158015610e1e573d6000803e3d6000fd5b505050506000818a8989898888604051602401610e419796959493929190611571565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f761f44930000000000000000000000000000000000000000000000000000000017905260015460025491517f3dbb202b00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff90811692633dbb202b92610f1692169085908a906004016115ce565b600060405180830381600087803b158015610f3057600080fd5b505af1158015610f44573d6000803e3d6000fd5b505050508773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a58a8a8989604051610fc29493929190611531565b60405180910390a450505050505050505050565b6000610fe1836110e3565b8015610ff25750610ff28383611148565b9392505050565b600054610100900460ff16611090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161029f565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b600061110f827f01ffc9a700000000000000000000000000000000000000000000000000000000611148565b80156111425750611140827fffffffff00000000000000000000000000000000000000000000000000000000611148565b155b92915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015611200575060208210155b801561120c5750600081115b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461123957600080fd5b50565b803563ffffffff8116811461125057600080fd5b919050565b60008083601f84011261126757600080fd5b50813567ffffffffffffffff81111561127f57600080fd5b60208301915083602082850101111561129757600080fd5b9250929050565b60008060008060008060a087890312156112b757600080fd5b86356112c281611217565b955060208701356112d281611217565b9450604087013593506112e76060880161123c565b9250608087013567ffffffffffffffff81111561130357600080fd5b61130f89828a01611255565b979a9699509497509295939492505050565b6000815180845260005b818110156113475760208185018101518683018201520161132b565b81811115611359576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610ff26020830184611321565b600080600080600080600060c0888a0312156113ba57600080fd5b87356113c581611217565b965060208801356113d581611217565b955060408801356113e581611217565b945060608801356113f581611217565b93506080880135925060a088013567ffffffffffffffff81111561141857600080fd5b6114248a828b01611255565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561145257600080fd5b873561145d81611217565b9650602088013561146d81611217565b9550604088013561147d81611217565b9450606088013593506114926080890161123c565b925060a088013567ffffffffffffffff81111561141857600080fd5b6000602082840312156114c057600080fd5b8135610ff281611217565b6000602082840312156114dd57600080fd5b8151610ff281611217565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006115676060830184866114e8565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a08301526115c160c0830184866114e8565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006115fd6060830185611321565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000004200000000000000000000000000000000000007" + }, + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30015": { + "code": "0x608060405234801561001057600080fd5b50600436106101825760003560e01c806364ca23ef116100d8578063b80777ea1161008c578063e591b28211610066578063e591b282146103b0578063e81b2c6d146103d2578063f8206140146103db57600080fd5b8063b80777ea14610337578063c598591814610357578063d84447151461037757600080fd5b80638381f58a116100bd5780638381f58a146103115780638b239f73146103255780639e8c49661461032e57600080fd5b806364ca23ef146102e157806368d5dca6146102f557600080fd5b80634397dfef1161013a57806354fd4d501161011457806354fd4d501461025d578063550fcdc91461029f5780635cf24969146102d857600080fd5b80634397dfef146101fc578063440a5e20146102245780634d5d9a2a1461022c57600080fd5b806309bd5a601161016b57806309bd5a60146101a457806316d3bc7f146101c057806321326849146101ed57600080fd5b8063015d8eb914610187578063098999be1461019c575b600080fd5b61019a6101953660046105bc565b6103e4565b005b61019a610523565b6101ad60025481565b6040519081526020015b60405180910390f35b6008546101d49067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101b7565b604051600081526020016101b7565b6040805173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee815260126020820152016101b7565b61019a61052d565b6008546102489068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016101b7565b60408051808201909152600581527f312e362e3000000000000000000000000000000000000000000000000000000060208201525b6040516101b7919061062e565b60408051808201909152600381527f45544800000000000000000000000000000000000000000000000000000000006020820152610292565b6101ad60015481565b6003546101d49067ffffffffffffffff1681565b6003546102489068010000000000000000900463ffffffff1681565b6000546101d49067ffffffffffffffff1681565b6101ad60055481565b6101ad60065481565b6000546101d49068010000000000000000900467ffffffffffffffff1681565b600354610248906c01000000000000000000000000900463ffffffff1681565b60408051808201909152600581527f45746865720000000000000000000000000000000000000000000000000000006020820152610292565b60405173deaddeaddeaddeaddeaddeaddeaddeaddead000181526020016101b7565b6101ad60045481565b6101ad60075481565b3373deaddeaddeaddeaddeaddeaddeaddeaddead00011461048b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4c31426c6f636b3a206f6e6c7920746865206465706f7369746f72206163636f60448201527f756e742063616e20736574204c3120626c6f636b2076616c7565730000000000606482015260840160405180910390fd5b6000805467ffffffffffffffff98891668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116998916999099179890981790975560019490945560029290925560038054919094167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009190911617909255600491909155600555600655565b61052b610535565b565b61052b610548565b61053d610548565b60a43560a01c600855565b73deaddeaddeaddeaddeaddeaddeaddeaddead000133811461057257633cc50b456000526004601cfd5b60043560801c60035560143560801c60005560243560015560443560075560643560025560843560045550565b803567ffffffffffffffff811681146105b757600080fd5b919050565b600080600080600080600080610100898b0312156105d957600080fd5b6105e28961059f565b97506105f060208a0161059f565b9650604089013595506060890135945061060c60808a0161059f565b979a969950949793969560a0850135955060c08501359460e001359350915050565b600060208083528351808285015260005b8181101561065b5785810183015185820160400152820161063f565b8181111561066d576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea164736f6c634300080f000a", + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30016": { + "code": "0x6080604052600436106100695760003560e01c806382e3702d1161004357806382e3702d1461012a578063c2b3e5ac1461016a578063ecc704281461017d57600080fd5b80633f827a5a1461009257806344df8e70146100bf57806354fd4d50146100d457600080fd5b3661008d5761008b33620186a0604051806020016040528060008152506101e2565b005b600080fd5b34801561009e57600080fd5b506100a7600181565b60405161ffff90911681526020015b60405180910390f35b3480156100cb57600080fd5b5061008b6103a6565b3480156100e057600080fd5b5061011d6040518060400160405280600c81526020017f312e312e312d626574612e33000000000000000000000000000000000000000081525081565b6040516100b691906104d1565b34801561013657600080fd5b5061015a6101453660046104eb565b60006020819052908152604090205460ff1681565b60405190151581526020016100b6565b61008b610178366004610533565b6101e2565b34801561018957600080fd5b506101d46001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016100b6565b60006102786040518060c0016040528061023c6001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b815233602082015273ffffffffffffffffffffffffffffffffffffffff871660408201523460608201526080810186905260a0018490526103de565b600081815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055905073ffffffffffffffffffffffffffffffffffffffff8416336103136001547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b7f02a52367d10742d8032712c1bb8e0144ff1ec5ffda1ed7d70bb05a2744955054348787876040516103489493929190610637565b60405180910390a45050600180547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8082168301167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b476103b08161042b565b60405181907f7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f90600090a250565b80516020808301516040808501516060860151608087015160a0880151935160009761040e979096959101610667565b604051602081830303815290604052805190602001209050919050565b806040516104389061045a565b6040518091039082f0905080158015610455573d6000803e3d6000fd5b505050565b6008806106bf83390190565b6000815180845260005b8181101561048c57602081850181015186830182015201610470565b8181111561049e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104e46020830184610466565b9392505050565b6000602082840312156104fd57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060006060848603121561054857600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461056c57600080fd5b925060208401359150604084013567ffffffffffffffff8082111561059057600080fd5b818601915086601f8301126105a457600080fd5b8135818111156105b6576105b6610504565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156105fc576105fc610504565b8160405282815289602084870101111561061557600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b8481528360208201526080604082015260006106566080830185610466565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526106b260c0830184610466565b9897505050505050505056fe608060405230fffea164736f6c634300080f000a", + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30017": { + "code": "0x60806040523480156200001157600080fd5b5060043610620000875760003560e01c8063d23822421162000062578063d2382242146200014f578063d97df6521462000176578063e78cea9214620001b3578063ee9a31a214620001da57600080fd5b806354fd4d50146200008c5780635572acae14620000e15780637d1d0c5b1462000118575b600080fd5b620000c96040518060400160405280600c81526020017f312e342e312d626574612e37000000000000000000000000000000000000000081525081565b604051620000d891906200049b565b60405180910390f35b62000107620000f2366004620004e1565b60006020819052908152604090205460ff1681565b6040519015158152602001620000d8565b620001407f0000000000000000000000000000000000000000000000000000000000007a6981565b604051908152602001620000d8565b7f0000000000000000000000000000000000000000000000000000000000007a6962000140565b6200018d62000187366004620005e1565b62000202565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620000d8565b7f00000000000000000000000042000000000000000000000000000000000000146200018d565b6200018d7f000000000000000000000000420000000000000000000000000000000000001481565b600073ffffffffffffffffffffffffffffffffffffffff8416620002d3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4f7074696d69736d4d696e7461626c65455243373231466163746f72793a204c908201527f3120746f6b656e20616464726573732063616e6e6f742062652061646472657360648201527f7328302900000000000000000000000000000000000000000000000000000000608482015260a40160405180910390fd5b6000848484604051602001620002ec939291906200065e565b6040516020818303038152906040528051906020012090506000817f00000000000000000000000042000000000000000000000000000000000000147f0000000000000000000000000000000000000000000000000000000000007a698888886040516200035a906200041f565b6200036a959493929190620006ad565b8190604051809103906000f59050801580156200038b573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff8181166000818152602081815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590513381529394509189169290917fe72783bb8e0ca31286b85278da59684dd814df9762a52f0837f89edd1483b299910160405180910390a395945050505050565b6131bf806200070f83390190565b6000815180845260005b81811015620004555760208185018101518683018201520162000437565b8181111562000468576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000620004b060208301846200042d565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114620004dc57600080fd5b919050565b600060208284031215620004f457600080fd5b620004b082620004b7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126200054057600080fd5b813567ffffffffffffffff808211156200055e576200055e620004ff565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715620005a757620005a7620004ff565b81604052838152866020858801011115620005c157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215620005f757600080fd5b6200060284620004b7565b9250602084013567ffffffffffffffff808211156200062057600080fd5b6200062e878388016200052e565b935060408601359150808211156200064557600080fd5b5062000654868287016200052e565b9150509250925092565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006200068f60608301856200042d565b8281036040840152620006a381856200042d565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835286602084015280861660408401525060a06060830152620006ee60a08301856200042d565b82810360808401526200070281856200042d565b9897505050505050505056fe60e06040523480156200001157600080fd5b50604051620031bf380380620031bf83398101604081905262000034916200062d565b8181600062000044838262000756565b50600162000053828262000756565b5050506001600160a01b038516620000d85760405162461bcd60e51b815260206004820152603360248201527f4f7074696d69736d4d696e7461626c654552433732313a20627269646765206360448201527f616e6e6f7420626520616464726573732830290000000000000000000000000060648201526084015b60405180910390fd5b83600003620001505760405162461bcd60e51b815260206004820152603660248201527f4f7074696d69736d4d696e7461626c654552433732313a2072656d6f7465206360448201527f6861696e2069642063616e6e6f74206265207a65726f000000000000000000006064820152608401620000cf565b6001600160a01b038316620001ce5760405162461bcd60e51b815260206004820152603960248201527f4f7074696d69736d4d696e7461626c654552433732313a2072656d6f7465207460448201527f6f6b656e2063616e6e6f742062652061646472657373283029000000000000006064820152608401620000cf565b60808490526001600160a01b0383811660a081905290861660c0526200020290601462000256602090811b62000eed17901c565b62000218856200041660201b620011301760201c565b6040516020016200022b92919062000822565b604051602081830303815290604052600a90816200024a919062000756565b50505050505062000993565b6060600062000267836002620008ac565b62000274906002620008ce565b6001600160401b038111156200028e576200028e62000553565b6040519080825280601f01601f191660200182016040528015620002b9576020820181803683370190505b509050600360fc1b81600081518110620002d757620002d7620008e9565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110620003095762000309620008e9565b60200101906001600160f81b031916908160001a90535060006200032f846002620008ac565b6200033c906001620008ce565b90505b6001811115620003be576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620003745762000374620008e9565b1a60f81b8282815181106200038d576200038d620008e9565b60200101906001600160f81b031916908160001a90535060049490941c93620003b681620008ff565b90506200033f565b5083156200040f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620000cf565b9392505050565b6060816000036200043e5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156200046e5780620004558162000919565b9150620004669050600a836200094b565b915062000442565b6000816001600160401b038111156200048b576200048b62000553565b6040519080825280601f01601f191660200182016040528015620004b6576020820181803683370190505b5090505b84156200052e57620004ce60018362000962565b9150620004dd600a866200097c565b620004ea906030620008ce565b60f81b818381518110620005025762000502620008e9565b60200101906001600160f81b031916908160001a90535062000526600a866200094b565b9450620004ba565b949350505050565b80516001600160a01b03811681146200054e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620005865781810151838201526020016200056c565b8381111562000596576000848401525b50505050565b600082601f830112620005ae57600080fd5b81516001600160401b0380821115620005cb57620005cb62000553565b604051601f8301601f19908116603f01168101908282118183101715620005f657620005f662000553565b816040528381528660208588010111156200061057600080fd5b6200062384602083016020890162000569565b9695505050505050565b600080600080600060a086880312156200064657600080fd5b620006518662000536565b945060208601519350620006686040870162000536565b60608701519093506001600160401b03808211156200068657600080fd5b6200069489838a016200059c565b93506080880151915080821115620006ab57600080fd5b50620006ba888289016200059c565b9150509295509295909350565b600181811c90821680620006dc57607f821691505b602082108103620006fd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200075157600081815260208120601f850160051c810160208610156200072c5750805b601f850160051c820191505b818110156200074d5782815560010162000738565b5050505b505050565b81516001600160401b0381111562000772576200077262000553565b6200078a81620007838454620006c7565b8462000703565b602080601f831160018114620007c25760008415620007a95750858301515b600019600386901b1c1916600185901b1785556200074d565b600085815260208120601f198616915b82811015620007f357888601518255948401946001909101908401620007d2565b5085821015620008125787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6832ba3432b932bab69d60b91b8152600083516200084881600985016020880162000569565b600160fe1b60099184019182015283516200086b81600a84016020880162000569565b712f746f6b656e5552493f75696e743235363d60701b600a9290910191820152601c01949350505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615620008c957620008c962000896565b500290565b60008219821115620008e457620008e462000896565b500190565b634e487b7160e01b600052603260045260246000fd5b60008162000911576200091162000896565b506000190190565b6000600182016200092e576200092e62000896565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826200095d576200095d62000935565b500490565b60008282101562000977576200097762000896565b500390565b6000826200098e576200098e62000935565b500690565b60805160a05160c0516127d9620009e6600039600081816103e20152818161047a01528181610b210152610c430152600081816101e001526103bc015260008181610329015261040801526127d96000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80637d1d0c5b116100ee578063c87b56dd11610097578063e78cea9211610071578063e78cea92146103e0578063e951819614610406578063e985e9c51461042c578063ee9a31a21461047557600080fd5b8063c87b56dd1461039f578063d547cfb7146103b2578063d6c0b2c4146103ba57600080fd5b8063a1448194116100c8578063a144819414610366578063a22cb46514610379578063b88d4fde1461038c57600080fd5b80637d1d0c5b1461032457806395d89b411461034b5780639dc29fac1461035357600080fd5b806323b872dd1161015b5780634f6ccce7116101355780634f6ccce7146102af57806354fd4d50146102c25780636352211e146102fe57806370a082311461031157600080fd5b806323b872dd146102765780632f745c591461028957806342842e0e1461029c57600080fd5b8063081812fc1161018c578063081812fc1461023c578063095ea7b31461024f57806318160ddd1461026457600080fd5b806301ffc9a7146101b3578063033964be146101db57806306fdde0314610227575b600080fd5b6101c66101c1366004612226565b61049c565b60405190151581526020015b60405180910390f35b6102027f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b61022f6104fa565b6040516101d291906122b9565b61020261024a3660046122cc565b61058c565b61026261025d36600461230e565b6105c0565b005b6008545b6040519081526020016101d2565b610262610284366004612338565b610751565b61026861029736600461230e565b6107f2565b6102626102aa366004612338565b6108c1565b6102686102bd3660046122cc565b6108dc565b61022f6040518060400160405280600c81526020017f312e332e312d626574612e36000000000000000000000000000000000000000081525081565b61020261030c3660046122cc565b61099a565b61026861031f366004612374565b610a2c565b6102687f000000000000000000000000000000000000000000000000000000000000000081565b61022f610afa565b61026261036136600461230e565b610b09565b61026261037436600461230e565b610c2b565b61026261038736600461238f565b610d42565b61026261039a3660046123fa565b610d51565b61022f6103ad3660046122cc565b610df9565b61022f610e5f565b7f0000000000000000000000000000000000000000000000000000000000000000610202565b7f0000000000000000000000000000000000000000000000000000000000000000610202565b7f0000000000000000000000000000000000000000000000000000000000000000610268565b6101c661043a3660046124f4565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102027f000000000000000000000000000000000000000000000000000000000000000081565b60007faecafc23000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083168114806104f357506104f38361126d565b9392505050565b60606000805461050990612527565b80601f016020809104026020016040519081016040528092919081815260200182805461053590612527565b80156105825780601f1061055757610100808354040283529160200191610582565b820191906000526020600020905b81548152906001019060200180831161056557829003601f168201915b5050505050905090565b6000610597826112c3565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006105cb8261099a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361068d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806106b657506106b6813361043a565b610742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610684565b61074c8383611351565b505050565b61075b33826113f1565b6107e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610684565b61074c8383836114b0565b60006107fd83610a2c565b821061088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610684565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b61074c83838360405180602001604052806000815250610d51565b60006108e760085490565b8210610975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610684565b600882815481106109885761098861257a565b90600052602060002001549050919050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610a26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610684565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff8216610ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152608401610684565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b60606001805461050990612527565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610bce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4f7074696d69736d4d696e7461626c654552433732313a206f6e6c792062726960448201527f6467652063616e2063616c6c20746869732066756e6374696f6e0000000000006064820152608401610684565b610bd781611722565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca582604051610c1f91815260200190565b60405180910390a25050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610cf0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4f7074696d69736d4d696e7461626c654552433732313a206f6e6c792062726960448201527f6467652063616e2063616c6c20746869732066756e6374696f6e0000000000006064820152608401610684565b610cfa82826117fb565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610c1f91815260200190565b610d4d338383611815565b5050565b610d5b33836113f1565b610de7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610684565b610df384848484611942565b50505050565b6060610e04826112c3565b6000610e0e6119e5565b90506000815111610e2e57604051806020016040528060008152506104f3565b80610e3884611130565b604051602001610e499291906125a9565b6040516020818303038152906040529392505050565b600a8054610e6c90612527565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9890612527565b8015610ee55780601f10610eba57610100808354040283529160200191610ee5565b820191906000526020600020905b815481529060010190602001808311610ec857829003601f168201915b505050505081565b60606000610efc836002612607565b610f07906002612644565b67ffffffffffffffff811115610f1f57610f1f6123cb565b6040519080825280601f01601f191660200182016040528015610f49576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110610f8057610f8061257a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110610fe357610fe361257a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061101f846002612607565b61102a906001612644565b90505b60018111156110c7577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061106b5761106b61257a565b1a60f81b8282815181106110815761108161257a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936110c08161265c565b905061102d565b5083156104f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610684565b60608160000361117357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561119d578061118781612691565b91506111969050600a836126f8565b9150611177565b60008167ffffffffffffffff8111156111b8576111b86123cb565b6040519080825280601f01601f1916602001820160405280156111e2576020820181803683370190505b5090505b8415611265576111f760018361270c565b9150611204600a86612723565b61120f906030612644565b60f81b8183815181106112245761122461257a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061125e600a866126f8565b94506111e6565b949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610a265750610a26826119f4565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1661134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610684565b50565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906113ab8261099a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806113fd8361099a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061146b575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b8061126557508373ffffffffffffffffffffffffffffffffffffffff166114918461058c565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b8273ffffffffffffffffffffffffffffffffffffffff166114d08261099a565b73ffffffffffffffffffffffffffffffffffffffff1614611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610684565b73ffffffffffffffffffffffffffffffffffffffff8216611615576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610684565b611620838383611ad7565b61162b600082611351565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546001929061166190849061270c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080546001929061169c908490612644565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061172d8261099a565b905061173b81600084611ad7565b611746600083611351565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080546001929061177c90849061270c565b909155505060008281526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555183919073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b610d4d828260405180602001604052806000815250611bdd565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610684565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61194d8484846114b0565b61195984848484611c80565b610df3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610684565b6060600a805461050990612527565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611a8757507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610a2657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610a26565b73ffffffffffffffffffffffffffffffffffffffff8316611b3f57611b3a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611b7c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611b7c57611b7c8382611e73565b73ffffffffffffffffffffffffffffffffffffffff8216611ba05761074c81611f2a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461074c5761074c8282611fd9565b611be7838361202a565b611bf46000848484611c80565b61074c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610684565b600073ffffffffffffffffffffffffffffffffffffffff84163b15611e68576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290611cf7903390899088908890600401612737565b6020604051808303816000875af1925050508015611d50575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611d4d91810190612780565b60015b611e1d573d808015611d7e576040519150601f19603f3d011682016040523d82523d6000602084013e611d83565b606091505b508051600003611e15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610684565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611265565b506001949350505050565b60006001611e8084610a2c565b611e8a919061270c565b600083815260076020526040902054909150808214611eea5773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b600854600090611f3c9060019061270c565b60008381526009602052604081205460088054939450909284908110611f6457611f6461257a565b906000526020600020015490508060088381548110611f8557611f8561257a565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611fbd57611fbd61279d565b6001900381819060005260206000200160009055905550505050565b6000611fe483610a2c565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b73ffffffffffffffffffffffffffffffffffffffff82166120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610684565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610684565b61213f60008383611ad7565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290612175908490612644565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461134e57600080fd5b60006020828403121561223857600080fd5b81356104f3816121f8565b60005b8381101561225e578181015183820152602001612246565b83811115610df35750506000910152565b60008151808452612287816020860160208601612243565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f3602083018461226f565b6000602082840312156122de57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461230957600080fd5b919050565b6000806040838503121561232157600080fd5b61232a836122e5565b946020939093013593505050565b60008060006060848603121561234d57600080fd5b612356846122e5565b9250612364602085016122e5565b9150604084013590509250925092565b60006020828403121561238657600080fd5b6104f3826122e5565b600080604083850312156123a257600080fd5b6123ab836122e5565b9150602083013580151581146123c057600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561241057600080fd5b612419856122e5565b9350612427602086016122e5565b925060408501359150606085013567ffffffffffffffff8082111561244b57600080fd5b818701915087601f83011261245f57600080fd5b813581811115612471576124716123cb565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156124b7576124b76123cb565b816040528281528a60208487010111156124d057600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561250757600080fd5b612510836122e5565b915061251e602084016122e5565b90509250929050565b600181811c9082168061253b57607f821691505b602082108103612574577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600083516125bb818460208801612243565b8351908301906125cf818360208801612243565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561263f5761263f6125d8565b500290565b60008219821115612657576126576125d8565b500190565b60008161266b5761266b6125d8565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036126c2576126c26125d8565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612707576127076126c9565b500490565b60008282101561271e5761271e6125d8565b500390565b600082612732576127326126c9565b500690565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612776608083018461226f565b9695505050505050565b60006020828403121561279257600080fd5b81516104f3816121f8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c634300080f000aa164736f6c634300080f000a", + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30018": { + "code": "0x60806040526004361061010e5760003560e01c8063860f7cda116100a557806399a88ec411610074578063b794726211610059578063b794726214610329578063f2fde38b14610364578063f3b7dead1461038457600080fd5b806399a88ec4146102e95780639b2ea4bd1461030957600080fd5b8063860f7cda1461026b5780638d52d4a01461028b5780638da5cb5b146102ab5780639623609d146102d657600080fd5b80633ab76e9f116100e15780633ab76e9f146101cc5780636bd9f516146101f9578063715018a6146102365780637eff275e1461024b57600080fd5b80630652b57a1461011357806307c8f7b014610135578063204e1c7a14610155578063238181ae1461019f575b600080fd5b34801561011f57600080fd5b5061013361012e3660046111f9565b6103a4565b005b34801561014157600080fd5b50610133610150366004611216565b6103f3565b34801561016157600080fd5b506101756101703660046111f9565b610445565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ab57600080fd5b506101bf6101ba3660046111f9565b61066b565b60405161019691906112ae565b3480156101d857600080fd5b506003546101759073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020557600080fd5b506102296102143660046111f9565b60016020526000908152604090205460ff1681565b60405161019691906112f0565b34801561024257600080fd5b50610133610705565b34801561025757600080fd5b50610133610266366004611331565b610719565b34801561027757600080fd5b5061013361028636600461148c565b6108cc565b34801561029757600080fd5b506101336102a63660046114dc565b610903565b3480156102b757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610175565b6101336102e436600461150e565b610977565b3480156102f557600080fd5b50610133610304366004611331565b610b8e565b34801561031557600080fd5b50610133610324366004611584565b610e1e565b34801561033557600080fd5b5060035474010000000000000000000000000000000000000000900460ff166040519015158152602001610196565b34801561037057600080fd5b5061013361037f3660046111f9565b610eb4565b34801561039057600080fd5b5061017561039f3660046111f9565b610f6b565b6103ac6110e1565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6103fb6110e1565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610481576104816112c1565b036104fc578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f591906115cb565b9392505050565b6001816002811115610510576105106112c1565b03610560578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6002816002811115610574576105746112c1565b036105fe5760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac1916105e19190600401611635565b602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064015b60405180910390fd5b50919050565b60026020526000908152604090208054610684906115e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b0906115e8565b80156106fd5780601f106106d2576101008083540402835291602001916106fd565b820191906000526020600020905b8154815290600101906020018083116106e057829003601f168201915b505050505081565b61070d6110e1565b6107176000611162565b565b6107216110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561075d5761075d6112c1565b036107e9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b50505050505050565b60018160028111156107fd576107fd6112c1565b03610856576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016107b2565b600281600281111561086a5761086a6112c1565b036105fe576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016107b2565b505050565b6108d46110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206108c78282611724565b61090b6110e1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091169083600281111561096e5761096e6112c1565b02179055505050565b61097f6110e1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff16908160028111156109bb576109bb6112c1565b03610a81576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610a16908790879060040161183e565b60006040518083038185885af1158015610a34573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a7b9190810190611875565b50610b88565b610a8b8484610b8e565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610ab391906118ec565b60006040518083038185875af1925050503d8060008114610af0576040519150601f19603f3d011682016040523d82523d6000602084013e610af5565b606091505b5050905080610b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c6564000000000000000000000000000000000000606482015260840161065c565b505b50505050565b610b966110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610bd257610bd26112c1565b03610c2b576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016107b2565b6001816002811115610c3f57610c3f6112c1565b03610cbe576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016107b2565b6002816002811115610cd257610cd26112c1565b03610e165773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054610d07906115e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906115e8565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd9350610dde92508591508790600401611908565b600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b5050505050505050565b6108c7611940565b610e266110e1565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd90610e7e9085908590600401611908565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505050565b610ebc6110e1565b73ffffffffffffffffffffffffffffffffffffffff8116610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b610f6881611162565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610fa757610fa76112c1565b03610ff7578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600181600281111561100b5761100b6112c1565b0361105b578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600281600281111561106f5761106f6112c1565b036105fe57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f6857600080fd5b60006020828403121561120b57600080fd5b81356104f5816111d7565b60006020828403121561122857600080fd5b813580151581146104f557600080fd5b60005b8381101561125357818101518382015260200161123b565b83811115610b885750506000910152565b6000815180845261127c816020860160208601611238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f56020830184611264565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061132b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561134457600080fd5b823561134f816111d7565b9150602083013561135f816111d7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113e0576113e061136a565b604052919050565b600067ffffffffffffffff8211156114025761140261136a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061144161143c846113e8565b611399565b905082815283838301111561145557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261147d57600080fd5b6104f58383356020850161142e565b6000806040838503121561149f57600080fd5b82356114aa816111d7565b9150602083013567ffffffffffffffff8111156114c657600080fd5b6114d28582860161146c565b9150509250929050565b600080604083850312156114ef57600080fd5b82356114fa816111d7565b915060208301356003811061135f57600080fd5b60008060006060848603121561152357600080fd5b833561152e816111d7565b9250602084013561153e816111d7565b9150604084013567ffffffffffffffff81111561155a57600080fd5b8401601f8101861361156b57600080fd5b61157a8682356020840161142e565b9150509250925092565b6000806040838503121561159757600080fd5b823567ffffffffffffffff8111156115ae57600080fd5b6115ba8582860161146c565b925050602083013561135f816111d7565b6000602082840312156115dd57600080fd5b81516104f5816111d7565b600181811c908216806115fc57607f821691505b602082108103610665577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454611649816115e8565b8084870152604060018084166000811461166a57600181146116a2576116d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506116d0565b896000528660002060005b858110156116c85781548b82018601529083019088016116ad565b8a0184019650505b509398975050505050505050565b601f8211156108c757600081815260208120601f850160051c810160208610156117055750805b601f850160051c820191505b81811015610eac57828155600101611711565b815167ffffffffffffffff81111561173e5761173e61136a565b6117528161174c84546115e8565b846116de565b602080601f8311600181146117a5576000841561176f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610eac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156117f2578886015182559484019460019091019084016117d3565b508582101561182e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061186d6040830184611264565b949350505050565b60006020828403121561188757600080fd5b815167ffffffffffffffff81111561189e57600080fd5b8201601f810184136118af57600080fd5b80516118bd61143c826113e8565b8181528560208385010111156118d257600080fd5b6118e3826020830160208601611238565b95945050505050565b600082516118fe818460208701611238565b9190910192915050565b60408152600061191b6040830185611264565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea164736f6c634300080f000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + }, + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30019": { + "code": "0x60806040526004361061009a5760003560e01c806382356d8a1161006957806384411d651161004e57806384411d651461021d578063d0e12f9014610233578063d3e5792b1461026757600080fd5b806382356d8a146101a45780638312f149146101e057600080fd5b80630d9019e1146100a65780633ccfd60b1461010457806354fd4d501461011b57806366d003ac1461017157600080fd5b366100a157005b600080fd5b3480156100b257600080fd5b506100da7f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561011057600080fd5b5061011961029b565b005b34801561012757600080fd5b506101646040518060400160405280600c81526020017f312e352e302d626574612e36000000000000000000000000000000000000000081525081565b6040516100fb9190610671565b34801561017d57600080fd5b507f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb922666100da565b3480156101b057600080fd5b507f00000000000000000000000000000000000000000000000000000000000000015b6040516100fb919061074e565b3480156101ec57600080fd5b507f0000000000000000000000000000000000000000000000008ac7230489e800005b6040519081526020016100fb565b34801561022957600080fd5b5061020f60005481565b34801561023f57600080fd5b506101d37f000000000000000000000000000000000000000000000000000000000000000181565b34801561027357600080fd5b5061020f7f0000000000000000000000000000000000000000000000008ac7230489e8000081565b7f0000000000000000000000000000000000000000000000008ac7230489e80000471015610376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b60004790508060008082825461038c9190610762565b9091555050604080518281527f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226673ffffffffffffffffffffffffffffffffffffffff166020820152338183015290517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee817f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266337f000000000000000000000000000000000000000000000000000000000000000160405161047a94939291906107a1565b60405180910390a160017f000000000000000000000000000000000000000000000000000000000000000160018111156104b6576104b66106e4565b0361057a5760006104e77f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226683610649565b905080610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e7400000000000000000000000000000000606482015260840161036d565b5050565b6040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226616600482015262061a80602482015260606044820152600060648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084016000604051808303818588803b15801561062d57600080fd5b505af1158015610641573d6000803e3d6000fd5b505050505050565b6000610656835a8461065d565b9392505050565b6000806000806000858888f1949350505050565b600060208083528351808285015260005b8181101561069e57858101830151858201604001528201610682565b818111156106b0576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6002811061074a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6020810161075c8284610713565b92915050565b6000821982111561079c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff848116602083015283166040820152608081016107d96060830184610713565b9594505050505056fea164736f6c634300080f000a", + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3001a": { + "code": "0x60806040526004361061009a5760003560e01c806382356d8a1161006957806384411d651161004e57806384411d651461021d578063d0e12f9014610233578063d3e5792b1461026757600080fd5b806382356d8a146101a45780638312f149146101e057600080fd5b80630d9019e1146100a65780633ccfd60b1461010457806354fd4d501461011b57806366d003ac1461017157600080fd5b366100a157005b600080fd5b3480156100b257600080fd5b506100da7f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561011057600080fd5b5061011961029b565b005b34801561012757600080fd5b506101646040518060400160405280600c81526020017f312e352e302d626574612e35000000000000000000000000000000000000000081525081565b6040516100fb9190610671565b34801561017d57600080fd5b507f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb922666100da565b3480156101b057600080fd5b507f00000000000000000000000000000000000000000000000000000000000000015b6040516100fb919061074e565b3480156101ec57600080fd5b507f0000000000000000000000000000000000000000000000008ac7230489e800005b6040519081526020016100fb565b34801561022957600080fd5b5061020f60005481565b34801561023f57600080fd5b506101d37f000000000000000000000000000000000000000000000000000000000000000181565b34801561027357600080fd5b5061020f7f0000000000000000000000000000000000000000000000008ac7230489e8000081565b7f0000000000000000000000000000000000000000000000008ac7230489e80000471015610376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b60004790508060008082825461038c9190610762565b9091555050604080518281527f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226673ffffffffffffffffffffffffffffffffffffffff166020820152338183015290517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee817f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266337f000000000000000000000000000000000000000000000000000000000000000160405161047a94939291906107a1565b60405180910390a160017f000000000000000000000000000000000000000000000000000000000000000160018111156104b6576104b66106e4565b0361057a5760006104e77f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226683610649565b905080610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e7400000000000000000000000000000000606482015260840161036d565b5050565b6040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226616600482015262061a80602482015260606044820152600060648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084016000604051808303818588803b15801561062d57600080fd5b505af1158015610641573d6000803e3d6000fd5b505050505050565b6000610656835a8461065d565b9392505050565b6000806000806000858888f1949350505050565b600060208083528351808285015260005b8181101561069e57858101830151858201604001528201610682565b818111156106b0576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6002811061074a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6020810161075c8284610713565b92915050565b6000821982111561079c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff848116602083015283166040820152608081016107d96060830184610713565b9594505050505056fea164736f6c634300080f000a", + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3001b": { + "code": "0x60806040526004361061009a5760003560e01c806382356d8a1161006957806384411d651161004e57806384411d651461021d578063d0e12f9014610233578063d3e5792b1461026757600080fd5b806382356d8a146101a45780638312f149146101e057600080fd5b80630d9019e1146100a65780633ccfd60b1461010457806354fd4d501461011b57806366d003ac1461017157600080fd5b366100a157005b600080fd5b3480156100b257600080fd5b506100da7f000000000000000000000000420000000000000000000000000000000000001981565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561011057600080fd5b5061011961029b565b005b34801561012757600080fd5b506101646040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100fb9190610671565b34801561017d57600080fd5b507f00000000000000000000000042000000000000000000000000000000000000196100da565b3480156101b057600080fd5b507f00000000000000000000000000000000000000000000000000000000000000015b6040516100fb919061074e565b3480156101ec57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040519081526020016100fb565b34801561022957600080fd5b5061020f60005481565b34801561023f57600080fd5b506101d37f000000000000000000000000000000000000000000000000000000000000000181565b34801561027357600080fd5b5061020f7f000000000000000000000000000000000000000000000000000000000000000081565b7f0000000000000000000000000000000000000000000000000000000000000000471015610376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b60004790508060008082825461038c9190610762565b9091555050604080518281527f000000000000000000000000420000000000000000000000000000000000001973ffffffffffffffffffffffffffffffffffffffff166020820152338183015290517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee817f0000000000000000000000004200000000000000000000000000000000000019337f000000000000000000000000000000000000000000000000000000000000000160405161047a94939291906107a1565b60405180910390a160017f000000000000000000000000000000000000000000000000000000000000000160018111156104b6576104b66106e4565b0361057a5760006104e77f000000000000000000000000420000000000000000000000000000000000001983610649565b905080610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e7400000000000000000000000000000000606482015260840161036d565b5050565b6040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000420000000000000000000000000000000000001916600482015262061a80602482015260606044820152600060648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084016000604051808303818588803b15801561062d57600080fd5b505af1158015610641573d6000803e3d6000fd5b505050505050565b6000610656835a8461065d565b9392505050565b6000806000806000858888f1949350505050565b600060208083528351808285015260005b8181101561069e57858101830151858201604001528201610682565b818111156106b0576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6002811061074a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6020810161075c8284610713565b92915050565b6000821982111561079c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff848116602083015283166040820152608081016107d96060830184610713565b9594505050505056fea164736f6c634300080f000a", + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30020": { + "code": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d501461004657806360d7a27814610098578063a2ea7c6e146100b9575b600080fd5b6100826040518060400160405280600c81526020017f312e332e312d626574612e32000000000000000000000000000000000000000081525081565b60405161008f9190610473565b60405180910390f35b6100ab6100a636600461048d565b6100d9565b60405190815260200161008f565b6100cc6100c736600461053f565b61029d565b60405161008f9190610558565b60008060405180608001604052806000801b81526020018573ffffffffffffffffffffffffffffffffffffffff168152602001841515815260200187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250929350915061015b9050826103c5565b600081815260208190526040902054909150156101a4576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80825260008181526020818152604091829020845181559084015160018201805493860151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090941673ffffffffffffffffffffffffffffffffffffffff9092169190911792909217909155606083015183919060028201906102409082610682565b509050503373ffffffffffffffffffffffffffffffffffffffff16817fd0b86852e21f9e5fa4bc3b0cff9757ffe243d50c4b43968a42202153d651ea5e8460405161028b9190610558565b60405180910390a39695505050505050565b604080516080810182526000808252602082018190529181019190915260608082015260008281526020818152604091829020825160808101845281548152600182015473ffffffffffffffffffffffffffffffffffffffff8116938201939093527401000000000000000000000000000000000000000090920460ff1615159282019290925260028201805491929160608401919061033c906105e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610368906105e0565b80156103b55780601f1061038a576101008083540402835291602001916103b5565b820191906000526020600020905b81548152906001019060200180831161039857829003601f168201915b5050505050815250509050919050565b60008160600151826020015183604001516040516020016103e89392919061079c565b604051602081830303815290604052805190602001209050919050565b60005b83811015610420578181015183820152602001610408565b50506000910152565b60008151808452610441816020860160208601610405565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104866020830184610429565b9392505050565b600080600080606085870312156104a357600080fd5b843567ffffffffffffffff808211156104bb57600080fd5b818701915087601f8301126104cf57600080fd5b8135818111156104de57600080fd5b8860208285010111156104f057600080fd5b6020928301965094505085013573ffffffffffffffffffffffffffffffffffffffff8116811461051f57600080fd5b91506040850135801515811461053457600080fd5b939692955090935050565b60006020828403121561055157600080fd5b5035919050565b602081528151602082015273ffffffffffffffffffffffffffffffffffffffff6020830151166040820152604082015115156060820152600060608301516080808401526105a960a0840182610429565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c908216806105f457607f821691505b60208210810361062d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561067d57600081815260208120601f850160051c8101602086101561065a5750805b601f850160051c820191505b8181101561067957828155600101610666565b5050505b505050565b815167ffffffffffffffff81111561069c5761069c6105b1565b6106b0816106aa84546105e0565b84610633565b602080601f83116001811461070357600084156106cd5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610679565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561075057888601518255948401946001909101908401610731565b508582101561078c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600084516107ae818460208901610405565b60609490941b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190930190815290151560f81b60148201526015019291505056fea164736f6c6343000813000a", + "balance": "0x0" + }, + "c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30021": { + "code": "0x60806040526004361061018b5760003560e01c806395411525116100d6578063d45c44351161007f578063ed24911d11610059578063ed24911d146104fd578063f10b5cc814610512578063f17325e71461054157600080fd5b8063d45c443514610467578063e30bb5631461049e578063e71ff365146104dd57600080fd5b8063b469318d116100b0578063b469318d146103ba578063b83010d314610414578063cf190f341461044757600080fd5b80639541152514610367578063a3112a641461037a578063a6d4dbc7146103a757600080fd5b806344adc90e116101385780634d003070116101125780634d003070146102de57806354fd4d50146102fe57806379f7573a1461034757600080fd5b806344adc90e1461029857806346926267146102b85780634cb7e9e5146102cb57600080fd5b806317d7de7c1161016957806317d7de7c146102205780632d0335ab146102425780633c0427151461028557600080fd5b80630eabf6601461019057806312b11a17146101a557806313893f61146101e7575b600080fd5b6101a361019e3660046134c8565b610554565b005b3480156101b157600080fd5b507ffeb2925a02bae3dae48d424a0437a2b6ac939aa9230ddc55a1a76f065d9880765b6040519081526020015b60405180910390f35b3480156101f357600080fd5b506102076102023660046134c8565b6106eb565b60405167ffffffffffffffff90911681526020016101de565b34801561022c57600080fd5b50610235610730565b6040516101de9190613578565b34801561024e57600080fd5b506101d461025d3660046135bd565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101d46102933660046135da565b610760565b6102ab6102a63660046134c8565b610863565b6040516101de9190613615565b6101a36102c6366004613659565b6109e4565b6101a36102d93660046134c8565b610a68565b3480156102ea57600080fd5b506102076102f9366004613671565b610b4b565b34801561030a57600080fd5b506102356040518060400160405280600c81526020017f312e342e312d626574612e33000000000000000000000000000000000000000081525081565b34801561035357600080fd5b506101a3610362366004613671565b610b58565b6102ab6103753660046134c8565b610bef565b34801561038657600080fd5b5061039a610395366004613671565b610e62565b6040516101de9190613771565b6101a36103b5366004613784565b611025565b3480156103c657600080fd5b506102076103d5366004613797565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152603460209081526040808320938352929052205467ffffffffffffffff1690565b34801561042057600080fd5b507fb5d556f07587ec0f08cf386545cc4362c702a001650c2058002615ee5c9d1e756101d4565b34801561045357600080fd5b50610207610462366004613671565b6110ca565b34801561047357600080fd5b50610207610482366004613671565b60009081526033602052604090205467ffffffffffffffff1690565b3480156104aa57600080fd5b506104cd6104b9366004613671565b600090815260326020526040902054151590565b60405190151581526020016101de565b3480156104e957600080fd5b506102076104f83660046134c8565b6110d8565b34801561050957600080fd5b506101d4611110565b34801561051e57600080fd5b5060405173420000000000000000000000000000000000002081526020016101de565b6101d461054f3660046137c3565b61111a565b348160005b818110156106e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82018114600086868481811061059a5761059a6137fe565b90506020028101906105ac919061382d565b6105b590613ac3565b60208101518051919250908015806105d257508260400151518114155b15610609576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156106ad576106a56040518060a001604052808660000151815260200185848151811061063e5761063e6137fe565b6020026020010151815260200186604001518481518110610661576106616137fe565b60200260200101518152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015167ffffffffffffffff168152506111d8565b60010161060c565b506106c383600001518385606001518a886113e9565b6106cd9088613bed565b9650505050506106dd8160010190565b9050610559565b5050505050565b60004282825b818110156107245761071c3387878481811061070f5761070f6137fe565b9050602002013585611a18565b6001016106f1565b50909150505b92915050565b606061075b7f4541530000000000000000000000000000000000000000000000000000000000611b17565b905090565b600061077361076e83613d22565b611ca5565b604080516001808252818301909252600091816020015b6040805160c081018252600080825260208083018290529282018190526060808301829052608083015260a082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161078a5790505090506107f86020840184613d9d565b61080190613dd1565b81600081518110610814576108146137fe565b602090810291909101015261083d83358261083560c0870160a088016135bd565b346001611e2f565b60200151600081518110610853576108536137fe565b6020026020010151915050919050565b60608160008167ffffffffffffffff8111156108815761088161386b565b6040519080825280602002602001820160405280156108b457816020015b606081526020019060019003908161089f5790505b509050600034815b848110156109ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85018114368989848181106108fc576108fc6137fe565b905060200281019061090e9190613ddd565b905061091d6020820182613e11565b9050600003610958576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061097d823561096c6020850185613e11565b61097591613e79565b338887611e2f565b805190915061098c9086613bed565b945080602001518785815181106109a5576109a56137fe565b6020026020010181905250806020015151860195505050506109c78160010190565b90506108bc565b506109d98383612541565b979650505050505050565b604080516001808252818301909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816109fb579050509050610a3636839003830160208401613eed565b81600081518110610a4957610a496137fe565b6020908102919091010152610a63823582333460016113e9565b505050565b348160005b818110156106e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201811436868684818110610aad57610aad6137fe565b9050602002810190610abf9190613ddd565b9050610b2c8135610ad36020840184613f09565b808060200260200160405190810160405280939291908181526020016000905b82821015610b1f57610b1060408302860136819003810190613eed565b81526020019060010190610af3565b50505050503388866113e9565b610b369086613bed565b94505050610b448160010190565b9050610a6d565b60004261072a838261262b565b33600090815260208190526040902054808211610ba1576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152602081815260409182902084905581518381529081018490527f57b09af877df9068fd60a69d7b21f5576b8b38955812d6ae4ac52942f1e38fb7910160405180910390a15050565b60608160008167ffffffffffffffff811115610c0d57610c0d61386b565b604051908082528060200260200182016040528015610c4057816020015b6060815260200190600190039081610c2b5790505b509050600034815b848110156109ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501811436898984818110610c8857610c886137fe565b9050602002810190610c9a919061382d565b9050366000610cac6020840184613e11565b909250905080801580610ccd5750610cc76040850185613f71565b90508114155b15610d04576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610de557610ddd6040518060a0016040528087600001358152602001868685818110610d3957610d396137fe565b9050602002810190610d4b9190613d9d565b610d5490613dd1565b8152602001610d666040890189613f71565b85818110610d7657610d766137fe565b905060600201803603810190610d8c9190613fd8565b8152602001610da16080890160608a016135bd565b73ffffffffffffffffffffffffffffffffffffffff168152602001610dcc60a0890160808a01613ff4565b67ffffffffffffffff169052611ca5565b600101610d07565b506000610e0e8535610df78587613e79565b610e076080890160608a016135bd565b8b8a611e2f565b8051909150610e1d9089613bed565b975080602001518a8881518110610e3657610e366137fe565b602002602001018190525080602001515189019850505050505050610e5b8160010190565b9050610c48565b604080516101408101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820183905261010082019290925261012081019190915260008281526032602090815260409182902082516101408101845281548152600182015492810192909252600281015467ffffffffffffffff808216948401949094526801000000000000000081048416606084015270010000000000000000000000000000000090049092166080820152600382015460a0820152600482015473ffffffffffffffffffffffffffffffffffffffff90811660c0830152600583015490811660e083015274010000000000000000000000000000000000000000900460ff16151561010082015260068201805491929161012084019190610f9c9061400f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc89061400f565b80156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b5050505050815250509050919050565b61103c6110373683900383018361405c565b6111d8565b604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908161105357905050905061108e36839003830160208401613eed565b816000815181106110a1576110a16137fe565b6020908102919091010152610a638235826110c260e0860160c087016135bd565b3460016113e9565b60004261072a338483611a18565b60004282825b81811015610724576111088686838181106110fb576110fb6137fe565b905060200201358461262b565b6001016110de565b600061075b6126ed565b604080516001808252818301909252600091829190816020015b6040805160c081018252600080825260208083018290529282018190526060808301829052608083015260a082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816111345790505090506111a26020840184613d9d565b6111ab90613dd1565b816000815181106111be576111be6137fe565b602090810291909101015261083d83358233346001611e2f565b608081015167ffffffffffffffff161580159061120c57504267ffffffffffffffff16816080015167ffffffffffffffff16105b15611243576040517f1ab7da6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808201516040808401516060850151855184518587015173ffffffffffffffffffffffffffffffffffffffff84166000908152978890529487208054969794969495611337957fb5d556f07587ec0f08cf386545cc4362c702a001650c2058002615ee5c9d1e7595949392886112ba836140ca565b909155506080808c015160408051602081019990995273ffffffffffffffffffffffffffffffffffffffff9097169688019690965260608701949094529285019190915260a084015260c083015267ffffffffffffffff1660e0820152610100015b60405160208183030381529060405280519060200120612821565b90506113ad84606001518284602001518560400151866000015160405160200161139993929190928352602083019190915260f81b7fff0000000000000000000000000000000000000000000000000000000000000016604082015260410190565b604051602081830303815290604052612834565b6113e3576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6040517fa2ea7c6e0000000000000000000000000000000000000000000000000000000081526004810186905260009081907342000000000000000000000000000000000000209063a2ea7c6e90602401600060405180830381865afa158015611457573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261149d9190810190614102565b80519091506114d8576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b855160008167ffffffffffffffff8111156114f5576114f561386b565b60405190808252806020026020018201604052801561159457816020015b60408051610140810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c0830182905260e0830182905261010083019190915261012082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816115135790505b50905060008267ffffffffffffffff8111156115b2576115b261386b565b6040519080825280602002602001820160405280156115db578160200160208202803683370190505b50905060005b838110156119fa5760008a82815181106115fd576115fd6137fe565b6020908102919091018101518051600090815260329092526040909120805491925090611656576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8c816001015414611693576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581015473ffffffffffffffffffffffffffffffffffffffff8c81169116146116e9576040517f4ca8886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581015474010000000000000000000000000000000000000000900460ff1661173f576040517f157bd4c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002810154700100000000000000000000000000000000900467ffffffffffffffff1615611799576040517f905e710700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b426002820180547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff811670010000000000000000000000000000000067ffffffffffffffff948516810291821793849055604080516101408101825287548152600188015460208201529386169286169290921791830191909152680100000000000000008304841660608301529091049091166080820152600382015460a0820152600482015473ffffffffffffffffffffffffffffffffffffffff90811660c0830152600583015490811660e083015274010000000000000000000000000000000000000000900460ff16151561010082015260068201805483916101208401916118a59061400f565b80601f01602080910402602001604051908101604052809291908181526020018280546118d19061400f565b801561191e5780601f106118f35761010080835404028352916020019161191e565b820191906000526020600020905b81548152906001019060200180831161190157829003601f168201915b505050505081525050858481518110611939576119396137fe565b6020026020010181905250816020015184848151811061195b5761195b6137fe565b6020026020010181815250508c8b73ffffffffffffffffffffffffffffffffffffffff16868581518110611991576119916137fe565b602002602001015160c0015173ffffffffffffffffffffffffffffffffffffffff167ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f61585600001516040516119e891815260200190565b60405180910390a450506001016115e1565b50611a0a84838360018b8b612a03565b9a9950505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152603460209081526040808320858452918290529091205467ffffffffffffffff1615611a8c576040517fec9d6eeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526020829052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861690811790915590519091859173ffffffffffffffffffffffffffffffffffffffff8816917f92a1f7a41a7c585a8b09e25b195e225b1d43248daca46b0faf9e0792777a222991a450505050565b604080516020808252818301909252606091600091906020820181803683370190505090506000805b6020811015611be2576000858260208110611b5d57611b5d6137fe565b1a60f81b90507fff000000000000000000000000000000000000000000000000000000000000008116600003611b935750611be2565b80848481518110611ba657611ba66137fe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505060019182019101611b40565b5060008167ffffffffffffffff811115611bfe57611bfe61386b565b6040519080825280601f01601f191660200182016040528015611c28576020820181803683370190505b50905060005b82811015611c9c57838181518110611c4857611c486137fe565b602001015160f81c60f81b828281518110611c6557611c656137fe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611c2e565b50949350505050565b608081015167ffffffffffffffff1615801590611cd957504267ffffffffffffffff16816080015167ffffffffffffffff16105b15611d10576040517f1ab7da6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808201516040808401516060808601518651855186880151868801519488015160808901518051908b012060a08a015173ffffffffffffffffffffffffffffffffffffffff871660009081529b8c9052988b2080549a9b989a9899611337997ffeb2925a02bae3dae48d424a0437a2b6ac939aa9230ddc55a1a76f065d988076999493928c611da0836140ca565b919050558e6080015160405160200161131c9b9a999897969594939291909a8b5273ffffffffffffffffffffffffffffffffffffffff998a1660208c015260408b019890985295909716606089015267ffffffffffffffff938416608089015291151560a088015260c087015260e0860152610100850193909352610120840152166101408201526101600190565b60408051808201909152600081526060602082015284516040805180820190915260008152606060208201528167ffffffffffffffff811115611e7457611e7461386b565b604051908082528060200260200182016040528015611e9d578160200160208202803683370190505b5060208201526040517fa2ea7c6e000000000000000000000000000000000000000000000000000000008152600481018990526000907342000000000000000000000000000000000000209063a2ea7c6e90602401600060405180830381865afa158015611f0f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f559190810190614102565b8051909150611f90576040517fbf37b20e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008367ffffffffffffffff811115611fab57611fab61386b565b60405190808252806020026020018201604052801561204a57816020015b60408051610140810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c0830182905260e0830182905261010083019190915261012082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181611fc95790505b50905060008467ffffffffffffffff8111156120685761206861386b565b604051908082528060200260200182016040528015612091578160200160208202803683370190505b50905060005b858110156125205760008b82815181106120b3576120b36137fe565b60200260200101519050600067ffffffffffffffff16816020015167ffffffffffffffff16141580156120fe57504267ffffffffffffffff16816020015167ffffffffffffffff1611155b15612135576040517f08e8b93700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460400151158015612148575080604001515b1561217f576040517f157bd4c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052806000801b81526020018f81526020016121a34290565b67ffffffffffffffff168152602001836020015167ffffffffffffffff168152602001600067ffffffffffffffff16815260200183606001518152602001836000015173ffffffffffffffffffffffffffffffffffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815260200183604001511515815260200183608001518152509050600080600090505b6122458382612df4565b600081815260326020526040902054909250156122645760010161223b565b81835260008281526032602090815260409182902085518155908501516001820155908401516002820180546060870151608088015167ffffffffffffffff908116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff92821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169190951617919091171691909117905560a0840151600382015560c084015160048201805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905560e0850151600583018054610100880151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff000000000000000000000000000000000000000000909116929093169190911791909117905561012084015184919060068201906123e49082614228565b50505060608401511561243b57606084015160009081526032602052604090205461243b576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8287868151811061244e5761244e6137fe565b60200260200101819052508360a00151868681518110612470576124706137fe565b6020026020010181815250508189602001518681518110612493576124936137fe565b6020026020010181815250508f8e73ffffffffffffffffffffffffffffffffffffffff16856000015173ffffffffffffffffffffffffffffffffffffffff167f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b358560405161250391815260200190565b60405180910390a4505050506125198160010190565b9050612097565b5061253083838360008c8c612a03565b845250919998505050505050505050565b606060008267ffffffffffffffff81111561255e5761255e61386b565b604051908082528060200260200182016040528015612587578160200160208202803683370190505b508451909150600090815b818110156126205760008782815181106125ae576125ae6137fe565b6020026020010151905060008151905060005b8181101561260c578281815181106125db576125db6137fe565b60200260200101518787815181106125f5576125f56137fe565b6020908102919091010152600195860195016125c1565b5050506126198160010190565b9050612592565b509195945050505050565b60008281526033602052604090205467ffffffffffffffff161561267b576040517f2e26794600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526033602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051909184917f5aafceeb1c7ad58e4a84898bdee37c02c0fc46e7d24e6b60e8209449f183459f9190a35050565b60003073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a5906e11c3b7f5b832bcbf389295d44e7695b4a61614801561275357507f000000000000000000000000000000000000000000000000000000000000076346145b1561277d57507f8468d0181abf73384d91963514c8f501771a4e37c3f4b5daf31aa15cabc66e2290565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f9fed719e0073f95229e6f4f6b6f28f260c524ab08aa40b11f9c28cb710d7c72a828401527f6a08c3e203132c561752255a4d52ffae85bb9c5d33cb3291520dea1b8435638960608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600061072a61282e6126ed565b83612e53565b60008060006128438585612e95565b9092509050600081600481111561285c5761285c614342565b14801561289457508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b156128a4576001925050506129fc565b6000808773ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b88886040516024016128d9929190614371565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516129629190614392565b600060405180830381855afa9150503d806000811461299d576040519150601f19603f3d011682016040523d82523d6000602084013e6129a2565b606091505b50915091508180156129b5575080516020145b80156129f5575080517f1626ba7e00000000000000000000000000000000000000000000000000000000906129f390830160209081019084016143a4565b145b9450505050505b9392505050565b84516000906001819003612a5b57612a538888600081518110612a2857612a286137fe565b602002602001015188600081518110612a4357612a436137fe565b6020026020010151888888612eda565b915050612dea565b602088015173ffffffffffffffffffffffffffffffffffffffff8116612afc5760005b82811015612ae157878181518110612a9857612a986137fe565b6020026020010151600014612ad9576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101612a7e565b508315612af157612af1856131f9565b600092505050612dea565b6000808273ffffffffffffffffffffffffffffffffffffffff1663ce46e0466040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6e91906143bd565b905060005b84811015612c2b5760008a8281518110612b8f57612b8f6137fe565b6020026020010151905080600003612ba75750612c23565b82612bde576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88811115612c18576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b978890039792909201915b600101612b73565b508715612d06576040517f88e5b2d900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906388e5b2d9908490612c88908e908e906004016143da565b60206040518083038185885af1158015612ca6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612ccb91906143bd565b612d01576040517fbf2f3a8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd5565b6040517f91db0b7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906391db0b7e908490612d5c908e908e906004016143da565b60206040518083038185885af1158015612d7a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d9f91906143bd565b612dd5576040517fe8bee83900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8515612de457612de4876131f9565b50925050505b9695505050505050565b60208083015160c084015160e0850151604080870151606088015161010089015160a08a01516101208b01519451600099612e3599989796918c9101614493565b60405160208183030381529060405280519060200120905092915050565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526022810183905260428101829052600090606201612e35565b6000808251604103612ecb5760208301516040840151606085015160001a612ebf8782858561320c565b94509450505050612ed3565b506000905060025b9250929050565b602086015160009073ffffffffffffffffffffffffffffffffffffffff8116612f4e578515612f35576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8215612f4457612f44846131f9565b6000915050612dea565b8515613039578073ffffffffffffffffffffffffffffffffffffffff1663ce46e0466040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc391906143bd565b612ff9576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83861115613033576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85840393505b8415613111576040517fe49617e100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e49617e1908890613093908b90600401613771565b60206040518083038185885af11580156130b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130d691906143bd565b61310c576040517fccf3bb2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131de565b6040517fe60c350500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e60c3505908890613165908b90600401613771565b60206040518083038185885af1158015613183573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131a891906143bd565b6131de576040517fbd8ba84d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82156131ed576131ed846131f9565b50939695505050505050565b8015613209576132093382613324565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613243575060009050600361331b565b8460ff16601b1415801561325b57508460ff16601c14155b1561326c575060009050600461331b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156132c0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166133145760006001925092505061331b565b9150600090505b94509492505050565b80471015613393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146133ed576040519150601f19603f3d011682016040523d82523d6000602084013e6133f2565b606091505b5050905080610a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161338a565b60008083601f84011261349557600080fd5b50813567ffffffffffffffff8111156134ad57600080fd5b6020830191508360208260051b8501011115612ed357600080fd5b600080602083850312156134db57600080fd5b823567ffffffffffffffff8111156134f257600080fd5b6134fe85828601613483565b90969095509350505050565b60005b8381101561352557818101518382015260200161350d565b50506000910152565b6000815180845261354681602086016020860161350a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129fc602083018461352e565b73ffffffffffffffffffffffffffffffffffffffff8116811461320957600080fd5b80356135b88161358b565b919050565b6000602082840312156135cf57600080fd5b81356129fc8161358b565b6000602082840312156135ec57600080fd5b813567ffffffffffffffff81111561360357600080fd5b820160e081850312156129fc57600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561364d57835183529284019291840191600101613631565b50909695505050505050565b60006060828403121561366b57600080fd5b50919050565b60006020828403121561368357600080fd5b5035919050565b6000610140825184526020830151602085015260408301516136b8604086018267ffffffffffffffff169052565b5060608301516136d4606086018267ffffffffffffffff169052565b5060808301516136f0608086018267ffffffffffffffff169052565b5060a083015160a085015260c083015161372260c086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e083015161374a60e086018273ffffffffffffffffffffffffffffffffffffffff169052565b506101008381015115159085015261012080840151818601839052612dea8387018261352e565b6020815260006129fc602083018461368a565b6000610100828403121561366b57600080fd5b600080604083850312156137aa57600080fd5b82356137b58161358b565b946020939093013593505050565b6000602082840312156137d557600080fd5b813567ffffffffffffffff8111156137ec57600080fd5b8201604081850312156129fc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261386157600080fd5b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156138bd576138bd61386b565b60405290565b60405160c0810167ffffffffffffffff811182821017156138bd576138bd61386b565b6040516080810167ffffffffffffffff811182821017156138bd576138bd61386b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156139505761395061386b565b604052919050565b600067ffffffffffffffff8211156139725761397261386b565b5060051b60200190565b60006040828403121561398e57600080fd5b6040516040810181811067ffffffffffffffff821117156139b1576139b161386b565b604052823581526020928301359281019290925250919050565b6000606082840312156139dd57600080fd5b6040516060810181811067ffffffffffffffff82111715613a0057613a0061386b565b604052905080823560ff81168114613a1757600080fd5b8082525060208301356020820152604083013560408201525092915050565b600082601f830112613a4757600080fd5b81356020613a5c613a5783613958565b613909565b82815260609283028501820192828201919087851115613a7b57600080fd5b8387015b85811015613a9e57613a9189826139cb565b8452928401928101613a7f565b5090979650505050505050565b803567ffffffffffffffff811681146135b857600080fd5b600060a08236031215613ad557600080fd5b613add61389a565b8235815260208084013567ffffffffffffffff80821115613afd57600080fd5b9085019036601f830112613b1057600080fd5b8135613b1e613a5782613958565b81815260069190911b83018401908481019036831115613b3d57600080fd5b938501935b82851015613b6657613b54368661397c565b82528582019150604085019450613b42565b80868801525050506040860135925080831115613b8257600080fd5b5050613b9036828601613a36565b604083015250613ba2606084016135ad565b6060820152613bb360808401613aab565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561072a5761072a613bbe565b801515811461320957600080fd5b600067ffffffffffffffff821115613c2857613c2861386b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600060c08284031215613c6657600080fd5b613c6e6138c3565b90508135613c7b8161358b565b81526020613c8a838201613aab565b818301526040830135613c9c81613c00565b604083015260608381013590830152608083013567ffffffffffffffff811115613cc557600080fd5b8301601f81018513613cd657600080fd5b8035613ce4613a5782613c0e565b8181528684838501011115613cf857600080fd5b818484018583013760008483830101528060808601525050505060a082013560a082015292915050565b600060e08236031215613d3457600080fd5b613d3c61389a565b82358152602083013567ffffffffffffffff811115613d5a57600080fd5b613d6636828601613c54565b602083015250613d7936604085016139cb565b604082015260a0830135613d8c8161358b565b6060820152613bb360c08401613aab565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4183360301811261386157600080fd5b600061072a3683613c54565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261386157600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e4657600080fd5b83018035915067ffffffffffffffff821115613e6157600080fd5b6020019150600581901b3603821315612ed357600080fd5b6000613e87613a5784613958565b80848252602080830192508560051b850136811115613ea557600080fd5b855b81811015613ee157803567ffffffffffffffff811115613ec75760008081fd5b613ed336828a01613c54565b865250938201938201613ea7565b50919695505050505050565b600060408284031215613eff57600080fd5b6129fc838361397c565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613f3e57600080fd5b83018035915067ffffffffffffffff821115613f5957600080fd5b6020019150600681901b3603821315612ed357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613fa657600080fd5b83018035915067ffffffffffffffff821115613fc157600080fd5b6020019150606081023603821315612ed357600080fd5b600060608284031215613fea57600080fd5b6129fc83836139cb565b60006020828403121561400657600080fd5b6129fc82613aab565b600181811c9082168061402357607f821691505b60208210810361366b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000610100828403121561406f57600080fd5b61407761389a565b82358152614088846020850161397c565b602082015261409a84606085016139cb565b604082015260c08301356140ad8161358b565b60608201526140be60e08401613aab565b60808201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140fb576140fb613bbe565b5060010190565b6000602080838503121561411557600080fd5b825167ffffffffffffffff8082111561412d57600080fd5b908401906080828703121561414157600080fd5b6141496138e6565b825181528383015161415a8161358b565b81850152604083015161416c81613c00565b604082015260608301518281111561418357600080fd5b80840193505086601f84011261419857600080fd5b825191506141a8613a5783613c0e565b82815287858486010111156141bc57600080fd5b6141cb8386830187870161350a565b60608201529695505050505050565b601f821115610a6357600081815260208120601f850160051c810160208610156142015750805b601f850160051c820191505b818110156142205782815560010161420d565b505050505050565b815167ffffffffffffffff8111156142425761424261386b565b61425681614250845461400f565b846141da565b602080601f8311600181146142a957600084156142735750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614220565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142f6578886015182559484019460019091019084016142d7565b508582101561433257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82815260406020820152600061438a604083018461352e565b949350505050565b6000825161386181846020870161350a565b6000602082840312156143b657600080fd5b5051919050565b6000602082840312156143cf57600080fd5b81516129fc81613c00565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b8381101561444f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa088870301855261443d86835161368a565b95509382019390820190600101614403565b50508584038187015286518085528782019482019350915060005b828110156144865784518452938101939281019260010161446a565b5091979650505050505050565b89815260007fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808b60601b166020840152808a60601b166034840152507fffffffffffffffff000000000000000000000000000000000000000000000000808960c01b166048840152808860c01b1660508401525085151560f81b6058830152846059830152835161452c81607985016020880161350a565b80830190507fffffffff000000000000000000000000000000000000000000000000000000008460e01b166079820152607d81019150509a995050505050505050505056fea164736f6c6343000813000a", + "balance": "0x0" } }, "number": "0x0", From f85a50208a1cefa69b1524a964b87bc7bbea92e5 Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Wed, 20 Aug 2025 19:21:19 +0100 Subject: [PATCH 13/36] fix tx insertion validation, add post validation helper --- crates/gas-station/src/lib.rs | 316 ++++++++++++++----------- crates/optimism/payload/src/builder.rs | 1 - 2 files changed, 174 insertions(+), 143 deletions(-) diff --git a/crates/gas-station/src/lib.rs b/crates/gas-station/src/lib.rs index eec59918932..d9fe5be3df2 100644 --- a/crates/gas-station/src/lib.rs +++ b/crates/gas-station/src/lib.rs @@ -2,7 +2,7 @@ // CalculateGasStationStorageSlots -> calculate_slots // ValidateGaslessTx -> validate_gasless_tx -use alloy_primitives::{address, b256, keccak256, Address, B256, U256}; +use alloy_primitives::{address, b256, keccak256, Address, B256, Bytes, Log, U256}; use reth_storage_api::StateProvider; #[derive(Clone, Debug)] // lets us clone (.clone()) and print debug info ("{:?}") @@ -19,6 +19,7 @@ pub fn credits_used_topic0() -> B256 { keccak256(b"CreditsUsed(address,address,uint256,uint256)") } + /// predeploy local for GasStation by default pub const GAS_STATION_PREDEPLOY: Address = address!("0x4300000000000000000000000000000000000001"); @@ -38,100 +39,86 @@ pub const GAS_STATION_STORAGE_LOCATION: B256 = /// and optional `from`. #[derive(Clone, Debug)] pub struct GasStationStorageSlots { - pub contracts_slot: B256, - pub contract_slot: B256, - pub registered_slot: B256, - pub active_slot: B256, - pub admin_slot: B256, - pub credits_slot: B256, - pub whitelist_enabled_slot: B256, - pub single_use_enabled_slot: B256, - pub whitelist_user_slot: Option, - pub used_addresses_user_slot: Option, + pub registered_slot: B256, // struct base slot (has registered/active packed) + pub active_slot: B256, // same as registered_slot (both in packed struct) + pub credits_slot: B256, // credits slot + pub nested_whitelist_map_base_slot: B256, // base slot for the nested whitelist mapping + pub whitelist_enabled_slot: B256, // whitelist enabled flag + pub single_use_enabled_slot: B256, // single use enabled flag + pub used_addresses_map_base_slot: B256, // base slot for the nested usedAddresses mapping } -/// computes storage slots according to solidity layout for -/// mapping(address => GaslessContract) contracts -/// and fields of GaslessContract etc -pub fn calculate_slots( - gas_station_storage_location: B256, - to: Address, - from: Option
, -) -> GasStationStorageSlots { - // GasStationStorage Layout: - // 0: dao - // 1: contracts (mapping) -> mapping slot index 1 within the struct - // 2: creditPackages (mapping) - // 3: nextPackageId (u256) - // We need base slot for `contracts` to compute keccak(key . slot). - - // contracts mapping position within the struct - let contracts_field_index = U256::from(1u64); - - // Step 1.derive the slot representing `contracts`. - let mut buf = [0u8; 64]; - // – keccak256(abi.encode(field_index, storage_location)) - buf[..32].copy_from_slice(B256::from(contracts_field_index).as_slice()); // add field_index to buf - buf[32..].copy_from_slice(gas_station_storage_location.as_slice()); // add storage_location to buf - let contracts_slot = keccak256(buf); // hash it - - // Step 2. derive the slot for key `to` in the `contracts` mapping. - let mut elem_buf = [0u8; 64]; - // left-pad address to 32 bytes - elem_buf[12..32].copy_from_slice(to.as_slice()); - elem_buf[32..].copy_from_slice(contracts_slot.as_slice()); - let contract_slot = keccak256(elem_buf); - - // fields of GaslessContract layout (packed sequentially starting at contract_slot): - // 0: bool registered - // 1: bool active - // 2: address admin - // 3: uint256 credits - // 4: bool whitelistEnabled - // 5: mapping(address => bool) whitelist (slot index 5) - // 6: bool singleUseEnabled - // 7: mapping(address => bool) usedAddresses (slot index 7) - // Note: Booleans may be bit-packed but solidity puts each bool in its own slot when followed by mappings. - - // Step 3. derive the slots for the fields of GaslessContract. - let registered_slot = contract_slot; - let active_slot = add_u64_to_b256(contract_slot, 1); - let admin_slot = add_u64_to_b256(contract_slot, 2); - let credits_slot = add_u64_to_b256(contract_slot, 3); - let whitelist_enabled_slot = add_u64_to_b256(contract_slot, 4); - let whitelist_mapping_slot = add_u64_to_b256(contract_slot, 5); - let single_use_enabled_slot = add_u64_to_b256(contract_slot, 6); - let used_addresses_mapping_slot = add_u64_to_b256(contract_slot, 7); - - // Step 4. If `from` provided, compute nested mapping keys - let whitelist_user_slot = from.map(|addr| { - let mut buf = [0u8; 64]; - buf[12..32].copy_from_slice(addr.as_slice()); - buf[32..].copy_from_slice(whitelist_mapping_slot.as_slice()); - keccak256(buf) - }); - let used_addresses_user_slot = from.map(|addr| { - let mut buf = [0u8; 64]; - buf[12..32].copy_from_slice(addr.as_slice()); - buf[32..].copy_from_slice(used_addresses_mapping_slot.as_slice()); - keccak256(buf) - }); - - // Step 5. return the slots +/// Calculates the storage slot hashes for a specific registered contract within the GasStation's `contracts` mapping. +/// It returns the base slot for the struct (holding packed fields), the slot for credits, +/// the slot for whitelistEnabled, and the base slot for the nested whitelist mapping. +pub fn calculate_gas_station_slots(registered_contract_address: Address) -> GasStationStorageSlots { + // The 'contracts' mapping is at offset 1 from the storage location + // (dao is at offset 0, contracts is at offset 1) + let contracts_map_slot = U256::from_be_bytes(GAS_STATION_STORAGE_LOCATION.0) + U256::from(1); + + // Calculate the base slot for the struct entry in the mapping + // Left-pad the address to 32 bytes and combine with the map slot + let mut key_padded = [0u8; 32]; + key_padded[12..].copy_from_slice(registered_contract_address.as_slice()); // Left-pad 20-byte address to 32 bytes + + // Left-pad the map slot to 32 bytes (Go: common.LeftPadBytes(contractsMapSlot.Bytes(), 32)) + let map_slot_padded = contracts_map_slot.to_be_bytes::<32>(); + + // Combine: key first, then map slot (Go: append(keyPadded, mapSlotPadded...)) + let combined = [key_padded, map_slot_padded].concat(); + let struct_base_slot_hash = keccak256(combined); + + // Calculate subsequent slots by adding offsets to the base slot hash + // New struct layout: bool registered, bool active, address admin (all packed in slot 0) + // uint256 credits (slot 1), bool whitelistEnabled (slot 2), mapping whitelist (slot 3) + // bool singleUseEnabled (slot 4), mapping usedAddresses (slot 5) + let struct_base_slot_u256 = U256::from_be_bytes(struct_base_slot_hash.0); + + // Slot for 'credits' (offset 1 from base - after the packed bools and address) + let credits_slot_u256 = struct_base_slot_u256 + U256::from(1); + let credit_slot_hash = B256::from_slice(&credits_slot_u256.to_be_bytes::<32>()); + + // Slot for 'whitelistEnabled' (offset 2 from base) + let whitelist_enabled_slot_u256 = struct_base_slot_u256 + U256::from(2); + let whitelist_enabled_slot_hash = B256::from_slice(&whitelist_enabled_slot_u256.to_be_bytes::<32>()); + + // Base slot for the nested 'whitelist' mapping (offset 3 from base) + let nested_whitelist_map_base_slot_u256 = struct_base_slot_u256 + U256::from(3); + let nested_whitelist_map_base_slot_hash = B256::from_slice(&nested_whitelist_map_base_slot_u256.to_be_bytes::<32>()); + + // Slot for 'singleUseEnabled' (offset 4 from base) + let single_use_enabled_slot_u256 = struct_base_slot_u256 + U256::from(4); + let single_use_enabled_slot_hash = B256::from_slice(&single_use_enabled_slot_u256.to_be_bytes::<32>()); + + // Base slot for the nested 'usedAddresses' mapping (offset 5 from base) + let used_addresses_map_base_slot_u256 = struct_base_slot_u256 + U256::from(5); + let used_addresses_map_base_slot_hash = B256::from_slice(&used_addresses_map_base_slot_u256.to_be_bytes::<32>()); + GasStationStorageSlots { - contracts_slot, - contract_slot, - registered_slot, - active_slot, - admin_slot, - credits_slot, - whitelist_enabled_slot, - single_use_enabled_slot, - whitelist_user_slot, - used_addresses_user_slot, + registered_slot: struct_base_slot_hash, + active_slot: struct_base_slot_hash, // Same slot, different packed fields + credits_slot: credit_slot_hash, + whitelist_enabled_slot: whitelist_enabled_slot_hash, + single_use_enabled_slot: single_use_enabled_slot_hash, + nested_whitelist_map_base_slot: nested_whitelist_map_base_slot_hash, + used_addresses_map_base_slot: used_addresses_map_base_slot_hash, } } +/// Computes the storage slot hash for a nested mapping +pub fn calculate_nested_mapping_slot(key: Address, base_slot: B256) -> B256 { + // Left-pad the address to 32 bytes + let mut key_padded = [0u8; 32]; + key_padded[12..].copy_from_slice(key.as_slice()); // Left-pad 20-byte address to 32 bytes + + // The base_slot is already 32 bytes (B256) + let map_base_slot_padded = base_slot.0; + + // Combine: key first, then base slot + let combined = [key_padded, map_base_slot_padded].concat(); + keccak256(combined) +} + #[derive(Clone, Debug)] pub struct GaslessValidation { pub available_credits: U256, @@ -194,7 +181,6 @@ impl PendingCreditUsageProvider for PendingCreditUsageMap { pub fn validate_gasless_tx( cfg: &GasStationConfig, state: &SP, - gas_station_storage_location: B256, to: Address, from: Address, gas_limit: u64, @@ -208,7 +194,7 @@ pub fn validate_gasless_tx( } // 1. compute slots - let slots = calculate_slots(gas_station_storage_location, to, Some(from)); + let slots = calculate_gas_station_slots(to); // 2. read a storage slot // - helper to read a storage slot at gas station address @@ -216,7 +202,8 @@ pub fn validate_gasless_tx( |slot: B256| -> Option { state.storage(cfg.address, slot.into()).ok().flatten() }; // -> read GaslessContract.registered - let registered = read_slot(slots.registered_slot).unwrap_or_default() != U256::ZERO; + let registered_slot = read_slot(slots.registered_slot); + let registered = registered_slot.unwrap_or_default() != U256::ZERO; if !registered { return Err(GaslessValidationError::NotRegistered); } @@ -249,13 +236,9 @@ pub fn validate_gasless_tx( let whitelist_enabled = read_slot(slots.whitelist_enabled_slot).unwrap_or_default() != U256::ZERO; if whitelist_enabled { - // basically read whitelist[from] and check if it's true - let ok = slots - .whitelist_user_slot - .and_then(|s| read_slot(s)) - .map(|v| v != U256::ZERO) - .unwrap_or(false); - if !ok { + let whitelist_slot = calculate_nested_mapping_slot(from, slots.nested_whitelist_map_base_slot); + let whitelist_status = read_slot(whitelist_slot).unwrap_or_default() != U256::ZERO; + if !whitelist_status { return Err(GaslessValidationError::NotWhitelisted); } } @@ -264,12 +247,9 @@ pub fn validate_gasless_tx( let single_use_enabled = read_slot(slots.single_use_enabled_slot).unwrap_or_default() != U256::ZERO; if single_use_enabled { - let used = slots - .used_addresses_user_slot - .and_then(|s| read_slot(s)) - .map(|v| v != U256::ZERO) - .unwrap_or(false); - if used { + let used_addresses_slot = calculate_nested_mapping_slot(from, slots.used_addresses_map_base_slot); + let used_addresses_status = read_slot(used_addresses_slot).unwrap_or_default() != U256::ZERO; + if used_addresses_status { return Err(GaslessValidationError::SingleUseConsumed); } } @@ -286,28 +266,97 @@ pub fn encode_credits_used_log_data(gas_used: U256, credits_deducted: U256) -> [ out } -/// Add a small u64 delta to a B256 interpreted as a big endian integer. -/// TODO: VERIFY THIS IS CORRECT. -/// In future we should use https://crates.io/crates/num ??? -fn add_u64_to_b256(value: B256, delta: u64) -> B256 { - if delta == 0 { - return value; +/// Represents the storage/log effects that should be applied after a successful gasless tx. +#[derive(Clone, Debug, Default)] +pub struct GaslessPostExecEffects { + /// Keyed by storage slot hash. Values are raw U256 slot values to write. + pub storage_writes: Vec<(B256, U256)>, + /// Optional log to emit: `CreditsUsed(address,address,uint256,uint256)`. + pub log: Option, +} + +/// Computes the post-execution effects for a gasless transaction: +/// - Deducts `gas_used` from the contract's credits (saturating at 0) +/// - If single-use is enabled, marks `from` as used in `usedAddresses` mapping +/// - Prepares a `CreditsUsed` log +/// +/// This is a pure function that only depends on a read accessor for current storage values and +/// returns the necessary writes and the log to emit. The caller is responsible for applying the +/// writes to the execution state and attaching the log to the transaction receipt. +pub fn compute_gasless_post_exec_effects( + cfg: &GasStationConfig, + gas_station_storage_location: B256, + to: Address, + from: Address, + gas_used: u64, + mut read_slot: impl FnMut(B256) -> U256, +) -> GaslessPostExecEffects { + // If feature is disabled or address not configured, produce no-op effects. + if !cfg.enabled || cfg.address.is_zero() { + return GaslessPostExecEffects::default(); } - let mut bytes = [0u8; 32]; - bytes.copy_from_slice(value.as_slice()); - // add delta in big endian - let mut i = 31usize; - let mut carry = delta as u128; // up to 64 bits fits into u128 - while carry > 0 && i < 32 { - let sum = bytes[i] as u128 + (carry & 0xFF); - bytes[i] = (sum & 0xFF) as u8; - carry = (carry >> 8) + (sum >> 8); - if i == 0 { - break; - } - i -= 1; + + // Derive all relevant slots for this (to, from) pair. + let slots = calculate_gas_station_slots(to); + + // Read current credits and compute the deduction (saturating at 0). + let available_credits = read_slot(slots.credits_slot); + let gas_used_u256 = U256::from(gas_used); + let new_credits = available_credits.saturating_sub(gas_used_u256); + + // Check if single-use is enabled. + let single_use_enabled = read_slot(slots.single_use_enabled_slot) != U256::ZERO; + + // Prepare storage writes + let mut storage_writes = Vec::with_capacity(2); + storage_writes.push((slots.credits_slot, new_credits)); + + if single_use_enabled { + let used_addresses_slot = calculate_nested_mapping_slot(from, slots.used_addresses_map_base_slot); + storage_writes.push((used_addresses_slot, U256::from(1u64))); } - B256::from(bytes) + + // calculate log data + // event CreditsUsed( + // address indexed contractAddress, address indexed caller, uint256 gasUsed, uint256 creditsDeducted + // ); + // topics: [signature, indexed contractAddress, indexed caller] + let topic0 = credits_used_topic0(); + let to_bytes = to.into_word(); + let from_bytes = from.into_word(); + let topics = vec![topic0, to_bytes, from_bytes]; + let data = encode_credits_used_log_data(gas_used_u256, gas_used_u256); + + let log = Log::new_unchecked( + cfg.address, + topics, + Bytes::copy_from_slice(&data), + ); + + GaslessPostExecEffects { storage_writes, log: Some(log) } +} + +/// A minimal writer trait to apply storage writes returned by +/// `compute_gasless_post_exec_effects`. +pub trait StorageWriter { + /// Writes a storage value for `account` at `slot`. + fn write_storage(&mut self, account: Address, slot: B256, value: U256); +} + +/// Applies the post-execution effects to the provided writer and returns the prepared log. +/// +/// This is a convenience helper: callers that can directly write to EVM state can implement +/// `StorageWriter` and invoke this to update credits/mark single-use, then attach the returned +/// log to the transaction receipt. +pub fn apply_gasless_post_exec( + writer: &mut W, + cfg: &GasStationConfig, + effects: GaslessPostExecEffects, +) -> Option { + for (slot, value) in effects.storage_writes { + writer.write_storage(cfg.address, slot, value); + } + effects.log } // ??? @@ -320,21 +369,4 @@ mod tests { let t = credits_used_topic0(); assert_eq!(t, keccak256(b"CreditsUsed(address,address,uint256,uint256)")); } - - #[test] - fn add_delta_to_b256() { - let base = B256::ZERO; - assert_eq!(add_u64_to_b256(base, 0), base); - assert_eq!( - add_u64_to_b256(base, 1), - B256::from_slice(&[0u8; 31].iter().cloned().chain([1u8]).collect::>()) - ); - let max_low = - B256::from_slice(&[0u8; 24].iter().cloned().chain([0xFFu8; 8]).collect::>()); - let res = add_u64_to_b256(max_low, 1); - // expect carry into next byte - let mut expect = [0u8; 32]; - expect[23] = 1; - assert_eq!(res, B256::from(expect)); - } } diff --git a/crates/optimism/payload/src/builder.rs b/crates/optimism/payload/src/builder.rs index 8af414278bf..c1dba5f7b74 100644 --- a/crates/optimism/payload/src/builder.rs +++ b/crates/optimism/payload/src/builder.rs @@ -736,7 +736,6 @@ where if let Err(_e) = validate_gasless_tx( &gas_cfg, state_provider, - GAS_STATION_STORAGE_LOCATION, to, from, gas_limit, From d0aca7ea7ca32985c716c79f79f005d8e0f6c997 Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Wed, 20 Aug 2025 19:21:29 +0100 Subject: [PATCH 14/36] comments --- crates/gas-station/src/lib.rs | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/crates/gas-station/src/lib.rs b/crates/gas-station/src/lib.rs index d9fe5be3df2..7672242107a 100644 --- a/crates/gas-station/src/lib.rs +++ b/crates/gas-station/src/lib.rs @@ -40,7 +40,7 @@ pub const GAS_STATION_STORAGE_LOCATION: B256 = #[derive(Clone, Debug)] pub struct GasStationStorageSlots { pub registered_slot: B256, // struct base slot (has registered/active packed) - pub active_slot: B256, // same as registered_slot (both in packed struct) + pub active_slot: B256, // TODO REMOVE THIS pub credits_slot: B256, // credits slot pub nested_whitelist_map_base_slot: B256, // base slot for the nested whitelist mapping pub whitelist_enabled_slot: B256, // whitelist enabled flag @@ -48,30 +48,28 @@ pub struct GasStationStorageSlots { pub used_addresses_map_base_slot: B256, // base slot for the nested usedAddresses mapping } -/// Calculates the storage slot hashes for a specific registered contract within the GasStation's `contracts` mapping. -/// It returns the base slot for the struct (holding packed fields), the slot for credits, +/// calculates the storage slot hashes for a specific registered contract within the GasStation's `contracts` mapping. +/// it returns the base slot for the struct (holding packed fields), the slot for credits, /// the slot for whitelistEnabled, and the base slot for the nested whitelist mapping. pub fn calculate_gas_station_slots(registered_contract_address: Address) -> GasStationStorageSlots { - // The 'contracts' mapping is at offset 1 from the storage location - // (dao is at offset 0, contracts is at offset 1) + // The 'contracts' mapping is at offset 1 from the storage location + // (dao is at offset 0, contracts is at offset 1) let contracts_map_slot = U256::from_be_bytes(GAS_STATION_STORAGE_LOCATION.0) + U256::from(1); // Calculate the base slot for the struct entry in the mapping - // Left-pad the address to 32 bytes and combine with the map slot + // - left pad the address to 32 bytes let mut key_padded = [0u8; 32]; key_padded[12..].copy_from_slice(registered_contract_address.as_slice()); // Left-pad 20-byte address to 32 bytes - - // Left-pad the map slot to 32 bytes (Go: common.LeftPadBytes(contractsMapSlot.Bytes(), 32)) + // - I expect this is left padded because big endian etc let map_slot_padded = contracts_map_slot.to_be_bytes::<32>(); - - // Combine: key first, then map slot (Go: append(keyPadded, mapSlotPadded...)) + // - keccak256(append(keyPadded, mapSlotPadded...)) let combined = [key_padded, map_slot_padded].concat(); let struct_base_slot_hash = keccak256(combined); - // Calculate subsequent slots by adding offsets to the base slot hash - // New struct layout: bool registered, bool active, address admin (all packed in slot 0) - // uint256 credits (slot 1), bool whitelistEnabled (slot 2), mapping whitelist (slot 3) - // bool singleUseEnabled (slot 4), mapping usedAddresses (slot 5) + // Calculate subsequent slots by adding offsets to the base slot hash + // New struct layout: bool registered, bool active, address admin (all packed in slot 0) + // uint256 credits (slot 1), bool whitelistEnabled (slot 2), mapping whitelist (slot 3) + // bool singleUseEnabled (slot 4), mapping usedAddresses (slot 5) let struct_base_slot_u256 = U256::from_be_bytes(struct_base_slot_hash.0); // Slot for 'credits' (offset 1 from base - after the packed bools and address) @@ -96,7 +94,7 @@ pub fn calculate_gas_station_slots(registered_contract_address: Address) -> GasS GasStationStorageSlots { registered_slot: struct_base_slot_hash, - active_slot: struct_base_slot_hash, // Same slot, different packed fields + active_slot: struct_base_slot_hash, credits_slot: credit_slot_hash, whitelist_enabled_slot: whitelist_enabled_slot_hash, single_use_enabled_slot: single_use_enabled_slot_hash, From 00cdaf241ccb1c767613c115322152b2d022cb3a Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Wed, 20 Aug 2025 19:38:23 +0100 Subject: [PATCH 15/36] slight refactor --- crates/gas-station/src/lib.rs | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/crates/gas-station/src/lib.rs b/crates/gas-station/src/lib.rs index 7672242107a..55404f6b5dc 100644 --- a/crates/gas-station/src/lib.rs +++ b/crates/gas-station/src/lib.rs @@ -276,14 +276,12 @@ pub struct GaslessPostExecEffects { /// Computes the post-execution effects for a gasless transaction: /// - Deducts `gas_used` from the contract's credits (saturating at 0) /// - If single-use is enabled, marks `from` as used in `usedAddresses` mapping -/// - Prepares a `CreditsUsed` log -/// -/// This is a pure function that only depends on a read accessor for current storage values and -/// returns the necessary writes and the log to emit. The caller is responsible for applying the -/// writes to the execution state and attaching the log to the transaction receipt. +/// Returns a struct with the storage writes and the log to emit. +/// +/// NOTE: DOESNT ACTUALLY APPLY CHANGES!!!! +/// see `apply_gasless_post_exec`... pub fn compute_gasless_post_exec_effects( cfg: &GasStationConfig, - gas_station_storage_location: B256, to: Address, from: Address, gas_used: u64, @@ -294,21 +292,19 @@ pub fn compute_gasless_post_exec_effects( return GaslessPostExecEffects::default(); } - // Derive all relevant slots for this (to, from) pair. let slots = calculate_gas_station_slots(to); - // Read current credits and compute the deduction (saturating at 0). + // Calculate new credits let available_credits = read_slot(slots.credits_slot); let gas_used_u256 = U256::from(gas_used); - let new_credits = available_credits.saturating_sub(gas_used_u256); - - // Check if single-use is enabled. - let single_use_enabled = read_slot(slots.single_use_enabled_slot) != U256::ZERO; - + let new_credits = available_credits.saturating_sub(gas_used_u256); // saturating means if it goes below 0, it stays at 0, no underflow + // Prepare storage writes let mut storage_writes = Vec::with_capacity(2); storage_writes.push((slots.credits_slot, new_credits)); - + + // - if single use mark it as used + let single_use_enabled = read_slot(slots.single_use_enabled_slot) != U256::ZERO; if single_use_enabled { let used_addresses_slot = calculate_nested_mapping_slot(from, slots.used_addresses_map_base_slot); storage_writes.push((used_addresses_slot, U256::from(1u64))); From 77765ff6a582774d85d4d46e091722ab99ee5a54 Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Wed, 20 Aug 2025 20:08:09 +0100 Subject: [PATCH 16/36] refactor post execution effects --- Cargo.lock | 1 + crates/gas-station/Cargo.toml | 1 + crates/gas-station/src/lib.rs | 54 ++++++++++++++++++++++++----------- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 07902128d9c..db94e79eb55 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8558,6 +8558,7 @@ dependencies = [ "alloy-rlp", "hex", "reth-storage-api", + "revm-database", "thiserror 2.0.15", ] diff --git a/crates/gas-station/Cargo.toml b/crates/gas-station/Cargo.toml index 6c771e46f08..93e3b9808f0 100644 --- a/crates/gas-station/Cargo.toml +++ b/crates/gas-station/Cargo.toml @@ -14,6 +14,7 @@ alloy-primitives = { workspace = true } alloy-rlp = { workspace = true } reth-storage-api = { workspace = true } thiserror = { workspace = true } +revm-database.workspace = true [dev-dependencies] hex = "0.4" diff --git a/crates/gas-station/src/lib.rs b/crates/gas-station/src/lib.rs index 55404f6b5dc..b18cfdc9a00 100644 --- a/crates/gas-station/src/lib.rs +++ b/crates/gas-station/src/lib.rs @@ -3,7 +3,8 @@ // ValidateGaslessTx -> validate_gasless_tx use alloy_primitives::{address, b256, keccak256, Address, B256, Bytes, Log, U256}; -use reth_storage_api::StateProvider; +use reth_storage_api::{errors::ProviderResult, StateProvider, StateWriter}; +use revm_database::states::{PlainStorageChangeset, StateChangeset}; #[derive(Clone, Debug)] // lets us clone (.clone()) and print debug info ("{:?}") pub struct GasStationConfig { @@ -280,31 +281,35 @@ pub struct GaslessPostExecEffects { /// /// NOTE: DOESNT ACTUALLY APPLY CHANGES!!!! /// see `apply_gasless_post_exec`... -pub fn compute_gasless_post_exec_effects( +pub fn compute_gasless_post_exec_effects( cfg: &GasStationConfig, to: Address, from: Address, gas_used: u64, - mut read_slot: impl FnMut(B256) -> U256, + state: &SP, ) -> GaslessPostExecEffects { // If feature is disabled or address not configured, produce no-op effects. if !cfg.enabled || cfg.address.is_zero() { return GaslessPostExecEffects::default(); } + // - helper to read a storage slot at gas station address + let read_slot = + |slot: B256| -> Option { state.storage(cfg.address, slot.into()).ok().flatten() }; + let slots = calculate_gas_station_slots(to); // Calculate new credits let available_credits = read_slot(slots.credits_slot); let gas_used_u256 = U256::from(gas_used); - let new_credits = available_credits.saturating_sub(gas_used_u256); // saturating means if it goes below 0, it stays at 0, no underflow + let new_credits = available_credits.unwrap_or_default().saturating_sub(gas_used_u256); // saturating means if it goes below 0, it stays at 0, no underflow // Prepare storage writes let mut storage_writes = Vec::with_capacity(2); storage_writes.push((slots.credits_slot, new_credits)); // - if single use mark it as used - let single_use_enabled = read_slot(slots.single_use_enabled_slot) != U256::ZERO; + let single_use_enabled = read_slot(slots.single_use_enabled_slot).unwrap_or_default() != U256::ZERO; if single_use_enabled { let used_addresses_slot = calculate_nested_mapping_slot(from, slots.used_addresses_map_base_slot); storage_writes.push((used_addresses_slot, U256::from(1u64))); @@ -330,27 +335,44 @@ pub fn compute_gasless_post_exec_effects( GaslessPostExecEffects { storage_writes, log: Some(log) } } -/// A minimal writer trait to apply storage writes returned by -/// `compute_gasless_post_exec_effects`. -pub trait StorageWriter { - /// Writes a storage value for `account` at `slot`. - fn write_storage(&mut self, account: Address, slot: B256, value: U256); -} /// Applies the post-execution effects to the provided writer and returns the prepared log. /// /// This is a convenience helper: callers that can directly write to EVM state can implement /// `StorageWriter` and invoke this to update credits/mark single-use, then attach the returned /// log to the transaction receipt. -pub fn apply_gasless_post_exec( +pub fn apply_gasless_post_exec( writer: &mut W, cfg: &GasStationConfig, effects: GaslessPostExecEffects, -) -> Option { - for (slot, value) in effects.storage_writes { - writer.write_storage(cfg.address, slot, value); +) -> ProviderResult<()> { + // If no effects, just return early + if effects.storage_writes.is_empty() { + return Ok(()); } - effects.log + + + // Convert storage writes to the format expected by PlainStorageChangeset + let storage: Vec<(U256, U256)> = effects.storage_writes + .into_iter() + .map(|(slot, value)| (U256::from_be_bytes(slot.0), value)) + .collect(); + + // Create a single PlainStorageChangeset for the gas station address + let storage_changeset = PlainStorageChangeset { + address: cfg.address, + wipe_storage: false, + storage, + }; + + let changes = StateChangeset { + accounts: Default::default(), + storage: vec![storage_changeset], + contracts: Default::default(), + }; + + // Write the changes + writer.write_state_changes(changes) } // ??? From 990d0949cb50a131ddf3b186329032d90bd15e6c Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Thu, 21 Aug 2025 21:09:12 +0100 Subject: [PATCH 17/36] set gas station config enabled by default --- crates/gas-station/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/gas-station/src/lib.rs b/crates/gas-station/src/lib.rs index b18cfdc9a00..b9df9bd89c2 100644 --- a/crates/gas-station/src/lib.rs +++ b/crates/gas-station/src/lib.rs @@ -28,7 +28,7 @@ impl Default for GasStationConfig { fn default() -> Self { // Set it as disabled by default // TODO: make it enabled by default?? idk. - Self { enabled: false, address: GAS_STATION_PREDEPLOY } + Self { enabled: true, address: GAS_STATION_PREDEPLOY } } } From 003e37faf8d552a8a8c4ea17ec2f46cdc398c0aa Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Thu, 21 Aug 2025 21:09:45 +0100 Subject: [PATCH 18/36] add gasless validation to txpool validation --- Cargo.lock | 386 ++++++++++---------- Cargo.toml | 33 +- crates/transaction-pool/Cargo.toml | 1 + crates/transaction-pool/src/validate/eth.rs | 30 ++ 4 files changed, 247 insertions(+), 203 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index db94e79eb55..9c7e034aaca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -97,9 +97,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-chains" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4195a29a4b87137b2bb02105e746102873bc03561805cf45c0e510c961f160e6" +checksum = "a379c0d821498c996ceb9e7519fc2dab8286c35a203c1fb95f80ecd66e07cf2f" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -112,9 +112,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda689f7287f15bd3582daba6be8d1545bad3740fd1fb778f629a1fe866bb43b" +checksum = "35f021a55afd68ff2364ccfddaa364fc9a38a72200cdc74fcfb8dc3231d38f2c" dependencies = [ "alloy-eips", "alloy-primitives", @@ -133,14 +133,14 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] name = "alloy-consensus-any" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5659581e41e8fe350ecc3593cb5c9dcffddfd550896390f2b78a07af67b0fa" +checksum = "5a0ecca7a71b1f88e63d19e2d9397ce56949d3dd3484fd73c73d0077dc5c93d4" dependencies = [ "alloy-consensus", "alloy-eips", @@ -153,9 +153,9 @@ dependencies = [ [[package]] name = "alloy-contract" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "944085cf3ac8f32d96299aa26c03db7c8ca6cdaafdbc467910b889f0328e6b70" +checksum = "dd26132cbfa6e5f191a01f7b9725eaa0680a953be1fd005d588b0e9422c16456" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -170,7 +170,7 @@ dependencies = [ "futures", "futures-util", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -202,7 +202,7 @@ dependencies = [ "crc", "rand 0.8.5", "serde", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -231,14 +231,14 @@ dependencies = [ "rand 0.8.5", "serde", "serde_with", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] name = "alloy-eips" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f35887da30b5fc50267109a3c61cd63e6ca1f45967983641053a40ee83468c1" +checksum = "7473a19f02b25f8e1e8c69d35f02c07245694d11bd91bfe00e9190ac106b3838" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -274,14 +274,14 @@ dependencies = [ "op-alloy-consensus", "op-revm", "revm", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] name = "alloy-genesis" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d4009efea6f403b3a80531f9c6f70fc242399498ff71196a1688cc1c901f44" +checksum = "17b2c29f25098bfa4cd3d9ec7806e1506716931e188c7c0843284123831c2cf1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -319,24 +319,24 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883dee3b4020fcb5667ee627b4f401e899dad82bf37b246620339dd980720ed9" +checksum = "7a4d1f49fdf9780b60e52c20ffcc1e352d8d27885cc8890620eb584978265dd9" dependencies = [ "alloy-primitives", "alloy-sol-types", "http", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tracing", ] [[package]] name = "alloy-network" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6e5b8ac1654a05c224390008e43634a2bdc74e181e02cf8ed591d8b3d4ad08" +checksum = "2991c432e149babfd996194f8f558f85d7326ac4cf52c55732d32078ff0282d4" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -355,14 +355,14 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] name = "alloy-network-primitives" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7980333dd9391719756ac28bc2afa9baa705fc70ffd11dc86ab078dd64477" +checksum = "1d540d962ddbc3e95153bafe56ccefeb16dfbffa52c5f7bdd66cd29ec8f52259" dependencies = [ "alloy-consensus", "alloy-eips", @@ -432,9 +432,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478a42fe167057b7b919cd8b0c2844f0247f667473340dad100eaf969de5754e" +checksum = "7e96d8084a1cf96be2df6219ac407275ac20c1136fa01f911535eb489aa006e8" dependencies = [ "alloy-chains", "alloy-consensus", @@ -468,7 +468,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tracing", "url", @@ -477,9 +477,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0a99b17987f40a066b29b6b56d75e84cd193b866cac27cae17b59f40338de95" +checksum = "8a682f14e10c3f4489c57b64ed457801b3e7ffc5091b6a35883d0e5960b9b894" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -521,9 +521,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0c6d723fbdf4a87454e2e3a275e161be27edcfbf46e2e3255dd66c138634b6" +checksum = "194ff51cd1d2e65c66b98425e0ca7eb559ca1a579725834c986d84faf8e224c0" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -547,9 +547,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41492dac39365b86a954de86c47ec23dcc7452cdb2fde591caadc194b3e34c6" +checksum = "8d4fe522f6fc749c8afce721bdc8f73b715d317c3c02fcb9b51f7a143e4401dd" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", @@ -560,9 +560,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-admin" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c0f415ad97cc68d2f49eb08214f45c6827a6932a69773594f4ce178f8a41dc0" +checksum = "30f218456a0a70a234ed52c181f04e6c98b6810c25273cf5280d32dd2cbdc876" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -572,9 +572,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10493fa300a2757d8134f584800fef545c15905c95122bed1f6dde0b0d9dae27" +checksum = "c6af88d9714b499675164cac2fa2baadb3554579ab3ea8bc0d7b0c0de4f9d692" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -584,9 +584,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f7eb22670a972ad6c222a6c6dac3eef905579acffe9d63ab42be24c7d158535" +checksum = "124b742619519d5932e586631f11050028b29c30e3e195f2bb04228c886253d6" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -595,9 +595,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-beacon" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53381ffba0110a8aed4c9f108ef34a382ed21aeefb5f50f91c73451ae68b89aa" +checksum = "fd39ff755554e506ae0f6a8e8251f8633bd7512cce0d7d1a7cfd689797e0daa5" dependencies = [ "alloy-eips", "alloy-primitives", @@ -606,16 +606,16 @@ dependencies = [ "ethereum_ssz_derive", "serde", "serde_with", - "thiserror 2.0.15", + "thiserror 2.0.16", "tree_hash", "tree_hash_derive", ] [[package]] name = "alloy-rpc-types-debug" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b6f0482c82310366ec3dcf4e5212242f256a69fcf1a26e5017e6704091ee95" +checksum = "1c6a6c8ae298c2739706ee3cd996c220b0ea406e6841a4e4290c7336edd5f811" dependencies = [ "alloy-primitives", "derive_more", @@ -624,9 +624,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e24c171377c0684e3860385f6d93fbfcc8ecc74f6cce8304c822bf1a50bacce0" +checksum = "9a1a77a23d609bca2e4a60f992dde5f987475cb064da355fa4dbd7cda2e1bb48" dependencies = [ "alloy-consensus", "alloy-eips", @@ -645,9 +645,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b777b98526bbe5b7892ca22a7fd5f18ed624ff664a79f40d0f9f2bf94ba79a84" +checksum = "781d4d5020bea8f020e164f5593101c2e2f790d66d04a0727839d03bc4411ed7" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -662,14 +662,14 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] name = "alloy-rpc-types-mev" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15e8ccb6c16e196fcc968e16a71cd8ce4160f3ec5871d2ea196b75bf569ac02" +checksum = "81f742708f7ea7c3dc6067e7d87b6635c0817cf142b7c72cb8e8e3e07371aa3a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -682,23 +682,23 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6a854af3fe8fce1cfe319fcf84ee8ba8cda352b14d3dd4221405b5fc6cce9e1" +checksum = "719e5eb9c15e21dab3dee2cac53505500e5e701f25d556734279c5f02154022a" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", "alloy-serde", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] name = "alloy-rpc-types-txpool" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc803e9b8d16154c856a738c376e002abe4b388e5fef91c8aebc8373e99fd45" +checksum = "37c751233a6067ccc8a4cbd469e0fd34e0d9475fd118959dbc777ae3af31bba7" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -708,9 +708,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee8d2c52adebf3e6494976c8542fbdf12f10123b26e11ad56f77274c16a2a039" +checksum = "30be84f45d4f687b00efaba1e6290cbf53ccc8f6b8fbb54e4c2f9d2a0474ce95" dependencies = [ "alloy-primitives", "arbitrary", @@ -720,9 +720,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0494d1e0f802716480aabbe25549c7f6bc2a25ff33b08fd332bbb4b7d06894" +checksum = "fa8c24b883fe56395db64afcd665fca32dcdef670a59e5338de6892c2e38d7e9" dependencies = [ "alloy-primitives", "async-trait", @@ -730,14 +730,14 @@ dependencies = [ "either", "elliptic-curve", "k256", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] name = "alloy-signer-local" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c2435eb8979a020763ced3fb478932071c56e5f75ea86db41f320915d325ba" +checksum = "05724615fd2ec3417f5cd07cab908300cbb3aae5badc1b805ca70c555b26775f" dependencies = [ "alloy-consensus", "alloy-network", @@ -748,7 +748,8 @@ dependencies = [ "coins-bip39", "k256", "rand 0.8.5", - "thiserror 2.0.15", + "thiserror 2.0.16", + "zeroize", ] [[package]] @@ -823,9 +824,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0107675e10c7f248bf7273c1e7fdb02409a717269cc744012e6f3c39959bfb" +checksum = "20b7f8b6c540b55e858f958d3a92223494cf83c4fb43ff9b26491edbeb3a3b71" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -837,7 +838,7 @@ dependencies = [ "parking_lot", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tower", "tracing", @@ -847,9 +848,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78e3736701b5433afd06eecff08f0688a71a10e0e1352e0bbf0bed72f0dd4e35" +checksum = "260e9584dfd7998760d7dfe1856c6f8f346462b9e7837287d7eddfb3922ef275" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -862,9 +863,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c79064b5a08259581cb5614580010007c2df6deab1e8f3e8c7af8d7e9227008f" +checksum = "9491a1d81e97ae9d919da49e1c63dec4729c994e2715933968b8f780aa18793e" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -882,9 +883,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77fd607158cb9bc54cbcfcaab4c5f36c5b26994c7dc58b6f095ce27a54f270f3" +checksum = "d056ef079553e1f18834d6ef4c2793e4d51ac742021b2be5039dd623fe1354f0" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -900,9 +901,9 @@ dependencies = [ [[package]] name = "alloy-trie" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bada1fc392a33665de0dc50d401a3701b62583c655e3522a323490a5da016962" +checksum = "e3412d52bb97c6c6cc27ccc28d4e6e8cf605469101193b50b0bd5813b1f990b5" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -920,9 +921,9 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6acb36318dfa50817154064fea7932adf2eec3f51c86680e2b37d7e8906c66bb" +checksum = "72e29436068f836727d4e7c819ae6bf6f9c9e19a32e96fc23e814709a277f23a" dependencies = [ "alloy-primitives", "darling 0.20.11", @@ -1747,7 +1748,7 @@ dependencies = [ "static_assertions", "tap", "thin-vec", - "thiserror 2.0.15", + "thiserror 2.0.16", "time", ] @@ -1992,7 +1993,7 @@ dependencies = [ "semver 1.0.26", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -2044,9 +2045,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -3078,7 +3079,7 @@ dependencies = [ "revm", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tracing", "walkdir", ] @@ -3267,7 +3268,7 @@ dependencies = [ "reth-ethereum", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -3311,7 +3312,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -3357,7 +3358,7 @@ dependencies = [ "reth-payload-builder", "reth-tracing", "serde", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", ] @@ -3427,7 +3428,7 @@ dependencies = [ "revm-primitives", "serde", "test-fuzz", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -3753,14 +3754,14 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "filetime" -version = "0.2.25" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -4243,7 +4244,7 @@ dependencies = [ "rand 0.9.2", "ring", "serde", - "thiserror 2.0.15", + "thiserror 2.0.16", "tinyvec", "tokio", "tracing", @@ -4267,7 +4268,7 @@ dependencies = [ "resolv-conf", "serde", "smallvec", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -5037,7 +5038,7 @@ dependencies = [ "rustls-pki-types", "rustls-platform-verifier", "soketto", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-rustls", "tokio-util", @@ -5065,7 +5066,7 @@ dependencies = [ "rustc-hash 2.1.1", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tower", @@ -5090,7 +5091,7 @@ dependencies = [ "rustls-platform-verifier", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tower", "url", @@ -5128,7 +5129,7 @@ dependencies = [ "serde", "serde_json", "soketto", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -5145,7 +5146,7 @@ dependencies = [ "http", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -5297,7 +5298,7 @@ dependencies = [ "multihash", "quick-protobuf", "sha2 0.10.9", - "thiserror 2.0.15", + "thiserror 2.0.16", "tracing", "zeroize", ] @@ -5639,7 +5640,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -6027,7 +6028,7 @@ dependencies = [ "derive_more", "serde", "serde_with", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -6079,7 +6080,7 @@ dependencies = [ "op-alloy-consensus", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -6101,7 +6102,7 @@ dependencies = [ "op-alloy-consensus", "serde", "snap", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -6155,7 +6156,7 @@ dependencies = [ "futures-sink", "js-sys", "pin-project-lite", - "thiserror 2.0.15", + "thiserror 2.0.16", "tracing", ] @@ -6187,7 +6188,7 @@ dependencies = [ "opentelemetry_sdk", "prost", "reqwest", - "thiserror 2.0.15", + "thiserror 2.0.16", "tracing", ] @@ -6223,7 +6224,7 @@ dependencies = [ "percent-encoding", "rand 0.9.2", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tracing", ] @@ -6368,7 +6369,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" dependencies = [ "memchr", - "thiserror 2.0.15", + "thiserror 2.0.16", "ucd-trie", ] @@ -6570,9 +6571,9 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.36" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", "syn 2.0.106", @@ -6782,7 +6783,7 @@ dependencies = [ "rustc-hash 2.1.1", "rustls", "socket2 0.5.10", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tracing", "web-time", @@ -6803,7 +6804,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.15", + "thiserror 2.0.16", "tinyvec", "tracing", "web-time", @@ -7049,7 +7050,7 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -7284,7 +7285,7 @@ dependencies = [ "reth-tracing", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tower", "tracing", @@ -7458,7 +7459,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "snmalloc-rs", - "thiserror 2.0.15", + "thiserror 2.0.16", "tikv-jemallocator", "tracy-client", ] @@ -7524,7 +7525,7 @@ dependencies = [ "auto_impl", "reth-execution-types", "reth-primitives-traits", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -7595,7 +7596,7 @@ dependencies = [ "strum 0.27.2", "sysinfo", "tempfile", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -7654,7 +7655,7 @@ dependencies = [ "reth-trie-db", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tracing", ] @@ -7696,7 +7697,7 @@ dependencies = [ "schnellru", "secp256k1 0.30.0", "serde", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -7722,7 +7723,7 @@ dependencies = [ "reth-network-peers", "reth-tracing", "secp256k1 0.30.0", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -7749,7 +7750,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -7787,7 +7788,7 @@ dependencies = [ "reth-testing-utils", "reth-tracing", "tempfile", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -7878,7 +7879,7 @@ dependencies = [ "secp256k1 0.30.0", "sha2 0.10.9", "sha3", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -7929,7 +7930,7 @@ dependencies = [ "reth-primitives-traits", "reth-trie-common", "serde", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", ] @@ -7958,7 +7959,7 @@ dependencies = [ "reth-prune", "reth-stages-api", "reth-tasks", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", ] @@ -8027,7 +8028,7 @@ dependencies = [ "revm-state", "schnellru", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -8077,7 +8078,7 @@ dependencies = [ "snap", "tempfile", "test-case", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", ] @@ -8134,7 +8135,7 @@ dependencies = [ "reth-consensus", "reth-execution-errors", "reth-storage-errors", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -8168,7 +8169,7 @@ dependencies = [ "serde", "snap", "test-fuzz", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -8197,7 +8198,7 @@ dependencies = [ "reth-ethereum-primitives", "reth-primitives-traits", "serde", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -8292,7 +8293,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.9", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -8426,7 +8427,7 @@ dependencies = [ "alloy-rlp", "nybbles", "reth-storage-errors", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -8487,7 +8488,7 @@ dependencies = [ "rmp-serde", "secp256k1 0.30.0", "tempfile", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-util", "tracing", @@ -8520,7 +8521,7 @@ dependencies = [ "reth-tasks", "reth-transaction-pool", "tempfile", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", ] @@ -8547,7 +8548,7 @@ version = "1.6.0" dependencies = [ "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -8559,7 +8560,7 @@ dependencies = [ "hex", "reth-storage-api", "revm-database", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -8603,7 +8604,7 @@ dependencies = [ "reth-tracing", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -8626,7 +8627,7 @@ dependencies = [ "reth-mdbx-sys", "smallvec", "tempfile", - "thiserror 2.0.15", + "thiserror 2.0.16", "tracing", ] @@ -8665,7 +8666,7 @@ dependencies = [ "reqwest", "reth-tracing", "serde_with", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -8723,7 +8724,7 @@ dependencies = [ "serde", "smallvec", "tempfile", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-util", @@ -8750,7 +8751,7 @@ dependencies = [ "reth-network-types", "reth-tokio-util", "serde", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", ] @@ -8789,7 +8790,7 @@ dependencies = [ "secp256k1 0.30.0", "serde_json", "serde_with", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "url", ] @@ -8820,7 +8821,7 @@ dependencies = [ "reth-fs-util", "serde", "tempfile", - "thiserror 2.0.15", + "thiserror 2.0.16", "tracing", "zstd", ] @@ -8963,7 +8964,7 @@ dependencies = [ "serde", "shellexpand", "strum 0.27.2", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "toml", "tracing", @@ -9040,7 +9041,7 @@ dependencies = [ "reth-transaction-pool", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-tungstenite", @@ -9168,7 +9169,7 @@ dependencies = [ "serde", "serde_json", "tar-no-std", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -9247,7 +9248,7 @@ dependencies = [ "reth-trie", "reth-trie-common", "revm", - "thiserror 2.0.15", + "thiserror 2.0.16", "tracing", ] @@ -9277,7 +9278,7 @@ dependencies = [ "reth-rpc-eth-api", "reth-storage-errors", "revm", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -9385,7 +9386,7 @@ dependencies = [ "revm", "serde", "sha2 0.10.9", - "thiserror 2.0.15", + "thiserror 2.0.16", "tracing", ] @@ -9467,7 +9468,7 @@ dependencies = [ "reth-transaction-pool", "revm", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tower", "tracing", @@ -9523,7 +9524,7 @@ dependencies = [ "reth-storage-api", "reth-transaction-pool", "serde", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -9574,7 +9575,7 @@ dependencies = [ "reth-errors", "reth-primitives-traits", "serde", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", ] @@ -9653,7 +9654,7 @@ dependencies = [ "serde_json", "serde_with", "test-fuzz", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -9732,7 +9733,7 @@ dependencies = [ "reth-tokio-util", "reth-tracing", "rustc-hash 2.1.1", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -9752,7 +9753,7 @@ dependencies = [ "serde", "serde_json", "test-fuzz", - "thiserror 2.0.15", + "thiserror 2.0.16", "toml", ] @@ -9894,7 +9895,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.9", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tower", @@ -9996,7 +9997,7 @@ dependencies = [ "reth-transaction-pool", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-util", "tower", @@ -10025,7 +10026,7 @@ dependencies = [ "reth-primitives-traits", "reth-storage-api", "revm-context", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -10079,7 +10080,7 @@ dependencies = [ "reth-testing-utils", "reth-transaction-pool", "serde", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -10165,7 +10166,7 @@ dependencies = [ "schnellru", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -10257,7 +10258,7 @@ dependencies = [ "reth-trie", "reth-trie-db", "tempfile", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -10285,7 +10286,7 @@ dependencies = [ "reth-static-file-types", "reth-testing-utils", "reth-tokio-util", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -10330,7 +10331,7 @@ dependencies = [ "reth-trie-sparse", "serde", "serde_with", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -10403,7 +10404,7 @@ dependencies = [ "reth-prune-types", "reth-static-file-types", "revm-database-interface", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -10446,7 +10447,7 @@ dependencies = [ "pin-project", "rayon", "reth-metrics", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tracing", "tracing-futures", @@ -10531,6 +10532,7 @@ dependencies = [ "reth-ethereum-primitives", "reth-execution-types", "reth-fs-util", + "reth-gas-station", "reth-metrics", "reth-optimism-primitives", "reth-primitives-traits", @@ -10546,7 +10548,7 @@ dependencies = [ "serde_json", "smallvec", "tempfile", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tokio-stream", "tracing", @@ -10666,7 +10668,7 @@ dependencies = [ "reth-trie-common", "reth-trie-db", "reth-trie-sparse", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -10901,7 +10903,7 @@ dependencies = [ "revm", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -11549,9 +11551,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.142" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ "indexmap 2.10.0", "itoa", @@ -11782,7 +11784,7 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", - "thiserror 2.0.15", + "thiserror 2.0.16", "time", ] @@ -12076,15 +12078,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.20.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" dependencies = [ "fastrand 2.3.0", "getrandom 0.3.3", "once_cell", "rustix 1.0.8", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -12122,9 +12124,9 @@ dependencies = [ [[package]] name = "test-fuzz" -version = "7.2.2" +version = "7.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b8d521c6196e60e389bfa3c6e13a8c7abe579a05fcfb8fb695c6129e2b28c7" +checksum = "2544811444783be05d3221045db0abf7f10013b85bf7d9e3e1a09e96355f405f" dependencies = [ "serde", "serde_combinators", @@ -12135,9 +12137,9 @@ dependencies = [ [[package]] name = "test-fuzz-internal" -version = "7.2.2" +version = "7.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb966d72fcf4e04773f5f77a2203893d095c24ddcc69c192815195a9503033f" +checksum = "324b46e1673f1c123007be9245678eb8f35a8a886a01d29ea56edd3ef13cb012" dependencies = [ "bincode 2.0.1", "cargo_metadata 0.19.2", @@ -12146,9 +12148,9 @@ dependencies = [ [[package]] name = "test-fuzz-macro" -version = "7.2.2" +version = "7.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37101b5b033dcf2b50236f61c6773318e00a1792fea4e020b5b2fc613bfb60d0" +checksum = "d4aa61edbcc785cac8ce4848ce917fb675c94f299f866186c0455b62896a8dac" dependencies = [ "darling 0.21.2", "heck", @@ -12161,9 +12163,9 @@ dependencies = [ [[package]] name = "test-fuzz-runtime" -version = "7.2.2" +version = "7.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c13409f445cdfdf04fc8effa1f94cd2cc1358005d4ca21bfad3831949d16d07" +checksum = "60ac4faeced56bd2c2d1dd35ddae75627c58eb63696f324c7c0a19760746e14d" dependencies = [ "hex", "num-traits", @@ -12189,11 +12191,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.15" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d76d3f064b981389ecb4b6b7f45a0bf9fdac1d5b9204c7bd6714fecc302850" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl 2.0.15", + "thiserror-impl 2.0.16", ] [[package]] @@ -12209,9 +12211,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.15" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d29feb33e986b6ea906bd9c3559a856983f92371b3eaa5e83782a351623de0" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", @@ -12342,9 +12344,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -12796,7 +12798,7 @@ dependencies = [ "rustls", "rustls-pki-types", "sha1", - "thiserror 2.0.15", + "thiserror 2.0.16", "utf-8", ] @@ -13273,11 +13275,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -13861,7 +13863,7 @@ dependencies = [ "pharos", "rustc_version 0.4.1", "send_wrapper 0.6.0", - "thiserror 2.0.15", + "thiserror 2.0.16", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", diff --git a/Cargo.toml b/Cargo.toml index 16c66ee2d4f..45887c2ec19 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -711,17 +711,28 @@ walkdir = "2.3.3" vergen-git2 = "1.0.5" [patch.crates-io] -revm = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-primitives = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless" } -revm-interpreter = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-handler = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless" } -revm-context = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-context-interface = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-state = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-database = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-database-interface = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-bytecode = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-inspector = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +# revm = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} +# revm-primitives = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass" } +# revm-interpreter = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} +# revm-handler = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass" } +# revm-context = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} +# revm-context-interface = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} +# revm-state = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} +# revm-database = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} +# revm-database-interface = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} +# revm-bytecode = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} +# revm-inspector = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} +revm = { path = "/Users/kb/dev/pellar/revm/crates/revm" } +revm-primitives = { path = "/Users/kb/dev/pellar/revm/crates/primitives" } +revm-interpreter = { path = "/Users/kb/dev/pellar/revm/crates/interpreter" } +revm-handler = { path = "/Users/kb/dev/pellar/revm/crates/handler" } +revm-context = { path = "/Users/kb/dev/pellar/revm/crates/context" } +revm-context-interface = { path = "/Users/kb/dev/pellar/revm/crates/context/interface" } +revm-state = { path = "/Users/kb/dev/pellar/revm/crates/state" } +revm-database = { path = "/Users/kb/dev/pellar/revm/crates/database" } +revm-database-interface = { path = "/Users/kb/dev/pellar/revm/crates/database/interface" } +revm-bytecode = { path = "/Users/kb/dev/pellar/revm/crates/bytecode" } +revm-inspector = { path = "/Users/kb/dev/pellar/revm/crates/inspector" } # [patch.crates-io] # alloy-consensus = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" } diff --git a/crates/transaction-pool/Cargo.toml b/crates/transaction-pool/Cargo.toml index 919f15f0b38..10a7301d010 100644 --- a/crates/transaction-pool/Cargo.toml +++ b/crates/transaction-pool/Cargo.toml @@ -25,6 +25,7 @@ reth-storage-api.workspace = true reth-tasks.workspace = true revm-interpreter.workspace = true revm-primitives.workspace = true +reth-gas-station.workspace = true # ethereum alloy-eips = { workspace = true, features = ["kzg"] } diff --git a/crates/transaction-pool/src/validate/eth.rs b/crates/transaction-pool/src/validate/eth.rs index e901831da4b..8975884f4b8 100644 --- a/crates/transaction-pool/src/validate/eth.rs +++ b/crates/transaction-pool/src/validate/eth.rs @@ -24,6 +24,7 @@ use alloy_eips::{ eip7840::BlobParams, }; use reth_chainspec::{ChainSpecProvider, EthChainSpec, EthereumHardforks}; +use reth_optimism_primitives::is_gasless; use reth_primitives_traits::{ constants::MAX_TX_GAS_LIMIT_OSAKA, transaction::error::InvalidTransactionError, Block, GotExpected, SealedBlock, @@ -39,6 +40,7 @@ use std::{ time::Instant, }; use tokio::sync::Mutex; +use reth_gas_station::{validate_gasless_tx, GasStationConfig}; /// Validator for Ethereum transactions. /// It is a [`TransactionValidator`] implementation that validates ethereum transaction. @@ -691,6 +693,34 @@ where } } + // Validate gasless + if is_gasless(&transaction) { + let full_state = self.client.latest().unwrap(); + let to = match transaction.to() { + Some(to) => *to, + None => { + return TransactionValidationOutcome::Invalid( + transaction, + InvalidTransactionError::TxTypeNotSupported.into(), // TODO use a better error + ); + } + }; + + if let Err(err) = validate_gasless_tx( + &GasStationConfig::default(), + &full_state, + to.into(), + *transaction.sender_ref(), + transaction.gas_limit(), + None, + ) { + return TransactionValidationOutcome::Invalid( + transaction, + InvalidTransactionError::TxTypeNotSupported.into(), // TODO use a better error + ); + } + } + let authorities = transaction.authorization_list().map(|auths| { auths.iter().flat_map(|auth| auth.recover_authority()).collect::>() }); From 49a26e969c497fce1d81853d4c2d3bb619d71bd9 Mon Sep 17 00:00:00 2001 From: CryptoKass Date: Thu, 21 Aug 2025 21:43:01 +0100 Subject: [PATCH 19/36] cleanup: removed unsued code, and add better errors for gasless --- Cargo.lock | 1 + crates/gas-station/Cargo.toml | 1 + crates/gas-station/src/lib.rs | 140 +----------------- crates/optimism/payload/src/builder.rs | 7 +- .../src/transaction/error.rs | 6 + .../src/transaction/gasless_error.rs | 21 +++ .../primitives-traits/src/transaction/mod.rs | 1 + crates/rpc/rpc-eth-types/src/error/mod.rs | 3 + crates/transaction-pool/src/error.rs | 6 +- crates/transaction-pool/src/validate/eth.rs | 7 +- 10 files changed, 47 insertions(+), 146 deletions(-) create mode 100644 crates/primitives-traits/src/transaction/gasless_error.rs diff --git a/Cargo.lock b/Cargo.lock index 9c7e034aaca..a78158853e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8558,6 +8558,7 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "hex", + "reth-primitives-traits", "reth-storage-api", "revm-database", "thiserror 2.0.16", diff --git a/crates/gas-station/Cargo.toml b/crates/gas-station/Cargo.toml index 93e3b9808f0..cc72cfb0e64 100644 --- a/crates/gas-station/Cargo.toml +++ b/crates/gas-station/Cargo.toml @@ -15,6 +15,7 @@ alloy-rlp = { workspace = true } reth-storage-api = { workspace = true } thiserror = { workspace = true } revm-database.workspace = true +reth-primitives-traits.workspace = true [dev-dependencies] hex = "0.4" diff --git a/crates/gas-station/src/lib.rs b/crates/gas-station/src/lib.rs index b9df9bd89c2..dcd9e211244 100644 --- a/crates/gas-station/src/lib.rs +++ b/crates/gas-station/src/lib.rs @@ -2,9 +2,9 @@ // CalculateGasStationStorageSlots -> calculate_slots // ValidateGaslessTx -> validate_gasless_tx -use alloy_primitives::{address, b256, keccak256, Address, B256, Bytes, Log, U256}; -use reth_storage_api::{errors::ProviderResult, StateProvider, StateWriter}; -use revm_database::states::{PlainStorageChangeset, StateChangeset}; +use alloy_primitives::{address, b256, keccak256, Address, B256, U256}; +use reth_storage_api::StateProvider; +use reth_primitives_traits::transaction::gasless_error::GaslessValidationError; #[derive(Clone, Debug)] // lets us clone (.clone()) and print debug info ("{:?}") pub struct GasStationConfig { @@ -12,15 +12,12 @@ pub struct GasStationConfig { pub address: Address, } -// pub const CREDITS_USED_TOPIC0: B256 = keccak256(b"CreditsUsed(address,address,uint256,uint256)"); - /// Topic0 for CreditsUsed event. pub fn credits_used_topic0() -> B256 { // GUESS WE CAN PRECOMPUTE THIS AND HAVE IT A CONSTANT keccak256(b"CreditsUsed(address,address,uint256,uint256)") } - /// predeploy local for GasStation by default pub const GAS_STATION_PREDEPLOY: Address = address!("0x4300000000000000000000000000000000000001"); @@ -125,26 +122,6 @@ pub struct GaslessValidation { pub slots: GasStationStorageSlots, } -#[derive(thiserror::Error, Clone, Debug)] -pub enum GaslessValidationError { - #[error("gas station feature disabled")] - Disabled, - #[error("destination is create transaction")] - Create, - #[error("gas station contract not configured")] - NoAddress, - #[error("not registered for gasless")] - NotRegistered, - #[error("contract inactive for gasless")] - Inactive, - #[error("insufficient credits: have {available}, need {needed}")] - InsufficientCredits { available: U256, needed: U256 }, - #[error("whitelist required")] - NotWhitelisted, - #[error("single-use already used")] - SingleUseConsumed, -} - /// A provider of pending credit usage, ... used by the txpool. pub trait PendingCreditUsageProvider { fn pending_credits_for_destination(&self, destination: &Address) -> U256; @@ -265,117 +242,6 @@ pub fn encode_credits_used_log_data(gas_used: U256, credits_deducted: U256) -> [ out } -/// Represents the storage/log effects that should be applied after a successful gasless tx. -#[derive(Clone, Debug, Default)] -pub struct GaslessPostExecEffects { - /// Keyed by storage slot hash. Values are raw U256 slot values to write. - pub storage_writes: Vec<(B256, U256)>, - /// Optional log to emit: `CreditsUsed(address,address,uint256,uint256)`. - pub log: Option, -} - -/// Computes the post-execution effects for a gasless transaction: -/// - Deducts `gas_used` from the contract's credits (saturating at 0) -/// - If single-use is enabled, marks `from` as used in `usedAddresses` mapping -/// Returns a struct with the storage writes and the log to emit. -/// -/// NOTE: DOESNT ACTUALLY APPLY CHANGES!!!! -/// see `apply_gasless_post_exec`... -pub fn compute_gasless_post_exec_effects( - cfg: &GasStationConfig, - to: Address, - from: Address, - gas_used: u64, - state: &SP, -) -> GaslessPostExecEffects { - // If feature is disabled or address not configured, produce no-op effects. - if !cfg.enabled || cfg.address.is_zero() { - return GaslessPostExecEffects::default(); - } - - // - helper to read a storage slot at gas station address - let read_slot = - |slot: B256| -> Option { state.storage(cfg.address, slot.into()).ok().flatten() }; - - let slots = calculate_gas_station_slots(to); - - // Calculate new credits - let available_credits = read_slot(slots.credits_slot); - let gas_used_u256 = U256::from(gas_used); - let new_credits = available_credits.unwrap_or_default().saturating_sub(gas_used_u256); // saturating means if it goes below 0, it stays at 0, no underflow - - // Prepare storage writes - let mut storage_writes = Vec::with_capacity(2); - storage_writes.push((slots.credits_slot, new_credits)); - - // - if single use mark it as used - let single_use_enabled = read_slot(slots.single_use_enabled_slot).unwrap_or_default() != U256::ZERO; - if single_use_enabled { - let used_addresses_slot = calculate_nested_mapping_slot(from, slots.used_addresses_map_base_slot); - storage_writes.push((used_addresses_slot, U256::from(1u64))); - } - - // calculate log data - // event CreditsUsed( - // address indexed contractAddress, address indexed caller, uint256 gasUsed, uint256 creditsDeducted - // ); - // topics: [signature, indexed contractAddress, indexed caller] - let topic0 = credits_used_topic0(); - let to_bytes = to.into_word(); - let from_bytes = from.into_word(); - let topics = vec![topic0, to_bytes, from_bytes]; - let data = encode_credits_used_log_data(gas_used_u256, gas_used_u256); - - let log = Log::new_unchecked( - cfg.address, - topics, - Bytes::copy_from_slice(&data), - ); - - GaslessPostExecEffects { storage_writes, log: Some(log) } -} - - -/// Applies the post-execution effects to the provided writer and returns the prepared log. -/// -/// This is a convenience helper: callers that can directly write to EVM state can implement -/// `StorageWriter` and invoke this to update credits/mark single-use, then attach the returned -/// log to the transaction receipt. -pub fn apply_gasless_post_exec( - writer: &mut W, - cfg: &GasStationConfig, - effects: GaslessPostExecEffects, -) -> ProviderResult<()> { - // If no effects, just return early - if effects.storage_writes.is_empty() { - return Ok(()); - } - - - // Convert storage writes to the format expected by PlainStorageChangeset - let storage: Vec<(U256, U256)> = effects.storage_writes - .into_iter() - .map(|(slot, value)| (U256::from_be_bytes(slot.0), value)) - .collect(); - - // Create a single PlainStorageChangeset for the gas station address - let storage_changeset = PlainStorageChangeset { - address: cfg.address, - wipe_storage: false, - storage, - }; - - let changes = StateChangeset { - accounts: Default::default(), - storage: vec![storage_changeset], - contracts: Default::default(), - }; - - // Write the changes - writer.write_state_changes(changes) -} - -// ??? #[cfg(test)] mod tests { use super::*; diff --git a/crates/optimism/payload/src/builder.rs b/crates/optimism/payload/src/builder.rs index c1dba5f7b74..a624835e9f2 100644 --- a/crates/optimism/payload/src/builder.rs +++ b/crates/optimism/payload/src/builder.rs @@ -728,13 +728,8 @@ where }; let from = tx.signer(); let gas_limit = tx.gas_limit(); - let mut gas_cfg = GasStationConfig::default(); - // temporary enable gasless transactions - // Idk where to put this config, it can be a run time flag??? - gas_cfg.enabled = true; - gas_cfg.address = GAS_STATION_PREDEPLOY; if let Err(_e) = validate_gasless_tx( - &gas_cfg, + &GasStationConfig::default(), state_provider, to, from, diff --git a/crates/primitives-traits/src/transaction/error.rs b/crates/primitives-traits/src/transaction/error.rs index b87405e4abd..f358e222443 100644 --- a/crates/primitives-traits/src/transaction/error.rs +++ b/crates/primitives-traits/src/transaction/error.rs @@ -2,6 +2,7 @@ use crate::GotExpectedBoxed; use alloy_primitives::U256; +use crate::transaction::gasless_error::GaslessValidationError; /// Represents error variants that can happen when trying to validate a transaction. #[derive(Debug, Clone, Eq, PartialEq, thiserror::Error)] @@ -64,6 +65,11 @@ pub enum InvalidTransactionError { /// Thrown post Osaka if gas limit is too high. #[error("gas limit too high")] GasLimitTooHigh, + + // Gasless errors + /// Thrown if the transaction is a gasless transaction and the validation fails. + #[error("gasless transaction validation failed")] + GaslessValidationError(GaslessValidationError), } /// Represents error variants that can happen when trying to convert a transaction to pooled diff --git a/crates/primitives-traits/src/transaction/gasless_error.rs b/crates/primitives-traits/src/transaction/gasless_error.rs new file mode 100644 index 00000000000..11103ca6e61 --- /dev/null +++ b/crates/primitives-traits/src/transaction/gasless_error.rs @@ -0,0 +1,21 @@ +use revm_primitives::U256; + +#[derive(thiserror::Error, Clone, Debug, PartialEq, Eq)] +pub enum GaslessValidationError { + #[error("gas station feature disabled")] + Disabled, + #[error("destination is create transaction")] + Create, + #[error("gas station contract not configured")] + NoAddress, + #[error("not registered for gasless")] + NotRegistered, + #[error("contract inactive for gasless")] + Inactive, + #[error("insufficient credits: have {available}, need {needed}")] + InsufficientCredits { available: U256, needed: U256 }, + #[error("whitelist required")] + NotWhitelisted, + #[error("single-use already used")] + SingleUseConsumed, +} \ No newline at end of file diff --git a/crates/primitives-traits/src/transaction/mod.rs b/crates/primitives-traits/src/transaction/mod.rs index f11c3346aec..f7658420ef3 100644 --- a/crates/primitives-traits/src/transaction/mod.rs +++ b/crates/primitives-traits/src/transaction/mod.rs @@ -17,6 +17,7 @@ pub mod signed; pub mod error; pub mod recover; +pub mod gasless_error; pub use alloy_consensus::transaction::{SignerRecoverable, TransactionInfo, TransactionMeta}; diff --git a/crates/rpc/rpc-eth-types/src/error/mod.rs b/crates/rpc/rpc-eth-types/src/error/mod.rs index 413e15585a8..4855abb4a4e 100644 --- a/crates/rpc/rpc-eth-types/src/error/mod.rs +++ b/crates/rpc/rpc-eth-types/src/error/mod.rs @@ -785,6 +785,9 @@ impl From for RpcInvalidTransactionError { InvalidTransactionError::FeeCapTooLow => Self::FeeCapTooLow, InvalidTransactionError::SignerAccountHasBytecode => Self::SenderNoEOA, InvalidTransactionError::GasLimitTooHigh => Self::GasLimitTooHigh, + InvalidTransactionError::GaslessValidationError(err) => { + Self::other(internal_rpc_err(err.to_string())) + } } } } diff --git a/crates/transaction-pool/src/error.rs b/crates/transaction-pool/src/error.rs index b499c57aebd..731a7c3e70b 100644 --- a/crates/transaction-pool/src/error.rs +++ b/crates/transaction-pool/src/error.rs @@ -319,7 +319,11 @@ impl InvalidPoolTransactionError { InvalidTransactionError::Eip7702Disabled => { // settings false - } + }, + InvalidTransactionError::GaslessValidationError(_) => { + // gasless validation failed + false + }, InvalidTransactionError::OldLegacyChainId | InvalidTransactionError::ChainIdMismatch | InvalidTransactionError::GasUintOverflow | diff --git a/crates/transaction-pool/src/validate/eth.rs b/crates/transaction-pool/src/validate/eth.rs index 8975884f4b8..de7b5de9341 100644 --- a/crates/transaction-pool/src/validate/eth.rs +++ b/crates/transaction-pool/src/validate/eth.rs @@ -41,6 +41,7 @@ use std::{ }; use tokio::sync::Mutex; use reth_gas_station::{validate_gasless_tx, GasStationConfig}; +use reth_primitives_traits::transaction::gasless_error::GaslessValidationError; /// Validator for Ethereum transactions. /// It is a [`TransactionValidator`] implementation that validates ethereum transaction. @@ -701,7 +702,9 @@ where None => { return TransactionValidationOutcome::Invalid( transaction, - InvalidTransactionError::TxTypeNotSupported.into(), // TODO use a better error + InvalidTransactionError::GaslessValidationError( + GaslessValidationError::Create, + ).into(), ); } }; @@ -716,7 +719,7 @@ where ) { return TransactionValidationOutcome::Invalid( transaction, - InvalidTransactionError::TxTypeNotSupported.into(), // TODO use a better error + InvalidTransactionError::GaslessValidationError(err).into(), ); } } From 1e8852581f85cfbbfe7ef7c7d76e6daca9844bdb Mon Sep 17 00:00:00 2001 From: sledro Date: Tue, 26 Aug 2025 17:08:11 +0100 Subject: [PATCH 20/36] clean up --- crates/ethereum/primitives/src/transaction.rs | 6 +-- crates/optimism/payload/src/builder.rs | 29 ++++++----- crates/optimism/txpool/src/validator.rs | 10 ++-- crates/transaction-pool/src/validate/eth.rs | 50 +++++++++---------- 4 files changed, 49 insertions(+), 46 deletions(-) diff --git a/crates/ethereum/primitives/src/transaction.rs b/crates/ethereum/primitives/src/transaction.rs index c62fa70e804..6e7412d4140 100644 --- a/crates/ethereum/primitives/src/transaction.rs +++ b/crates/ethereum/primitives/src/transaction.rs @@ -347,9 +347,9 @@ impl Hash for TransactionSigned { impl PartialEq for TransactionSigned { fn eq(&self, other: &Self) -> bool { - self.signature == other.signature - && self.transaction == other.transaction - && self.tx_hash() == other.tx_hash() + self.signature == other.signature && + self.transaction == other.transaction && + self.tx_hash() == other.tx_hash() } } diff --git a/crates/optimism/payload/src/builder.rs b/crates/optimism/payload/src/builder.rs index a624835e9f2..fabecd8040c 100644 --- a/crates/optimism/payload/src/builder.rs +++ b/crates/optimism/payload/src/builder.rs @@ -20,7 +20,10 @@ use reth_evm::{ ConfigureEvm, Database, Evm, }; use reth_execution_types::ExecutionOutcome; +use reth_gas_station::{validate_gasless_tx, GasStationConfig}; +use reth_optimism_evm::OpNextBlockEnvAttributes; use reth_optimism_forks::OpHardforks; +use reth_optimism_primitives::is_gasless; use reth_optimism_primitives::{transaction::OpTransaction, ADDRESS_L2_TO_L1_MESSAGE_PASSER}; use reth_optimism_txpool::{ estimated_da_size::DataAvailabilitySized, @@ -360,14 +363,14 @@ impl OpBuilder<'_, Txs> { .execute_best_transactions(&mut info, &mut builder, &state_provider, best_txs)? .is_some() { - return Ok(BuildOutcomeKind::Cancelled) + return Ok(BuildOutcomeKind::Cancelled); } // check if the new payload is even more valuable // if fees are equal but we included any mempool transactions (e.g. gasless), still proceed if !ctx.is_better_payload(info.total_fees) && !info.included_any_mempool_tx { // can skip building the block - return Ok(BuildOutcomeKind::Aborted { fees: info.total_fees }) + return Ok(BuildOutcomeKind::Aborted { fees: info.total_fees }); } } @@ -628,7 +631,7 @@ where if sequencer_tx.value().is_eip4844() { return Err(PayloadBuilderError::other( OpPayloadBuilderError::BlobTransactionRejected, - )) + )); } // Convert the transaction to a [RecoveredTx]. This is @@ -646,11 +649,11 @@ where .. })) => { trace!(target: "payload_builder", %error, ?sequencer_tx, "Error in sequencer transaction, skipping."); - continue + continue; } Err(err) => { // this is an error that we should treat as fatal for this attempt - return Err(PayloadBuilderError::EvmExecutionError(Box::new(err))) + return Err(PayloadBuilderError::EvmExecutionError(Box::new(err))); } }; @@ -693,13 +696,13 @@ where // invalid which also removes all dependent transaction from // the iterator before we can continue best_txs.mark_invalid(tx.signer(), tx.nonce()); - continue + continue; } // A sequencer's block should never contain blob or deposit transactions from the pool. if tx.is_eip4844() || tx.is_deposit() { best_txs.mark_invalid(tx.signer(), tx.nonce()); - continue + continue; } // We skip invalid cross chain txs, they would be removed on the next block update in @@ -707,12 +710,12 @@ where if let Some(interop) = interop { if !is_valid_interop(interop, self.config.attributes.timestamp()) { best_txs.mark_invalid(tx.signer(), tx.nonce()); - continue + continue; } } // check if the job was cancelled, if so we can exit early if self.cancel.is_cancelled() { - return Ok(Some(())) + return Ok(Some(())); } // validate the gasless transaction @@ -723,7 +726,7 @@ where alloy_primitives::TxKind::Create => { info!("gasless transaction is a create transaction, skipping"); best_txs.mark_invalid(tx.signer(), tx.nonce()); - continue + continue; } }; let from = tx.signer(); @@ -738,7 +741,7 @@ where ) { info!("gasless transaction validation failed: {:?}", _e); best_txs.mark_invalid(tx.signer(), tx.nonce()); - continue + continue; } } @@ -757,11 +760,11 @@ where trace!(target: "payload_builder", %error, ?tx, "skipping invalid transaction and its descendants"); best_txs.mark_invalid(tx.signer(), tx.nonce()); } - continue + continue; } Err(err) => { // this is an error that we should treat as fatal for this attempt - return Err(PayloadBuilderError::EvmExecutionError(Box::new(err))) + return Err(PayloadBuilderError::EvmExecutionError(Box::new(err))); } }; diff --git a/crates/optimism/txpool/src/validator.rs b/crates/optimism/txpool/src/validator.rs index 904862ffe25..78b0d14b6b8 100644 --- a/crates/optimism/txpool/src/validator.rs +++ b/crates/optimism/txpool/src/validator.rs @@ -189,7 +189,7 @@ where return TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::TxTypeNotSupported.into(), - ); + ) } // Interop cross tx validation @@ -201,7 +201,7 @@ where } err => InvalidPoolTransactionError::Other(Box::new(err)), }; - return TransactionValidationOutcome::Invalid(transaction, err); + return TransactionValidationOutcome::Invalid(transaction, err) } Some(Ok(_)) => { // valid interop tx @@ -224,7 +224,7 @@ where ) -> TransactionValidationOutcome { if !self.requires_l1_data_gas_fee() { // no need to check L1 gas fee - return outcome; + return outcome } // ensure that the account has enough balance to cover the L1 gas cost if let TransactionValidationOutcome::Valid { @@ -278,7 +278,7 @@ where GotExpected { got: balance, expected: cost }.into(), ) .into(), - ); + ) } return TransactionValidationOutcome::Valid { @@ -288,7 +288,7 @@ where propagate, bytecode_hash, authorities, - }; + } } outcome } diff --git a/crates/transaction-pool/src/validate/eth.rs b/crates/transaction-pool/src/validate/eth.rs index de7b5de9341..521c3e4b765 100644 --- a/crates/transaction-pool/src/validate/eth.rs +++ b/crates/transaction-pool/src/validate/eth.rs @@ -315,7 +315,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::Eip2930Disabled.into(), - )); + )) } } EIP1559_TX_TYPE_ID => { @@ -324,7 +324,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::Eip1559Disabled.into(), - )); + )) } } EIP4844_TX_TYPE_ID => { @@ -333,7 +333,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::Eip4844Disabled.into(), - )); + )) } } EIP7702_TX_TYPE_ID => { @@ -342,7 +342,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::Eip7702Disabled.into(), - )); + )) } } @@ -360,7 +360,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidPoolTransactionError::Eip2681, - )); + )) } // Reject transactions over defined size to prevent DOS attacks @@ -393,7 +393,7 @@ where // Check whether the init code size has been exceeded. if self.fork_tracker.is_shanghai_activated() { if let Err(err) = transaction.ensure_max_init_code_size(MAX_INIT_CODE_BYTE_SIZE) { - return Err(TransactionValidationOutcome::Invalid(transaction, err)); + return Err(TransactionValidationOutcome::Invalid(transaction, err)) } } @@ -407,7 +407,7 @@ where transaction_gas_limit, block_gas_limit, ), - )); + )) } // Check individual transaction gas limit if configured @@ -428,7 +428,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::TipAboveFeeCap.into(), - )); + )) } // determine whether the transaction should be treated as local @@ -482,7 +482,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::ChainIdMismatch.into(), - )); + )) } } @@ -492,19 +492,19 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::TxTypeNotSupported.into(), - )); + )) } if transaction.authorization_list().is_none_or(|l| l.is_empty()) { return Err(TransactionValidationOutcome::Invalid( transaction, Eip7702PoolTransactionError::MissingEip7702AuthorizationList.into(), - )); + )) } } if let Err(err) = ensure_intrinsic_gas(&transaction, &self.fork_tracker) { - return Err(TransactionValidationOutcome::Invalid(transaction, err)); + return Err(TransactionValidationOutcome::Invalid(transaction, err)) } // light blob tx pre-checks @@ -514,7 +514,7 @@ where return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::TxTypeNotSupported.into(), - )); + )) } let blob_count = transaction.blob_count().unwrap_or(0); @@ -525,7 +525,7 @@ where InvalidPoolTransactionError::Eip4844( Eip4844PoolTransactionError::NoEip4844Blobs, ), - )); + )) } let max_blob_count = self.fork_tracker.max_blob_count(); @@ -543,13 +543,13 @@ where } // Osaka validation of max tx gas. - if self.fork_tracker.is_osaka_activated() - && transaction.gas_limit() > MAX_TX_GAS_LIMIT_OSAKA + if self.fork_tracker.is_osaka_activated() && + transaction.gas_limit() > MAX_TX_GAS_LIMIT_OSAKA { return Err(TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::GasLimitTooHigh.into(), - )); + )) } Ok(transaction) @@ -598,7 +598,7 @@ where return TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::SignerAccountHasBytecode.into(), - ); + ) } } @@ -610,7 +610,7 @@ where transaction, InvalidTransactionError::NonceNotConsistent { tx: tx_nonce, state: account.nonce } .into(), - ); + ) } let cost = transaction.cost(); @@ -624,7 +624,7 @@ where GotExpected { got: account.balance, expected }.into(), ) .into(), - ); + ) } let mut maybe_blob_sidecar = None; @@ -638,7 +638,7 @@ where return TransactionValidationOutcome::Invalid( transaction, InvalidTransactionError::TxTypeNotSupported.into(), - ); + ) } EthBlobTransactionSidecar::Missing => { // This can happen for re-injected blob transactions (on re-org), since the blob @@ -653,7 +653,7 @@ where InvalidPoolTransactionError::Eip4844( Eip4844PoolTransactionError::MissingEip4844BlobSidecar, ), - ); + ) } } EthBlobTransactionSidecar::Present(sidecar) => { @@ -666,7 +666,7 @@ where InvalidPoolTransactionError::Eip4844( Eip4844PoolTransactionError::UnexpectedEip4844SidecarAfterOsaka, ), - ); + ) } } else if sidecar.is_eip7594() { return TransactionValidationOutcome::Invalid( @@ -674,7 +674,7 @@ where InvalidPoolTransactionError::Eip4844( Eip4844PoolTransactionError::UnexpectedEip7594SidecarBeforeOsaka, ), - ); + ) } // validate the blob @@ -684,7 +684,7 @@ where InvalidPoolTransactionError::Eip4844( Eip4844PoolTransactionError::InvalidEip4844Blob(err), ), - ); + ) } // Record the duration of successful blob validation as histogram self.validation_metrics.blob_validation_duration.record(now.elapsed()); From 1bc0fcbda52691ba1570c4c529bba02f5dc01990 Mon Sep 17 00:00:00 2001 From: sledro Date: Tue, 26 Aug 2025 19:44:01 +0100 Subject: [PATCH 21/36] clean up 2 --- crates/transaction-pool/src/validate/eth.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/transaction-pool/src/validate/eth.rs b/crates/transaction-pool/src/validate/eth.rs index 521c3e4b765..b2da4a6709e 100644 --- a/crates/transaction-pool/src/validate/eth.rs +++ b/crates/transaction-pool/src/validate/eth.rs @@ -419,7 +419,7 @@ where transaction_gas_limit, max_tx_gas_limit, ), - )); + )) } } @@ -451,7 +451,7 @@ where max_tx_fee_wei, tx_fee_cap_wei, }, - )); + )) } } } @@ -538,7 +538,7 @@ where permitted: max_blob_count, }, ), - )); + )) } } From 87ca8b0f4991fde74c48bfd5c3e323c32fd1a831 Mon Sep 17 00:00:00 2001 From: sledro Date: Tue, 26 Aug 2025 19:46:15 +0100 Subject: [PATCH 22/36] update Cargo.toml to switch revm dependencies to use the 'feat/gasless' branch from GitHub --- Cargo.toml | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 45887c2ec19..d92c9dc57a5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -315,7 +315,7 @@ strip = "none" # Include debug info in benchmarks too. [profile.bench] -inherits = "profiling" +# inherits = "profiling" [profile.maxperf] inherits = "release" @@ -711,28 +711,17 @@ walkdir = "2.3.3" vergen-git2 = "1.0.5" [patch.crates-io] -# revm = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} -# revm-primitives = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass" } -# revm-interpreter = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} -# revm-handler = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass" } -# revm-context = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} -# revm-context-interface = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} -# revm-state = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} -# revm-database = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} -# revm-database-interface = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} -# revm-bytecode = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} -# revm-inspector = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-kass"} -revm = { path = "/Users/kb/dev/pellar/revm/crates/revm" } -revm-primitives = { path = "/Users/kb/dev/pellar/revm/crates/primitives" } -revm-interpreter = { path = "/Users/kb/dev/pellar/revm/crates/interpreter" } -revm-handler = { path = "/Users/kb/dev/pellar/revm/crates/handler" } -revm-context = { path = "/Users/kb/dev/pellar/revm/crates/context" } -revm-context-interface = { path = "/Users/kb/dev/pellar/revm/crates/context/interface" } -revm-state = { path = "/Users/kb/dev/pellar/revm/crates/state" } -revm-database = { path = "/Users/kb/dev/pellar/revm/crates/database" } -revm-database-interface = { path = "/Users/kb/dev/pellar/revm/crates/database/interface" } -revm-bytecode = { path = "/Users/kb/dev/pellar/revm/crates/bytecode" } -revm-inspector = { path = "/Users/kb/dev/pellar/revm/crates/inspector" } +revm = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-primitives = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless" } +revm-interpreter = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-handler = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless" } +revm-context = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-context-interface = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-state = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-database = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-database-interface = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-bytecode = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm-inspector = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} # [patch.crates-io] # alloy-consensus = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" } From 58ef54e25efd5e037494dafbaa3cd49b2ab2d44a Mon Sep 17 00:00:00 2001 From: sledro Date: Tue, 26 Aug 2025 19:55:44 +0100 Subject: [PATCH 23/36] refactor gas station code: remove unused functions and improve comments for clarity --- crates/gas-station/src/lib.rs | 57 ++++++++------------------ crates/optimism/payload/src/builder.rs | 20 ++++----- 2 files changed, 27 insertions(+), 50 deletions(-) diff --git a/crates/gas-station/src/lib.rs b/crates/gas-station/src/lib.rs index dcd9e211244..e45a6e42b17 100644 --- a/crates/gas-station/src/lib.rs +++ b/crates/gas-station/src/lib.rs @@ -1,7 +1,3 @@ -// a rough port of https://github.com/lightlink-network/ll-geth/blob/5fc91fa5288a54b3761f43126655fc5e30923ab7/core/gas_station.go -// CalculateGasStationStorageSlots -> calculate_slots -// ValidateGaslessTx -> validate_gasless_tx - use alloy_primitives::{address, b256, keccak256, Address, B256, U256}; use reth_storage_api::StateProvider; use reth_primitives_traits::transaction::gasless_error::GaslessValidationError; @@ -12,12 +8,6 @@ pub struct GasStationConfig { pub address: Address, } -/// Topic0 for CreditsUsed event. -pub fn credits_used_topic0() -> B256 { - // GUESS WE CAN PRECOMPUTE THIS AND HAVE IT A CONSTANT - keccak256(b"CreditsUsed(address,address,uint256,uint256)") -} - /// predeploy local for GasStation by default pub const GAS_STATION_PREDEPLOY: Address = address!("0x4300000000000000000000000000000000000001"); @@ -37,13 +27,20 @@ pub const GAS_STATION_STORAGE_LOCATION: B256 = /// and optional `from`. #[derive(Clone, Debug)] pub struct GasStationStorageSlots { - pub registered_slot: B256, // struct base slot (has registered/active packed) - pub active_slot: B256, // TODO REMOVE THIS - pub credits_slot: B256, // credits slot - pub nested_whitelist_map_base_slot: B256, // base slot for the nested whitelist mapping - pub whitelist_enabled_slot: B256, // whitelist enabled flag - pub single_use_enabled_slot: B256, // single use enabled flag - pub used_addresses_map_base_slot: B256, // base slot for the nested usedAddresses mapping + /// Struct base slot (has registered/active packed). + pub registered_slot: B256, + /// TODO REMOVE THIS. + pub active_slot: B256, + /// Slot for `credits` balance. + pub credits_slot: B256, + /// Base slot for nested `whitelist` mapping. + pub nested_whitelist_map_base_slot: B256, + /// Slot for `whitelistEnabled` flag. + pub whitelist_enabled_slot: B256, + /// Slot for `singleUseEnabled` flag. + pub single_use_enabled_slot: B256, + /// Base slot for nested `usedAddresses` mapping. + pub used_addresses_map_base_slot: B256, } /// calculates the storage slot hashes for a specific registered contract within the GasStation's `contracts` mapping. @@ -92,7 +89,7 @@ pub fn calculate_gas_station_slots(registered_contract_address: Address) -> GasS GasStationStorageSlots { registered_slot: struct_base_slot_hash, - active_slot: struct_base_slot_hash, + active_slot: struct_base_slot_hash, credits_slot: credit_slot_hash, whitelist_enabled_slot: whitelist_enabled_slot_hash, single_use_enabled_slot: single_use_enabled_slot_hash, @@ -106,10 +103,10 @@ pub fn calculate_nested_mapping_slot(key: Address, base_slot: B256) -> B256 { // Left-pad the address to 32 bytes let mut key_padded = [0u8; 32]; key_padded[12..].copy_from_slice(key.as_slice()); // Left-pad 20-byte address to 32 bytes - + // The base_slot is already 32 bytes (B256) let map_base_slot_padded = base_slot.0; - + // Combine: key first, then base slot let combined = [key_padded, map_base_slot_padded].concat(); keccak256(combined) @@ -232,23 +229,3 @@ pub fn validate_gasless_tx( Ok(GaslessValidation { available_credits, required_credits: required, slots }) } - -/// encodes the CreditsUsed event log data payload (topics are computed by caller). -/// event CreditsUsed(address indexed contractAddress, address indexed caller, uint256 gasUsed, uint256 creditsDeducted) -pub fn encode_credits_used_log_data(gas_used: U256, credits_deducted: U256) -> [u8; 64] { - let mut out = [0u8; 64]; - out[..32].copy_from_slice(B256::from(gas_used).as_slice()); - out[32..].copy_from_slice(B256::from(credits_deducted).as_slice()); - out -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn topic0_signature_hash() { - let t = credits_used_topic0(); - assert_eq!(t, keccak256(b"CreditsUsed(address,address,uint256,uint256)")); - } -} diff --git a/crates/optimism/payload/src/builder.rs b/crates/optimism/payload/src/builder.rs index fabecd8040c..cf782f2b903 100644 --- a/crates/optimism/payload/src/builder.rs +++ b/crates/optimism/payload/src/builder.rs @@ -370,7 +370,7 @@ impl OpBuilder<'_, Txs> { // if fees are equal but we included any mempool transactions (e.g. gasless), still proceed if !ctx.is_better_payload(info.total_fees) && !info.included_any_mempool_tx { // can skip building the block - return Ok(BuildOutcomeKind::Aborted { fees: info.total_fees }); + return Ok(BuildOutcomeKind::Aborted { fees: info.total_fees }) } } @@ -631,7 +631,7 @@ where if sequencer_tx.value().is_eip4844() { return Err(PayloadBuilderError::other( OpPayloadBuilderError::BlobTransactionRejected, - )); + )) } // Convert the transaction to a [RecoveredTx]. This is @@ -649,11 +649,11 @@ where .. })) => { trace!(target: "payload_builder", %error, ?sequencer_tx, "Error in sequencer transaction, skipping."); - continue; + continue } Err(err) => { // this is an error that we should treat as fatal for this attempt - return Err(PayloadBuilderError::EvmExecutionError(Box::new(err))); + return Err(PayloadBuilderError::EvmExecutionError(Box::new(err))) } }; @@ -696,13 +696,13 @@ where // invalid which also removes all dependent transaction from // the iterator before we can continue best_txs.mark_invalid(tx.signer(), tx.nonce()); - continue; + continue } // A sequencer's block should never contain blob or deposit transactions from the pool. if tx.is_eip4844() || tx.is_deposit() { best_txs.mark_invalid(tx.signer(), tx.nonce()); - continue; + continue } // We skip invalid cross chain txs, they would be removed on the next block update in @@ -710,12 +710,12 @@ where if let Some(interop) = interop { if !is_valid_interop(interop, self.config.attributes.timestamp()) { best_txs.mark_invalid(tx.signer(), tx.nonce()); - continue; + continue } } // check if the job was cancelled, if so we can exit early if self.cancel.is_cancelled() { - return Ok(Some(())); + return Ok(Some(())) } // validate the gasless transaction @@ -760,11 +760,11 @@ where trace!(target: "payload_builder", %error, ?tx, "skipping invalid transaction and its descendants"); best_txs.mark_invalid(tx.signer(), tx.nonce()); } - continue; + continue } Err(err) => { // this is an error that we should treat as fatal for this attempt - return Err(PayloadBuilderError::EvmExecutionError(Box::new(err))); + return Err(PayloadBuilderError::EvmExecutionError(Box::new(err))) } }; From 89666cc4ed2a09c21638782ac9524658b00d85d0 Mon Sep 17 00:00:00 2001 From: sledro Date: Tue, 26 Aug 2025 23:47:52 +0100 Subject: [PATCH 24/36] remove is_gasless method from TransactionSigned implementation to clean up unused code --- crates/ethereum/primitives/src/transaction.rs | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/crates/ethereum/primitives/src/transaction.rs b/crates/ethereum/primitives/src/transaction.rs index 6e7412d4140..c6de2521a03 100644 --- a/crates/ethereum/primitives/src/transaction.rs +++ b/crates/ethereum/primitives/src/transaction.rs @@ -323,20 +323,6 @@ impl TransactionSigned { keccak256(self.encoded_2718()) } } -impl TransactionSigned { - /// return true if the transaction is gasless as per the gas station spec. - /// i.e. - /// - legacy: gas_price == 0 - /// - or 1559: max_fee_per_gas == 0 and max_priority_fee_per_gas == 0 - pub fn is_gasless(&self) -> bool { - match &self.transaction { - Transaction::Legacy(tx) => tx.gas_price == 0, - Transaction::Eip1559(tx) => tx.max_fee_per_gas == 0 && tx.max_priority_fee_per_gas == 0, - // only legacy and 1559 are gasless so we return false for other types - _ => false, // <- matches all other types - } - } -} impl Hash for TransactionSigned { fn hash(&self, state: &mut H) { From 637a59a730c36e886ea7a2733c5639972732b66f Mon Sep 17 00:00:00 2001 From: sledro Date: Tue, 26 Aug 2025 23:58:55 +0100 Subject: [PATCH 25/36] implement gasless transaction prioritization in transaction pool --- crates/transaction-pool/src/ordering.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/crates/transaction-pool/src/ordering.rs b/crates/transaction-pool/src/ordering.rs index ae0afe34f2a..54ff5d509cc 100644 --- a/crates/transaction-pool/src/ordering.rs +++ b/crates/transaction-pool/src/ordering.rs @@ -1,5 +1,6 @@ use crate::traits::PoolTransaction; use alloy_primitives::U256; +use reth_optimism_primitives::is_gasless; use std::{cmp::Ordering, fmt::Debug, marker::PhantomData}; /// Priority of the transaction that can be missing. @@ -82,14 +83,11 @@ where transaction: &Self::Transaction, base_fee: u64, ) -> Priority { - transaction.effective_tip_per_gas(base_fee).map(U256::from).into() - // TODO: give top priority to gasless transactions - // match transaction.effective_tip_per_gas(base_fee) { - // Some(tip) => Priority::Value(U256::from(tip)), - // // Gasless transactions (no effective tip) get the highest priority to ensure they are - // // selected for inclusion. - // Some(0) => Priority::Value(U256::MAX), - // } + if is_gasless(transaction) { + Priority::Value(U256::MAX) + } else { + transaction.effective_tip_per_gas(base_fee).map(U256::from).into() + } } } From 0772b757189bbd01c5323da41352d6b772c98b5f Mon Sep 17 00:00:00 2001 From: sledro Date: Thu, 4 Sep 2025 03:03:13 +0100 Subject: [PATCH 26/36] Update Cargo.lock and Cargo.toml to switch revm dependencies to the 'feat/gasless-2' branch and bump various package versions --- Cargo.lock | 571 +++++++++++++++++++++++++++-------------------------- Cargo.toml | 22 +-- 2 files changed, 303 insertions(+), 290 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a78158853e9..e578cabfcc6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -97,9 +97,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-chains" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a379c0d821498c996ceb9e7519fc2dab8286c35a203c1fb95f80ecd66e07cf2f" +checksum = "ef8ff73a143281cb77c32006b04af9c047a6b8fe5860e85a88ad325328965355" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -112,9 +112,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35f021a55afd68ff2364ccfddaa364fc9a38a72200cdc74fcfb8dc3231d38f2c" +checksum = "d213580c17d239ae83c0d897ac3315db7cda83d2d4936a9823cc3517552f2e24" dependencies = [ "alloy-eips", "alloy-primitives", @@ -138,9 +138,9 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a0ecca7a71b1f88e63d19e2d9397ce56949d3dd3484fd73c73d0077dc5c93d4" +checksum = "81443e3b8dccfeac7cd511aced15928c97ff253f4177acbb97de97178e543f6c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -153,9 +153,9 @@ dependencies = [ [[package]] name = "alloy-contract" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd26132cbfa6e5f191a01f7b9725eaa0680a953be1fd005d588b0e9422c16456" +checksum = "de217ab604f1bcfa2e3b0aff86d50812d5931d47522f9f0a949cc263ec2d108e" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -236,9 +236,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7473a19f02b25f8e1e8c69d35f02c07245694d11bd91bfe00e9190ac106b3838" +checksum = "2a15b4b0f6bab47aae017d52bb5a739bda381553c09fb9918b7172721ef5f5de" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -254,14 +254,16 @@ dependencies = [ "ethereum_ssz", "ethereum_ssz_derive", "serde", + "serde_with", "sha2 0.10.9", + "thiserror 2.0.16", ] [[package]] name = "alloy-evm" -version = "0.18.3" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4d88e267e4b599e944e1d32fbbfeaf4b8ea414e54da27306ede37c0798684d" +checksum = "7808e88376405c92315b4d752d9b207f25328e04b31d13e9b1c73f9236486f63" dependencies = [ "alloy-consensus", "alloy-eips", @@ -279,9 +281,9 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b2c29f25098bfa4cd3d9ec7806e1506716931e188c7c0843284123831c2cf1" +checksum = "33ba1cbc25a07e0142e8875fcbe80e1fdb02be8160ae186b90f4b9a69a72ed2b" dependencies = [ "alloy-eips", "alloy-primitives", @@ -319,9 +321,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a4d1f49fdf9780b60e52c20ffcc1e352d8d27885cc8890620eb584978265dd9" +checksum = "f8882ec8e4542cfd02aadc6dccbe90caa73038f60016d936734eb6ced53d2167" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -334,9 +336,9 @@ dependencies = [ [[package]] name = "alloy-network" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2991c432e149babfd996194f8f558f85d7326ac4cf52c55732d32078ff0282d4" +checksum = "51d6d87d588bda509881a7a66ae77c86514bd1193ac30fbff0e0f24db95eb5a5" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -360,9 +362,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d540d962ddbc3e95153bafe56ccefeb16dfbffa52c5f7bdd66cd29ec8f52259" +checksum = "5b14fa9ba5774e0b30ae6a04176d998211d516c8af69c9c530af7c6c42a8c508" dependencies = [ "alloy-consensus", "alloy-eips", @@ -415,7 +417,7 @@ dependencies = [ "foldhash", "getrandom 0.3.3", "hashbrown 0.15.5", - "indexmap 2.10.0", + "indexmap 2.11.0", "itoa", "k256", "keccak-asm", @@ -432,9 +434,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e96d8084a1cf96be2df6219ac407275ac20c1136fa01f911535eb489aa006e8" +checksum = "475a5141313c3665b75d818be97d5fa3eb5e0abb7e832e9767edd94746db28e3" dependencies = [ "alloy-chains", "alloy-consensus", @@ -477,9 +479,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a682f14e10c3f4489c57b64ed457801b3e7ffc5091b6a35883d0e5960b9b894" +checksum = "f97c18795ce1ce8151c5539ce1e4200940389674173f677c7455f79bfb00e5df" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -521,9 +523,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194ff51cd1d2e65c66b98425e0ca7eb559ca1a579725834c986d84faf8e224c0" +checksum = "25289674cd8c58fcca2568b5350423cb0dd7bca8c596c5e2869bfe4c5c57ed14" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -547,9 +549,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d4fe522f6fc749c8afce721bdc8f73b715d317c3c02fcb9b51f7a143e4401dd" +checksum = "39676beaa50db545cf15447fc94ec5513b64e85a48357a0625b9a04aef08a910" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", @@ -560,9 +562,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-admin" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30f218456a0a70a234ed52c181f04e6c98b6810c25273cf5280d32dd2cbdc876" +checksum = "65acc9264342069decb617aa344847f55180ba3aeab1c8d1db062d0619881029" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -572,9 +574,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6af88d9714b499675164cac2fa2baadb3554579ab3ea8bc0d7b0c0de4f9d692" +checksum = "a9c8cad42fa936000be72ab80fcd97386a6a226c35c2989212756da9e76c1521" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -584,9 +586,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "124b742619519d5932e586631f11050028b29c30e3e195f2bb04228c886253d6" +checksum = "01bac57c987c93773787619e20f89167db74d460a2d1d40f591d94fb7c22c379" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -595,9 +597,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-beacon" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd39ff755554e506ae0f6a8e8251f8633bd7512cce0d7d1a7cfd689797e0daa5" +checksum = "8d3c0e6cc87a8be5582d08f929f96db25843f44cb636a0985a4a6bf02609c02f" dependencies = [ "alloy-eips", "alloy-primitives", @@ -605,6 +607,7 @@ dependencies = [ "ethereum_ssz", "ethereum_ssz_derive", "serde", + "serde_json", "serde_with", "thiserror 2.0.16", "tree_hash", @@ -613,20 +616,21 @@ dependencies = [ [[package]] name = "alloy-rpc-types-debug" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c6a6c8ae298c2739706ee3cd996c220b0ea406e6841a4e4290c7336edd5f811" +checksum = "c2fe118e6c152d54cb4549b9835fb87d38b12754bb121375183ee3ec84bd0849" dependencies = [ "alloy-primitives", "derive_more", "serde", + "serde_with", ] [[package]] name = "alloy-rpc-types-engine" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a1a77a23d609bca2e4a60f992dde5f987475cb064da355fa4dbd7cda2e1bb48" +checksum = "72a41624eb84bc743e414198bf10eb48b611a5554d6a9fd6205f7384d57dfd7f" dependencies = [ "alloy-consensus", "alloy-eips", @@ -645,9 +649,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "781d4d5020bea8f020e164f5593101c2e2f790d66d04a0727839d03bc4411ed7" +checksum = "1cd1e1b4dcdf13eaa96343e5c0dafc2d2e8ce5d20b90347169d46a1df0dec210" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -667,9 +671,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-mev" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81f742708f7ea7c3dc6067e7d87b6635c0817cf142b7c72cb8e8e3e07371aa3a" +checksum = "01620baa48d3f49fc908c781eb91ded71f3226e719bb6404697c2851cac4e098" dependencies = [ "alloy-consensus", "alloy-eips", @@ -682,9 +686,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719e5eb9c15e21dab3dee2cac53505500e5e701f25d556734279c5f02154022a" +checksum = "1bc33d9d0e0b3cfe9c2e82a1a427c9ed516fcfebe764f0adf7ceb8107f702dd1" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -696,9 +700,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-txpool" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c751233a6067ccc8a4cbd469e0fd34e0d9475fd118959dbc777ae3af31bba7" +checksum = "d4fa9e9b3e613425d2a2ee1a322bdad5f1cedf835406fd4b59538822500b44bc" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -708,9 +712,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30be84f45d4f687b00efaba1e6290cbf53ccc8f6b8fbb54e4c2f9d2a0474ce95" +checksum = "f1b3b1078b8775077525bc9fe9f6577e815ceaecd6c412a4f3b4d8aa2836e8f6" dependencies = [ "alloy-primitives", "arbitrary", @@ -720,9 +724,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa8c24b883fe56395db64afcd665fca32dcdef670a59e5338de6892c2e38d7e9" +checksum = "10ab1b8d4649bf7d0db8ab04e31658a6cc20364d920795484d886c35bed3bab4" dependencies = [ "alloy-primitives", "async-trait", @@ -735,9 +739,9 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05724615fd2ec3417f5cd07cab908300cbb3aae5badc1b805ca70c555b26775f" +checksum = "7bdeec36c8d9823102b571b3eab8b323e053dc19c12da14a9687bd474129bf2a" dependencies = [ "alloy-consensus", "alloy-network", @@ -775,7 +779,7 @@ dependencies = [ "alloy-sol-macro-input", "const-hex", "heck", - "indexmap 2.10.0", + "indexmap 2.11.0", "proc-macro-error2", "proc-macro2", "quote", @@ -824,9 +828,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20b7f8b6c540b55e858f958d3a92223494cf83c4fb43ff9b26491edbeb3a3b71" +checksum = "dce5129146a76ca6139a19832c75ad408857a56bcd18cd2c684183b8eacd78d8" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -848,9 +852,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260e9584dfd7998760d7dfe1856c6f8f346462b9e7837287d7eddfb3922ef275" +checksum = "e2379d998f46d422ec8ef2b61603bc28cda931e5e267aea1ebe71f62da61d101" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -863,9 +867,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9491a1d81e97ae9d919da49e1c63dec4729c994e2715933968b8f780aa18793e" +checksum = "041aa5db2e907692a9a93a0a908057665c03e59364e1fbbeed613511a0159289" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -883,9 +887,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d056ef079553e1f18834d6ef4c2793e4d51ac742021b2be5039dd623fe1354f0" +checksum = "c6d44395e6793566e9c89bd82297cc4b0566655c1e78a1d69362640814784cc6" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -921,12 +925,12 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "1.0.25" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e29436068f836727d4e7c819ae6bf6f9c9e19a32e96fc23e814709a277f23a" +checksum = "3b5becb9c269a7d05a2f28d549f86df5a5dbc923e2667eff84fdecac8cda534c" dependencies = [ "alloy-primitives", - "darling 0.20.11", + "darling 0.21.3", "proc-macro2", "quote", "syn 2.0.106", @@ -1362,18 +1366,15 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.27" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddb939d66e4ae03cee6091612804ba446b12878410cfa17f785f4dd67d4014e8" +checksum = "977eb15ea9efd848bb8a4a1a2500347ed7f0bf794edf0dc3ddcf439f43d36b23" dependencies = [ - "brotli", - "flate2", + "compression-codecs", + "compression-core", "futures-core", - "memchr", "pin-project-lite", "tokio", - "zstd", - "zstd-safe", ] [[package]] @@ -1581,7 +1582,7 @@ version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "cexpr", "clang-sys", "itertools 0.13.0", @@ -1632,9 +1633,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.2" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" dependencies = [ "arbitrary", "serde", @@ -1698,11 +1699,11 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c340fe0f0b267787095cbe35240c6786ff19da63ec7b69367ba338eace8169b" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "boa_interner", "boa_macros", "boa_string", - "indexmap 2.10.0", + "indexmap 2.11.0", "num-bigint", "rustc-hash 2.1.1", ] @@ -1714,7 +1715,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f620c3f06f51e65c0504ddf04978be1b814ac6586f0b45f6019801ab5efd37f9" dependencies = [ "arrayvec", - "bitflags 2.9.2", + "bitflags 2.9.4", "boa_ast", "boa_gc", "boa_interner", @@ -1728,7 +1729,7 @@ dependencies = [ "fast-float2", "hashbrown 0.15.5", "icu_normalizer 1.5.0", - "indexmap 2.10.0", + "indexmap 2.11.0", "intrusive-collections", "itertools 0.13.0", "num-bigint", @@ -1774,7 +1775,7 @@ dependencies = [ "boa_gc", "boa_macros", "hashbrown 0.15.5", - "indexmap 2.10.0", + "indexmap 2.11.0", "once_cell", "phf", "rustc-hash 2.1.1", @@ -1799,7 +1800,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cc142dac798cdc6e2dbccfddeb50f36d2523bb977a976e19bdb3ae19b740804" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "boa_ast", "boa_interner", "boa_macros", @@ -1878,7 +1879,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" dependencies = [ "memchr", - "regex-automata 0.4.9", + "regex-automata", "serde", ] @@ -1953,9 +1954,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.11" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d07aa9a93b00c76f71bc35d598bed923f6d4f3a9ca5c24b7737ae1a292841c0" +checksum = "dd0b03af37dad7a14518b7691d81acb0f8222604ad3d1b02f6b4bed5188c0cd5" dependencies = [ "serde", ] @@ -2120,9 +2121,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.45" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" +checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" dependencies = [ "clap_builder", "clap_derive", @@ -2130,9 +2131,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.44" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" +checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" dependencies = [ "anstream", "anstyle", @@ -2142,9 +2143,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.45" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" dependencies = [ "heck", "proc-macro2", @@ -2301,11 +2302,11 @@ dependencies = [ [[package]] name = "comfy-table" -version = "7.1.4" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a65ebfec4fb190b6f90e944a817d60499ee0744e582530e2c9900a22e591d9a" +checksum = "3f8e18d0dca9578507f13f9803add0df13362b02c501c1c17734f0dbb52eaf0b" dependencies = [ - "crossterm", + "crossterm 0.29.0", "unicode-segmentation", "unicode-width 0.2.0", ] @@ -2324,6 +2325,26 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "compression-codecs" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "485abf41ac0c8047c07c87c72c8fb3eb5197f6e9d7ded615dfd1a00ae00a0f64" +dependencies = [ + "brotli", + "compression-core", + "flate2", + "memchr", + "zstd", + "zstd-safe", +] + +[[package]] +name = "compression-core" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" + [[package]] name = "concat-kdf" version = "0.1.0" @@ -2516,7 +2537,7 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "crossterm_winapi", "mio", "parking_lot", @@ -2526,6 +2547,20 @@ dependencies = [ "winapi", ] +[[package]] +name = "crossterm" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" +dependencies = [ + "bitflags 2.9.4", + "crossterm_winapi", + "document-features", + "parking_lot", + "rustix 1.0.8", + "winapi", +] + [[package]] name = "crossterm_winapi" version = "0.9.1" @@ -2633,12 +2668,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08440b3dd222c3d0433e63e097463969485f112baff337dfdaca043a0d760570" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ - "darling_core 0.21.2", - "darling_macro 0.21.2", + "darling_core 0.21.3", + "darling_macro 0.21.3", ] [[package]] @@ -2657,14 +2692,15 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25b7912bc28a04ab1b7715a68ea03aaa15662b43a1a4b2c480531fd19f8bf7e" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", + "serde", "strsim", "syn 2.0.106", ] @@ -2682,11 +2718,11 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce154b9bea7fb0c8e8326e62d00354000c36e79770ff21b8c84e3aa267d9d531" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ - "darling_core 0.21.2", + "darling_core 0.21.3", "quote", "syn 2.0.106", ] @@ -2773,9 +2809,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" dependencies = [ "powerfmt", "serde", @@ -2986,6 +3022,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" +[[package]] +name = "document-features" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +dependencies = [ + "litrs", +] + [[package]] name = "dunce" version = "1.0.5" @@ -3800,9 +3845,9 @@ checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -3944,9 +3989,9 @@ checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" [[package]] name = "generator" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" +checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2" dependencies = [ "cc", "cfg-if", @@ -4002,7 +4047,7 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.3+wasi-0.2.4", "wasm-bindgen", ] @@ -4028,7 +4073,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "libc", "libgit2-sys", "log", @@ -4089,12 +4134,12 @@ dependencies = [ [[package]] name = "gmp-mpfr-sys" -version = "1.6.5" +version = "1.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66d61197a68f6323b9afa616cf83d55d69191e1bf364d4eb7d35ae18defe776" +checksum = "60f8970a75c006bb2f8ae79c6768a116dd215fa8346a87aed99bf9d82ca43394" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -4120,7 +4165,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.10.0", + "indexmap 2.11.0", "slab", "tokio", "tokio-util", @@ -4687,9 +4732,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -4774,9 +4819,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" dependencies = [ "arbitrary", "equivalent", @@ -4802,7 +4847,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "inotify-sys", "libc", ] @@ -4874,11 +4919,11 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "cfg-if", "libc", ] @@ -4985,9 +5030,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ "getrandom 0.3.3", "libc", @@ -5320,7 +5365,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "libc", "redox_syscall", ] @@ -5423,6 +5468,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +[[package]] +name = "litrs" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" + [[package]] name = "lock_api" version = "0.4.13" @@ -5436,9 +5487,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "loom" @@ -5450,7 +5501,7 @@ dependencies = [ "generator", "scoped-tls", "tracing", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -5524,11 +5575,11 @@ dependencies = [ [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -5539,9 +5590,9 @@ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memmap2" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" +checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" dependencies = [ "libc", ] @@ -5584,7 +5635,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd7399781913e5393588a8d8c6a2867bf85fb38eaf2502fdce465aad2dc6f034" dependencies = [ "base64 0.22.1", - "indexmap 2.10.0", + "indexmap 2.11.0", "metrics", "metrics-util", "quanta", @@ -5616,7 +5667,7 @@ dependencies = [ "crossbeam-epoch", "crossbeam-utils", "hashbrown 0.15.5", - "indexmap 2.10.0", + "indexmap 2.11.0", "metrics", "ordered-float", "quanta", @@ -5806,7 +5857,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "fsevent-sys", "inotify", "kqueue", @@ -5835,12 +5886,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -6243,12 +6293,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "p256" version = "0.13.2" @@ -6358,9 +6402,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" @@ -6537,9 +6581,9 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ "zerovec 0.11.4", ] @@ -6645,7 +6689,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "chrono", "flate2", "hex", @@ -6659,7 +6703,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "chrono", "hex", ] @@ -6672,13 +6716,13 @@ checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.9.2", + "bitflags 2.9.4", "lazy_static", "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", "rand_xorshift", - "regex-syntax 0.8.5", + "regex-syntax", "rusty-fork", "tempfile", "unarray", @@ -6734,7 +6778,7 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "memchr", "unicase", ] @@ -6771,9 +6815,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", @@ -6782,7 +6826,7 @@ dependencies = [ "quinn-udp", "rustc-hash 2.1.1", "rustls", - "socket2 0.5.10", + "socket2 0.6.0", "thiserror 2.0.16", "tokio", "tracing", @@ -6791,9 +6835,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.12" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", "getrandom 0.3.3", @@ -6812,16 +6856,16 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.0", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -6972,10 +7016,10 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "cassowary", "compact_str", - "crossterm", + "crossterm 0.28.1", "indoc", "instability", "itertools 0.13.0", @@ -6993,7 +7037,7 @@ version = "11.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", ] [[package]] @@ -7028,7 +7072,7 @@ version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", ] [[package]] @@ -7075,47 +7119,32 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "regress" @@ -7369,7 +7398,7 @@ dependencies = [ "backon", "clap", "comfy-table", - "crossterm", + "crossterm 0.28.1", "eyre", "fdlimit", "futures", @@ -8617,12 +8646,12 @@ dependencies = [ name = "reth-libmdbx" version = "1.6.0" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "byteorder", "codspeed-criterion-compat", "dashmap 6.1.0", "derive_more", - "indexmap 2.10.0", + "indexmap 2.11.0", "parking_lot", "rand 0.9.2", "reth-mdbx-sys", @@ -10489,7 +10518,7 @@ dependencies = [ "tracing-appender", "tracing-journald", "tracing-logfmt", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -10502,7 +10531,7 @@ dependencies = [ "opentelemetry_sdk", "tracing", "tracing-opentelemetry", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -10516,7 +10545,7 @@ dependencies = [ "aquamarine", "assert_matches", "auto_impl", - "bitflags 2.9.2", + "bitflags 2.9.4", "codspeed-criterion-compat", "futures", "futures-util", @@ -10746,8 +10775,7 @@ dependencies = [ [[package]] name = "revm" version = "28.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee5d3f7d031e90ab47c7488061bdc4875abc4e9dcea6c18f5dee09732d0436fb" +source = "git+https://github.com/lightlink-network/revm?branch=feat%2Fgasless-2#f15d0e0df4e272e0948e97a3f509e9ce214611db" dependencies = [ "revm-bytecode", "revm-context", @@ -10765,8 +10793,7 @@ dependencies = [ [[package]] name = "revm-bytecode" version = "6.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d800e6c2119457ded5b0af71634eb2468040bf97de468eee5a730272a106da0" +source = "git+https://github.com/lightlink-network/revm?branch=feat%2Fgasless-2#f15d0e0df4e272e0948e97a3f509e9ce214611db" dependencies = [ "bitvec", "phf", @@ -10777,8 +10804,7 @@ dependencies = [ [[package]] name = "revm-context" version = "9.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c63485b4d1b0e67f342f9a8c0e9f78b6b5f1750863a39bdf6ceabdbaaf4aed1" +source = "git+https://github.com/lightlink-network/revm?branch=feat%2Fgasless-2#f15d0e0df4e272e0948e97a3f509e9ce214611db" dependencies = [ "bitvec", "cfg-if", @@ -10810,8 +10836,7 @@ dependencies = [ [[package]] name = "revm-context-interface" version = "10.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "550cb8b9465e00bdb0a384922b69f864c5bcc228bed19c8ecbfa69fff2256382" +source = "git+https://github.com/lightlink-network/revm?branch=feat%2Fgasless-2#f15d0e0df4e272e0948e97a3f509e9ce214611db" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -10826,8 +10851,7 @@ dependencies = [ [[package]] name = "revm-database" version = "7.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40000c7d917c865f6c232a78581b78e70c43f52db17282bd1b52d4f0565bc8a2" +source = "git+https://github.com/lightlink-network/revm?branch=feat%2Fgasless-2#f15d0e0df4e272e0948e97a3f509e9ce214611db" dependencies = [ "alloy-eips", "revm-bytecode", @@ -10840,8 +10864,7 @@ dependencies = [ [[package]] name = "revm-database-interface" version = "7.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ccea7a168cba1196b1e57dd3e22c36047208c135f600f8e58cbe7d49957dba" +source = "git+https://github.com/lightlink-network/revm?branch=feat%2Fgasless-2#f15d0e0df4e272e0948e97a3f509e9ce214611db" dependencies = [ "auto_impl", "either", @@ -10853,8 +10876,7 @@ dependencies = [ [[package]] name = "revm-handler" version = "9.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cb09d07e6799823ce5a344f1604236b53fe1a92bacd7122c0b16286f92254c2" +source = "git+https://github.com/lightlink-network/revm?branch=feat%2Fgasless-2#f15d0e0df4e272e0948e97a3f509e9ce214611db" dependencies = [ "auto_impl", "derive-where", @@ -10872,8 +10894,7 @@ dependencies = [ [[package]] name = "revm-inspector" version = "9.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2770c0d7e9f4f23660dc0b8b954b7a1eee8989ec97f936ebce366c78b6d7b915" +source = "git+https://github.com/lightlink-network/revm?branch=feat%2Fgasless-2#f15d0e0df4e272e0948e97a3f509e9ce214611db" dependencies = [ "auto_impl", "either", @@ -10889,9 +10910,9 @@ dependencies = [ [[package]] name = "revm-inspectors" -version = "0.28.0" +version = "0.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a76ba086ca57a718368e46e792a81c5eb7a30366956aa6293adbcec8b1181ce" +checksum = "364d0b3c46727dc810a9ddc40799805e85236424a1a9ddec3909c734e03f0657" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -10922,8 +10943,7 @@ dependencies = [ [[package]] name = "revm-interpreter" version = "25.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c938c0d4d617c285203cad8aba1cefeec383fcff2fdf94a4469f588ab979b5" +source = "git+https://github.com/lightlink-network/revm?branch=feat%2Fgasless-2#f15d0e0df4e272e0948e97a3f509e9ce214611db" dependencies = [ "revm-bytecode", "revm-context-interface 10.0.1", @@ -10934,8 +10954,7 @@ dependencies = [ [[package]] name = "revm-precompile" version = "26.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7bb5e8b92891c5ac9dd8dae157bd1d90aab01973ad4f99d4135d507facc3e7" +source = "git+https://github.com/lightlink-network/revm?branch=feat%2Fgasless-2#f15d0e0df4e272e0948e97a3f509e9ce214611db" dependencies = [ "ark-bls12-381", "ark-bn254", @@ -10960,8 +10979,7 @@ dependencies = [ [[package]] name = "revm-primitives" version = "20.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa29d9da06fe03b249b6419b33968ecdf92ad6428e2f012dc57bcd619b5d94e" +source = "git+https://github.com/lightlink-network/revm?branch=feat%2Fgasless-2#f15d0e0df4e272e0948e97a3f509e9ce214611db" dependencies = [ "alloy-primitives", "num_enum", @@ -10972,10 +10990,9 @@ dependencies = [ [[package]] name = "revm-state" version = "7.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d7f39ea56df3bfbb3c81c99b1f028d26f205b6004156baffbf1a4f84b46cfa" +source = "git+https://github.com/lightlink-network/revm?branch=feat%2Fgasless-2#f15d0e0df4e272e0948e97a3f509e9ce214611db" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "revm-bytecode", "revm-primitives", "serde", @@ -11118,9 +11135,9 @@ dependencies = [ [[package]] name = "rug" -version = "1.27.0" +version = "1.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4207e8d668e5b8eb574bda8322088ccd0d7782d3d03c7e8d562e82ed82bdcbc3" +checksum = "58ad2e973fe3c3214251a840a621812a4f40468da814b1a3d6947d433c2af11f" dependencies = [ "az", "gmp-mpfr-sys", @@ -11213,7 +11230,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "errno", "libc", "linux-raw-sys 0.4.15", @@ -11226,7 +11243,7 @@ version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "errno", "libc", "linux-raw-sys 0.9.4", @@ -11465,7 +11482,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "core-foundation", "core-foundation-sys", "libc", @@ -11556,7 +11573,7 @@ version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.11.0", "itoa", "memchr", "ryu", @@ -11605,7 +11622,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.10.0", + "indexmap 2.11.0", "schemars 0.9.0", "schemars 1.0.4", "serde", @@ -12072,7 +12089,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac9ee8b664c9f1740cd813fea422116f8ba29997bb7c878d1940424889802897" dependencies = [ - "bitflags 2.9.2", + "bitflags 2.9.4", "log", "num-traits", ] @@ -12125,9 +12142,9 @@ dependencies = [ [[package]] name = "test-fuzz" -version = "7.2.3" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2544811444783be05d3221045db0abf7f10013b85bf7d9e3e1a09e96355f405f" +checksum = "6696b1bcee3edb0553566f632c31b3b18fda42cf4d529327ca47f230c4acd3ab" dependencies = [ "serde", "serde_combinators", @@ -12138,9 +12155,9 @@ dependencies = [ [[package]] name = "test-fuzz-internal" -version = "7.2.3" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324b46e1673f1c123007be9245678eb8f35a8a886a01d29ea56edd3ef13cb012" +checksum = "5988511fdb342582013a17a4263e994bce92828a1bae039f92a2f05a5f95ce78" dependencies = [ "bincode 2.0.1", "cargo_metadata 0.19.2", @@ -12149,11 +12166,11 @@ dependencies = [ [[package]] name = "test-fuzz-macro" -version = "7.2.3" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4aa61edbcc785cac8ce4848ce917fb675c94f299f866186c0455b62896a8dac" +checksum = "c8893e583c5af79a67761a9285535d26612cb1617fcbf388c3abc0c1d35a0b89" dependencies = [ - "darling 0.21.2", + "darling 0.21.3", "heck", "itertools 0.14.0", "prettyplease", @@ -12164,9 +12181,9 @@ dependencies = [ [[package]] name = "test-fuzz-runtime" -version = "7.2.3" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60ac4faeced56bd2c2d1dd35ddae75627c58eb63696f324c7c0a19760746e14d" +checksum = "47be06afdb9cb50c76ef938e2e4bda2e28e1cbb4d3d305603d57a5e374a6d6e7" dependencies = [ "hex", "num-traits", @@ -12272,12 +12289,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" dependencies = [ "deranged", - "itoa", "js-sys", "libc", "num-conv", @@ -12290,15 +12306,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -12470,7 +12486,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.11.0", "serde", "serde_spanned", "toml_datetime", @@ -12514,7 +12530,7 @@ dependencies = [ "futures-core", "futures-util", "hdrhistogram", - "indexmap 2.10.0", + "indexmap 2.11.0", "pin-project-lite", "slab", "sync_wrapper", @@ -12533,7 +12549,7 @@ checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ "async-compression", "base64 0.22.1", - "bitflags 2.9.2", + "bitflags 2.9.4", "bytes", "futures-core", "futures-util", @@ -12589,7 +12605,7 @@ dependencies = [ "crossbeam-channel", "thiserror 1.0.69", "time", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -12631,7 +12647,7 @@ checksum = "fc0b4143302cf1022dac868d521e36e8b27691f72c84b3311750d5188ebba657" dependencies = [ "libc", "tracing-core", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -12654,7 +12670,7 @@ dependencies = [ "time", "tracing", "tracing-core", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", ] [[package]] @@ -12671,7 +12687,7 @@ dependencies = [ "tracing", "tracing-core", "tracing-log", - "tracing-subscriber 0.3.19", + "tracing-subscriber 0.3.20", "web-time", ] @@ -12696,14 +12712,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "serde", "serde_json", "sharded-slab", @@ -12922,9 +12938,9 @@ checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", @@ -12958,9 +12974,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.18.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ "getrandom 0.3.3", "js-sys", @@ -13091,11 +13107,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.3+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] @@ -13184,9 +13200,9 @@ dependencies = [ [[package]] name = "wasmtimer" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8d49b5d6c64e8558d9b1b065014426f35c18de636895d24893dbbd329743446" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" dependencies = [ "futures", "js-sys", @@ -13807,9 +13823,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] @@ -13825,13 +13841,10 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.2", -] +checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" [[package]] name = "write16" diff --git a/Cargo.toml b/Cargo.toml index d92c9dc57a5..8d805bd0b10 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -711,17 +711,17 @@ walkdir = "2.3.3" vergen-git2 = "1.0.5" [patch.crates-io] -revm = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-primitives = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless" } -revm-interpreter = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-handler = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless" } -revm-context = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-context-interface = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-state = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-database = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-database-interface = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-bytecode = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} -revm-inspector = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless"} +revm = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-2"} +revm-primitives = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-2" } +revm-interpreter = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-2"} +revm-handler = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-2" } +revm-context = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-2"} +revm-context-interface = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-2"} +revm-state = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-2"} +revm-database = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-2"} +revm-database-interface = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-2"} +revm-bytecode = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-2"} +revm-inspector = { git = "https://github.com/lightlink-network/revm", branch = "feat/gasless-2"} # [patch.crates-io] # alloy-consensus = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" } From 6d1198375b598d88665363c99d8ba5928a3121d5 Mon Sep 17 00:00:00 2001 From: sledro Date: Thu, 4 Sep 2025 03:22:40 +0100 Subject: [PATCH 27/36] Remove unused import of is_gasless from builder.rs to streamline code --- crates/optimism/payload/src/builder.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/optimism/payload/src/builder.rs b/crates/optimism/payload/src/builder.rs index cf782f2b903..480e0ca9033 100644 --- a/crates/optimism/payload/src/builder.rs +++ b/crates/optimism/payload/src/builder.rs @@ -23,7 +23,6 @@ use reth_execution_types::ExecutionOutcome; use reth_gas_station::{validate_gasless_tx, GasStationConfig}; use reth_optimism_evm::OpNextBlockEnvAttributes; use reth_optimism_forks::OpHardforks; -use reth_optimism_primitives::is_gasless; use reth_optimism_primitives::{transaction::OpTransaction, ADDRESS_L2_TO_L1_MESSAGE_PASSER}; use reth_optimism_txpool::{ estimated_da_size::DataAvailabilitySized, From 82fa84b3f7e28a9588bc70dc442d613754bc3412 Mon Sep 17 00:00:00 2001 From: sledro Date: Fri, 5 Sep 2025 02:19:07 +0100 Subject: [PATCH 28/36] Refactor gasless transaction validation: update is_gasless function and enhance error handling in gasless_error module --- crates/optimism/payload/src/builder.rs | 6 ++---- crates/optimism/primitives/src/utils.rs | 10 +++++---- .../src/transaction/gasless_error.rs | 21 +++++++++++++++++-- .../primitives-traits/src/transaction/mod.rs | 1 + 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/crates/optimism/payload/src/builder.rs b/crates/optimism/payload/src/builder.rs index 480e0ca9033..dcd5c2b83db 100644 --- a/crates/optimism/payload/src/builder.rs +++ b/crates/optimism/payload/src/builder.rs @@ -21,7 +21,6 @@ use reth_evm::{ }; use reth_execution_types::ExecutionOutcome; use reth_gas_station::{validate_gasless_tx, GasStationConfig}; -use reth_optimism_evm::OpNextBlockEnvAttributes; use reth_optimism_forks::OpHardforks; use reth_optimism_primitives::{transaction::OpTransaction, ADDRESS_L2_TO_L1_MESSAGE_PASSER}; use reth_optimism_txpool::{ @@ -45,7 +44,6 @@ use revm::context::{Block, BlockEnv}; use std::{marker::PhantomData, sync::Arc}; use tracing::{info, debug, trace, warn}; use reth_optimism_primitives::is_gasless; -use reth_gas_station::{validate_gasless_tx, GasStationConfig, GAS_STATION_PREDEPLOY, GAS_STATION_STORAGE_LOCATION}; /// Optimism's payload builder #[derive(Debug)] @@ -718,7 +716,7 @@ where } // validate the gasless transaction - if is_gasless(tx.as_ref()) { + if is_gasless(&*tx) { // do we allow create transactions??? let to = match tx.kind() { alloy_primitives::TxKind::Call(to) => to, @@ -772,7 +770,7 @@ where info.cumulative_gas_used += gas_used; info.cumulative_da_bytes_used += tx_da_size; - if !is_gasless(tx.as_ref()) { + if !is_gasless(&*tx) { // update add to total fees; gasless transactions pay no miner fee let miner_fee = tx .effective_tip_per_gas(base_fee) diff --git a/crates/optimism/primitives/src/utils.rs b/crates/optimism/primitives/src/utils.rs index 6ecb800dcf1..f27bdf72b89 100644 --- a/crates/optimism/primitives/src/utils.rs +++ b/crates/optimism/primitives/src/utils.rs @@ -3,12 +3,14 @@ /// Returns true if the transaction is a zero-fee transaction. /// /// Rules: -/// - Legacy/EIP-2930: gas_price == 0 -/// - EIP-1559/EIP-4844/EIP-7702: max_fee_per_gas == 0 +/// - Legacy +/// - EIP-1559 pub fn is_gasless(tx: &T) -> bool { match tx.ty() { - 0 | 1 => tx.gas_price().unwrap_or(0) == 0, // Legacy/EIP-2930 - 2 | 3 | 4 => tx.max_fee_per_gas() == 0, // EIP-1559/EIP-4844/EIP-7702 + 1 => tx.gas_price().unwrap_or(0) == 0, + 2 => { + tx.max_fee_per_gas() == 0 && tx.max_priority_fee_per_gas().unwrap_or_default() == 0 + } _ => false, } } diff --git a/crates/primitives-traits/src/transaction/gasless_error.rs b/crates/primitives-traits/src/transaction/gasless_error.rs index 11103ca6e61..5b8adfa199f 100644 --- a/crates/primitives-traits/src/transaction/gasless_error.rs +++ b/crates/primitives-traits/src/transaction/gasless_error.rs @@ -1,21 +1,38 @@ use revm_primitives::U256; +/// Errors that can occur during gasless transaction validation. +/// +/// These errors represent various failure modes when validating whether a transaction +/// is eligible for gasless execution through the gas station mechanism. #[derive(thiserror::Error, Clone, Debug, PartialEq, Eq)] pub enum GaslessValidationError { + /// The gas station feature is disabled in the current configuration. #[error("gas station feature disabled")] Disabled, + /// The transaction is a contract creation transaction, which is not supported for gasless execution. #[error("destination is create transaction")] Create, + /// No gas station contract address has been configured. #[error("gas station contract not configured")] NoAddress, + /// The destination contract is not registered for gasless transactions. #[error("not registered for gasless")] NotRegistered, + /// The destination contract is registered but currently inactive for gasless transactions. #[error("contract inactive for gasless")] Inactive, + /// Insufficient credits available for the gasless transaction. #[error("insufficient credits: have {available}, need {needed}")] - InsufficientCredits { available: U256, needed: U256 }, + InsufficientCredits { + /// The amount of credits currently available. + available: U256, + /// The amount of credits needed for this transaction. + needed: U256, + }, + /// The transaction sender is not on the required whitelist. #[error("whitelist required")] NotWhitelisted, + /// A single-use gasless transaction has already been consumed. #[error("single-use already used")] SingleUseConsumed, -} \ No newline at end of file +} diff --git a/crates/primitives-traits/src/transaction/mod.rs b/crates/primitives-traits/src/transaction/mod.rs index f7658420ef3..c26177d3dde 100644 --- a/crates/primitives-traits/src/transaction/mod.rs +++ b/crates/primitives-traits/src/transaction/mod.rs @@ -17,6 +17,7 @@ pub mod signed; pub mod error; pub mod recover; +/// Gasless transaction validation errors. pub mod gasless_error; pub use alloy_consensus::transaction::{SignerRecoverable, TransactionInfo, TransactionMeta}; From 4592186446759ac8cff6c8de5356e02610be35f2 Mon Sep 17 00:00:00 2001 From: sledro Date: Tue, 9 Sep 2025 19:41:18 +0100 Subject: [PATCH 29/36] Update static assertion sizes for RethError and ConsensusError in error.rs --- crates/errors/src/error.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/errors/src/error.rs b/crates/errors/src/error.rs index 676a9c015d9..30a2ddd1315 100644 --- a/crates/errors/src/error.rs +++ b/crates/errors/src/error.rs @@ -61,9 +61,9 @@ mod size_asserts { }; } - static_assert_size!(RethError, 56); + static_assert_size!(RethError, 72); static_assert_size!(BlockExecutionError, 56); - static_assert_size!(ConsensusError, 48); + static_assert_size!(ConsensusError, 72); static_assert_size!(DatabaseError, 32); static_assert_size!(ProviderError, 48); } From 3c1f55e469a89c89c6cb6e23a19a8425ba6f6d28 Mon Sep 17 00:00:00 2001 From: sledro Date: Tue, 9 Sep 2025 21:04:34 +0100 Subject: [PATCH 30/36] Remove obsolete GitHub configuration files and workflows, including CODEOWNERS, issue templates, and CI/CD workflows, to streamline repository management. --- .github/CODEOWNERS | 45 --- .github/ISSUE_TEMPLATE/bug.yml | 127 -------- .github/ISSUE_TEMPLATE/config.yml | 5 - .github/ISSUE_TEMPLATE/docs.yml | 19 -- .github/ISSUE_TEMPLATE/feature.yml | 21 -- .github/assets/check_rv32imac.sh | 88 ------ .github/assets/check_wasm.sh | 150 --------- .github/assets/hive/Dockerfile | 62 ---- .github/assets/hive/build_simulators.sh | 42 --- .github/assets/hive/expected_failures.yaml | 105 ------- .github/assets/hive/ignored_tests.yaml | 17 - .github/assets/hive/load_images.sh | 27 -- .github/assets/hive/no_sim_build.diff | 52 ---- .github/assets/hive/parse.py | 78 ----- .github/assets/hive/run_simulator.sh | 38 --- .github/assets/install_geth.sh | 23 -- .github/assets/kurtosis_network_params.yaml | 13 - .../assets/kurtosis_op_network_params.yaml | 29 -- .github/assets/label_pr.js | 57 ---- .github/dependabot.yml | 6 - .github/scripts/codspeed-build.sh | 14 - .github/workflows/bench.yml | 39 --- .github/workflows/book.yml | 70 ----- .github/workflows/compact.yml | 47 --- .github/workflows/dependencies.yml | 20 -- .github/workflows/docker-git.yml | 54 ---- .github/workflows/docker-nightly.yml | 61 ---- .github/workflows/docker.yml | 89 ------ .github/workflows/e2e.yml | 46 --- .github/workflows/hive.yml | 225 -------------- .github/workflows/integration.yml | 82 ----- .github/workflows/kurtosis-op.yml | 100 ------ .github/workflows/kurtosis.yml | 70 ----- .github/workflows/label-pr.yml | 23 -- .github/workflows/lint-actions.yml | 22 -- .github/workflows/lint.yml | 290 ------------------ .github/workflows/pr-title.yml | 86 ------ .github/workflows/prepare-reth.yml | 57 ---- .github/workflows/release-dist.yml | 20 -- .github/workflows/release-reproducible.yml | 56 ---- .github/workflows/release.yml | 288 ----------------- .github/workflows/reproducible-build.yml | 38 --- .github/workflows/stage.yml | 73 ----- .github/workflows/stale.yml | 29 -- .github/workflows/sync-era.yml | 67 ---- .github/workflows/sync.yml | 66 ---- .github/workflows/unit.yml | 119 ------- .github/workflows/update-superchain.yml | 36 --- .github/workflows/windows.yml | 49 --- 49 files changed, 3240 deletions(-) delete mode 100644 .github/CODEOWNERS delete mode 100644 .github/ISSUE_TEMPLATE/bug.yml delete mode 100644 .github/ISSUE_TEMPLATE/config.yml delete mode 100644 .github/ISSUE_TEMPLATE/docs.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature.yml delete mode 100755 .github/assets/check_rv32imac.sh delete mode 100755 .github/assets/check_wasm.sh delete mode 100644 .github/assets/hive/Dockerfile delete mode 100755 .github/assets/hive/build_simulators.sh delete mode 100644 .github/assets/hive/expected_failures.yaml delete mode 100644 .github/assets/hive/ignored_tests.yaml delete mode 100755 .github/assets/hive/load_images.sh delete mode 100644 .github/assets/hive/no_sim_build.diff delete mode 100644 .github/assets/hive/parse.py delete mode 100755 .github/assets/hive/run_simulator.sh delete mode 100755 .github/assets/install_geth.sh delete mode 100644 .github/assets/kurtosis_network_params.yaml delete mode 100644 .github/assets/kurtosis_op_network_params.yaml delete mode 100644 .github/assets/label_pr.js delete mode 100644 .github/dependabot.yml delete mode 100755 .github/scripts/codspeed-build.sh delete mode 100644 .github/workflows/bench.yml delete mode 100644 .github/workflows/book.yml delete mode 100644 .github/workflows/compact.yml delete mode 100644 .github/workflows/dependencies.yml delete mode 100644 .github/workflows/docker-git.yml delete mode 100644 .github/workflows/docker-nightly.yml delete mode 100644 .github/workflows/docker.yml delete mode 100644 .github/workflows/e2e.yml delete mode 100644 .github/workflows/hive.yml delete mode 100644 .github/workflows/integration.yml delete mode 100644 .github/workflows/kurtosis-op.yml delete mode 100644 .github/workflows/kurtosis.yml delete mode 100644 .github/workflows/label-pr.yml delete mode 100644 .github/workflows/lint-actions.yml delete mode 100644 .github/workflows/lint.yml delete mode 100644 .github/workflows/pr-title.yml delete mode 100644 .github/workflows/prepare-reth.yml delete mode 100644 .github/workflows/release-dist.yml delete mode 100644 .github/workflows/release-reproducible.yml delete mode 100644 .github/workflows/release.yml delete mode 100644 .github/workflows/reproducible-build.yml delete mode 100644 .github/workflows/stage.yml delete mode 100644 .github/workflows/stale.yml delete mode 100644 .github/workflows/sync-era.yml delete mode 100644 .github/workflows/sync.yml delete mode 100644 .github/workflows/unit.yml delete mode 100644 .github/workflows/update-superchain.yml delete mode 100644 .github/workflows/windows.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 01fe80522d5..00000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,45 +0,0 @@ -* @gakonst -crates/blockchain-tree-api/ @rakita @rkrasiuk @mattsse @Rjected -crates/blockchain-tree/ @rakita @rkrasiuk @mattsse @Rjected -crates/chain-state/ @fgimenez @mattsse @rkrasiuk -crates/chainspec/ @Rjected @joshieDo @mattsse -crates/cli/ @mattsse -crates/consensus/ @rkrasiuk @mattsse @Rjected -crates/e2e-test-utils/ @mattsse @Rjected -crates/engine @rkrasiuk @mattsse @Rjected -crates/engine/ @rkrasiuk @mattsse @Rjected @fgimenez -crates/era/ @mattsse @RomanHodulak -crates/errors/ @mattsse -crates/ethereum-forks/ @mattsse @Rjected -crates/ethereum/ @mattsse @Rjected -crates/etl/ @joshieDo @shekhirin -crates/evm/ @rakita @mattsse @Rjected -crates/exex/ @shekhirin -crates/net/ @mattsse @Rjected -crates/net/downloaders/ @rkrasiuk -crates/node/ @mattsse @Rjected @klkvr -crates/optimism/ @mattsse @Rjected @fgimenez -crates/payload/ @mattsse @Rjected -crates/primitives-traits/ @Rjected @RomanHodulak @mattsse @klkvr -crates/primitives/ @Rjected @mattsse @klkvr -crates/prune/ @shekhirin @joshieDo -crates/ress @rkrasiuk -crates/revm/ @mattsse @rakita -crates/rpc/ @mattsse @Rjected @RomanHodulak -crates/stages/ @rkrasiuk @shekhirin -crates/static-file/ @joshieDo @shekhirin -crates/storage/codecs/ @joshieDo -crates/storage/db-api/ @joshieDo @rakita -crates/storage/db-common/ @Rjected -crates/storage/db/ @joshieDo @rakita -crates/storage/errors/ @rakita -crates/storage/libmdbx-rs/ @rakita @shekhirin -crates/storage/nippy-jar/ @joshieDo @shekhirin -crates/storage/provider/ @rakita @joshieDo @shekhirin -crates/storage/storage-api/ @joshieDo @rkrasiuk -crates/tasks/ @mattsse -crates/tokio-util/ @fgimenez -crates/transaction-pool/ @mattsse -crates/trie/ @rkrasiuk @Rjected @shekhirin @mediocregopher -etc/ @Rjected @shekhirin -.github/ @gakonst @DaniPopes diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml deleted file mode 100644 index b01d4518f75..00000000000 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ /dev/null @@ -1,127 +0,0 @@ -name: Bug Report -description: Create a bug report -labels: ["C-bug", "S-needs-triage"] -body: - - type: markdown - attributes: - value: | - Thanks for taking the time to fill out this bug report! Please provide as much detail as possible. - - If you believe you have found a vulnerability, please provide details [here](mailto:georgios@paradigm.xyz) instead. - - type: textarea - id: what-happened - attributes: - label: Describe the bug - description: | - A clear and concise description of what the bug is. - - If the bug is in a crate you are using (i.e. you are not running the standard `reth` binary) please mention that as well. - validations: - required: true - - type: textarea - id: reproduction-steps - attributes: - label: Steps to reproduce - description: Please provide any steps you think might be relevant to reproduce the bug. - placeholder: | - Steps to reproduce: - - 1. Start '...' - 2. Then '...' - 3. Check '...' - 4. See error - validations: - required: true - - type: textarea - id: logs - attributes: - label: Node logs - description: | - If applicable, please provide the node logs leading up to the bug. - - **Please also provide debug logs.** By default, these can be found in: - - - `~/.cache/reth/logs` on Linux - - `~/Library/Caches/reth/logs` on macOS - - `%localAppData%/reth/logs` on Windows - render: text - validations: - required: false - - type: dropdown - id: platform - attributes: - label: Platform(s) - description: What platform(s) did this occur on? - multiple: true - options: - - Linux (x86) - - Linux (ARM) - - Mac (Intel) - - Mac (Apple Silicon) - - Windows (x86) - - Windows (ARM) - - type: dropdown - id: container_type - attributes: - label: Container Type - description: Were you running it in a container? - multiple: true - options: - - Not running in a container - - Docker - - Kubernetes - - LXC/LXD - - Other - validations: - required: true - - type: textarea - id: client-version - attributes: - label: What version/commit are you on? - description: This can be obtained with `reth --version` - validations: - required: true - - type: textarea - id: database-version - attributes: - label: What database version are you on? - description: This can be obtained with `reth db version` - validations: - required: true - - type: textarea - id: network - attributes: - label: Which chain / network are you on? - description: This is the argument you pass to `reth --chain`. If you are using `--dev`, type in 'dev' here. If you are not running with `--chain` or `--dev` then it is mainnet. - validations: - required: true - - type: dropdown - id: node-type - attributes: - label: What type of node are you running? - options: - - Archive (default) - - Full via --full flag - - Pruned with custom reth.toml config - validations: - required: true - - type: textarea - id: prune-config - attributes: - label: What prune config do you use, if any? - description: The `[prune]` section in `reth.toml` file - validations: - required: false - - type: input - attributes: - label: If you've built Reth from source, provide the full command you used - validations: - required: false - - type: checkboxes - id: terms - attributes: - label: Code of Conduct - description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/paradigmxyz/reth/blob/main/CONTRIBUTING.md#code-of-conduct) - options: - - label: I agree to follow the Code of Conduct - required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index cfefdb13a69..00000000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,5 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: GitHub Discussions - url: https://github.com/paradigmxyz/reth/discussions - about: Please ask and answer questions here to keep the issue tracker clean. diff --git a/.github/ISSUE_TEMPLATE/docs.yml b/.github/ISSUE_TEMPLATE/docs.yml deleted file mode 100644 index c1c1c2d51b4..00000000000 --- a/.github/ISSUE_TEMPLATE/docs.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Documentation -description: Suggest a change to our documentation -labels: ["C-docs", "S-needs-triage"] -body: - - type: markdown - attributes: - value: | - If you are unsure if the docs are relevant or needed, please open up a discussion first. - - type: textarea - attributes: - label: Describe the change - description: | - Please describe the documentation you want to change or add, and if it is for end-users or contributors. - validations: - required: true - - type: textarea - attributes: - label: Additional context - description: Add any other context to the feature (like screenshots, resources) diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml deleted file mode 100644 index 005c33ae3fa..00000000000 --- a/.github/ISSUE_TEMPLATE/feature.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Feature request -description: Suggest a feature -labels: ["C-enhancement", "S-needs-triage"] -body: - - type: markdown - attributes: - value: | - Please ensure that the feature has not already been requested in the issue tracker. - - type: textarea - attributes: - label: Describe the feature - description: | - Please describe the feature and what it is aiming to solve, if relevant. - - If the feature is for a crate, please include a proposed API surface. - validations: - required: true - - type: textarea - attributes: - label: Additional context - description: Add any other context to the feature (like screenshots, resources) diff --git a/.github/assets/check_rv32imac.sh b/.github/assets/check_rv32imac.sh deleted file mode 100755 index 9d9c421ca20..00000000000 --- a/.github/assets/check_rv32imac.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env bash -set +e # Disable immediate exit on error - -# Array of crates to check -crates_to_check=( - reth-codecs-derive - reth-primitives - reth-primitives-traits - reth-network-peers - reth-trie-common - reth-trie-sparse - reth-chainspec - reth-consensus - reth-consensus-common - reth-prune-types - reth-static-file-types - reth-storage-errors - reth-execution-errors - reth-errors - reth-execution-types - reth-db-models - reth-evm - reth-revm - reth-storage-api - - ## ethereum - reth-evm-ethereum - reth-ethereum-forks - reth-ethereum-primitives - reth-ethereum-consensus - reth-stateless - - ## optimism - reth-optimism-chainspec - reth-optimism-forks - reth-optimism-consensus - reth-optimism-primitives - reth-optimism-evm -) - -# Array to hold the results -results=() -# Flag to track if any command fails -any_failed=0 - -for crate in "${crates_to_check[@]}"; do - cmd="cargo +stable build -p $crate --target riscv32imac-unknown-none-elf --no-default-features" - - if [ -n "$CI" ]; then - echo "::group::$cmd" - else - printf "\n%s:\n %s\n" "$crate" "$cmd" - fi - - set +e # Disable immediate exit on error - # Run the command and capture the return code - $cmd - ret_code=$? - set -e # Re-enable immediate exit on error - - # Store the result in the dictionary - if [ $ret_code -eq 0 ]; then - results+=("1:✅:$crate") - else - results+=("2:❌:$crate") - any_failed=1 - fi - - if [ -n "$CI" ]; then - echo "::endgroup::" - fi -done - -# Sort the results by status and then by crate name -IFS=$'\n' sorted_results=($(sort <<<"${results[*]}")) -unset IFS - -# Print summary -echo -e "\nSummary of build results:" -for result in "${sorted_results[@]}"; do - status="${result#*:}" - status="${status%%:*}" - crate="${result##*:}" - echo "$status $crate" -done - -# Exit with a non-zero status if any command fails -exit $any_failed diff --git a/.github/assets/check_wasm.sh b/.github/assets/check_wasm.sh deleted file mode 100755 index e140d01e796..00000000000 --- a/.github/assets/check_wasm.sh +++ /dev/null @@ -1,150 +0,0 @@ -#!/usr/bin/env bash -set +e # Disable immediate exit on error - -# Array of crates to compile -crates=($(cargo metadata --format-version=1 --no-deps | jq -r '.packages[].name' | grep '^reth' | sort)) - -# Array of crates to exclude -# Used with the `contains` function. -# shellcheck disable=SC2034 -exclude_crates=( - # The following require investigation if they can be fixed - reth-basic-payload-builder - reth-bench - reth-cli - reth-cli-commands - reth-cli-runner - reth-consensus-debug-client - reth-db-common - reth-discv4 - reth-discv5 - reth-dns-discovery - reth-downloaders - reth-e2e-test-utils - reth-engine-service - reth-engine-tree - reth-engine-util - reth-eth-wire - reth-ethereum-cli - reth-ethereum-payload-builder - reth-etl - reth-exex - reth-exex-test-utils - reth-ipc - reth-net-nat - reth-network - reth-node-api - reth-node-builder - reth-node-core - reth-node-ethereum - reth-node-events - reth-node-metrics - reth-optimism-cli - reth-optimism-node - reth-optimism-payload-builder - reth-optimism-rpc - reth-optimism-storage - reth-rpc - reth-rpc-api - reth-rpc-api-testing-util - reth-rpc-builder - reth-rpc-convert - reth-rpc-e2e-tests - reth-rpc-engine-api - reth-rpc-eth-api - reth-rpc-eth-types - reth-rpc-layer - reth-stages - reth-engine-local - reth-ress-protocol - reth-ress-provider - # The following are not supposed to be working - reth # all of the crates below - reth-storage-rpc-provider - reth-invalid-block-hooks # reth-provider - reth-libmdbx # mdbx - reth-mdbx-sys # mdbx - reth-payload-builder # reth-metrics - reth-provider # tokio - reth-prune # tokio - reth-stages-api # reth-provider, reth-prune - reth-static-file # tokio - reth-transaction-pool # c-kzg - reth-payload-util # reth-transaction-pool - reth-trie-parallel # tokio - reth-trie-sparse-parallel # rayon - reth-testing-utils - reth-optimism-txpool # reth-transaction-pool - reth-era-downloader # tokio - reth-era-utils # tokio - reth-tracing-otlp - reth-node-ethstats -) - -# Array to hold the results -results=() -# Flag to track if any command fails -any_failed=0 - -# Function to check if a value exists in an array -contains() { - local array="$1[@]" - local seeking=$2 - local in=1 - for element in "${!array}"; do - if [[ "$element" == "$seeking" ]]; then - in=0 - break - fi - done - return $in -} - -for crate in "${crates[@]}"; do - if contains exclude_crates "$crate"; then - results+=("3:⏭️:$crate") - continue - fi - - cmd="cargo +stable build -p $crate --target wasm32-wasip1 --no-default-features" - - if [ -n "$CI" ]; then - echo "::group::$cmd" - else - printf "\n%s:\n %s\n" "$crate" "$cmd" - fi - - set +e # Disable immediate exit on error - # Run the command and capture the return code - $cmd - ret_code=$? - set -e # Re-enable immediate exit on error - - # Store the result in the dictionary - if [ $ret_code -eq 0 ]; then - results+=("1:✅:$crate") - else - results+=("2:❌:$crate") - any_failed=1 - fi - - if [ -n "$CI" ]; then - echo "::endgroup::" - fi -done - -# Sort the results by status and then by crate name -IFS=$'\n' sorted_results=($(sort <<<"${results[*]}")) -unset IFS - -# Print summary -echo -e "\nSummary of build results:" -for result in "${sorted_results[@]}"; do - status="${result#*:}" - status="${status%%:*}" - crate="${result##*:}" - echo "$status $crate" -done - -# Exit with a non-zero status if any command fails -exit $any_failed diff --git a/.github/assets/hive/Dockerfile b/.github/assets/hive/Dockerfile deleted file mode 100644 index e059ecf977d..00000000000 --- a/.github/assets/hive/Dockerfile +++ /dev/null @@ -1,62 +0,0 @@ -# syntax=docker.io/docker/dockerfile:1.7-labs - -# -# We'll use cargo-chef to speed up the build -# -FROM lukemathwalker/cargo-chef:latest-rust-1 AS chef -WORKDIR /app - -# Install system dependencies -RUN apt-get update && apt-get -y upgrade && apt-get install -y libclang-dev pkg-config - -# -# We prepare the build plan -# -FROM chef AS planner - -ARG CARGO_BIN - -COPY --exclude=.git --exclude=dist . . -RUN cargo chef prepare --recipe-path recipe.json --bin ${CARGO_BIN} - -# -# And build the app -# -FROM chef AS builder -WORKDIR /app - -ARG CARGO_BIN -ARG BUILD_PROFILE=hivetests -ARG FEATURES="" -ARG MANIFEST_PATH="" - -COPY --from=planner /app/recipe.json recipe.json - -RUN cargo chef cook \ - --profile $BUILD_PROFILE \ - --bin $CARGO_BIN \ - ${FEATURES:+--features "$FEATURES"} \ - ${MANIFEST_PATH:+--manifest-path $MANIFEST_PATH} \ - --recipe-path recipe.json - -COPY --exclude=.git --exclude=dist . . -RUN cargo build \ - --profile $BUILD_PROFILE \ - --bin $CARGO_BIN \ - ${FEATURES:+--features "$FEATURES"} \ - ${MANIFEST_PATH:+--manifest-path $MANIFEST_PATH} \ - --locked - -# -# The runtime will then just use the build artifact without building anything -# -FROM ubuntu AS runtime - -ARG CARGO_BIN - -COPY --from=builder /app/target/hivetests/$CARGO_BIN /usr/local/bin/reth -COPY LICENSE-* ./ - -EXPOSE 30303 30303/udp 9001 8545 8546 -ENV RUST_LOG=debug -ENTRYPOINT ["/usr/local/bin/reth"] diff --git a/.github/assets/hive/build_simulators.sh b/.github/assets/hive/build_simulators.sh deleted file mode 100755 index 44792bde076..00000000000 --- a/.github/assets/hive/build_simulators.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env bash -set -eo pipefail - -# Create the hive_assets directory -mkdir hive_assets/ - -cd hivetests -go build . - -./hive -client reth # first builds and caches the client - -# Run each hive command in the background for each simulator and wait -echo "Building images" -./hive -client reth --sim "ethereum/eest" --sim.buildarg fixtures=https://github.com/ethereum/execution-spec-tests/releases/download/v4.4.0/fixtures_develop.tar.gz --sim.buildarg branch=v4.4.0 -sim.timelimit 1s || true & -./hive -client reth --sim "ethereum/engine" -sim.timelimit 1s || true & -./hive -client reth --sim "devp2p" -sim.timelimit 1s || true & -./hive -client reth --sim "ethereum/rpc-compat" -sim.timelimit 1s || true & -./hive -client reth --sim "smoke/genesis" -sim.timelimit 1s || true & -./hive -client reth --sim "smoke/network" -sim.timelimit 1s || true & -./hive -client reth --sim "ethereum/sync" -sim.timelimit 1s || true & -wait - -# Run docker save in parallel, wait and exit on error -echo "Saving images" -saving_pids=( ) -docker save hive/hiveproxy:latest -o ../hive_assets/hiveproxy.tar & saving_pids+=( $! ) -docker save hive/simulators/devp2p:latest -o ../hive_assets/devp2p.tar & saving_pids+=( $! ) -docker save hive/simulators/ethereum/engine:latest -o ../hive_assets/engine.tar & saving_pids+=( $! ) -docker save hive/simulators/ethereum/rpc-compat:latest -o ../hive_assets/rpc_compat.tar & saving_pids+=( $! ) -docker save hive/simulators/ethereum/eest/consume-engine:latest -o ../hive_assets/eest_engine.tar & saving_pids+=( $! ) -docker save hive/simulators/ethereum/eest/consume-rlp:latest -o ../hive_assets/eest_rlp.tar & saving_pids+=( $! ) -docker save hive/simulators/smoke/genesis:latest -o ../hive_assets/smoke_genesis.tar & saving_pids+=( $! ) -docker save hive/simulators/smoke/network:latest -o ../hive_assets/smoke_network.tar & saving_pids+=( $! ) -docker save hive/simulators/ethereum/sync:latest -o ../hive_assets/ethereum_sync.tar & saving_pids+=( $! ) -for pid in "${saving_pids[@]}"; do - wait "$pid" || exit -done - -# Make sure we don't rebuild images on the CI jobs -git apply ../.github/assets/hive/no_sim_build.diff -go build . -mv ./hive ../hive_assets/ diff --git a/.github/assets/hive/expected_failures.yaml b/.github/assets/hive/expected_failures.yaml deleted file mode 100644 index a4dd3376efd..00000000000 --- a/.github/assets/hive/expected_failures.yaml +++ /dev/null @@ -1,105 +0,0 @@ -# tracked by https://github.com/paradigmxyz/reth/issues/13879 -rpc-compat: - - debug_getRawBlock/get-invalid-number (reth) - - debug_getRawHeader/get-invalid-number (reth) - - debug_getRawReceipts/get-invalid-number (reth) - - debug_getRawReceipts/get-block-n (reth) - - debug_getRawTransaction/get-invalid-hash (reth) - - - eth_getStorageAt/get-storage-invalid-key-too-large (reth) - - eth_getStorageAt/get-storage-invalid-key (reth) - - eth_getTransactionReceipt/get-access-list (reth) - - eth_getTransactionReceipt/get-blob-tx (reth) - - eth_getTransactionReceipt/get-dynamic-fee (reth) - - eth_getTransactionReceipt/get-legacy-contract (reth) - - eth_getTransactionReceipt/get-legacy-input (reth) - - eth_getTransactionReceipt/get-legacy-receipt (reth) - - # after https://github.com/paradigmxyz/reth/pull/16742 we start the node in - # syncing mode, the test expects syncing to be false on start - - eth_syncing/check-syncing (reth) - -# no fix due to https://github.com/paradigmxyz/reth/issues/8732 -engine-withdrawals: - - Withdrawals Fork On Genesis (Paris) (reth) - - Withdrawals Fork on Block 1 (Paris) (reth) - - Withdrawals Fork on Block 2 (Paris) (reth) - - Withdrawals Fork on Block 3 (Paris) (reth) - - Withdraw to a single account (Paris) (reth) - - Withdraw to two accounts (Paris) (reth) - - Withdraw many accounts (Paris) (reth) - - Withdraw zero amount (Paris) (reth) - - Empty Withdrawals (Paris) (reth) - - Corrupted Block Hash Payload (INVALID) (Paris) (reth) - - Withdrawals Fork on Block 1 - 8 Block Re-Org NewPayload (Paris) (reth) - - Withdrawals Fork on Canonical Block 8 / Side Block 7 - 10 Block Re-Org (Paris) (reth) - -engine-api: [] - -# no fix due to https://github.com/paradigmxyz/reth/issues/8732 -engine-cancun: - - Invalid PayloadAttributes, Missing BeaconRoot, Syncing=True (Cancun) (reth) - # the test fails with older verions of the code for which it passed before, probably related to changes - # in hive or its dependencies - - Blob Transaction Ordering, Multiple Clients (Cancun) (reth) - -sync: [] - -# https://github.com/ethereum/hive/issues/1277 -engine-auth: - - "JWT Authentication: No time drift, correct secret (Paris) (reth)" - - "JWT Authentication: Negative time drift, within limit, correct secret (Paris) (reth)" - - "JWT Authentication: Positive time drift, within limit, correct secret (Paris) (reth)" - -# 7702 test - no fix: it’s too expensive to check whether the storage is empty on each creation -# 6110 related tests - may start passing when fixtures improve -# 7002 related tests - post-fork test, should fix for spec compliance but not -# realistic on mainnet -# 7251 related tests - modified contract, not necessarily practical on mainnet, -# worth re-visiting when more of these related tests are passing -eest/consume-engine: - - tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_non_empty_storage[fork_Prague-blockchain_test_engine-zero_nonce]-reth - - tests/prague/eip7251_consolidations/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test_engine-deploy_after_fork-nonzero_balance]-reth - - tests/prague/eip7251_consolidations/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test_engine-deploy_after_fork-zero_balance]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_amount_offset-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_amount_size-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_index_offset-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_index_size-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_pubkey_offset-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_pubkey_size-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_signature_offset-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_signature_size-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_withdrawal_credentials_offset-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_withdrawal_credentials_size-value_zero]-reth - - tests/prague/eip7002_el_triggerable_withdrawals/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test_engine-deploy_after_fork-nonzero_balance]-reth - - tests/prague/eip7002_el_triggerable_withdrawals/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test_engine-deploy_after_fork-zero_balance]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_log_length[fork_Prague-blockchain_test_engine-slice_bytes_False]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_log_length[fork_Prague-blockchain_test_engine-slice_bytes_True]-reth - # the next test expects a concrete new format in the error message, there is no spec for this message, so it is ok to ignore - - tests/cancun/eip4844_blobs/test_blob_txs.py::test_blob_type_tx_pre_fork[fork_ShanghaiToCancunAtTime15k-blockchain_test_engine_from_state_test-one_blob_tx]-reth -# 7702 test - no fix: it’s too expensive to check whether the storage is empty on each creation -# rest of tests - see above -eest/consume-rlp: - - tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_non_empty_storage[fork_Prague-blockchain_test-zero_nonce]-reth - - tests/prague/eip7251_consolidations/test_modified_consolidation_contract.py::test_system_contract_errors[fork_Prague-blockchain_test_engine-system_contract_reaches_gas_limit-system_contract_0x0000bbddc7ce488642fb579f8b00f3a590007251]-reth - - tests/prague/eip7251_consolidations/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test_engine-deploy_after_fork-nonzero_balance]-reth - - tests/prague/eip7251_consolidations/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test_engine-deploy_after_fork-zero_balance]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_amount_offset-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_amount_size-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_index_offset-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_index_size-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_pubkey_offset-value_zero]-reth - - tests/prague/eip7002_el_triggerable_withdrawals/test_modified_withdrawal_contract.py::test_system_contract_errors[fork_Prague-blockchain_test_engine-system_contract_reaches_gas_limit-system_contract_0x00000961ef480eb55e80d19ad83579a64c007002]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_pubkey_size-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_signature_offset-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_signature_size-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_withdrawal_credentials_offset-value_zero]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_withdrawal_credentials_size-value_zero]-reth - - tests/prague/eip7002_el_triggerable_withdrawals/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test_engine-deploy_after_fork-nonzero_balance]-reth - - tests/prague/eip7002_el_triggerable_withdrawals/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test_engine-deploy_after_fork-zero_balance]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_log_length[fork_Prague-blockchain_test_engine-slice_bytes_False]-reth - - tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_log_length[fork_Prague-blockchain_test_engine-slice_bytes_True]-reth - - tests/prague/eip7251_consolidations/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test-deploy_after_fork-nonzero_balance]-reth - - tests/prague/eip7251_consolidations/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test-deploy_after_fork-zero_balance]-reth - - tests/prague/eip7002_el_triggerable_withdrawals/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test-deploy_after_fork-nonzero_balance]-reth - - tests/prague/eip7002_el_triggerable_withdrawals/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test-deploy_after_fork-zero_balance]-reth diff --git a/.github/assets/hive/ignored_tests.yaml b/.github/assets/hive/ignored_tests.yaml deleted file mode 100644 index 43021de8420..00000000000 --- a/.github/assets/hive/ignored_tests.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# Ignored Tests Configuration -# -# This file contains tests that should be ignored for various reasons (flaky, known issues, etc). -# These tests will be IGNORED in the CI results - they won't cause the build to fail -# regardless of whether they pass or fail. -# -# Format -# test_suite: -# - "test name 1" -# - "test name 2" -# -# When a test should no longer be ignored, remove it from this list. - -engine-withdrawals: - # flaky - - Withdrawals Fork on Block 1 - 8 Block Re-Org NewPayload (Paris) (reth) - diff --git a/.github/assets/hive/load_images.sh b/.github/assets/hive/load_images.sh deleted file mode 100755 index 37a2f82de54..00000000000 --- a/.github/assets/hive/load_images.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash -set -eo pipefail - -# List of tar files to load -IMAGES=( - "/tmp/hiveproxy.tar" - "/tmp/devp2p.tar" - "/tmp/engine.tar" - "/tmp/rpc_compat.tar" - "/tmp/pyspec.tar" - "/tmp/smoke_genesis.tar" - "/tmp/smoke_network.tar" - "/tmp/ethereum_sync.tar" - "/tmp/eest_engine.tar" - "/tmp/eest_rlp.tar" - "/tmp/reth_image.tar" -) - -# Loop through the images and load them -for IMAGE_TAR in "${IMAGES[@]}"; do - echo "Loading image $IMAGE_TAR..." - docker load -i "$IMAGE_TAR" & -done - -wait - -docker image ls -a diff --git a/.github/assets/hive/no_sim_build.diff b/.github/assets/hive/no_sim_build.diff deleted file mode 100644 index 6127a4ecb73..00000000000 --- a/.github/assets/hive/no_sim_build.diff +++ /dev/null @@ -1,52 +0,0 @@ -diff --git a/internal/libdocker/builder.go b/internal/libdocker/builder.go -index e4bf99b6..2023f7e2 100644 ---- a/internal/libdocker/builder.go -+++ b/internal/libdocker/builder.go -@@ -8,7 +8,6 @@ import ( - "io" - "io/fs" - "log/slog" -- "os" - "path/filepath" - "slices" - "strings" -@@ -49,25 +48,8 @@ func (b *Builder) BuildClientImage(ctx context.Context, client libhive.ClientDes - - // BuildSimulatorImage builds a docker image of a simulator. - func (b *Builder) BuildSimulatorImage(ctx context.Context, name string, buildArgs map[string]string) (string, error) { -- dir := b.config.Inventory.SimulatorDirectory(name) -- buildContextPath := dir -- buildDockerfile := "Dockerfile" -- -- // build context dir of simulator can be overridden with "hive_context.txt" file containing the desired build path -- if contextPathBytes, err := os.ReadFile(filepath.Join(filepath.FromSlash(dir), "hive_context.txt")); err == nil { -- buildContextPath = filepath.Join(dir, strings.TrimSpace(string(contextPathBytes))) -- if strings.HasPrefix(buildContextPath, "../") { -- return "", fmt.Errorf("cannot access build directory outside of Hive root: %q", buildContextPath) -- } -- if p, err := filepath.Rel(buildContextPath, filepath.Join(filepath.FromSlash(dir), "Dockerfile")); err != nil { -- return "", fmt.Errorf("failed to derive relative simulator Dockerfile path: %v", err) -- } else { -- buildDockerfile = p -- } -- } - tag := fmt.Sprintf("hive/simulators/%s:latest", name) -- err := b.buildImage(ctx, buildContextPath, buildDockerfile, tag, buildArgs) -- return tag, err -+ return tag, nil - } - - // BuildImage creates a container by archiving the given file system, -diff --git a/internal/libdocker/proxy.go b/internal/libdocker/proxy.go -index d3a14ae6..8779671e 100644 ---- a/internal/libdocker/proxy.go -+++ b/internal/libdocker/proxy.go -@@ -16,7 +16,7 @@ const hiveproxyTag = "hive/hiveproxy" - - // Build builds the hiveproxy image. - func (cb *ContainerBackend) Build(ctx context.Context, b libhive.Builder) error { -- return b.BuildImage(ctx, hiveproxyTag, hiveproxy.Source) -+ return nil - } - - // ServeAPI starts the API server. diff --git a/.github/assets/hive/parse.py b/.github/assets/hive/parse.py deleted file mode 100644 index 11a30ae095b..00000000000 --- a/.github/assets/hive/parse.py +++ /dev/null @@ -1,78 +0,0 @@ -import json -import yaml -import sys -import argparse - -# Argument parser setup -parser = argparse.ArgumentParser(description="Check for unexpected test results based on an exclusion list.") -parser.add_argument("report_json", help="Path to the hive report JSON file.") -parser.add_argument("--exclusion", required=True, help="Path to the exclusion YAML file.") -parser.add_argument("--ignored", required=True, help="Path to the ignored tests YAML file.") -args = parser.parse_args() - -# Load hive JSON -with open(args.report_json, 'r') as file: - report = json.load(file) - -# Load exclusion YAML -with open(args.exclusion, 'r') as file: - exclusion_data = yaml.safe_load(file) - exclusions = exclusion_data.get(report['name'], []) - -# Load ignored tests YAML -with open(args.ignored, 'r') as file: - ignored_data = yaml.safe_load(file) - ignored_tests = ignored_data.get(report['name'], []) - -# Collect unexpected failures and passes -unexpected_failures = [] -unexpected_passes = [] -ignored_results = {'passed': [], 'failed': []} - -for test in report['testCases'].values(): - test_name = test['name'] - test_pass = test['summaryResult']['pass'] - - # Check if this is an ignored test - if test_name in ignored_tests: - # Track ignored test results for informational purposes - if test_pass: - ignored_results['passed'].append(test_name) - else: - ignored_results['failed'].append(test_name) - continue # Skip this test - don't count it as unexpected - - # Check against expected failures - if test_name in exclusions: - if test_pass: - unexpected_passes.append(test_name) - else: - if not test_pass: - unexpected_failures.append(test_name) - -# Print summary of ignored tests if any were ignored -if ignored_results['passed'] or ignored_results['failed']: - print("Ignored Tests:") - if ignored_results['passed']: - print(f" Passed ({len(ignored_results['passed'])} tests):") - for test in ignored_results['passed']: - print(f" {test}") - if ignored_results['failed']: - print(f" Failed ({len(ignored_results['failed'])} tests):") - for test in ignored_results['failed']: - print(f" {test}") - print() - -# Check if there are any unexpected failures or passes and exit with error -if unexpected_failures or unexpected_passes: - if unexpected_failures: - print("Unexpected Failures:") - for test in unexpected_failures: - print(f" {test}") - if unexpected_passes: - print("Unexpected Passes:") - for test in unexpected_passes: - print(f" {test}") - sys.exit(1) - -print("Success.") diff --git a/.github/assets/hive/run_simulator.sh b/.github/assets/hive/run_simulator.sh deleted file mode 100755 index cb4d8110dfa..00000000000 --- a/.github/assets/hive/run_simulator.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env bash -# set -x - -cd hivetests/ - -sim="${1}" -limit="${2}" - -run_hive() { - hive --sim "${sim}" --sim.limit "${limit}" --sim.parallelism 8 --client reth 2>&1 | tee /tmp/log || true -} - -check_log() { - tail -n 1 /tmp/log | sed -r 's/\x1B\[[0-9;]*[mK]//g' -} - -attempt=0 -max_attempts=5 - -while [ $attempt -lt $max_attempts ]; do - run_hive - - # Check if no tests were run. sed removes ansi colors - if check_log | grep -q "suites=0"; then - echo "no tests were run, retrying in 10 seconds" - sleep 10 - attempt=$((attempt + 1)) - continue - fi - - # Check the last line of the log for "finished", "tests failed", or "test failed" - if check_log | grep -Eq "(finished|tests? failed)"; then - exit 0 - else - exit 1 - fi -done -exit 1 diff --git a/.github/assets/install_geth.sh b/.github/assets/install_geth.sh deleted file mode 100755 index 8469f5a73f8..00000000000 --- a/.github/assets/install_geth.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash - -# Installs Geth (https://geth.ethereum.org) in $HOME/bin for x86_64 Linux. - -set -eo pipefail - -GETH_BUILD=${GETH_BUILD:-"1.13.4-3f907d6a"} - -name="geth-linux-amd64-$GETH_BUILD" - -mkdir -p "$HOME/bin" -wget "https://gethstore.blob.core.windows.net/builds/$name.tar.gz" -tar -xvf "$name.tar.gz" -rm "$name.tar.gz" -mv "$name/geth" "$HOME/bin/geth" -rm -rf "$name" -chmod +x "$HOME/bin/geth" - -# Add $HOME/bin to $PATH -[[ "$PATH" != *$HOME/bin* ]] && export PATH=$HOME/bin:$PATH -[ -n "$CI" ] && echo "$HOME/bin" >> "$GITHUB_PATH" - -geth version diff --git a/.github/assets/kurtosis_network_params.yaml b/.github/assets/kurtosis_network_params.yaml deleted file mode 100644 index e8cc1b51dc8..00000000000 --- a/.github/assets/kurtosis_network_params.yaml +++ /dev/null @@ -1,13 +0,0 @@ -participants: - - el_type: geth - cl_type: lighthouse - - el_type: reth - el_image: "ghcr.io/paradigmxyz/reth:kurtosis-ci" - cl_type: teku -additional_services: - - assertoor -assertoor_params: - run_block_proposal_check: true - run_transaction_test: true - run_blob_transaction_test: true - run_opcodes_transaction_test: true diff --git a/.github/assets/kurtosis_op_network_params.yaml b/.github/assets/kurtosis_op_network_params.yaml deleted file mode 100644 index 5dcc418fe08..00000000000 --- a/.github/assets/kurtosis_op_network_params.yaml +++ /dev/null @@ -1,29 +0,0 @@ -ethereum_package: - participants: - - el_type: reth - el_extra_params: - - "--rpc.eth-proof-window=100" - cl_type: teku - network_params: - preset: minimal - genesis_delay: 5 - additional_preloaded_contracts: ' - { - "0x4e59b44847b379578588920cA78FbF26c0B4956C": { - "balance": "0ETH", - "code": "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3", - "storage": {}, - "nonce": "1" - } - }' -optimism_package: - chains: - - participants: - - el_type: op-geth - cl_type: op-node - - el_type: op-reth - cl_type: op-node - el_image: "ghcr.io/paradigmxyz/op-reth:kurtosis-ci" - network_params: - holocene_time_offset: 0 - isthmus_time_offset: 0 diff --git a/.github/assets/label_pr.js b/.github/assets/label_pr.js deleted file mode 100644 index 16ace2db032..00000000000 --- a/.github/assets/label_pr.js +++ /dev/null @@ -1,57 +0,0 @@ -// Filter function for labels we do not want on PRs automatically. -function shouldIncludeLabel (label) { - const isStatus = label.startsWith('S-'); - const isTrackingIssue = label === 'C-tracking-issue'; - const isPreventStale = label === 'M-prevent-stale'; - const isDifficulty = label.startsWith('D-'); - - return !isStatus && !isTrackingIssue && !isPreventStale && !isDifficulty; -} - -// Get the issue number from an issue link in the forms ` ` or ` #`. -function getIssueLink (repoUrl, body) { - const urlPattern = new RegExp(`(close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved) ${repoUrl}/issues/(?\\d+)`, 'i') - const issuePattern = new RegExp(`(close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved) \#(?\\d+)`, 'i') - - const urlRe = body.match(urlPattern); - const issueRe = body.match(issuePattern); - if (urlRe?.groups?.issue_number) { - return urlRe.groups.issue_number - } else { - return issueRe?.groups?.issue_number - } -} - -module.exports = async ({ github, context }) => { - try { - const prNumber = context.payload.pull_request.number; - const prBody = context.payload.pull_request.body; - const repo = context.repo; - - const repoUrl = context.payload.repository.html_url; - const issueNumber = getIssueLink(repoUrl, prBody); - if (!issueNumber) { - console.log('No issue reference found in PR description.'); - return; - } - - const issue = await github.rest.issues.get({ - ...repo, - issue_number: issueNumber, - }); - - const issueLabels = issue.data.labels - .map(label => label.name) - .filter(shouldIncludeLabel); - if (issueLabels.length > 0) { - await github.rest.issues.addLabels({ - ...repo, - issue_number: prNumber, - labels: issueLabels, - }); - } - } catch (err) { - console.error('Failed to label PR'); - console.error(err); - } -} diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 8c139c7bec2..00000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,6 +0,0 @@ -version: 2 -updates: -- package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" diff --git a/.github/scripts/codspeed-build.sh b/.github/scripts/codspeed-build.sh deleted file mode 100755 index 9976a3314c9..00000000000 --- a/.github/scripts/codspeed-build.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash -set -eo pipefail - -# TODO: Benchmarks run WAY too slow due to excessive amount of iterations. - -cmd=(cargo codspeed build --profile profiling) -crates=( - -p reth-primitives - -p reth-trie - -p reth-trie-common - -p reth-trie-sparse -) - -"${cmd[@]}" --features test-utils "${crates[@]}" diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml deleted file mode 100644 index 43c43b503b1..00000000000 --- a/.github/workflows/bench.yml +++ /dev/null @@ -1,39 +0,0 @@ -# Runs benchmarks. - -on: - pull_request: - # TODO: Disabled temporarily for https://github.com/CodSpeedHQ/runner/issues/55 - # merge_group: - push: - branches: [main] - -env: - CARGO_TERM_COLOR: always - BASELINE: base - SEED: reth - -name: bench -jobs: - codspeed: - runs-on: - group: Reth - steps: - - uses: actions/checkout@v5 - with: - submodules: true - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: Install cargo-codspeed - uses: taiki-e/install-action@v2 - with: - tool: cargo-codspeed - - name: Build the benchmark target(s) - run: ./.github/scripts/codspeed-build.sh - - name: Run the benchmarks - uses: CodSpeedHQ/action@v3 - with: - run: cargo codspeed run --workspace - token: ${{ secrets.CODSPEED_TOKEN }} diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml deleted file mode 100644 index 712f28fd4b6..00000000000 --- a/.github/workflows/book.yml +++ /dev/null @@ -1,70 +0,0 @@ -# Documentation and mdbook related jobs. - -name: book - -on: - push: - branches: [main] - pull_request: - branches: [main] - types: [opened, reopened, synchronize, closed] - merge_group: - -jobs: - build: - runs-on: ubuntu-latest - timeout-minutes: 60 - steps: - - name: Checkout - uses: actions/checkout@v5 - - - name: Install bun - uses: oven-sh/setup-bun@v2 - - - name: Install Playwright browsers - # Required for rehype-mermaid to render Mermaid diagrams during build - run: | - cd docs/vocs/ - bun i - npx playwright install --with-deps chromium - - - name: Install Rust nightly - uses: dtolnay/rust-toolchain@nightly - - - name: Build docs - run: cd docs/vocs && bash scripts/build-cargo-docs.sh - - - name: Build Vocs - run: | - cd docs/vocs/ && bun run build - echo "Vocs Build Complete" - - - name: Setup Pages - uses: actions/configure-pages@v5 - - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: "./docs/vocs/docs/dist" - - deploy: - # Only deploy if a push to main - if: github.ref_name == 'main' && github.event_name == 'push' - runs-on: ubuntu-latest - needs: [build] - - # Grant GITHUB_TOKEN the permissions required to make a Pages deployment - permissions: - pages: write - id-token: write - - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - - timeout-minutes: 60 - - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.github/workflows/compact.yml b/.github/workflows/compact.yml deleted file mode 100644 index 8a18df872d2..00000000000 --- a/.github/workflows/compact.yml +++ /dev/null @@ -1,47 +0,0 @@ -# Ensures that `Compact` codec changes are backwards compatible. -# -# 1) checkout `main` -# 2) randomly generate and serialize to disk many different type vectors with `Compact` (eg. Header, Transaction, etc) -# 3) checkout `pr` -# 4) deserialize previously generated test vectors - -on: - pull_request: - merge_group: - push: - branches: [main] - -env: - CARGO_TERM_COLOR: always - -name: compact-codec -jobs: - compact-codec: - runs-on: - group: Reth - strategy: - matrix: - bin: - - cargo run --bin reth --features "dev" - - cargo run --bin op-reth --features "dev" --manifest-path crates/optimism/bin/Cargo.toml - steps: - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: Checkout base - uses: actions/checkout@v5 - with: - ref: ${{ github.base_ref || 'main' }} - # On `main` branch, generates test vectors and serializes them to disk using `Compact`. - - name: Generate compact vectors - run: | - ${{ matrix.bin }} -- test-vectors compact --write - - name: Checkout PR - uses: actions/checkout@v5 - with: - clean: false - # On incoming merge try to read and decode previously generated vectors with `Compact` - - name: Read vectors - run: ${{ matrix.bin }} -- test-vectors compact --read diff --git a/.github/workflows/dependencies.yml b/.github/workflows/dependencies.yml deleted file mode 100644 index 49c13d38b8d..00000000000 --- a/.github/workflows/dependencies.yml +++ /dev/null @@ -1,20 +0,0 @@ -# Runs `cargo update` periodically. - -name: Update Dependencies - -on: - schedule: - # Run weekly - - cron: "0 0 * * SUN" - workflow_dispatch: - # Needed so we can run it manually - -permissions: - contents: write - pull-requests: write - -jobs: - update: - uses: ithacaxyz/ci/.github/workflows/cargo-update-pr.yml@main - secrets: - token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/docker-git.yml b/.github/workflows/docker-git.yml deleted file mode 100644 index 62830608d67..00000000000 --- a/.github/workflows/docker-git.yml +++ /dev/null @@ -1,54 +0,0 @@ -# Publishes the Docker image, only to be used with `workflow_dispatch`. The -# images from this workflow will be tagged with the git sha of the branch used -# and will NOT tag it as `latest`. - -name: docker-git - -on: - workflow_dispatch: {} - -env: - REPO_NAME: ${{ github.repository_owner }}/reth - IMAGE_NAME: ${{ github.repository_owner }}/reth - OP_IMAGE_NAME: ${{ github.repository_owner }}/op-reth - CARGO_TERM_COLOR: always - DOCKER_IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/reth - OP_DOCKER_IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/op-reth - DOCKER_USERNAME: ${{ github.actor }} - GIT_SHA: ${{ github.sha }} - -jobs: - build: - name: build and push - runs-on: ubuntu-24.04 - permissions: - packages: write - contents: read - strategy: - fail-fast: false - matrix: - build: - - name: 'Build and push the git-sha-tagged reth image' - command: 'make PROFILE=maxperf GIT_SHA=$GIT_SHA docker-build-push-git-sha' - - name: 'Build and push the git-sha-tagged op-reth image' - command: 'make IMAGE_NAME=$OP_IMAGE_NAME DOCKER_IMAGE_NAME=$OP_DOCKER_IMAGE_NAME GIT_SHA=$GIT_SHA PROFILE=maxperf op-docker-build-push-git-sha' - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: Install cross main - id: cross_main - run: | - cargo install cross --git https://github.com/cross-rs/cross - - name: Log in to Docker - run: | - echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io --username ${DOCKER_USERNAME} --password-stdin - - name: Set up Docker builder - run: | - docker run --privileged --rm tonistiigi/binfmt --install arm64,amd64 - docker buildx create --use --name cross-builder - - name: Build and push ${{ matrix.build.name }} - run: ${{ matrix.build.command }} diff --git a/.github/workflows/docker-nightly.yml b/.github/workflows/docker-nightly.yml deleted file mode 100644 index 213b2314060..00000000000 --- a/.github/workflows/docker-nightly.yml +++ /dev/null @@ -1,61 +0,0 @@ -# Publishes the nightly Docker image. - -name: docker-nightly - -on: - workflow_dispatch: - schedule: - - cron: "0 1 * * *" -env: - REPO_NAME: ${{ github.repository_owner }}/reth - IMAGE_NAME: ${{ github.repository_owner }}/reth - OP_IMAGE_NAME: ${{ github.repository_owner }}/op-reth - CARGO_TERM_COLOR: always - DOCKER_IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/reth - OP_DOCKER_IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/op-reth - DOCKER_USERNAME: ${{ github.actor }} - -jobs: - build: - name: build and push - runs-on: ubuntu-24.04 - permissions: - packages: write - contents: read - strategy: - fail-fast: false - matrix: - build: - - name: 'Build and push the nightly reth image' - command: 'make PROFILE=maxperf docker-build-push-nightly' - - name: 'Build and push the nightly profiling reth image' - command: 'make PROFILE=profiling docker-build-push-nightly-profiling' - - name: 'Build and push the nightly op-reth image' - command: 'make IMAGE_NAME=$OP_IMAGE_NAME DOCKER_IMAGE_NAME=$OP_DOCKER_IMAGE_NAME PROFILE=maxperf op-docker-build-push-nightly' - - name: 'Build and push the nightly profiling op-reth image' - command: 'make IMAGE_NAME=$OP_IMAGE_NAME DOCKER_IMAGE_NAME=$OP_DOCKER_IMAGE_NAME PROFILE=profiling op-docker-build-push-nightly-profiling' - steps: - - uses: actions/checkout@v5 - - name: Remove bloatware - uses: laverdet/remove-bloatware@v1.0.0 - with: - docker: true - lang: rust - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: Install cross main - id: cross_main - run: | - cargo install cross --git https://github.com/cross-rs/cross - - name: Log in to Docker - run: | - echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io --username ${DOCKER_USERNAME} --password-stdin - - name: Set up Docker builder - run: | - docker run --privileged --rm tonistiigi/binfmt --install arm64,amd64 - docker buildx create --use --name cross-builder - - name: Build and push ${{ matrix.build.name }} - run: ${{ matrix.build.command }} \ No newline at end of file diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml deleted file mode 100644 index 0768ea8e79a..00000000000 --- a/.github/workflows/docker.yml +++ /dev/null @@ -1,89 +0,0 @@ -# Publishes the Docker image. - -name: docker - -on: - push: - tags: - - v* - -env: - IMAGE_NAME: ${{ github.repository_owner }}/reth - OP_IMAGE_NAME: ${{ github.repository_owner }}/op-reth - CARGO_TERM_COLOR: always - DOCKER_IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/reth - OP_DOCKER_IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/op-reth - DOCKER_USERNAME: ${{ github.actor }} - -jobs: - build-rc: - if: contains(github.ref, '-rc') - name: build and push as release candidate - runs-on: ubuntu-24.04 - permissions: - packages: write - contents: read - strategy: - fail-fast: false - matrix: - build: - - name: "Build and push reth image" - command: "make IMAGE_NAME=$IMAGE_NAME DOCKER_IMAGE_NAME=$DOCKER_IMAGE_NAME PROFILE=maxperf docker-build-push" - - name: "Build and push op-reth image" - command: "make IMAGE_NAME=$OP_IMAGE_NAME DOCKER_IMAGE_NAME=$OP_DOCKER_IMAGE_NAME PROFILE=maxperf op-docker-build-push" - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: Install cross main - id: cross_main - run: | - cargo install cross --git https://github.com/cross-rs/cross - - name: Log in to Docker - run: | - echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io --username ${DOCKER_USERNAME} --password-stdin - - name: Set up Docker builder - run: | - docker run --privileged --rm tonistiigi/binfmt --install arm64,amd64 - docker buildx create --use --name cross-builder - - name: Build and push ${{ matrix.build.name }} - run: ${{ matrix.build.command }} - - build: - if: ${{ !contains(github.ref, '-rc') }} - name: build and push as latest - runs-on: ubuntu-24.04 - permissions: - packages: write - contents: read - strategy: - fail-fast: false - matrix: - build: - - name: "Build and push reth image" - command: "make IMAGE_NAME=$IMAGE_NAME DOCKER_IMAGE_NAME=$DOCKER_IMAGE_NAME PROFILE=maxperf docker-build-push-latest" - - name: "Build and push op-reth image" - command: "make IMAGE_NAME=$OP_IMAGE_NAME DOCKER_IMAGE_NAME=$OP_DOCKER_IMAGE_NAME PROFILE=maxperf op-docker-build-push-latest" - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: Install cross main - id: cross_main - run: | - cargo install cross --git https://github.com/cross-rs/cross - - name: Log in to Docker - run: | - echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io --username ${DOCKER_USERNAME} --password-stdin - - name: Set up Docker builder - run: | - docker run --privileged --rm tonistiigi/binfmt --install arm64,amd64 - docker buildx create --use --name cross-builder - - name: Build and push ${{ matrix.build.name }} - run: ${{ matrix.build.command }} diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml deleted file mode 100644 index 16c9fb2f613..00000000000 --- a/.github/workflows/e2e.yml +++ /dev/null @@ -1,46 +0,0 @@ -# Runs e2e tests using the testsuite framework - -name: e2e - -on: - pull_request: - merge_group: - push: - branches: [main] - -env: - CARGO_TERM_COLOR: always - SEED: rustethereumethereumrust - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - test: - name: e2e-testsuite - runs-on: - group: Reth - env: - RUST_BACKTRACE: 1 - timeout-minutes: 90 - steps: - - uses: actions/checkout@v5 - - uses: dtolnay/rust-toolchain@stable - - uses: taiki-e/install-action@nextest - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: Run e2e tests - run: | - cargo nextest run \ - --locked --features "asm-keccak" \ - --workspace \ - --exclude 'example-*' \ - --exclude 'exex-subscription' \ - --exclude 'reth-bench' \ - --exclude 'ef-tests' \ - --exclude 'op-reth' \ - --exclude 'reth' \ - -E 'binary(e2e_testsuite)' - diff --git a/.github/workflows/hive.yml b/.github/workflows/hive.yml deleted file mode 100644 index e6d604564f3..00000000000 --- a/.github/workflows/hive.yml +++ /dev/null @@ -1,225 +0,0 @@ -# Runs `ethereum/hive` tests. - -name: hive - -on: - workflow_dispatch: - schedule: - - cron: "0 */6 * * *" - -env: - CARGO_TERM_COLOR: always - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - prepare-reth: - uses: ./.github/workflows/prepare-reth.yml - with: - image_tag: ghcr.io/paradigmxyz/reth:latest - binary_name: reth - - prepare-hive: - if: github.repository == 'paradigmxyz/reth' - timeout-minutes: 45 - runs-on: - group: Reth - steps: - - uses: actions/checkout@v5 - - name: Checkout hive tests - uses: actions/checkout@v5 - with: - repository: ethereum/hive - path: hivetests - - - uses: actions/setup-go@v5 - with: - go-version: "^1.13.1" - - run: go version - - - name: Build hive assets - run: .github/assets/hive/build_simulators.sh - - - name: Upload hive assets - uses: actions/upload-artifact@v4 - with: - name: hive_assets - path: ./hive_assets - test: - timeout-minutes: 60 - strategy: - fail-fast: false - matrix: - # ethereum/rpc to be deprecated: - # https://github.com/ethereum/hive/pull/1117 - scenario: - - sim: smoke/genesis - - sim: smoke/network - - sim: ethereum/sync - - sim: devp2p - limit: discv4 - # started failing after https://github.com/ethereum/go-ethereum/pull/31843, no - # action on our side, remove from here when we get unxpected passes on these tests - # - sim: devp2p - # limit: eth - # include: - # - MaliciousHandshake - # # failures tracked in https://github.com/paradigmxyz/reth/issues/14825 - # - Status - # - GetBlockHeaders - # - ZeroRequestID - # - GetBlockBodies - # - Transaction - # - NewPooledTxs - - sim: devp2p - limit: discv5 - include: - # failures tracked at https://github.com/paradigmxyz/reth/issues/14825 - - PingLargeRequestID - - sim: ethereum/engine - limit: engine-exchange-capabilities - - sim: ethereum/engine - limit: engine-withdrawals - - sim: ethereum/engine - limit: engine-auth - - sim: ethereum/engine - limit: engine-api - - sim: ethereum/engine - limit: cancun - # eth_ rpc methods - - sim: ethereum/rpc-compat - include: - - eth_blockNumber - - eth_call - - eth_chainId - - eth_createAccessList - - eth_estimateGas - - eth_feeHistory - - eth_getBalance - - eth_getBlockBy - - eth_getBlockTransactionCountBy - - eth_getCode - - eth_getProof - - eth_getStorage - - eth_getTransactionBy - - eth_getTransactionCount - - eth_getTransactionReceipt - - eth_sendRawTransaction - - eth_syncing - # debug_ rpc methods - - debug_ - - # consume-engine - - sim: ethereum/eest/consume-engine - limit: .*tests/prague.* - - sim: ethereum/eest/consume-engine - limit: .*tests/cancun.* - - sim: ethereum/eest/consume-engine - limit: .*tests/shanghai.* - - sim: ethereum/eest/consume-engine - limit: .*tests/berlin.* - - sim: ethereum/eest/consume-engine - limit: .*tests/istanbul.* - - sim: ethereum/eest/consume-engine - limit: .*tests/homestead.* - - sim: ethereum/eest/consume-engine - limit: .*tests/frontier.* - - # consume-rlp - - sim: ethereum/eest/consume-rlp - limit: .*tests/prague.* - - sim: ethereum/eest/consume-rlp - limit: .*tests/cancun.* - - sim: ethereum/eest/consume-rlp - limit: .*tests/shanghai.* - - sim: ethereum/eest/consume-rlp - limit: .*tests/berlin.* - - sim: ethereum/eest/consume-rlp - limit: .*tests/istanbul.* - - sim: ethereum/eest/consume-rlp - limit: .*tests/homestead.* - - sim: ethereum/eest/consume-rlp - limit: .*tests/frontier.* - needs: - - prepare-reth - - prepare-hive - name: run ${{ matrix.scenario.sim }}${{ matrix.scenario.limit && format(' - {0}', matrix.scenario.limit) }} - runs-on: - group: Reth - permissions: - issues: write - steps: - - uses: actions/checkout@v5 - with: - fetch-depth: 0 - - - name: Download hive assets - uses: actions/download-artifact@v5 - with: - name: hive_assets - path: /tmp - - - name: Download reth image - uses: actions/download-artifact@v5 - with: - name: artifacts - path: /tmp - - - name: Load Docker images - run: .github/assets/hive/load_images.sh - - - name: Move hive binary - run: | - mv /tmp/hive /usr/local/bin - chmod +x /usr/local/bin/hive - - - name: Checkout hive tests - uses: actions/checkout@v5 - with: - repository: ethereum/hive - ref: master - path: hivetests - - - name: Run simulator - run: | - LIMIT="${{ matrix.scenario.limit }}" - TESTS="${{ join(matrix.scenario.include, '|') }}" - if [ -n "$LIMIT" ] && [ -n "$TESTS" ]; then - FILTER="$LIMIT/$TESTS" - elif [ -n "$LIMIT" ]; then - FILTER="$LIMIT" - elif [ -n "$TESTS" ]; then - FILTER="/$TESTS" - else - FILTER="/" - fi - echo "filter: $FILTER" - .github/assets/hive/run_simulator.sh "${{ matrix.scenario.sim }}" "$FILTER" - - - name: Parse hive output - run: | - find hivetests/workspace/logs -type f -name "*.json" ! -name "hive.json" | xargs -I {} python .github/assets/hive/parse.py {} --exclusion .github/assets/hive/expected_failures.yaml --ignored .github/assets/hive/ignored_tests.yaml - - - name: Print simulator output - if: ${{ failure() }} - run: | - cat hivetests/workspace/logs/*simulator*.log - - - name: Print reth client logs - if: ${{ failure() }} - run: | - cat hivetests/workspace/logs/reth/client-*.log - notify-on-error: - needs: test - if: failure() - runs-on: - group: Reth - steps: - - name: Slack Webhook Action - uses: rtCamp/action-slack-notify@v2 - env: - SLACK_COLOR: ${{ job.status }} - SLACK_MESSAGE: "Failed run: https://github.com/paradigmxyz/reth/actions/runs/${{ github.run_id }}" - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml deleted file mode 100644 index 90e3287917e..00000000000 --- a/.github/workflows/integration.yml +++ /dev/null @@ -1,82 +0,0 @@ -# Runs integration tests. - -name: integration - -on: - pull_request: - merge_group: - push: - branches: [main] - schedule: - # Run once a day at 3:00 UTC - - cron: "0 3 * * *" - -env: - CARGO_TERM_COLOR: always - SEED: rustethereumethereumrust - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - test: - name: test / ${{ matrix.network }} - if: github.event_name != 'schedule' - runs-on: - group: Reth - env: - RUST_BACKTRACE: 1 - strategy: - matrix: - network: ["ethereum", "optimism"] - timeout-minutes: 60 - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - name: Install Geth - run: .github/assets/install_geth.sh - - uses: taiki-e/install-action@nextest - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - if: matrix.network == 'ethereum' - name: Run tests - run: | - cargo nextest run \ - --locked --features "asm-keccak ${{ matrix.network }}" \ - --workspace --exclude ef-tests \ - -E "kind(test) and not binary(e2e_testsuite)" - - if: matrix.network == 'optimism' - name: Run tests - run: | - cargo nextest run \ - --locked -p reth-optimism-node - - integration-success: - name: integration success - runs-on: ubuntu-latest - if: always() && github.event_name != 'schedule' - needs: [test] - timeout-minutes: 30 - steps: - - name: Decide whether the needed jobs succeeded or failed - uses: re-actors/alls-green@release/v1 - with: - jobs: ${{ toJSON(needs) }} - - era-files: - name: era1 file integration tests once a day - if: github.event_name == 'schedule' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - uses: taiki-e/install-action@nextest - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: run era1 files integration tests - run: cargo nextest run --package reth-era --test it -- --ignored diff --git a/.github/workflows/kurtosis-op.yml b/.github/workflows/kurtosis-op.yml deleted file mode 100644 index 0ccc0f55bd9..00000000000 --- a/.github/workflows/kurtosis-op.yml +++ /dev/null @@ -1,100 +0,0 @@ -# Runs simple OP stack setup in Kurtosis - -name: kurtosis-op - -on: - workflow_dispatch: - schedule: - - cron: "0 */6 * * *" - - push: - tags: - - '*' - -env: - CARGO_TERM_COLOR: always - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - prepare-reth: - uses: ./.github/workflows/prepare-reth.yml - with: - image_tag: ghcr.io/paradigmxyz/op-reth:kurtosis-ci - binary_name: op-reth - cargo_features: asm-keccak - cargo_package: crates/optimism/bin/Cargo.toml - - test: - timeout-minutes: 60 - strategy: - fail-fast: false - name: run kurtosis - runs-on: - group: Reth - needs: - - prepare-reth - steps: - - uses: actions/checkout@v5 - with: - fetch-depth: 0 - - - name: Download reth image - uses: actions/download-artifact@v5 - with: - name: artifacts - path: /tmp - - - name: Load Docker image - run: | - docker load -i /tmp/reth_image.tar & - wait - docker image ls -a - - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - - - name: Run kurtosis - run: | - echo "deb [trusted=yes] https://apt.fury.io/kurtosis-tech/ /" | sudo tee /etc/apt/sources.list.d/kurtosis.list - sudo apt update - sudo apt install kurtosis-cli - kurtosis engine start - # TODO: unpin optimism-package when https://github.com/ethpandaops/optimism-package/issues/340 is fixed - # kurtosis run --enclave op-devnet github.com/ethpandaops/optimism-package --args-file .github/assets/kurtosis_op_network_params.yaml - kurtosis run --enclave op-devnet github.com/ethpandaops/optimism-package@452133367b693e3ba22214a6615c86c60a1efd5e --args-file .github/assets/kurtosis_op_network_params.yaml - ENCLAVE_ID=$(curl http://127.0.0.1:9779/api/enclaves | jq --raw-output 'keys[0]') - GETH_PORT=$(curl "http://127.0.0.1:9779/api/enclaves/$ENCLAVE_ID/services" | jq '."op-el-2151908-1-op-geth-op-node-op-kurtosis".public_ports.rpc.number') - RETH_PORT=$(curl "http://127.0.0.1:9779/api/enclaves/$ENCLAVE_ID/services" | jq '."op-el-2151908-2-op-reth-op-node-op-kurtosis".public_ports.rpc.number') - echo "GETH_RPC=http://127.0.0.1:$GETH_PORT" >> $GITHUB_ENV - echo "RETH_RPC=http://127.0.0.1:$RETH_PORT" >> $GITHUB_ENV - - - name: Assert that clients advance - run: | - for i in {1..100}; do - sleep 5 - BLOCK_GETH=$(cast bn --rpc-url $GETH_RPC) - BLOCK_RETH=$(cast bn --rpc-url $RETH_RPC) - - if [ $BLOCK_GETH -ge 100 ] && [ $BLOCK_RETH -ge 100 ] ; then exit 0; fi - echo "Waiting for clients to advance..., Reth: $BLOCK_RETH Geth: $BLOCK_GETH" - done - kurtosis service logs -a op-devnet op-el-2151908-2-op-reth-op-node-op-kurtosis - kurtosis service logs -a op-devnet op-cl-2151908-2-op-node-op-reth-op-kurtosis - exit 1 - - - notify-on-error: - needs: test - if: failure() - runs-on: - group: Reth - steps: - - name: Slack Webhook Action - uses: rtCamp/action-slack-notify@v2 - env: - SLACK_COLOR: ${{ job.status }} - SLACK_MESSAGE: "Failed run: https://github.com/paradigmxyz/reth/actions/runs/${{ github.run_id }}" - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} diff --git a/.github/workflows/kurtosis.yml b/.github/workflows/kurtosis.yml deleted file mode 100644 index f78fc81235a..00000000000 --- a/.github/workflows/kurtosis.yml +++ /dev/null @@ -1,70 +0,0 @@ -# Runs `assertoor` tests on a `kurtosis` testnet. - -name: kurtosis - -on: - workflow_dispatch: - schedule: - - cron: "0 */6 * * *" - - push: - tags: - - '*' - -env: - CARGO_TERM_COLOR: always - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - prepare-reth: - uses: ./.github/workflows/prepare-reth.yml - with: - image_tag: ghcr.io/paradigmxyz/reth:kurtosis-ci - binary_name: reth - - test: - timeout-minutes: 60 - strategy: - fail-fast: false - name: run kurtosis - runs-on: - group: Reth - needs: - - prepare-reth - steps: - - uses: actions/checkout@v5 - with: - fetch-depth: 0 - - - name: Download reth image - uses: actions/download-artifact@v5 - with: - name: artifacts - path: /tmp - - - name: Load Docker image - run: | - docker load -i /tmp/reth_image.tar & - wait - docker image ls -a - - - name: Run kurtosis - uses: ethpandaops/kurtosis-assertoor-github-action@v1 - with: - ethereum_package_args: '.github/assets/kurtosis_network_params.yaml' - - notify-on-error: - needs: test - if: failure() - runs-on: - group: Reth - steps: - - name: Slack Webhook Action - uses: rtCamp/action-slack-notify@v2 - env: - SLACK_COLOR: ${{ job.status }} - SLACK_MESSAGE: "Failed run: https://github.com/paradigmxyz/reth/actions/runs/${{ github.run_id }}" - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} diff --git a/.github/workflows/label-pr.yml b/.github/workflows/label-pr.yml deleted file mode 100644 index 686ffc172c1..00000000000 --- a/.github/workflows/label-pr.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Label PRs - -on: - pull_request: - types: [opened] - -jobs: - label_prs: - runs-on: ubuntu-latest - permissions: - issues: write - pull-requests: write - steps: - - uses: actions/checkout@v5 - with: - fetch-depth: 0 - - - name: Label PRs - uses: actions/github-script@v7 - with: - script: | - const label_pr = require('./.github/assets/label_pr.js') - await label_pr({github, context}) diff --git a/.github/workflows/lint-actions.yml b/.github/workflows/lint-actions.yml deleted file mode 100644 index f408c4f50a5..00000000000 --- a/.github/workflows/lint-actions.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Lint GitHub Actions workflows -on: - pull_request: - paths: - - '.github/**' - merge_group: - push: - paths: - - '.github/**' - -jobs: - actionlint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v5 - - name: Download actionlint - id: get_actionlint - run: bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash) - shell: bash - - name: Check workflow files - run: SHELLCHECK_OPTS="-S error" ${{ steps.get_actionlint.outputs.executable }} -color - shell: bash diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index a01ae5e81b5..00000000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,290 +0,0 @@ -name: lint - -on: - pull_request: - merge_group: - push: - branches: [main] - -env: - CARGO_TERM_COLOR: always - -jobs: - clippy-binaries: - name: clippy binaries / ${{ matrix.type }} - runs-on: ubuntu-latest - timeout-minutes: 30 - strategy: - matrix: - include: - - type: ethereum - args: --workspace --lib --examples --tests --benches --locked - features: "ethereum asm-keccak jemalloc jemalloc-prof min-error-logs min-warn-logs min-info-logs min-debug-logs min-trace-logs" - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@clippy - with: - components: clippy - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - if: "${{ matrix.type == 'book' }}" - uses: arduino/setup-protoc@v3 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - - name: Run clippy on binaries - run: cargo clippy ${{ matrix.args }} --features "${{ matrix.features }}" - env: - RUSTFLAGS: -D warnings - - clippy: - name: clippy - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@nightly - with: - components: clippy - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - run: cargo clippy --workspace --lib --examples --tests --benches --all-features --locked - env: - RUSTFLAGS: -D warnings - - wasm: - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - with: - target: wasm32-wasip1 - - uses: taiki-e/install-action@cargo-hack - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - uses: dcarbone/install-jq-action@v3 - - name: Run Wasm checks - run: | - sudo apt update && sudo apt install gcc-multilib - .github/assets/check_wasm.sh - - riscv: - runs-on: ubuntu-latest - timeout-minutes: 60 - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - with: - target: riscv32imac-unknown-none-elf - - uses: taiki-e/install-action@cargo-hack - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - uses: dcarbone/install-jq-action@v3 - - name: Run RISC-V checks - run: .github/assets/check_rv32imac.sh - - crate-checks: - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - uses: taiki-e/install-action@cargo-hack - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - run: cargo hack check --workspace - - msrv: - name: MSRV - runs-on: ubuntu-latest - timeout-minutes: 30 - strategy: - matrix: - include: - - binary: reth - - binary: op-reth - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@master - with: - toolchain: "1.88" # MSRV - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - run: cargo build --bin "${{ matrix.binary }}" --workspace - env: - RUSTFLAGS: -D warnings - - docs: - name: docs - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@nightly - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - run: cargo docs --document-private-items - env: - # Keep in sync with ./book.yml:jobs.build - # This should only add `-D warnings` - RUSTDOCFLAGS: --cfg docsrs --show-type-layout --generate-link-to-definition --enable-index-page -Zunstable-options -D warnings - - fmt: - name: fmt - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@nightly - with: - components: rustfmt - - name: Run fmt - run: cargo fmt --all --check - - udeps: - name: udeps - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@nightly - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - uses: taiki-e/install-action@cargo-udeps - - run: cargo udeps --workspace --lib --examples --tests --benches --all-features --locked - - book: - name: book - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@nightly - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - run: cargo build --bin reth --workspace --features ethereum - env: - RUSTFLAGS: -D warnings - - run: ./docs/cli/update.sh target/debug/reth - - name: Check docs changes - run: git diff --exit-code - - typos: - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v5 - - uses: crate-ci/typos@v1 - - check-toml: - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - name: Checkout repository - uses: actions/checkout@v5 - - name: Run dprint - uses: dprint/check@v2.3 - with: - config-path: dprint.json - - grafana: - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v5 - - name: Check dashboard JSON with jq - uses: sergeysova/jq-action@v2 - with: - cmd: jq empty etc/grafana/dashboards/overview.json - - no-test-deps: - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - name: Ensure no arbitrary or proptest dependency on default build - run: cargo tree --package reth -e=features,no-dev | grep -Eq "arbitrary|proptest" && exit 1 || exit 0 - - # Checks that selected rates can compile with power set of features - features: - name: features - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@clippy - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: cargo install cargo-hack - uses: taiki-e/install-action@cargo-hack - - run: make check-features - env: - RUSTFLAGS: -D warnings - - # Check crates correctly propagate features - feature-propagation: - runs-on: ubuntu-latest - timeout-minutes: 20 - steps: - - uses: actions/checkout@v5 - - name: fetch deps - run: | - # Eagerly pull dependencies - time cargo metadata --format-version=1 --locked > /dev/null - - name: run zepter - run: | - cargo install zepter -f --locked - zepter --version - time zepter run check - - deny: - uses: ithacaxyz/ci/.github/workflows/deny.yml@main - - lint-success: - name: lint success - runs-on: ubuntu-latest - if: always() - needs: - - clippy-binaries - - clippy - - wasm - - crate-checks - - docs - - fmt - - udeps - - book - - typos - - grafana - - no-test-deps - - features - - feature-propagation - - deny - timeout-minutes: 30 - steps: - - name: Decide whether the needed jobs succeeded or failed - uses: re-actors/alls-green@release/v1 - with: - jobs: ${{ toJSON(needs) }} diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml deleted file mode 100644 index e30045423bd..00000000000 --- a/.github/workflows/pr-title.yml +++ /dev/null @@ -1,86 +0,0 @@ -name: Pull Request - -on: - pull_request: - types: - - opened - - reopened - - edited - - synchronize - -permissions: - pull-requests: read - contents: read - -jobs: - conventional-title: - name: Validate PR title is Conventional Commit - runs-on: ubuntu-latest - permissions: - pull-requests: write - steps: - - name: Check title - id: lint_pr_title - uses: amannn/action-semantic-pull-request@v6 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - types: | - feat - fix - chore - test - bench - perf - refactor - docs - ci - revert - deps - continue-on-error: true - - name: Add PR Comment for Invalid Title - if: steps.lint_pr_title.outcome == 'failure' - uses: marocchino/sticky-pull-request-comment@v2 - with: - header: pr-title-lint-error - message: | - Your PR title doesn't follow the Conventional Commit guidelines. - - **Example of valid titles:** - - `feat: add new user login` - - `fix: correct button size` - - `docs: update README` - - **Usage:** - - `feat`: Introduces a new feature - - `fix`: Patches a bug - - `chore`: General maintenance tasks or updates - - `test`: Adding new tests or modifying existing tests - - `bench`: Adding new benchmarks or modifying existing benchmarks - - `perf`: Performance improvements - - `refactor`: Changes to improve code structure - - `docs`: Documentation updates - - `ci`: Changes to CI/CD configurations - - `revert`: Reverts a previously merged PR - - `deps`: Updates dependencies - - **Breaking Changes** - - Breaking changes are noted by using an exclamation mark. For example: - - `feat!: changed the API` - - `chore(node)!: Removed unused public function` - - **Help** - - For more information, follow the guidelines here: https://www.conventionalcommits.org/en/v1.0.0/ - - - name: Remove Comment for Valid Title - if: steps.lint_pr_title.outcome == 'success' - uses: marocchino/sticky-pull-request-comment@v2 - with: - header: pr-title-lint-error - delete: true - - - name: Fail workflow if title invalid - if: steps.lint_pr_title.outcome == 'failure' - run: exit 1 diff --git a/.github/workflows/prepare-reth.yml b/.github/workflows/prepare-reth.yml deleted file mode 100644 index 37a9445af72..00000000000 --- a/.github/workflows/prepare-reth.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: Prepare Reth Image - -on: - workflow_call: - inputs: - image_tag: - required: true - type: string - description: "Docker image tag to use" - binary_name: - required: false - type: string - default: "reth" - description: "Binary name to build (reth or op-reth)" - cargo_features: - required: false - type: string - default: "asm-keccak" - description: "Cargo features to enable" - cargo_package: - required: false - type: string - description: "Optional cargo package path" - -jobs: - prepare-reth: - if: github.repository == 'paradigmxyz/reth' - timeout-minutes: 45 - runs-on: - group: Reth - steps: - - uses: actions/checkout@v5 - - run: mkdir artifacts - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build and export reth image - uses: docker/build-push-action@v6 - with: - context: . - file: .github/assets/hive/Dockerfile - tags: ${{ inputs.image_tag }} - outputs: type=docker,dest=./artifacts/reth_image.tar - build-args: | - CARGO_BIN=${{ inputs.binary_name }} - MANIFEST_PATH=${{ inputs.cargo_package }} - FEATURES=${{ inputs.cargo_features }} - cache-from: type=gha - cache-to: type=gha,mode=max - - - name: Upload reth image - id: upload - uses: actions/upload-artifact@v4 - with: - name: artifacts - path: ./artifacts diff --git a/.github/workflows/release-dist.yml b/.github/workflows/release-dist.yml deleted file mode 100644 index 57a6f311d0b..00000000000 --- a/.github/workflows/release-dist.yml +++ /dev/null @@ -1,20 +0,0 @@ -# This workflow auto-publishes Reth to external package managers such as -# Homebrew when a release is published. - -name: release externally - -on: - release: - types: [published] - -jobs: - release-homebrew: - runs-on: ubuntu-latest - steps: - - name: Update Homebrew formula - uses: dawidd6/action-homebrew-bump-formula@v5 - with: - token: ${{ secrets.HOMEBREW }} - no_fork: true - tap: paradigmxyz/brew - formula: reth diff --git a/.github/workflows/release-reproducible.yml b/.github/workflows/release-reproducible.yml deleted file mode 100644 index e0e7f78aa58..00000000000 --- a/.github/workflows/release-reproducible.yml +++ /dev/null @@ -1,56 +0,0 @@ -# This workflow is for building and pushing reproducible Docker images for releases. - -name: release-reproducible - -on: - push: - tags: - - v* - -env: - DOCKER_REPRODUCIBLE_IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/reth-reproducible - -jobs: - extract-version: - name: extract version - runs-on: ubuntu-latest - steps: - - name: Extract version - run: echo "VERSION=$(echo ${GITHUB_REF#refs/tags/})" >> $GITHUB_OUTPUT - id: extract_version - outputs: - VERSION: ${{ steps.extract_version.outputs.VERSION }} - - build-reproducible: - name: build and push reproducible image - runs-on: ubuntu-latest - needs: extract-version - permissions: - packages: write - contents: read - steps: - - uses: actions/checkout@v5 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and push reproducible image - uses: docker/build-push-action@v6 - with: - context: . - file: ./Dockerfile.reproducible - push: true - tags: | - ${{ env.DOCKER_REPRODUCIBLE_IMAGE_NAME }}:${{ needs.extract-version.outputs.VERSION }} - ${{ env.DOCKER_REPRODUCIBLE_IMAGE_NAME }}:latest - cache-from: type=gha - cache-to: type=gha,mode=max - provenance: false - env: - DOCKER_BUILD_RECORD_UPLOAD: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 7a647c29687..00000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,288 +0,0 @@ -# This workflow is modified from Lighthouse: -# https://github.com/sigp/lighthouse/blob/441fc1691b69f9edc4bbdc6665f3efab16265c9b/.github/workflows/release.yml - -name: release - -on: - push: - tags: - - v* - workflow_dispatch: - inputs: - dry_run: - description: "Enable dry run mode (builds artifacts but skips uploads and release creation)" - type: boolean - default: false - -env: - REPO_NAME: ${{ github.repository_owner }}/reth - IMAGE_NAME: ${{ github.repository_owner }}/reth - OP_IMAGE_NAME: ${{ github.repository_owner }}/op-reth - REPRODUCIBLE_IMAGE_NAME: ${{ github.repository_owner }}/reth-reproducible - CARGO_TERM_COLOR: always - DOCKER_IMAGE_NAME_URL: https://ghcr.io/${{ github.repository_owner }}/reth - DOCKER_OP_IMAGE_NAME_URL: https://ghcr.io/${{ github.repository_owner }}/op-reth - -jobs: - dry-run: - name: check dry run - runs-on: ubuntu-latest - steps: - - run: | - echo "Dry run value: ${{ github.event.inputs.dry_run }}" - echo "Dry run enabled: ${{ github.event.inputs.dry_run == 'true'}}" - echo "Dry run disabled: ${{ github.event.inputs.dry_run != 'true'}}" - - extract-version: - name: extract version - runs-on: ubuntu-latest - steps: - - name: Extract version - run: echo "VERSION=${GITHUB_REF_NAME}" >> $GITHUB_OUTPUT - id: extract_version - outputs: - VERSION: ${{ steps.extract_version.outputs.VERSION }} - - check-version: - name: check version - runs-on: ubuntu-latest - needs: extract-version - if: ${{ github.event.inputs.dry_run != 'true' }} - steps: - - uses: actions/checkout@v5 - - uses: dtolnay/rust-toolchain@stable - - name: Verify crate version matches tag - # Check that the Cargo version starts with the tag, - # so that Cargo version 1.4.8 can be matched against both v1.4.8 and v1.4.8-rc.1 - run: | - tag="${{ needs.extract-version.outputs.VERSION }}" - tag=${tag#v} - cargo_ver=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version') - [[ "$tag" == "$cargo_ver"* ]] || { echo "Tag $tag doesn’t match the Cargo version $cargo_ver"; exit 1; } - - build: - name: build release - runs-on: ${{ matrix.configs.os }} - needs: extract-version - continue-on-error: ${{ matrix.configs.allow_fail }} - strategy: - fail-fast: true - matrix: - configs: - - target: x86_64-unknown-linux-gnu - os: ubuntu-24.04 - profile: maxperf - allow_fail: false - - target: aarch64-unknown-linux-gnu - os: ubuntu-24.04 - profile: maxperf - allow_fail: false - - target: x86_64-apple-darwin - os: macos-13 - profile: maxperf - allow_fail: false - - target: aarch64-apple-darwin - os: macos-14 - profile: maxperf - allow_fail: false - - target: x86_64-pc-windows-gnu - os: ubuntu-24.04 - profile: maxperf - allow_fail: false - - target: riscv64gc-unknown-linux-gnu - os: ubuntu-24.04 - profile: maxperf - allow_fail: true - build: - - command: build - binary: reth - - command: op-build - binary: op-reth - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - with: - target: ${{ matrix.configs.target }} - - name: Install cross main - id: cross_main - run: | - cargo install cross --git https://github.com/cross-rs/cross - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - - name: Apple M1 setup - if: matrix.configs.target == 'aarch64-apple-darwin' - run: | - echo "SDKROOT=$(xcrun -sdk macosx --show-sdk-path)" >> $GITHUB_ENV - echo "MACOSX_DEPLOYMENT_TARGET=$(xcrun -sdk macosx --show-sdk-platform-version)" >> $GITHUB_ENV - - - name: Build Reth - run: make PROFILE=${{ matrix.configs.profile }} ${{ matrix.build.command }}-${{ matrix.configs.target }} - - name: Move binary - run: | - mkdir artifacts - [[ "${{ matrix.configs.target }}" == *windows* ]] && ext=".exe" - mv "target/${{ matrix.configs.target }}/${{ matrix.configs.profile }}/${{ matrix.build.binary }}${ext}" ./artifacts - - - name: Configure GPG and create artifacts - env: - GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }} - GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - run: | - export GPG_TTY=$(tty) - echo -n "$GPG_SIGNING_KEY" | base64 --decode | gpg --batch --import - cd artifacts - tar -czf ${{ matrix.build.binary }}-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.configs.target }}.tar.gz ${{ matrix.build.binary }}* - echo "$GPG_PASSPHRASE" | gpg --passphrase-fd 0 --pinentry-mode loopback --batch -ab ${{ matrix.build.binary }}-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.configs.target }}.tar.gz - mv *tar.gz* .. - shell: bash - - - name: Upload artifact - if: ${{ github.event.inputs.dry_run != 'true' }} - uses: actions/upload-artifact@v4 - with: - name: ${{ matrix.build.binary }}-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.configs.target }}.tar.gz - path: ${{ matrix.build.binary }}-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.configs.target }}.tar.gz - - - name: Upload signature - if: ${{ github.event.inputs.dry_run != 'true' }} - uses: actions/upload-artifact@v4 - with: - name: ${{ matrix.build.binary }}-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.configs.target }}.tar.gz.asc - path: ${{ matrix.build.binary }}-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.configs.target }}.tar.gz.asc - - draft-release: - name: draft release - runs-on: ubuntu-latest - needs: [build, extract-version] - if: ${{ github.event.inputs.dry_run != 'true' }} - env: - VERSION: ${{ needs.extract-version.outputs.VERSION }} - permissions: - # Required to post the release - contents: write - steps: - # This is necessary for generating the changelog. - # It has to come before "Download Artifacts" or else it deletes the artifacts. - - uses: actions/checkout@v5 - with: - fetch-depth: 0 - - name: Download artifacts - uses: actions/download-artifact@v5 - - name: Generate full changelog - id: changelog - run: | - echo "CHANGELOG<> $GITHUB_OUTPUT - echo "$(git log --pretty=format:"- %s" $(git describe --tags --abbrev=0 ${{ env.VERSION }}^)..${{ env.VERSION }})" >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT - - name: Create release draft - env: - GITHUB_USER: ${{ github.repository_owner }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # The formatting here is borrowed from Lighthouse (which is borrowed from OpenEthereum): - # https://github.com/openethereum/openethereum/blob/6c2d392d867b058ff867c4373e40850ca3f96969/.github/workflows/build.yml - run: | - prerelease_flag="" - if [[ "${GITHUB_REF}" == *-rc* ]]; then - prerelease_flag="--prerelease" - fi - - body=$(cat <<- "ENDBODY" - ![image](https://raw.githubusercontent.com/paradigmxyz/reth/main/assets/reth-prod.png) - - ## Testing Checklist (DELETE ME) - - - [ ] Run on testnet for 1-3 days. - - [ ] Resync a mainnet node. - - [ ] Ensure all CI checks pass. - - ## Release Checklist (DELETE ME) - - - [ ] Ensure all crates have had their versions bumped. - - [ ] Write the summary. - - [ ] Fill out the update priority. - - [ ] Ensure all binaries have been added. - - [ ] Prepare release posts (Twitter, ...). - - ## Summary - - Add a summary, including: - - - Critical bug fixes - - New features - - Any breaking changes (and what to expect) - - ## Update Priority - - This table provides priorities for which classes of users should update particular components. - - | User Class | Priority | - |----------------------|-----------------| - | Payload Builders | | - | Non-Payload Builders | | - - *See [Update Priorities](https://reth.rs/installation/priorities) for more information about this table.* - - ## All Changes - - ${{ steps.changelog.outputs.CHANGELOG }} - - ## Binaries - - [See pre-built binaries documentation.](https://reth.rs/installation/binaries) - - The binaries are signed with the PGP key: `50FB 7CC5 5B2E 8AFA 59FE 03B7 AA5E D56A 7FBF 253E` - - ### Reth - - | System | Architecture | Binary | PGP Signature | - |:---:|:---:|:---:|:---| - | | x86_64 | [reth-${{ env.VERSION }}-x86_64-unknown-linux-gnu.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-x86_64-unknown-linux-gnu.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-x86_64-unknown-linux-gnu.tar.gz.asc) | - | | aarch64 | [reth-${{ env.VERSION }}-aarch64-unknown-linux-gnu.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-aarch64-unknown-linux-gnu.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-aarch64-unknown-linux-gnu.tar.gz.asc) | - | | x86_64 | [reth-${{ env.VERSION }}-x86_64-pc-windows-gnu.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-x86_64-pc-windows-gnu.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-x86_64-pc-windows-gnu.tar.gz.asc) | - | | x86_64 | [reth-${{ env.VERSION }}-x86_64-apple-darwin.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-x86_64-apple-darwin.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-x86_64-apple-darwin.tar.gz.asc) | - | | aarch64 | [reth-${{ env.VERSION }}-aarch64-apple-darwin.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-aarch64-apple-darwin.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-aarch64-apple-darwin.tar.gz.asc) | - | | Docker | [${{ env.IMAGE_NAME }}](${{ env.DOCKER_IMAGE_NAME_URL }}) | - | - - ### OP-Reth - - | System | Architecture | Binary | PGP Signature | - |:---:|:---:|:---:|:---| - | | x86_64 | [op-reth-${{ env.VERSION }}-x86_64-unknown-linux-gnu.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/op-reth-${{ env.VERSION }}-x86_64-unknown-linux-gnu.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/op-reth-${{ env.VERSION }}-x86_64-unknown-linux-gnu.tar.gz.asc) | - | | aarch64 | [op-reth-${{ env.VERSION }}-aarch64-unknown-linux-gnu.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/op-reth-${{ env.VERSION }}-aarch64-unknown-linux-gnu.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/op-reth-${{ env.VERSION }}-aarch64-unknown-linux-gnu.tar.gz.asc) | - | | x86_64 | [op-reth-${{ env.VERSION }}-x86_64-pc-windows-gnu.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/op-reth-${{ env.VERSION }}-x86_64-pc-windows-gnu.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/op-reth-${{ env.VERSION }}-x86_64-pc-windows-gnu.tar.gz.asc) | - | | x86_64 | [op-reth-${{ env.VERSION }}-x86_64-apple-darwin.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/op-reth-${{ env.VERSION }}-x86_64-apple-darwin.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/op-reth-${{ env.VERSION }}-x86_64-apple-darwin.tar.gz.asc) | - | | aarch64 | [op-reth-${{ env.VERSION }}-aarch64-apple-darwin.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/op-reth-${{ env.VERSION }}-aarch64-apple-darwin.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/op-reth-${{ env.VERSION }}-aarch64-apple-darwin.tar.gz.asc) | - | | Docker | [${{ env.OP_IMAGE_NAME }}](${{ env.DOCKER_OP_IMAGE_NAME_URL }}) | - | - ENDBODY - ) - assets=() - for asset in ./*reth-*.tar.gz*; do - assets+=("$asset/$asset") - done - tag_name="${{ env.VERSION }}" - echo "$body" | gh release create --draft $prerelease_flag -t "Reth $tag_name" -F "-" "$tag_name" "${assets[@]}" - - dry-run-summary: - name: dry run summary - runs-on: ubuntu-latest - needs: [build, extract-version] - if: ${{ github.event.inputs.dry_run == 'true' }} - env: - VERSION: ${{ needs.extract-version.outputs.VERSION }} - steps: - - name: Summarize dry run - run: | - echo "## 🧪 Release Dry Run Summary" - echo "" - echo "✅ Successfully completed dry run for commit ${{ github.sha }}" - echo "" - echo "### What would happen in a real release:" - echo "- Binary artifacts would be uploaded to GitHub" - echo "- Docker images would be pushed to registry" - echo "- A draft release would be created" - echo "" - echo "### Next Steps" - echo "To perform a real release, push a git tag." diff --git a/.github/workflows/reproducible-build.yml b/.github/workflows/reproducible-build.yml deleted file mode 100644 index b4a93cedaba..00000000000 --- a/.github/workflows/reproducible-build.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: reproducible-build - -on: - workflow_dispatch: {} - schedule: - - cron: "0 1 */2 * *" - -jobs: - build: - name: build reproducible binaries - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - with: - target: x86_64-unknown-linux-gnu - - name: Install cross main - run: | - cargo install cross --git https://github.com/cross-rs/cross - - name: Install cargo-cache - run: | - cargo install cargo-cache - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: Build Reth - run: | - make build-reproducible - mv target/x86_64-unknown-linux-gnu/release/reth reth-build-1 - - name: Clean cache - run: make clean && cargo cache -a - - name: Build Reth again - run: | - make build-reproducible - mv target/x86_64-unknown-linux-gnu/release/reth reth-build-2 - - name: Compare binaries - run: cmp reth-build-1 reth-build-2 diff --git a/.github/workflows/stage.yml b/.github/workflows/stage.yml deleted file mode 100644 index 7225d84cffa..00000000000 --- a/.github/workflows/stage.yml +++ /dev/null @@ -1,73 +0,0 @@ -# Runs all `stage run` commands. - -name: stage-test - -on: - pull_request: - merge_group: - push: - branches: [main] - -env: - CARGO_TERM_COLOR: always - FROM_BLOCK: 0 - TO_BLOCK: 50000 - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - stage: - name: stage-run-test - # Only run stage commands test in merge groups - if: github.event_name == 'merge_group' - runs-on: - group: Reth - env: - RUST_LOG: info,sync=error - RUST_BACKTRACE: 1 - timeout-minutes: 60 - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: Build reth - run: | - cargo install --features asm-keccak,jemalloc --path bin/reth - - name: Run headers stage - run: | - reth stage run headers --from ${{ env.FROM_BLOCK }} --to ${{ env.TO_BLOCK }} --commit --checkpoints - - name: Run bodies stage - run: | - reth stage run bodies --from ${{ env.FROM_BLOCK }} --to ${{ env.TO_BLOCK }} --commit --checkpoints - - name: Run senders stage - run: | - reth stage run senders --from ${{ env.FROM_BLOCK }} --to ${{ env.TO_BLOCK }} --commit --checkpoints - - name: Run execution stage - run: | - reth stage run execution --from ${{ env.FROM_BLOCK }} --to ${{ env.TO_BLOCK }} --commit --checkpoints - - name: Run account-hashing stage - run: | - reth stage run account-hashing --from ${{ env.FROM_BLOCK }} --to ${{ env.TO_BLOCK }} --commit --checkpoints - - name: Run storage hashing stage - run: | - reth stage run storage-hashing --from ${{ env.FROM_BLOCK }} --to ${{ env.TO_BLOCK }} --commit --checkpoints - - name: Run hashing stage - run: | - reth stage run hashing --from ${{ env.FROM_BLOCK }} --to ${{ env.TO_BLOCK }} --commit --checkpoints - - name: Run merkle stage - run: | - reth stage run merkle --from ${{ env.FROM_BLOCK }} --to ${{ env.TO_BLOCK }} --commit --checkpoints - - name: Run transaction lookup stage - run: | - reth stage run tx-lookup --from ${{ env.FROM_BLOCK }} --to ${{ env.TO_BLOCK }} --commit --checkpoints - - name: Run account history stage - run: | - reth stage run account-history --from ${{ env.FROM_BLOCK }} --to ${{ env.TO_BLOCK }} --commit --checkpoints - - name: Run storage history stage - run: | - reth stage run storage-history --from ${{ env.FROM_BLOCK }} --to ${{ env.TO_BLOCK }} --commit --checkpoints diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml deleted file mode 100644 index 38cca2fb1a9..00000000000 --- a/.github/workflows/stale.yml +++ /dev/null @@ -1,29 +0,0 @@ -# Marks issues as stale. - -name: stale issues - -on: - workflow_dispatch: {} - schedule: - - cron: "30 1 * * *" - -jobs: - close-issues: - runs-on: ubuntu-latest - permissions: - issues: write - pull-requests: write - steps: - - uses: actions/stale@v9 - with: - days-before-stale: 21 - days-before-close: 7 - stale-issue-label: "S-stale" - stale-pr-label: "S-stale" - exempt-issue-labels: "M-prevent-stale" - exempt-pr-labels: "M-prevent-stale" - stale-issue-message: "This issue is stale because it has been open for 21 days with no activity." - close-issue-message: "This issue was closed because it has been inactive for 7 days since being marked as stale." - exempt-all-milestones: true - exempt-all-assignees: true - repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/sync-era.yml b/.github/workflows/sync-era.yml deleted file mode 100644 index f2539b2fdc2..00000000000 --- a/.github/workflows/sync-era.yml +++ /dev/null @@ -1,67 +0,0 @@ -# Runs sync tests with ERA stage enabled. - -name: sync-era test - -on: - workflow_dispatch: - schedule: - - cron: "0 */6 * * *" - -env: - CARGO_TERM_COLOR: always - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - sync: - name: sync (${{ matrix.chain.bin }}) - runs-on: - group: Reth - env: - RUST_LOG: info,sync=error - RUST_BACKTRACE: 1 - timeout-minutes: 60 - strategy: - matrix: - chain: - - build: install - bin: reth - chain: mainnet - tip: "0x91c90676cab257a59cd956d7cb0bceb9b1a71d79755c23c7277a0697ccfaf8c4" - block: 100000 - unwind-target: "0x52e0509d33a988ef807058e2980099ee3070187f7333aae12b64d4d675f34c5a" - - build: install-op - bin: op-reth - chain: base - tip: "0xbb9b85352c7ebca6ba8efc63bd66cecd038c92ec8ebd02e153a3e0b197e672b7" - block: 10000 - unwind-target: "0x118a6e922a8c6cab221fc5adfe5056d2b72d58c6580e9c5629de55299e2cf8de" - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: Build ${{ matrix.chain.bin }} - run: make ${{ matrix.chain.build }} - - name: Run sync with ERA enabled - run: | - ${{ matrix.chain.bin }} node \ - --chain ${{ matrix.chain.chain }} \ - --debug.tip ${{ matrix.chain.tip }} \ - --debug.max-block ${{ matrix.chain.block }} \ - --debug.terminate \ - --era.enable - - name: Verify the target block hash - run: | - ${{ matrix.chain.bin }} db --chain ${{ matrix.chain.chain }} get static-file headers ${{ matrix.chain.block }} \ - | grep ${{ matrix.chain.tip }} - - name: Run stage unwind for 100 blocks - run: | - ${{ matrix.chain.bin }} stage unwind num-blocks 100 --chain ${{ matrix.chain.chain }} - - name: Run stage unwind to block hash - run: | - ${{ matrix.chain.bin }} stage unwind to-block ${{ matrix.chain.unwind-target }} --chain ${{ matrix.chain.chain }} diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml deleted file mode 100644 index e57082b83e7..00000000000 --- a/.github/workflows/sync.yml +++ /dev/null @@ -1,66 +0,0 @@ -# Runs sync tests. - -name: sync test - -on: - workflow_dispatch: - schedule: - - cron: "0 */6 * * *" - -env: - CARGO_TERM_COLOR: always - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - sync: - name: sync (${{ matrix.chain.bin }}) - runs-on: - group: Reth - env: - RUST_LOG: info,sync=error - RUST_BACKTRACE: 1 - timeout-minutes: 60 - strategy: - matrix: - chain: - - build: install - bin: reth - chain: mainnet - tip: "0x91c90676cab257a59cd956d7cb0bceb9b1a71d79755c23c7277a0697ccfaf8c4" - block: 100000 - unwind-target: "0x52e0509d33a988ef807058e2980099ee3070187f7333aae12b64d4d675f34c5a" - - build: install-op - bin: op-reth - chain: base - tip: "0xbb9b85352c7ebca6ba8efc63bd66cecd038c92ec8ebd02e153a3e0b197e672b7" - block: 10000 - unwind-target: "0x118a6e922a8c6cab221fc5adfe5056d2b72d58c6580e9c5629de55299e2cf8de" - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: Build ${{ matrix.chain.bin }} - run: make ${{ matrix.chain.build }} - - name: Run sync - run: | - ${{ matrix.chain.bin }} node \ - --chain ${{ matrix.chain.chain }} \ - --debug.tip ${{ matrix.chain.tip }} \ - --debug.max-block ${{ matrix.chain.block }} \ - --debug.terminate - - name: Verify the target block hash - run: | - ${{ matrix.chain.bin }} db --chain ${{ matrix.chain.chain }} get static-file headers ${{ matrix.chain.block }} \ - | grep ${{ matrix.chain.tip }} - - name: Run stage unwind for 100 blocks - run: | - ${{ matrix.chain.bin }} stage unwind num-blocks 100 --chain ${{ matrix.chain.chain }} - - name: Run stage unwind to block hash - run: | - ${{ matrix.chain.bin }} stage unwind to-block ${{ matrix.chain.unwind-target }} --chain ${{ matrix.chain.chain }} diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml deleted file mode 100644 index 39aeebde21d..00000000000 --- a/.github/workflows/unit.yml +++ /dev/null @@ -1,119 +0,0 @@ -# Runs unit tests. - -name: unit - -on: - pull_request: - merge_group: - push: - branches: [main] - -env: - CARGO_TERM_COLOR: always - SEED: rustethereumethereumrust - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - test: - name: test / ${{ matrix.type }} (${{ matrix.partition }}/${{ matrix.total_partitions }}) - runs-on: - group: Reth - env: - RUST_BACKTRACE: 1 - strategy: - matrix: - include: - - type: ethereum - args: --features "asm-keccak ethereum" --locked - partition: 1 - total_partitions: 2 - - type: ethereum - args: --features "asm-keccak ethereum" --locked - partition: 2 - total_partitions: 2 - - type: optimism - args: --features "asm-keccak" --locked --exclude reth --exclude reth-bench --exclude "example-*" --exclude "reth-ethereum-*" --exclude "*-ethereum" - partition: 1 - total_partitions: 2 - - type: optimism - args: --features "asm-keccak" --locked --exclude reth --exclude reth-bench --exclude "example-*" --exclude "reth-ethereum-*" --exclude "*-ethereum" - partition: 2 - total_partitions: 2 - timeout-minutes: 30 - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - uses: taiki-e/install-action@nextest - - if: "${{ matrix.type == 'book' }}" - uses: arduino/setup-protoc@v3 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - - name: Run tests - run: | - cargo nextest run \ - ${{ matrix.args }} --workspace \ - --exclude ef-tests --no-tests=warn \ - --partition hash:${{ matrix.partition }}/2 \ - -E "!kind(test) and not binary(e2e_testsuite)" - - state: - name: Ethereum state tests - runs-on: - group: Reth - env: - RUST_LOG: info,sync=error - RUST_BACKTRACE: 1 - timeout-minutes: 30 - steps: - - uses: actions/checkout@v5 - - name: Checkout ethereum/tests - uses: actions/checkout@v5 - with: - repository: ethereum/tests - ref: 81862e4848585a438d64f911a19b3825f0f4cd95 - path: testing/ef-tests/ethereum-tests - submodules: recursive - fetch-depth: 1 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - uses: taiki-e/install-action@nextest - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - run: cargo nextest run --release -p ef-tests --features "asm-keccak ef-tests" - - doc: - name: doc tests - runs-on: - group: Reth - env: - RUST_BACKTRACE: 1 - timeout-minutes: 30 - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: Run doctests - run: cargo test --doc --workspace --all-features - - unit-success: - name: unit success - runs-on: ubuntu-latest - if: always() - needs: [test, state, doc] - timeout-minutes: 30 - steps: - - name: Decide whether the needed jobs succeeded or failed - uses: re-actors/alls-green@release/v1 - with: - jobs: ${{ toJSON(needs) }} diff --git a/.github/workflows/update-superchain.yml b/.github/workflows/update-superchain.yml deleted file mode 100644 index f682f35a17d..00000000000 --- a/.github/workflows/update-superchain.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Update Superchain Config - -on: - schedule: - - cron: '0 3 * * 0' - workflow_dispatch: - -permissions: - contents: write - -jobs: - update-superchain: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v5 - - - name: Install required tools - run: | - sudo apt-get update - sudo apt-get install -y jq zstd qpdf yq - - - name: Run fetch_superchain_config.sh - run: | - chmod +x crates/optimism/chainspec/res/fetch_superchain_config.sh - cd crates/optimism/chainspec/res - ./fetch_superchain_config.sh - - - name: Create Pull Request - uses: peter-evans/create-pull-request@v7 - with: - commit-message: "chore: update superchain config" - title: "chore: update superchain config" - body: "This PR updates the superchain configs via scheduled workflow." - branch: "ci/update-superchain-config" - delete-branch: true diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml deleted file mode 100644 index 81181c2cb1a..00000000000 --- a/.github/workflows/windows.yml +++ /dev/null @@ -1,49 +0,0 @@ -# Windows build - -name: windows - -on: - push: - branches: [main] - pull_request: - branches: [main] - merge_group: - -jobs: - check-reth: - runs-on: ubuntu-24.04 - timeout-minutes: 60 - - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - with: - target: x86_64-pc-windows-gnu - - uses: taiki-e/install-action@cross - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: mingw-w64 - run: sudo apt-get install -y mingw-w64 - - name: Check Reth - run: cargo check --target x86_64-pc-windows-gnu - - check-op-reth: - runs-on: ubuntu-24.04 - timeout-minutes: 60 - - steps: - - uses: actions/checkout@v5 - - uses: rui314/setup-mold@v1 - - uses: dtolnay/rust-toolchain@stable - with: - target: x86_64-pc-windows-gnu - - uses: taiki-e/install-action@cross - - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - name: mingw-w64 - run: sudo apt-get install -y mingw-w64 - - name: Check OP-Reth - run: cargo check -p op-reth --target x86_64-pc-windows-gnu From 3acb577131203cf024497b18512c6c11344b0780 Mon Sep 17 00:00:00 2001 From: sledro Date: Tue, 9 Sep 2025 21:09:57 +0100 Subject: [PATCH 31/36] add build docker ci --- .github/workflows/docker_build.yml | 88 ++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 .github/workflows/docker_build.yml diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml new file mode 100644 index 00000000000..01390a2055d --- /dev/null +++ b/.github/workflows/docker_build.yml @@ -0,0 +1,88 @@ +name: Docker Build Release + +on: + push: + branches: + - lightlink # Trigger the workflow on pushes to the main branch + tags: + - "**" # Trigger the workflow on tags including hierarchical tags like v1.0/beta + pull_request: + types: [opened, synchronize] # Trigger the workflow when a PR is opened or updated + +jobs: + extract-version: + name: Extract version + runs-on: ubuntu-latest + outputs: + VERSION: ${{ steps.extract_version.outputs.VERSION }} + steps: + - name: Extract version + id: extract_version + run: | + if [[ "${GITHUB_REF_TYPE}" == "tag" ]]; then + VERSION="${GITHUB_REF#refs/tags/}" + else + VERSION="$(echo ${GITHUB_SHA} | cut -c1-7)" + fi + echo "VERSION=${VERSION}" >> $GITHUB_OUTPUT + + echo "| | |" >> $GITHUB_STEP_SUMMARY + echo "| ------------------- | ---------------------- |" >> $GITHUB_STEP_SUMMARY + echo "| \`GITHUB_REF_TYPE\` | \`${GITHUB_REF_TYPE}\` |" >> $GITHUB_STEP_SUMMARY + echo "| \`GITHUB_REF_NAME\` | \`${GITHUB_REF_NAME}\` |" >> $GITHUB_STEP_SUMMARY + echo "| \`GITHUB_REF\` | \`${GITHUB_REF}\` |" >> $GITHUB_STEP_SUMMARY + echo "| \`GITHUB_SHA\` | \`${GITHUB_SHA}\` |" >> $GITHUB_STEP_SUMMARY + echo "| \`VERSION\` | \`${VERSION}\` |" >> $GITHUB_STEP_SUMMARY + + build-docker: + name: Build and publish Docker image + needs: extract-version + runs-on: ${{ matrix.configs.runner }} + env: + VERSION: ${{ needs.extract-version.outputs.VERSION }} + permissions: + contents: read + packages: write + strategy: + matrix: + configs: + - target: linux/amd64 + runner: ubuntu-latest + steps: + - name: checkout sources + uses: actions/checkout@v4 + + - name: docker qemu + uses: docker/setup-qemu-action@v3 + + - name: docker buildx + uses: docker/setup-buildx-action@v3 + + - name: docker metadata + uses: docker/metadata-action@v5 + id: meta + with: + images: ghcr.io/${{ github.repository }} + labels: org.opencontainers.image.source=${{ github.repositoryUrl }} + tags: | + type=sha + type=schedule,pattern=nightly + + - name: docker login + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: docker build and push op-reth + uses: docker/build-push-action@v5 + with: + cache-from: type=gha + cache-to: type=gha,mode=max + file: DockerfileOp + context: . + labels: ${{ steps.meta.outputs.labels }} + platforms: ${{ matrix.configs.target }} + push: true + tags: ${{ steps.meta.outputs.tags }} From cf343a2d03ba7fbbb78f046c5f7533f061ddfaf5 Mon Sep 17 00:00:00 2001 From: sledro Date: Tue, 9 Sep 2025 21:25:13 +0100 Subject: [PATCH 32/36] Update Docker workflow to trigger on 'main' branch instead of 'lightlink' --- .github/workflows/docker_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index 01390a2055d..160b962e066 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -3,7 +3,7 @@ name: Docker Build Release on: push: branches: - - lightlink # Trigger the workflow on pushes to the main branch + - main # Trigger the workflow on pushes to the main branch tags: - "**" # Trigger the workflow on tags including hierarchical tags like v1.0/beta pull_request: From ea99870e5ebd839bb9783f667db41103b93038c8 Mon Sep 17 00:00:00 2001 From: sledro Date: Fri, 12 Sep 2025 15:40:35 +0100 Subject: [PATCH 33/36] Update Docker workflow to specify image path for op-reth --- .github/workflows/docker_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index 160b962e066..020631ab1d6 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -62,7 +62,7 @@ jobs: uses: docker/metadata-action@v5 id: meta with: - images: ghcr.io/${{ github.repository }} + images: ghcr.io/${{ github.repository }}/op-reth labels: org.opencontainers.image.source=${{ github.repositoryUrl }} tags: | type=sha From 8d03c7562543e690ad102628dfa0a9f851d2d1be Mon Sep 17 00:00:00 2001 From: sledro Date: Mon, 6 Oct 2025 19:23:54 +0100 Subject: [PATCH 34/36] Enable per-transaction gasless validation bypass in CfgEnv for lightlink revm --- crates/optimism/evm/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/optimism/evm/src/lib.rs b/crates/optimism/evm/src/lib.rs index 6acc374ea8c..d90a69a0215 100644 --- a/crates/optimism/evm/src/lib.rs +++ b/crates/optimism/evm/src/lib.rs @@ -250,7 +250,9 @@ where let spec = revm_spec_by_timestamp_after_bedrock(self.chain_spec(), timestamp); - let cfg_env = CfgEnv::new().with_chain_id(self.chain_spec().chain().id()).with_spec(spec); + let mut cfg_env = CfgEnv::new().with_chain_id(self.chain_spec().chain().id()).with_spec(spec); + // Enable per-tx gasless validation bypass in lightlink revm + cfg_env.allow_gasless = true; let blob_excess_gas_and_price = spec .into_eth_spec() From 7c1c6f2a714b5ac95016695d9cc0401dd4864161 Mon Sep 17 00:00:00 2001 From: sledro Date: Mon, 6 Oct 2025 19:51:55 +0100 Subject: [PATCH 35/36] Update Dockerfile to use Ubuntu 24.04 as the base image for runtime --- DockerfileOp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DockerfileOp b/DockerfileOp index 51a567317d2..e7b2bf4f96b 100644 --- a/DockerfileOp +++ b/DockerfileOp @@ -28,7 +28,7 @@ RUN cargo build --profile $BUILD_PROFILE --bin op-reth --manifest-path /app/crat RUN ls -la /app/target/$BUILD_PROFILE/op-reth RUN cp /app/target/$BUILD_PROFILE/op-reth /app/op-reth -FROM ubuntu:22.04 AS runtime +FROM ubuntu:24.04 AS runtime RUN apt-get update && \ apt-get install -y ca-certificates libssl-dev pkg-config strace && \ From 3921005ac119316d9939c940b75440ade9b78e78 Mon Sep 17 00:00:00 2001 From: sledro Date: Tue, 28 Oct 2025 01:12:47 +0000 Subject: [PATCH 36/36] fix: update gasless transaction priority type from U256 to u128 --- crates/transaction-pool/src/ordering.rs | 2 +- crates/transaction-pool/src/pool/txpool.rs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/transaction-pool/src/ordering.rs b/crates/transaction-pool/src/ordering.rs index 3294a285431..2106cc4e3bf 100644 --- a/crates/transaction-pool/src/ordering.rs +++ b/crates/transaction-pool/src/ordering.rs @@ -84,7 +84,7 @@ where base_fee: u64, ) -> Priority { if is_gasless(transaction) { - Priority::Value(U256::MAX) + Priority::Value(u128::MAX) } else { transaction.effective_tip_per_gas(base_fee).into() } diff --git a/crates/transaction-pool/src/pool/txpool.rs b/crates/transaction-pool/src/pool/txpool.rs index d2e8f8a743d..c77ade271f7 100644 --- a/crates/transaction-pool/src/pool/txpool.rs +++ b/crates/transaction-pool/src/pool/txpool.rs @@ -40,6 +40,7 @@ use std::{ ops::Bound::{Excluded, Unbounded}, sync::Arc, }; +use reth_optimism_primitives::is_gasless; use tracing::{trace, warn}; #[cfg_attr(doc, aquamarine::aquamarine)]