diff --git a/crates/anvil/core/src/eth/block.rs b/crates/anvil/core/src/eth/block.rs index fa68530e0f26b..6787fe37bc458 100644 --- a/crates/anvil/core/src/eth/block.rs +++ b/crates/anvil/core/src/eth/block.rs @@ -1,6 +1,6 @@ use super::transaction::{TransactionInfo, TypedReceipt}; -use alloy_consensus::{proofs::calculate_transaction_root, Header, EMPTY_OMMER_ROOT_HASH}; -use alloy_primitives::{Address, Bloom, Bytes, B256, B64, U256}; +use alloy_consensus::{EMPTY_OMMER_ROOT_HASH, Header, proofs::calculate_transaction_root}; +use alloy_primitives::{Address, B64, B256, Bloom, Bytes, U256}; use alloy_rlp::{RlpDecodable, RlpEncodable}; // Type alias to optionally support impersonated transactions diff --git a/crates/anvil/core/src/eth/mod.rs b/crates/anvil/core/src/eth/mod.rs index c1d54aa68e005..26603d002fe28 100644 --- a/crates/anvil/core/src/eth/mod.rs +++ b/crates/anvil/core/src/eth/mod.rs @@ -1,6 +1,7 @@ use crate::{eth::subscription::SubscriptionId, types::ReorgOptions}; -use alloy_primitives::{Address, Bytes, TxHash, B256, B64, U256}; +use alloy_primitives::{Address, B64, B256, Bytes, TxHash, U256}; use alloy_rpc_types::{ + BlockId, BlockNumberOrTag as BlockNumber, BlockOverrides, Filter, Index, anvil::{Forking, MineOptions}, pubsub::{Params as SubscriptionParams, SubscriptionKind}, request::TransactionRequest, @@ -10,7 +11,6 @@ use alloy_rpc_types::{ filter::TraceFilter, geth::{GethDebugTracingCallOptions, GethDebugTracingOptions}, }, - BlockId, BlockNumberOrTag as BlockNumber, BlockOverrides, Filter, Index, }; use alloy_serde::WithOtherFields; use foundry_common::serde_helpers::{ @@ -325,11 +325,7 @@ pub enum EthRequest { SetAutomine(bool), /// Sets the mining behavior to interval with the given interval (seconds) - #[serde( - rename = "anvil_setIntervalMining", - alias = "evm_setIntervalMining", - with = "sequence" - )] + #[serde(rename = "anvil_setIntervalMining", alias = "evm_setIntervalMining", with = "sequence")] SetIntervalMining(u64), /// Gets the current mining behavior @@ -337,11 +333,7 @@ pub enum EthRequest { GetIntervalMining(()), /// Removes transactions from the pool - #[serde( - rename = "anvil_dropTransaction", - alias = "hardhat_dropTransaction", - with = "sequence" - )] + #[serde(rename = "anvil_dropTransaction", alias = "hardhat_dropTransaction", with = "sequence")] DropTransaction(B256), /// Removes transactions from the pool diff --git a/crates/anvil/core/src/eth/serde_helpers.rs b/crates/anvil/core/src/eth/serde_helpers.rs index 05ec3b25fd04f..c80caf8ef5445 100644 --- a/crates/anvil/core/src/eth/serde_helpers.rs +++ b/crates/anvil/core/src/eth/serde_helpers.rs @@ -2,7 +2,7 @@ pub mod sequence { use serde::{ - de::DeserializeOwned, ser::SerializeSeq, Deserialize, Deserializer, Serialize, Serializer, + Deserialize, Deserializer, Serialize, Serializer, de::DeserializeOwned, ser::SerializeSeq, }; pub fn serialize(val: &T, s: S) -> Result diff --git a/crates/anvil/core/src/eth/subscription.rs b/crates/anvil/core/src/eth/subscription.rs index 8a5012f64cc80..eaf4d8ce373ef 100644 --- a/crates/anvil/core/src/eth/subscription.rs +++ b/crates/anvil/core/src/eth/subscription.rs @@ -1,6 +1,6 @@ //! Subscription types use alloy_primitives::hex; -use rand::{distr::Alphanumeric, rng, Rng}; +use rand::{Rng, distr::Alphanumeric, rng}; use std::fmt; /// Unique subscription id diff --git a/crates/anvil/core/src/eth/transaction/mod.rs b/crates/anvil/core/src/eth/transaction/mod.rs index ae6a7262565ca..791bf0c50112f 100644 --- a/crates/anvil/core/src/eth/transaction/mod.rs +++ b/crates/anvil/core/src/eth/transaction/mod.rs @@ -1,25 +1,25 @@ //! Transaction related types use alloy_consensus::{ + Receipt, ReceiptEnvelope, ReceiptWithBloom, Signed, Transaction, TxEip1559, TxEip2930, + TxEnvelope, TxLegacy, TxReceipt, Typed2718, transaction::{ - eip4844::{TxEip4844, TxEip4844Variant, TxEip4844WithSidecar}, Recovered, TxEip7702, + eip4844::{TxEip4844, TxEip4844Variant, TxEip4844WithSidecar}, }, - Receipt, ReceiptEnvelope, ReceiptWithBloom, Signed, Transaction, TxEip1559, TxEip2930, - TxEnvelope, TxLegacy, TxReceipt, Typed2718, }; use alloy_eips::eip2718::{Decodable2718, Eip2718Error, Encodable2718}; use alloy_network::{AnyReceiptEnvelope, AnyRpcTransaction, AnyTransactionReceipt, AnyTxEnvelope}; -use alloy_primitives::{Address, Bloom, Bytes, Log, Signature, TxHash, TxKind, B256, U256, U64}; -use alloy_rlp::{length_of_length, Decodable, Encodable, Header}; +use alloy_primitives::{Address, B256, Bloom, Bytes, Log, Signature, TxHash, TxKind, U64, U256}; +use alloy_rlp::{Decodable, Encodable, Header, length_of_length}; use alloy_rpc_types::{ - request::TransactionRequest, trace::otterscan::OtsReceipt, AccessList, ConversionError, - Transaction as RpcTransaction, TransactionReceipt, + AccessList, ConversionError, Transaction as RpcTransaction, TransactionReceipt, + request::TransactionRequest, trace::otterscan::OtsReceipt, }; use alloy_serde::{OtherFields, WithOtherFields}; use bytes::BufMut; use foundry_evm::traces::CallTraceNode; -use op_alloy_consensus::{TxDeposit, DEPOSIT_TX_TYPE_ID}; -use op_revm::{transaction::deposit::DepositTransactionParts, OpTransaction}; +use op_alloy_consensus::{DEPOSIT_TX_TYPE_ID, TxDeposit}; +use op_revm::{OpTransaction, transaction::deposit::DepositTransactionParts}; use revm::{context::TxEnv, interpreter::InstructionResult}; use serde::{Deserialize, Serialize}; use std::ops::{Deref, Mul}; @@ -1461,7 +1461,7 @@ pub fn convert_to_anvil_receipt(receipt: AnyTransactionReceipt) -> Option().unwrap()).to_vec() ); - unsafe { env::set_var("ANVIL_IP_ADDR", "1.1.1.1"); } + unsafe { + env::set_var("ANVIL_IP_ADDR", "1.1.1.1"); + } let args = NodeArgs::parse_from(["anvil"]); assert_eq!(args.host, vec!["1.1.1.1".parse::().unwrap()]); - unsafe { env::set_var("ANVIL_IP_ADDR", "::1,1.1.1.1,2.2.2.2"); } + unsafe { + env::set_var("ANVIL_IP_ADDR", "::1,1.1.1.1,2.2.2.2"); + } let args = NodeArgs::parse_from(["anvil"]); assert_eq!( args.host, diff --git a/crates/anvil/src/config.rs b/crates/anvil/src/config.rs index e5ffdc31c77fb..352d2e12bcb81 100644 --- a/crates/anvil/src/config.rs +++ b/crates/anvil/src/config.rs @@ -1,4 +1,5 @@ use crate::{ + EthereumHardfork, FeeManager, PrecompileFactory, eth::{ backend::{ db::{Db, SerializableState}, @@ -11,28 +12,27 @@ use crate::{ fees::{INITIAL_BASE_FEE, INITIAL_GAS_PRICE}, pool::transactions::{PoolTransaction, TransactionOrder}, }, - hardfork::{ethereum_hardfork_from_block_tag, spec_id_from_ethereum_hardfork, ChainHardfork}, + hardfork::{ChainHardfork, ethereum_hardfork_from_block_tag, spec_id_from_ethereum_hardfork}, mem::{self, in_memory_db::MemDb}, - EthereumHardfork, FeeManager, PrecompileFactory, }; use alloy_consensus::BlockHeader; use alloy_genesis::Genesis; use alloy_network::{AnyNetwork, TransactionResponse}; use alloy_op_hardforks::OpHardfork; -use alloy_primitives::{hex, map::HashMap, utils::Unit, BlockNumber, TxHash, U256}; +use alloy_primitives::{BlockNumber, TxHash, U256, hex, map::HashMap, utils::Unit}; use alloy_provider::Provider; use alloy_rpc_types::{Block, BlockNumberOrTag}; use alloy_signer::Signer; use alloy_signer_local::{ - coins_bip39::{English, Mnemonic}, MnemonicBuilder, PrivateKeySigner, + coins_bip39::{English, Mnemonic}, }; use alloy_transport::TransportError; use anvil_server::ServerConfig; use eyre::{Context, Result}; use foundry_common::{ - provider::{ProviderBuilder, RetryProvider}, ALCHEMY_FREE_TIER_CUPS, NON_ARCHIVE_NODE_WARNING, REQUEST_TIMEOUT, + provider::{ProviderBuilder, RetryProvider}, }; use foundry_config::Config; use foundry_evm::{ @@ -50,7 +50,7 @@ use revm::{ context_interface::block::BlobExcessGasAndPrice, primitives::hardfork::SpecId, }; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::{ fmt::Write as FmtWrite, fs::File, @@ -429,8 +429,10 @@ impl NodeConfig { impl Default for NodeConfig { fn default() -> Self { // generate some random wallets - let genesis_accounts = - AccountGenerator::new(10).phrase(DEFAULT_MNEMONIC).generate().expect("Invalid mnemonic."); + let genesis_accounts = AccountGenerator::new(10) + .phrase(DEFAULT_MNEMONIC) + .generate() + .expect("Invalid mnemonic."); Self { chain_id: None, gas_limit: None, diff --git a/crates/anvil/src/eth/api.rs b/crates/anvil/src/eth/api.rs index 84cf56c96d9a3..78ebcd6d18ac8 100644 --- a/crates/anvil/src/eth/api.rs +++ b/crates/anvil/src/eth/api.rs @@ -1,11 +1,12 @@ use super::{ backend::{ db::MaybeFullDatabase, - mem::{state, BlockRequest, State}, + mem::{BlockRequest, State, state}, }, sign::build_typed_transaction, }; use crate::{ + ClientFork, LoggingManager, Miner, MiningMode, StorageInfo, eth::{ backend::{ self, @@ -21,36 +22,37 @@ use crate::{ macros::node_info, miner::FixedBlockTimeMiner, pool::{ + Pool, transactions::{ - to_marker, PoolTransaction, TransactionOrder, TransactionPriority, TxMarker, + PoolTransaction, TransactionOrder, TransactionPriority, TxMarker, to_marker, }, - Pool, }, sign::{self, Signer}, }, filter::{EthFilter, Filters, LogsFilter}, mem::transaction_build, - ClientFork, LoggingManager, Miner, MiningMode, StorageInfo, }; use alloy_consensus::{ - transaction::{eip4844::TxEip4844Variant, Recovered}, Account, + transaction::{Recovered, eip4844::TxEip4844Variant}, }; use alloy_dyn_abi::TypedData; use alloy_eips::eip2718::Encodable2718; use alloy_network::{ - eip2718::Decodable2718, AnyRpcBlock, AnyRpcTransaction, BlockResponse, Ethereum, NetworkWallet, - TransactionBuilder, TransactionResponse, + AnyRpcBlock, AnyRpcTransaction, BlockResponse, Ethereum, NetworkWallet, TransactionBuilder, + TransactionResponse, eip2718::Decodable2718, }; use alloy_primitives::{ + Address, B64, B256, Bytes, Signature, TxHash, TxKind, U64, U256, map::{HashMap, HashSet}, - Address, Bytes, Signature, TxHash, TxKind, B256, B64, U256, U64, }; use alloy_provider::utils::{ - eip1559_default_estimator, EIP1559_FEE_ESTIMATION_PAST_BLOCKS, - EIP1559_FEE_ESTIMATION_REWARD_PERCENTILE, + EIP1559_FEE_ESTIMATION_PAST_BLOCKS, EIP1559_FEE_ESTIMATION_REWARD_PERCENTILE, + eip1559_default_estimator, }; use alloy_rpc_types::{ + AccessList, AccessListResult, BlockId, BlockNumberOrTag as BlockNumber, BlockTransactions, + EIP1186AccountProofResponse, FeeHistory, Filter, FilteredParams, Index, Log, Work, anvil::{ ForkedNetwork, Forking, Metadata, MineOptions, NodeEnvironment, NodeForkConfig, NodeInfo, }, @@ -63,21 +65,19 @@ use alloy_rpc_types::{ parity::LocalizedTransactionTrace, }, txpool::{TxpoolContent, TxpoolInspect, TxpoolInspectSummary, TxpoolStatus}, - AccessList, AccessListResult, BlockId, BlockNumberOrTag as BlockNumber, BlockTransactions, - EIP1186AccountProofResponse, FeeHistory, Filter, FilteredParams, Index, Log, Work, }; use alloy_serde::WithOtherFields; -use alloy_sol_types::{sol, SolCall, SolValue}; +use alloy_sol_types::{SolCall, SolValue, sol}; use alloy_transport::TransportErrorKind; use anvil_core::{ eth::{ + EthRequest, block::BlockInfo, transaction::{ - transaction_request_to_typed, PendingTransaction, ReceiptResponse, TypedTransaction, - TypedTransactionRequest, + PendingTransaction, ReceiptResponse, TypedTransaction, TypedTransactionRequest, + transaction_request_to_typed, }, wallet::{WalletCapabilities, WalletError}, - EthRequest, }, types::{ReorgOptions, TransactionData}, }; @@ -85,8 +85,8 @@ use anvil_rpc::{error::RpcError, response::ResponseResult}; use foundry_common::provider::ProviderBuilder; use foundry_evm::{backend::DatabaseError, decode::RevertDecoder}; use futures::{ - channel::{mpsc::Receiver, oneshot}, StreamExt, + channel::{mpsc::Receiver, oneshot}, }; use parking_lot::RwLock; use revm::{ @@ -94,11 +94,11 @@ use revm::{ context::BlockEnv, context_interface::{block::BlobExcessGasAndPrice, result::Output}, database::{CacheDB, DatabaseRef}, - interpreter::{return_ok, return_revert, InstructionResult}, + interpreter::{InstructionResult, return_ok, return_revert}, primitives::eip7702::PER_EMPTY_ACCOUNT_COST, }; use std::{sync::Arc, time::Duration}; -use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver}; +use tokio::sync::mpsc::{UnboundedReceiver, unbounded_channel}; /// The client version: `anvil/v{major}.{minor}.{patch}` pub const CLIENT_VERSION: &str = concat!("anvil/v", env!("CARGO_PKG_VERSION")); @@ -2233,7 +2233,7 @@ impl EthApi { if let Some((_, num)) = pairs.iter().find(|(_, num)| *num >= depth) { return Err(BlockchainError::RpcError(RpcError::invalid_params(format!( "Block number for reorg tx will exceed the reorged chain height. Block number {num} must not exceed (depth-1) {}", - depth-1 + depth - 1 )))); } @@ -3348,11 +3348,7 @@ fn required_marker(provided_nonce: u64, on_chain_nonce: u64, from: Address) -> V return Vec::new(); } let prev_nonce = provided_nonce.saturating_sub(1); - if on_chain_nonce <= prev_nonce { - vec![to_marker(prev_nonce, from)] - } else { - Vec::new() - } + if on_chain_nonce <= prev_nonce { vec![to_marker(prev_nonce, from)] } else { Vec::new() } } fn convert_transact_out(out: &Option) -> Bytes { diff --git a/crates/anvil/src/eth/backend/cheats.rs b/crates/anvil/src/eth/backend/cheats.rs index b2131a3ce08f0..b8beab638a77f 100644 --- a/crates/anvil/src/eth/backend/cheats.rs +++ b/crates/anvil/src/eth/backend/cheats.rs @@ -1,6 +1,6 @@ //! Support for "cheat codes" / bypass functions -use alloy_primitives::{map::AddressHashSet, Address}; +use alloy_primitives::{Address, map::AddressHashSet}; use parking_lot::RwLock; use std::sync::Arc; diff --git a/crates/anvil/src/eth/backend/db.rs b/crates/anvil/src/eth/backend/db.rs index e39baee9193df..0f51f0356b247 100644 --- a/crates/anvil/src/eth/backend/db.rs +++ b/crates/anvil/src/eth/backend/db.rs @@ -2,7 +2,7 @@ use crate::mem::storage::MinedTransaction; use alloy_consensus::Header; -use alloy_primitives::{keccak256, map::HashMap, Address, Bytes, B256, U256}; +use alloy_primitives::{Address, B256, Bytes, U256, keccak256, map::HashMap}; use alloy_rpc_types::BlockId; use anvil_core::eth::{ block::Block, @@ -13,16 +13,16 @@ use foundry_evm::backend::{ BlockchainDb, DatabaseError, DatabaseResult, MemDb, RevertStateSnapshotAction, StateSnapshot, }; use revm::{ + Database, DatabaseCommit, bytecode::Bytecode, context::BlockEnv, database::{CacheDB, DatabaseRef, DbAccount}, primitives::KECCAK_EMPTY, state::AccountInfo, - Database, DatabaseCommit, }; use serde::{ - de::{MapAccess, Visitor}, Deserialize, Deserializer, Serialize, + de::{MapAccess, Visitor}, }; use std::{collections::BTreeMap, fmt, path::Path}; diff --git a/crates/anvil/src/eth/backend/executor.rs b/crates/anvil/src/eth/backend/executor.rs index 2ae228e39dd54..d4140998a697b 100644 --- a/crates/anvil/src/eth/backend/executor.rs +++ b/crates/anvil/src/eth/backend/executor.rs @@ -1,4 +1,5 @@ use crate::{ + PrecompileFactory, eth::{ backend::{ db::Db, env::Env, mem::op_haltreason_to_instruction_result, @@ -9,15 +10,14 @@ use crate::{ }, inject_precompiles, mem::inspector::AnvilInspector, - PrecompileFactory, }; use alloy_consensus::{ - constants::EMPTY_WITHDRAWALS, proofs::calculate_receipt_root, Receipt, ReceiptWithBloom, + Receipt, ReceiptWithBloom, constants::EMPTY_WITHDRAWALS, proofs::calculate_receipt_root, }; use alloy_eips::{eip7685::EMPTY_REQUESTS_HASH, eip7840::BlobParams}; -use alloy_evm::{eth::EthEvmContext, precompiles::PrecompilesMap, EthEvm, Evm}; +use alloy_evm::{EthEvm, Evm, eth::EthEvmContext, precompiles::PrecompilesMap}; use alloy_op_evm::OpEvm; -use alloy_primitives::{Bloom, BloomInput, Log, B256}; +use alloy_primitives::{B256, Bloom, BloomInput, Log}; use anvil_core::eth::{ block::{Block, BlockInfo, PartialHeader}, transaction::{ @@ -26,16 +26,16 @@ use anvil_core::eth::{ }; use foundry_evm::{backend::DatabaseError, traces::CallTraceNode}; use foundry_evm_core::either_evm::EitherEvm; -use op_revm::{precompiles::OpPrecompiles, L1BlockInfo, OpContext}; +use op_revm::{L1BlockInfo, OpContext, precompiles::OpPrecompiles}; use revm::{ + Database, DatabaseRef, Inspector, Journal, context::{Block as RevmBlock, BlockEnv, CfgEnv, Evm as RevmEvm, JournalTr, LocalContext}, context_interface::result::{EVMError, ExecutionResult, Output}, database::WrapDatabaseRef, - handler::{instructions::EthInstructions, EthPrecompiles}, + handler::{EthPrecompiles, instructions::EthInstructions}, interpreter::InstructionResult, - precompile::{secp256r1::P256VERIFY, PrecompileSpecId, Precompiles}, + precompile::{PrecompileSpecId, Precompiles, secp256r1::P256VERIFY}, primitives::hardfork::SpecId, - Database, DatabaseRef, Inspector, Journal, }; use std::sync::Arc; diff --git a/crates/anvil/src/eth/backend/fork.rs b/crates/anvil/src/eth/backend/fork.rs index 841d740abc44f..6ab5b4830bad6 100644 --- a/crates/anvil/src/eth/backend/fork.rs +++ b/crates/anvil/src/eth/backend/fork.rs @@ -5,30 +5,30 @@ use alloy_consensus::Account; use alloy_eips::eip2930::AccessListResult; use alloy_network::{AnyRpcBlock, AnyRpcTransaction, BlockResponse, TransactionResponse}; use alloy_primitives::{ + Address, B256, Bytes, StorageValue, U256, map::{FbHashMap, HashMap}, - Address, Bytes, StorageValue, B256, U256, }; use alloy_provider::{ - ext::{DebugApi, TraceApi}, Provider, + ext::{DebugApi, TraceApi}, }; use alloy_rpc_types::{ + BlockId, BlockNumberOrTag as BlockNumber, BlockTransactions, EIP1186AccountProofResponse, + FeeHistory, Filter, Log, request::TransactionRequest, simulate::{SimulatePayload, SimulatedBlock}, trace::{ geth::{GethDebugTracingOptions, GethTrace}, parity::LocalizedTransactionTrace as Trace, }, - BlockId, BlockNumberOrTag as BlockNumber, BlockTransactions, EIP1186AccountProofResponse, - FeeHistory, Filter, Log, }; use alloy_serde::WithOtherFields; use alloy_transport::TransportError; -use anvil_core::eth::transaction::{convert_to_anvil_receipt, ReceiptResponse}; +use anvil_core::eth::transaction::{ReceiptResponse, convert_to_anvil_receipt}; use foundry_common::provider::{ProviderBuilder, RetryProvider}; use parking_lot::{ - lock_api::{RwLockReadGuard, RwLockWriteGuard}, RawRwLock, RwLock, + lock_api::{RwLockReadGuard, RwLockWriteGuard}, }; use revm::context_interface::block::BlobExcessGasAndPrice; use std::{sync::Arc, time::Duration}; diff --git a/crates/anvil/src/eth/backend/mem/cache.rs b/crates/anvil/src/eth/backend/mem/cache.rs index d4b2779da32b6..6eee7d7106d6e 100644 --- a/crates/anvil/src/eth/backend/mem/cache.rs +++ b/crates/anvil/src/eth/backend/mem/cache.rs @@ -119,11 +119,7 @@ fn build_tmp_dir(p: Option<&Path>) -> io::Result { let prefix = now.format("anvil-state-%d-%m-%Y-%H-%M").to_string(); builder.prefix(&prefix); - if let Some(p) = p { - builder.tempdir_in(p) - } else { - builder.tempdir() - } + if let Some(p) = p { builder.tempdir_in(p) } else { builder.tempdir() } } #[cfg(test)] @@ -136,20 +132,12 @@ mod tests { let dir = tempdir().unwrap(); let p = dir.path(); let cache_dir = build_tmp_dir(Some(p)).unwrap(); - assert!(cache_dir - .path() - .file_name() - .unwrap() - .to_str() - .unwrap() - .starts_with("anvil-state-")); + assert!( + cache_dir.path().file_name().unwrap().to_str().unwrap().starts_with("anvil-state-") + ); let cache_dir = build_tmp_dir(None).unwrap(); - assert!(cache_dir - .path() - .file_name() - .unwrap() - .to_str() - .unwrap() - .starts_with("anvil-state-")); + assert!( + cache_dir.path().file_name().unwrap().to_str().unwrap().starts_with("anvil-state-") + ); } } diff --git a/crates/anvil/src/eth/backend/mem/fork_db.rs b/crates/anvil/src/eth/backend/mem/fork_db.rs index 56a4944ada5a8..107695b6b1544 100644 --- a/crates/anvil/src/eth/backend/mem/fork_db.rs +++ b/crates/anvil/src/eth/backend/mem/fork_db.rs @@ -2,7 +2,7 @@ use crate::eth::backend::db::{ Db, MaybeForkedDatabase, MaybeFullDatabase, SerializableAccountRecord, SerializableBlock, SerializableHistoricalStates, SerializableState, SerializableTransaction, StateDb, }; -use alloy_primitives::{map::HashMap, Address, B256, U256}; +use alloy_primitives::{Address, B256, U256, map::HashMap}; use alloy_rpc_types::BlockId; use foundry_evm::{ backend::{ diff --git a/crates/anvil/src/eth/backend/mem/in_memory_db.rs b/crates/anvil/src/eth/backend/mem/in_memory_db.rs index 08a78b43406c7..fb6667ac8674a 100644 --- a/crates/anvil/src/eth/backend/mem/in_memory_db.rs +++ b/crates/anvil/src/eth/backend/mem/in_memory_db.rs @@ -7,7 +7,7 @@ use crate::{ }, mem::state::state_root, }; -use alloy_primitives::{map::HashMap, Address, B256, U256}; +use alloy_primitives::{Address, B256, U256, map::HashMap}; use alloy_rpc_types::BlockId; use foundry_evm::backend::{BlockchainDb, DatabaseResult, StateSnapshot}; use revm::{ @@ -148,7 +148,7 @@ impl MaybeForkedDatabase for MemDb { #[cfg(test)] mod tests { use super::*; - use alloy_primitives::{address, Bytes}; + use alloy_primitives::{Bytes, address}; use revm::{bytecode::Bytecode, primitives::KECCAK_EMPTY}; use std::collections::BTreeMap; diff --git a/crates/anvil/src/eth/backend/mem/inspector.rs b/crates/anvil/src/eth/backend/mem/inspector.rs index 465febdcd28a4..c5d1291bb4ae2 100644 --- a/crates/anvil/src/eth/backend/mem/inspector.rs +++ b/crates/anvil/src/eth/backend/mem/inspector.rs @@ -9,17 +9,17 @@ use foundry_evm::{ decode::decode_console_logs, inspectors::{LogCollector, TracingInspector}, traces::{ - render_trace_arena_inner, CallTraceDecoder, SparsedTraceArena, TracingInspectorConfig, + CallTraceDecoder, SparsedTraceArena, TracingInspectorConfig, render_trace_arena_inner, }, }; use revm::{ + Database, Inspector, context::ContextTr, inspector::JournalExt, interpreter::{ - interpreter::EthInterpreter, CallInputs, CallOutcome, CreateInputs, CreateOutcome, - Interpreter, + CallInputs, CallOutcome, CreateInputs, CreateOutcome, Interpreter, + interpreter::EthInterpreter, }, - Database, Inspector, }; /// The [`revm::Inspector`] used when transacting in the evm diff --git a/crates/anvil/src/eth/backend/mem/mod.rs b/crates/anvil/src/eth/backend/mem/mod.rs index d0cc3b8795404..c53109b80f67d 100644 --- a/crates/anvil/src/eth/backend/mem/mod.rs +++ b/crates/anvil/src/eth/backend/mem/mod.rs @@ -2,6 +2,7 @@ use self::state::trie_storage; use crate::{ + ForkChoice, NodeConfig, PrecompileFactory, config::PruneStateHistoryConfig, eth::{ backend::{ @@ -16,7 +17,7 @@ use crate::{ storage::MinedTransactionReceipt, }, notifications::{NewBlockNotification, NewBlockNotifications}, - time::{utc_from_secs, TimeManager}, + time::{TimeManager, utc_from_secs}, validate::TransactionValidator, }, error::{BlockchainError, ErrDetail, InvalidTransactionError}, @@ -31,14 +32,13 @@ use crate::{ inspector::AnvilInspector, storage::{BlockchainStorage, InMemoryBlockStates, MinedBlockOutcome}, }, - ForkChoice, NodeConfig, PrecompileFactory, }; use alloy_chains::NamedChain; use alloy_consensus::{ - proofs::{calculate_receipt_root, calculate_transaction_root}, - transaction::Recovered, Account, BlockHeader, EnvKzgSettings, Header, Receipt, ReceiptWithBloom, Signed, Transaction as TransactionTrait, TxEnvelope, + proofs::{calculate_receipt_root, calculate_transaction_root}, + transaction::Recovered, }; use alloy_eips::{ eip1559::BaseFeeParams, @@ -48,16 +48,19 @@ use alloy_eips::{ }, eip7840::BlobParams, }; -use alloy_evm::{eth::EthEvmContext, precompiles::PrecompilesMap, Database, Evm}; +use alloy_evm::{Database, Evm, eth::EthEvmContext, precompiles::PrecompilesMap}; use alloy_network::{ AnyHeader, AnyRpcBlock, AnyRpcHeader, AnyRpcTransaction, AnyTxEnvelope, AnyTxType, EthereumWallet, UnknownTxEnvelope, UnknownTypedTransaction, }; use alloy_primitives::{ - address, hex, keccak256, logs_bloom, map::HashMap, utils::Unit, Address, Bytes, TxHash, TxKind, - B256, U256, U64, + Address, B256, Bytes, TxHash, TxKind, U64, U256, address, hex, keccak256, logs_bloom, + map::HashMap, utils::Unit, }; use alloy_rpc_types::{ + AccessList, Block as AlloyBlock, BlockId, BlockNumberOrTag as BlockNumber, BlockTransactions, + EIP1186AccountProofResponse as AccountProof, EIP1186StorageProof as StorageProof, Filter, + Header as AlloyHeader, Index, Log, Transaction, TransactionReceipt, anvil::Forking, request::TransactionRequest, serde_helpers::JsonStorageKey, @@ -71,27 +74,24 @@ use alloy_rpc_types::{ }, parity::LocalizedTransactionTrace, }, - AccessList, Block as AlloyBlock, BlockId, BlockNumberOrTag as BlockNumber, BlockTransactions, - EIP1186AccountProofResponse as AccountProof, EIP1186StorageProof as StorageProof, Filter, - Header as AlloyHeader, Index, Log, Transaction, TransactionReceipt, }; use alloy_serde::{OtherFields, WithOtherFields}; use alloy_signer::Signature; use alloy_signer_local::PrivateKeySigner; -use alloy_trie::{proof::ProofRetainer, HashBuilder, Nibbles}; +use alloy_trie::{HashBuilder, Nibbles, proof::ProofRetainer}; use anvil_core::eth::{ block::{Block, BlockInfo}, transaction::{ - has_optimism_fields, transaction_request_to_typed, DepositReceipt, - MaybeImpersonatedTransaction, PendingTransaction, ReceiptResponse, TransactionInfo, - TypedReceipt, TypedTransaction, + DepositReceipt, MaybeImpersonatedTransaction, PendingTransaction, ReceiptResponse, + TransactionInfo, TypedReceipt, TypedTransaction, has_optimism_fields, + transaction_request_to_typed, }, wallet::{Capabilities, DelegationCapability, WalletCapabilities}, }; use anvil_rpc::error::RpcError; use chrono::Datelike; use eyre::{Context, Result}; -use flate2::{read::GzDecoder, write::GzEncoder, Compression}; +use flate2::{Compression, read::GzDecoder, write::GzEncoder}; use foundry_evm::{ backend::{DatabaseError, DatabaseResult, RevertStateSnapshotAction}, constants::DEFAULT_CREATE2_DEPLOYER_RUNTIME_CODE, @@ -100,13 +100,14 @@ use foundry_evm::{ traces::TracingInspectorConfig, }; use foundry_evm_core::either_evm::EitherEvm; -use futures::channel::mpsc::{unbounded, UnboundedSender}; +use futures::channel::mpsc::{UnboundedSender, unbounded}; use op_alloy_consensus::DEPOSIT_TX_TYPE_ID; use op_revm::{ - transaction::deposit::DepositTransactionParts, OpContext, OpHaltReason, OpTransaction, + OpContext, OpHaltReason, OpTransaction, transaction::deposit::DepositTransactionParts, }; use parking_lot::{Mutex, RwLock}; use revm::{ + DatabaseCommit, Inspector, context::{Block as RevmBlock, BlockEnv, TxEnv}, context_interface::{ block::BlobExcessGasAndPrice, @@ -115,9 +116,8 @@ use revm::{ database::{CacheDB, DatabaseRef, WrapDatabaseRef}, interpreter::InstructionResult, precompile::secp256r1::P256VERIFY, - primitives::{hardfork::SpecId, KECCAK_EMPTY}, + primitives::{KECCAK_EMPTY, hardfork::SpecId}, state::AccountInfo, - DatabaseCommit, Inspector, }; use revm_inspectors::transfer::TransferInspector; use std::{ @@ -128,7 +128,7 @@ use std::{ sync::Arc, time::Duration, }; -use storage::{Blockchain, MinedTransaction, DEFAULT_HISTORY_LIMIT}; +use storage::{Blockchain, DEFAULT_HISTORY_LIMIT, MinedTransaction}; use tokio::sync::RwLock as AsyncRwLock; use super::executor::new_evm_with_inspector_ref; @@ -151,11 +151,15 @@ pub const EXECUTOR_PK: &str = "0x502d47e1421cb9abef497096728e69f07543232b93ef24d pub const P256_DELEGATION_CONTRACT: Address = address!("0x35202a6e6317f3cc3a177eeee562d3bcda4a6fcc"); // Runtime code of the P256 delegation contract -pub const P256_DELEGATION_RUNTIME_CODE: &[u8] = &hex!("60806040526004361015610018575b361561001657005b005b5f3560e01c806309c5eabe146100c75780630cb6aaf1146100c257806330f6a8e5146100bd5780635fce1927146100b8578063641cdfe2146100b357806376ba882d146100ae5780638d80ff0a146100a9578063972ce4bc146100a4578063a78fc2441461009f578063a82e44e01461009a5763b34893910361000e576108e1565b6108b5565b610786565b610646565b6105ba565b610529565b6103f8565b6103a2565b61034c565b6102c0565b61020b565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff8211176100fc57604052565b6100cc565b6080810190811067ffffffffffffffff8211176100fc57604052565b60a0810190811067ffffffffffffffff8211176100fc57604052565b90601f8019910116810190811067ffffffffffffffff8211176100fc57604052565b6040519061016a608083610139565b565b67ffffffffffffffff81116100fc57601f01601f191660200190565b9291926101948261016c565b916101a26040519384610139565b8294818452818301116101be578281602093845f960137010152565b5f80fd5b9080601f830112156101be578160206101dd93359101610188565b90565b60206003198201126101be576004359067ffffffffffffffff82116101be576101dd916004016101c2565b346101be57610219366101e0565b3033036102295761001690610ae6565b636f6a1b8760e11b5f5260045ffd5b634e487b7160e01b5f52603260045260245ffd5b5f54811015610284575f8080526005919091027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630191565b610238565b8054821015610284575f52600560205f20910201905f90565b906040516102af816100e0565b602060018294805484520154910152565b346101be5760203660031901126101be576004355f548110156101be576102e69061024c565b5060ff815416600182015491610306600360ff60028401541692016102a2565b926040519215158352602083015260028110156103385760a09260209160408401528051606084015201516080820152f35b634e487b7160e01b5f52602160045260245ffd5b346101be575f3660031901126101be576020600254604051908152f35b6004359063ffffffff821682036101be57565b6064359063ffffffff821682036101be57565b6084359063ffffffff821682036101be57565b346101be5760203660031901126101be576103bb610369565b303303610229576103cb9061024c565b50805460ff19169055005b60609060231901126101be57602490565b60609060831901126101be57608490565b346101be5760803660031901126101be57610411610369565b60205f61041d366103d6565b60015461043161042c82610a0b565b600155565b60405184810191825260e086901b6001600160e01b031916602083015261046581602484015b03601f198101835282610139565b51902060ff61047660408401610a19565b161583146104fe576104b2601b925b85813591013590604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa156104f9575f51306001600160a01b03909116036104ea576104df6100169161024c565b50805460ff19169055565b638baa579f60e01b5f5260045ffd5b610a27565b6104b2601c92610485565b60409060031901126101be57600490565b6044359060028210156101be57565b346101be5760803660031901126101be5761054336610509565b61054b61051a565b606435903033036102295761059192610580610587926040519461056e86610101565b60018652602086015260408501610a32565b36906105f3565b6060820152610a3e565b5f545f1981019081116105b55760405163ffffffff919091168152602090f35b0390f35b6109f7565b6100166105c6366101e0565b610ae6565b60409060231901126101be57604051906105e4826100e0565b60243582526044356020830152565b91908260409103126101be5760405161060b816100e0565b6020808294803584520135910152565b6084359081151582036101be57565b60a4359081151582036101be57565b359081151582036101be57565b346101be5760a03660031901126101be5760043567ffffffffffffffff81116101be576106779036906004016101c2565b610680366105cb565b61068861037c565b61069061061b565b906002546106a56106a082610a0b565b600255565b6040516106bb8161045788602083019586610b6a565b51902091610747575b6106d06106d69161024c565b50610b7b565b906106e86106e48351151590565b1590565b610738576020820151801515908161072e575b5061071f576107129260606106e493015191610ce3565b6104ea5761001690610ae6565b632572e3a960e01b5f5260045ffd5b905042115f6106fb565b637dd286d760e11b5f5260045ffd5b905f61077361045761076760209460405192839187830160209181520190565b60405191828092610b58565b039060025afa156104f9575f51906106c4565b346101be5760e03660031901126101be576107a036610509565b6107a861051a565b6064359060205f6107b8366103e7565b6001546107c761042c82610a0b565b60408051808601928352883560208401528589013591830191909152606082018790526107f78160808401610457565b51902060ff61080860408401610a19565b161583146108aa5760408051918252601b602083015282359082015290830135606082015280608081015b838052039060015afa156104f9575f51306001600160a01b03909116036104ea5761087a926105806105879261086761015b565b6001815294602086015260408501610a32565b6105b161089361088a5f54610ad8565b63ffffffff1690565b60405163ffffffff90911681529081906020820190565b610833601c92610485565b346101be575f3660031901126101be576020600154604051908152f35b359061ffff821682036101be57565b346101be5760c03660031901126101be5760043567ffffffffffffffff81116101be576109129036906004016101c2565b61091b366105cb565b906064359167ffffffffffffffff83116101be5760a060031984360301126101be576040516109498161011d565b836004013567ffffffffffffffff81116101be5761096d90600436918701016101c2565b8152602484013567ffffffffffffffff81116101be57840193366023860112156101be5760846109db916109ae610016973690602460048201359101610188565b60208501526109bf604482016108d2565b60408501526109d0606482016108d2565b606085015201610639565b60808201526109e861038f565b916109f161062a565b93610bc3565b634e487b7160e01b5f52601160045260245ffd5b5f1981146105b55760010190565b3560ff811681036101be5790565b6040513d5f823e3d90fd5b60028210156103385752565b5f54680100000000000000008110156100fc57806001610a6192015f555f610289565b610ac557610a7e82511515829060ff801983541691151516179055565b6020820151600182015560028101604083015160028110156103385761016a9360039260609260ff8019835416911617905501519101906020600191805184550151910155565b634e487b7160e01b5f525f60045260245ffd5b5f198101919082116105b557565b80519060205b828110610af857505050565b808201805160f81c600182015160601c91601581015160358201519384915f9493845f14610b4257505050506001146101be575b15610b3a5701605501610aec565b3d5f803e3d5ffd5b5f95508594506055019130811502175af1610b2c565b805191908290602001825e015f815290565b6020906101dd939281520190610b58565b90604051610b8881610101565b6060610bbe6003839560ff8154161515855260018101546020860152610bb860ff60028301541660408701610a32565b016102a2565b910152565b93909192600254610bd66106a082610a0b565b604051610bec8161045789602083019586610b6a565b51902091610c50575b6106d0610c019161024c565b91610c0f6106e48451151590565b6107385760208301518015159081610c46575b5061071f57610c399360606106e494015192610e0d565b6104ea5761016a90610ae6565b905042115f610c22565b905f610c7061045761076760209460405192839187830160209181520190565b039060025afa156104f9575f5190610bf5565b3d15610cad573d90610c948261016c565b91610ca26040519384610139565b82523d5f602084013e565b606090565b8051601f101561028457603f0190565b8051602010156102845760400190565b908151811015610284570160200190565b5f9291839260208251920151906020815191015191604051936020850195865260408501526060840152608083015260a082015260a08152610d2660c082610139565b519060145afa610d34610c83565b81610d74575b81610d43575090565b600160f81b91506001600160f81b031990610d6f90610d6190610cb2565b516001600160f81b03191690565b161490565b80516020149150610d3a565b60405190610d8f604083610139565b6015825274113a3cb832911d113bb2b130baba34371733b2ba1160591b6020830152565b9061016a6001610de3936040519485916c1131b430b63632b733b2911d1160991b6020840152602d830190610b58565b601160f91b815203601e19810185520183610139565b610e069060209392610b58565b9081520190565b92919281516025815110908115610f0a575b50610ef957610e2c610d80565b90610e596106e460208501938451610e53610e4c606089015161ffff1690565b61ffff1690565b91610f9b565b610f01576106e4610e8d610e88610457610e83610ea1956040519283916020830160209181520190565b611012565b610db3565b8351610e53610e4c604088015161ffff1690565b610ef9575f610eb96020925160405191828092610b58565b039060025afa156104f9575f610ee360209261076783519151610457604051938492888401610df9565b039060025afa156104f9576101dd915f51610ce3565b505050505f90565b50505050505f90565b610f2b9150610f1e610d616106e492610cc2565b6080850151151590610f31565b5f610e1f565b906001600160f81b0319600160f81b831601610f955780610f85575b610f8057601f60fb1b600160fb1b821601610f69575b50600190565b600160fc1b90811614610f7c575f610f63565b5f90565b505f90565b50600160fa1b8181161415610f4d565b50505f90565b80519282515f5b858110610fb457505050505050600190565b8083018084116105b5578281101561100757610fe56001600160f81b0319610fdc8488610cd2565b51169187610cd2565b516001600160f81b03191603610ffd57600101610fa2565b5050505050505f90565b505050505050505f90565b80516060929181611021575050565b9092506003600284010460021b604051937f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f603f52602085019282860191602083019460208284010190600460038351955f85525b0191603f8351818160121c16515f538181600c1c1651600153818160061c165160025316516003535f5181520190878210156110db5760049060039061109a565b5095505f93600393604092520160405206600204809303613d3d60f01b81525203825256fea26469706673582212200ba93b78f286a25ece47e9403c47be9862f9b8b70ba1a95098667b90c47308b064736f6c634300081a0033"); +pub const P256_DELEGATION_RUNTIME_CODE: &[u8] = &hex!( + "60806040526004361015610018575b361561001657005b005b5f3560e01c806309c5eabe146100c75780630cb6aaf1146100c257806330f6a8e5146100bd5780635fce1927146100b8578063641cdfe2146100b357806376ba882d146100ae5780638d80ff0a146100a9578063972ce4bc146100a4578063a78fc2441461009f578063a82e44e01461009a5763b34893910361000e576108e1565b6108b5565b610786565b610646565b6105ba565b610529565b6103f8565b6103a2565b61034c565b6102c0565b61020b565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff8211176100fc57604052565b6100cc565b6080810190811067ffffffffffffffff8211176100fc57604052565b60a0810190811067ffffffffffffffff8211176100fc57604052565b90601f8019910116810190811067ffffffffffffffff8211176100fc57604052565b6040519061016a608083610139565b565b67ffffffffffffffff81116100fc57601f01601f191660200190565b9291926101948261016c565b916101a26040519384610139565b8294818452818301116101be578281602093845f960137010152565b5f80fd5b9080601f830112156101be578160206101dd93359101610188565b90565b60206003198201126101be576004359067ffffffffffffffff82116101be576101dd916004016101c2565b346101be57610219366101e0565b3033036102295761001690610ae6565b636f6a1b8760e11b5f5260045ffd5b634e487b7160e01b5f52603260045260245ffd5b5f54811015610284575f8080526005919091027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630191565b610238565b8054821015610284575f52600560205f20910201905f90565b906040516102af816100e0565b602060018294805484520154910152565b346101be5760203660031901126101be576004355f548110156101be576102e69061024c565b5060ff815416600182015491610306600360ff60028401541692016102a2565b926040519215158352602083015260028110156103385760a09260209160408401528051606084015201516080820152f35b634e487b7160e01b5f52602160045260245ffd5b346101be575f3660031901126101be576020600254604051908152f35b6004359063ffffffff821682036101be57565b6064359063ffffffff821682036101be57565b6084359063ffffffff821682036101be57565b346101be5760203660031901126101be576103bb610369565b303303610229576103cb9061024c565b50805460ff19169055005b60609060231901126101be57602490565b60609060831901126101be57608490565b346101be5760803660031901126101be57610411610369565b60205f61041d366103d6565b60015461043161042c82610a0b565b600155565b60405184810191825260e086901b6001600160e01b031916602083015261046581602484015b03601f198101835282610139565b51902060ff61047660408401610a19565b161583146104fe576104b2601b925b85813591013590604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa156104f9575f51306001600160a01b03909116036104ea576104df6100169161024c565b50805460ff19169055565b638baa579f60e01b5f5260045ffd5b610a27565b6104b2601c92610485565b60409060031901126101be57600490565b6044359060028210156101be57565b346101be5760803660031901126101be5761054336610509565b61054b61051a565b606435903033036102295761059192610580610587926040519461056e86610101565b60018652602086015260408501610a32565b36906105f3565b6060820152610a3e565b5f545f1981019081116105b55760405163ffffffff919091168152602090f35b0390f35b6109f7565b6100166105c6366101e0565b610ae6565b60409060231901126101be57604051906105e4826100e0565b60243582526044356020830152565b91908260409103126101be5760405161060b816100e0565b6020808294803584520135910152565b6084359081151582036101be57565b60a4359081151582036101be57565b359081151582036101be57565b346101be5760a03660031901126101be5760043567ffffffffffffffff81116101be576106779036906004016101c2565b610680366105cb565b61068861037c565b61069061061b565b906002546106a56106a082610a0b565b600255565b6040516106bb8161045788602083019586610b6a565b51902091610747575b6106d06106d69161024c565b50610b7b565b906106e86106e48351151590565b1590565b610738576020820151801515908161072e575b5061071f576107129260606106e493015191610ce3565b6104ea5761001690610ae6565b632572e3a960e01b5f5260045ffd5b905042115f6106fb565b637dd286d760e11b5f5260045ffd5b905f61077361045761076760209460405192839187830160209181520190565b60405191828092610b58565b039060025afa156104f9575f51906106c4565b346101be5760e03660031901126101be576107a036610509565b6107a861051a565b6064359060205f6107b8366103e7565b6001546107c761042c82610a0b565b60408051808601928352883560208401528589013591830191909152606082018790526107f78160808401610457565b51902060ff61080860408401610a19565b161583146108aa5760408051918252601b602083015282359082015290830135606082015280608081015b838052039060015afa156104f9575f51306001600160a01b03909116036104ea5761087a926105806105879261086761015b565b6001815294602086015260408501610a32565b6105b161089361088a5f54610ad8565b63ffffffff1690565b60405163ffffffff90911681529081906020820190565b610833601c92610485565b346101be575f3660031901126101be576020600154604051908152f35b359061ffff821682036101be57565b346101be5760c03660031901126101be5760043567ffffffffffffffff81116101be576109129036906004016101c2565b61091b366105cb565b906064359167ffffffffffffffff83116101be5760a060031984360301126101be576040516109498161011d565b836004013567ffffffffffffffff81116101be5761096d90600436918701016101c2565b8152602484013567ffffffffffffffff81116101be57840193366023860112156101be5760846109db916109ae610016973690602460048201359101610188565b60208501526109bf604482016108d2565b60408501526109d0606482016108d2565b606085015201610639565b60808201526109e861038f565b916109f161062a565b93610bc3565b634e487b7160e01b5f52601160045260245ffd5b5f1981146105b55760010190565b3560ff811681036101be5790565b6040513d5f823e3d90fd5b60028210156103385752565b5f54680100000000000000008110156100fc57806001610a6192015f555f610289565b610ac557610a7e82511515829060ff801983541691151516179055565b6020820151600182015560028101604083015160028110156103385761016a9360039260609260ff8019835416911617905501519101906020600191805184550151910155565b634e487b7160e01b5f525f60045260245ffd5b5f198101919082116105b557565b80519060205b828110610af857505050565b808201805160f81c600182015160601c91601581015160358201519384915f9493845f14610b4257505050506001146101be575b15610b3a5701605501610aec565b3d5f803e3d5ffd5b5f95508594506055019130811502175af1610b2c565b805191908290602001825e015f815290565b6020906101dd939281520190610b58565b90604051610b8881610101565b6060610bbe6003839560ff8154161515855260018101546020860152610bb860ff60028301541660408701610a32565b016102a2565b910152565b93909192600254610bd66106a082610a0b565b604051610bec8161045789602083019586610b6a565b51902091610c50575b6106d0610c019161024c565b91610c0f6106e48451151590565b6107385760208301518015159081610c46575b5061071f57610c399360606106e494015192610e0d565b6104ea5761016a90610ae6565b905042115f610c22565b905f610c7061045761076760209460405192839187830160209181520190565b039060025afa156104f9575f5190610bf5565b3d15610cad573d90610c948261016c565b91610ca26040519384610139565b82523d5f602084013e565b606090565b8051601f101561028457603f0190565b8051602010156102845760400190565b908151811015610284570160200190565b5f9291839260208251920151906020815191015191604051936020850195865260408501526060840152608083015260a082015260a08152610d2660c082610139565b519060145afa610d34610c83565b81610d74575b81610d43575090565b600160f81b91506001600160f81b031990610d6f90610d6190610cb2565b516001600160f81b03191690565b161490565b80516020149150610d3a565b60405190610d8f604083610139565b6015825274113a3cb832911d113bb2b130baba34371733b2ba1160591b6020830152565b9061016a6001610de3936040519485916c1131b430b63632b733b2911d1160991b6020840152602d830190610b58565b601160f91b815203601e19810185520183610139565b610e069060209392610b58565b9081520190565b92919281516025815110908115610f0a575b50610ef957610e2c610d80565b90610e596106e460208501938451610e53610e4c606089015161ffff1690565b61ffff1690565b91610f9b565b610f01576106e4610e8d610e88610457610e83610ea1956040519283916020830160209181520190565b611012565b610db3565b8351610e53610e4c604088015161ffff1690565b610ef9575f610eb96020925160405191828092610b58565b039060025afa156104f9575f610ee360209261076783519151610457604051938492888401610df9565b039060025afa156104f9576101dd915f51610ce3565b505050505f90565b50505050505f90565b610f2b9150610f1e610d616106e492610cc2565b6080850151151590610f31565b5f610e1f565b906001600160f81b0319600160f81b831601610f955780610f85575b610f8057601f60fb1b600160fb1b821601610f69575b50600190565b600160fc1b90811614610f7c575f610f63565b5f90565b505f90565b50600160fa1b8181161415610f4d565b50505f90565b80519282515f5b858110610fb457505050505050600190565b8083018084116105b5578281101561100757610fe56001600160f81b0319610fdc8488610cd2565b51169187610cd2565b516001600160f81b03191603610ffd57600101610fa2565b5050505050505f90565b505050505050505f90565b80516060929181611021575050565b9092506003600284010460021b604051937f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f603f52602085019282860191602083019460208284010190600460038351955f85525b0191603f8351818160121c16515f538181600c1c1651600153818160061c165160025316516003535f5181520190878210156110db5760049060039061109a565b5095505f93600393604092520160405206600204809303613d3d60f01b81525203825256fea26469706673582212200ba93b78f286a25ece47e9403c47be9862f9b8b70ba1a95098667b90c47308b064736f6c634300081a0033" +); // Experimental ERC20 pub const EXP_ERC20_CONTRACT: Address = address!("0x238c8CD93ee9F8c7Edf395548eF60c0d2e46665E"); // Runtime code of the experimental ERC20 contract -pub const EXP_ERC20_RUNTIME_CODE: &[u8] = &hex!("60806040526004361015610010575b005b5f3560e01c806306fdde03146106f7578063095ea7b31461068c57806318160ddd1461066757806323b872dd146105a15780632bb7c5951461050e578063313ce567146104f35780633644e5151461045557806340c10f191461043057806370a08231146103fe5780637ecebe00146103cc57806395d89b4114610366578063a9059cbb146102ea578063ad0c8fdd146102ad578063d505accf146100fb5763dd62ed3e0361000e57346100f75760403660031901126100f7576100d261075c565b6100da610772565b602052637f5e9f20600c525f5260206034600c2054604051908152f35b5f80fd5b346100f75760e03660031901126100f75761011461075c565b61011c610772565b6084359160643560443560ff851685036100f757610138610788565b60208101906e04578706572696d656e74455243323608c1b8252519020908242116102a0576040519360018060a01b03169460018060a01b03169565383775081901600e52855f5260c06020600c20958654957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252602082019586528660408301967fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc688528b6060850198468a528c608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9885252528688525260a082015220604e526042602c205f5260ff1660205260a43560405260c43560605260208060805f60015afa93853d5103610293577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92594602094019055856303faf4f960a51b176040526034602c2055a3005b63ddafbaef5f526004601cfd5b631a15a3cc5f526004601cfd5b5f3660031901126100f7576103e834023481046103e814341517156102d65761000e90336107ac565b634e487b7160e01b5f52601160045260245ffd5b346100f75760403660031901126100f75761030361075c565b602435906387a211a2600c52335f526020600c2080548084116103595783900390555f526020600c20818154019055602052600c5160601c335f51602061080d5f395f51905f52602080a3602060405160018152f35b63f4d678b85f526004601cfd5b346100f7575f3660031901126100f757604051604081019080821067ffffffffffffffff8311176103b8576103b491604052600381526204558560ec1b602082015260405191829182610732565b0390f35b634e487b7160e01b5f52604160045260245ffd5b346100f75760203660031901126100f7576103e561075c565b6338377508600c525f52602080600c2054604051908152f35b346100f75760203660031901126100f75761041761075c565b6387a211a2600c525f52602080600c2054604051908152f35b346100f75760403660031901126100f75761000e61044c61075c565b602435906107ac565b346100f7575f3660031901126100f757602060a0610471610788565b828101906e04578706572696d656e74455243323608c1b8252519020604051907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252838201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015220604051908152f35b346100f7575f3660031901126100f757602060405160128152f35b346100f75760203660031901126100f7576004356387a211a2600c52335f526020600c2090815490818111610359575f80806103e88487839688039055806805345cdf77eb68f44c54036805345cdf77eb68f44c5580835282335f51602061080d5f395f51905f52602083a304818115610598575b3390f11561058d57005b6040513d5f823e3d90fd5b506108fc610583565b346100f75760603660031901126100f7576105ba61075c565b6105c2610772565b604435908260601b33602052637f5e9f208117600c526034600c20908154918219610643575b506387a211a2915017600c526020600c2080548084116103595783900390555f526020600c20818154019055602052600c5160601c9060018060a01b03165f51602061080d5f395f51905f52602080a3602060405160018152f35b82851161065a57846387a211a293039055856105e8565b6313be252b5f526004601cfd5b346100f7575f3660031901126100f75760206805345cdf77eb68f44c54604051908152f35b346100f75760403660031901126100f7576106a561075c565b60243590602052637f5e9f20600c52335f52806034600c20555f52602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa3602060405160018152f35b346100f7575f3660031901126100f7576103b4610712610788565b6e04578706572696d656e74455243323608c1b6020820152604051918291825b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100f757565b602435906001600160a01b03821682036100f757565b604051906040820182811067ffffffffffffffff8211176103b857604052600f8252565b6805345cdf77eb68f44c548281019081106107ff576805345cdf77eb68f44c556387a211a2600c525f526020600c20818154019055602052600c5160601c5f5f51602061080d5f395f51905f52602080a3565b63e5cfe9575f526004601cfdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220fbe302881d9891005ba1448ba48547cc1cb17dea1a5c4011dfcb035de325bb1d64736f6c634300081b0033"); +pub const EXP_ERC20_RUNTIME_CODE: &[u8] = &hex!( + "60806040526004361015610010575b005b5f3560e01c806306fdde03146106f7578063095ea7b31461068c57806318160ddd1461066757806323b872dd146105a15780632bb7c5951461050e578063313ce567146104f35780633644e5151461045557806340c10f191461043057806370a08231146103fe5780637ecebe00146103cc57806395d89b4114610366578063a9059cbb146102ea578063ad0c8fdd146102ad578063d505accf146100fb5763dd62ed3e0361000e57346100f75760403660031901126100f7576100d261075c565b6100da610772565b602052637f5e9f20600c525f5260206034600c2054604051908152f35b5f80fd5b346100f75760e03660031901126100f75761011461075c565b61011c610772565b6084359160643560443560ff851685036100f757610138610788565b60208101906e04578706572696d656e74455243323608c1b8252519020908242116102a0576040519360018060a01b03169460018060a01b03169565383775081901600e52855f5260c06020600c20958654957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252602082019586528660408301967fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc688528b6060850198468a528c608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9885252528688525260a082015220604e526042602c205f5260ff1660205260a43560405260c43560605260208060805f60015afa93853d5103610293577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92594602094019055856303faf4f960a51b176040526034602c2055a3005b63ddafbaef5f526004601cfd5b631a15a3cc5f526004601cfd5b5f3660031901126100f7576103e834023481046103e814341517156102d65761000e90336107ac565b634e487b7160e01b5f52601160045260245ffd5b346100f75760403660031901126100f75761030361075c565b602435906387a211a2600c52335f526020600c2080548084116103595783900390555f526020600c20818154019055602052600c5160601c335f51602061080d5f395f51905f52602080a3602060405160018152f35b63f4d678b85f526004601cfd5b346100f7575f3660031901126100f757604051604081019080821067ffffffffffffffff8311176103b8576103b491604052600381526204558560ec1b602082015260405191829182610732565b0390f35b634e487b7160e01b5f52604160045260245ffd5b346100f75760203660031901126100f7576103e561075c565b6338377508600c525f52602080600c2054604051908152f35b346100f75760203660031901126100f75761041761075c565b6387a211a2600c525f52602080600c2054604051908152f35b346100f75760403660031901126100f75761000e61044c61075c565b602435906107ac565b346100f7575f3660031901126100f757602060a0610471610788565b828101906e04578706572696d656e74455243323608c1b8252519020604051907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252838201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015220604051908152f35b346100f7575f3660031901126100f757602060405160128152f35b346100f75760203660031901126100f7576004356387a211a2600c52335f526020600c2090815490818111610359575f80806103e88487839688039055806805345cdf77eb68f44c54036805345cdf77eb68f44c5580835282335f51602061080d5f395f51905f52602083a304818115610598575b3390f11561058d57005b6040513d5f823e3d90fd5b506108fc610583565b346100f75760603660031901126100f7576105ba61075c565b6105c2610772565b604435908260601b33602052637f5e9f208117600c526034600c20908154918219610643575b506387a211a2915017600c526020600c2080548084116103595783900390555f526020600c20818154019055602052600c5160601c9060018060a01b03165f51602061080d5f395f51905f52602080a3602060405160018152f35b82851161065a57846387a211a293039055856105e8565b6313be252b5f526004601cfd5b346100f7575f3660031901126100f75760206805345cdf77eb68f44c54604051908152f35b346100f75760403660031901126100f7576106a561075c565b60243590602052637f5e9f20600c52335f52806034600c20555f52602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa3602060405160018152f35b346100f7575f3660031901126100f7576103b4610712610788565b6e04578706572696d656e74455243323608c1b6020820152604051918291825b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100f757565b602435906001600160a01b03821682036100f757565b604051906040820182811067ffffffffffffffff8211176103b857604052600f8252565b6805345cdf77eb68f44c548281019081106107ff576805345cdf77eb68f44c556387a211a2600c525f526020600c20818154019055602052600c5160601c5f5f51602061080d5f395f51905f52602080a3565b63e5cfe9575f526004601cfdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220fbe302881d9891005ba1448ba48547cc1cb17dea1a5c4011dfcb035de325bb1d64736f6c634300081b0033" +); pub type State = foundry_evm::utils::StateChangeset; diff --git a/crates/anvil/src/eth/backend/mem/state.rs b/crates/anvil/src/eth/backend/mem/state.rs index 7adb49f15512d..19ecb4abfb5d3 100644 --- a/crates/anvil/src/eth/backend/mem/state.rs +++ b/crates/anvil/src/eth/backend/mem/state.rs @@ -1,9 +1,9 @@ //! Support for generating the state root for memdb storage use crate::eth::error::BlockchainError; -use alloy_primitives::{keccak256, map::HashMap, Address, B256, U256}; +use alloy_primitives::{Address, B256, U256, keccak256, map::HashMap}; use alloy_rlp::Encodable; -use alloy_rpc_types::{state::StateOverride, BlockOverrides}; +use alloy_rpc_types::{BlockOverrides, state::StateOverride}; use alloy_trie::{HashBuilder, Nibbles}; use foundry_evm::backend::DatabaseError; use revm::{ diff --git a/crates/anvil/src/eth/backend/mem/storage.rs b/crates/anvil/src/eth/backend/mem/storage.rs index 252435291cc68..2000f2dc692c9 100644 --- a/crates/anvil/src/eth/backend/mem/storage.rs +++ b/crates/anvil/src/eth/backend/mem/storage.rs @@ -14,10 +14,11 @@ use crate::eth::{ use alloy_consensus::constants::EMPTY_WITHDRAWALS; use alloy_eips::eip7685::EMPTY_REQUESTS_HASH; use alloy_primitives::{ + B256, Bytes, U256, map::{B256HashMap, HashMap}, - Bytes, B256, U256, }; use alloy_rpc_types::{ + BlockId, BlockNumberOrTag, TransactionInfo as RethTransactionInfo, trace::{ geth::{ FourByteFrame, GethDebugBuiltInTracerType, GethDebugTracerType, @@ -26,7 +27,6 @@ use alloy_rpc_types::{ otterscan::{InternalOperation, OperationType}, parity::LocalizedTransactionTrace, }, - BlockId, BlockNumberOrTag, TransactionInfo as RethTransactionInfo, }; use anvil_core::eth::{ block::{Block, PartialHeader}, @@ -609,7 +609,7 @@ pub struct MinedTransactionReceipt { mod tests { use super::*; use crate::eth::backend::db::Db; - use alloy_primitives::{hex, Address}; + use alloy_primitives::{Address, hex}; use alloy_rlp::Decodable; use anvil_core::eth::transaction::TypedTransaction; use revm::{database::DatabaseRef, state::AccountInfo}; diff --git a/crates/anvil/src/eth/error.rs b/crates/anvil/src/eth/error.rs index bd0c3b6e798d7..264c720dac648 100644 --- a/crates/anvil/src/eth/error.rs +++ b/crates/anvil/src/eth/error.rs @@ -80,15 +80,25 @@ pub enum BlockchainError { TimestampError(String), #[error(transparent)] DatabaseError(#[from] DatabaseError), - #[error("EIP-1559 style fee params (maxFeePerGas or maxPriorityFeePerGas) received but they are not supported by the current hardfork.\n\nYou can use them by running anvil with '--hardfork london' or later.")] + #[error( + "EIP-1559 style fee params (maxFeePerGas or maxPriorityFeePerGas) received but they are not supported by the current hardfork.\n\nYou can use them by running anvil with '--hardfork london' or later." + )] EIP1559TransactionUnsupportedAtHardfork, - #[error("Access list received but is not supported by the current hardfork.\n\nYou can use it by running anvil with '--hardfork berlin' or later.")] + #[error( + "Access list received but is not supported by the current hardfork.\n\nYou can use it by running anvil with '--hardfork berlin' or later." + )] EIP2930TransactionUnsupportedAtHardfork, - #[error("EIP-4844 fields received but is not supported by the current hardfork.\n\nYou can use it by running anvil with '--hardfork cancun' or later.")] + #[error( + "EIP-4844 fields received but is not supported by the current hardfork.\n\nYou can use it by running anvil with '--hardfork cancun' or later." + )] EIP4844TransactionUnsupportedAtHardfork, - #[error("EIP-7702 fields received but is not supported by the current hardfork.\n\nYou can use it by running anvil with '--hardfork prague' or later.")] + #[error( + "EIP-7702 fields received but is not supported by the current hardfork.\n\nYou can use it by running anvil with '--hardfork prague' or later." + )] EIP7702TransactionUnsupportedAtHardfork, - #[error("op-stack deposit tx received but is not supported.\n\nYou can use it by running anvil with '--optimism'.")] + #[error( + "op-stack deposit tx received but is not supported.\n\nYou can use it by running anvil with '--optimism'." + )] DepositTransactionUnsupported, #[error("UnknownTransactionType not supported ")] UnknownTransactionType, diff --git a/crates/anvil/src/eth/fees.rs b/crates/anvil/src/eth/fees.rs index 4ed0456a78697..98173694801bb 100644 --- a/crates/anvil/src/eth/fees.rs +++ b/crates/anvil/src/eth/fees.rs @@ -96,19 +96,11 @@ impl FeeManager { /// Calculates the current blob gas price pub fn blob_gas_price(&self) -> u128 { - if self.is_eip4844() { - self.base_fee_per_blob_gas() - } else { - 0 - } + if self.is_eip4844() { self.base_fee_per_blob_gas() } else { 0 } } pub fn base_fee(&self) -> u64 { - if self.is_eip1559() { - *self.base_fee.read() - } else { - 0 - } + if self.is_eip1559() { *self.base_fee.read() } else { 0 } } pub fn is_min_priority_fee_enforced(&self) -> bool { @@ -121,19 +113,11 @@ impl FeeManager { } pub fn excess_blob_gas_and_price(&self) -> Option { - if self.is_eip4844() { - Some(*self.blob_excess_gas_and_price.read()) - } else { - None - } + if self.is_eip4844() { Some(*self.blob_excess_gas_and_price.read()) } else { None } } pub fn base_fee_per_blob_gas(&self) -> u128 { - if self.is_eip4844() { - self.blob_excess_gas_and_price.read().blob_gasprice - } else { - 0 - } + if self.is_eip4844() { self.blob_excess_gas_and_price.read().blob_gasprice } else { 0 } } /// Returns the current gas price diff --git a/crates/anvil/src/eth/miner.rs b/crates/anvil/src/eth/miner.rs index fec6ff966738b..3ec310b54b29e 100644 --- a/crates/anvil/src/eth/miner.rs +++ b/crates/anvil/src/eth/miner.rs @@ -1,17 +1,17 @@ //! Mines transactions -use crate::eth::pool::{transactions::PoolTransaction, Pool}; +use crate::eth::pool::{Pool, transactions::PoolTransaction}; use alloy_primitives::TxHash; use futures::{ channel::mpsc::Receiver, stream::{Fuse, StreamExt}, task::AtomicWaker, }; -use parking_lot::{lock_api::RwLockWriteGuard, RawRwLock, RwLock}; +use parking_lot::{RawRwLock, RwLock, lock_api::RwLockWriteGuard}; use std::{ fmt, sync::Arc, - task::{ready, Context, Poll}, + task::{Context, Poll, ready}, time::Duration, }; use tokio::time::{Interval, MissedTickBehavior}; diff --git a/crates/anvil/src/eth/otterscan/api.rs b/crates/anvil/src/eth/otterscan/api.rs index 66322bd21a392..02487b4f7f9f4 100644 --- a/crates/anvil/src/eth/otterscan/api.rs +++ b/crates/anvil/src/eth/otterscan/api.rs @@ -1,15 +1,16 @@ use crate::eth::{ + EthApi, error::{BlockchainError, Result}, macros::node_info, - EthApi, }; use alloy_consensus::Transaction as TransactionTrait; use alloy_network::{ AnyHeader, AnyRpcBlock, AnyRpcHeader, AnyRpcTransaction, AnyTxEnvelope, BlockResponse, TransactionResponse, }; -use alloy_primitives::{Address, Bytes, B256, U256}; +use alloy_primitives::{Address, B256, Bytes, U256}; use alloy_rpc_types::{ + Block, BlockId, BlockNumberOrTag as BlockNumber, BlockTransactions, trace::{ otterscan::{ BlockDetails, ContractCreator, InternalOperation, OtsBlock, OtsBlockTransactions, @@ -20,7 +21,6 @@ use alloy_rpc_types::{ RewardAction, TraceOutput, }, }, - Block, BlockId, BlockNumberOrTag as BlockNumber, BlockTransactions, }; use itertools::Itertools; diff --git a/crates/anvil/src/eth/pool/mod.rs b/crates/anvil/src/eth/pool/mod.rs index 2133ea083df24..fc3b126e9cf8d 100644 --- a/crates/anvil/src/eth/pool/mod.rs +++ b/crates/anvil/src/eth/pool/mod.rs @@ -39,7 +39,7 @@ use crate::{ use alloy_primitives::{Address, TxHash}; use alloy_rpc_types::txpool::TxpoolStatus; use anvil_core::eth::transaction::PendingTransaction; -use futures::channel::mpsc::{channel, Receiver, Sender}; +use futures::channel::mpsc::{Receiver, Sender, channel}; use parking_lot::{Mutex, RwLock}; use std::{collections::VecDeque, fmt, sync::Arc}; diff --git a/crates/anvil/src/eth/pool/transactions.rs b/crates/anvil/src/eth/pool/transactions.rs index 293c7ce3b6e7b..7b68f9778fa3c 100644 --- a/crates/anvil/src/eth/pool/transactions.rs +++ b/crates/anvil/src/eth/pool/transactions.rs @@ -1,8 +1,8 @@ use crate::eth::{error::PoolError, util::hex_fmt_many}; use alloy_network::AnyRpcTransaction; use alloy_primitives::{ - map::{HashMap, HashSet}, Address, TxHash, + map::{HashMap, HashSet}, }; use anvil_core::eth::transaction::{PendingTransaction, TypedTransaction}; use parking_lot::RwLock; diff --git a/crates/anvil/src/eth/sign.rs b/crates/anvil/src/eth/sign.rs index 3dc07f347f16c..57f273953c620 100644 --- a/crates/anvil/src/eth/sign.rs +++ b/crates/anvil/src/eth/sign.rs @@ -2,7 +2,7 @@ use crate::eth::error::BlockchainError; use alloy_consensus::SignableTransaction; use alloy_dyn_abi::TypedData; use alloy_network::TxSignerSync; -use alloy_primitives::{map::AddressHashMap, Address, Signature, B256}; +use alloy_primitives::{Address, B256, Signature, map::AddressHashMap}; use alloy_signer::Signer as AlloySigner; use alloy_signer_local::PrivateKeySigner; use anvil_core::eth::transaction::{TypedTransaction, TypedTransactionRequest}; diff --git a/crates/anvil/src/evm.rs b/crates/anvil/src/evm.rs index 0d70250c4cb6e..d426fdb4e925a 100644 --- a/crates/anvil/src/evm.rs +++ b/crates/anvil/src/evm.rs @@ -1,13 +1,13 @@ use std::fmt::Debug; use alloy_evm::{ + Database, Evm, eth::EthEvmContext, precompiles::{DynPrecompile, PrecompilesMap}, - Database, Evm, }; use foundry_evm_core::either_evm::EitherEvm; use op_revm::OpContext; -use revm::{precompile::PrecompileWithAddress, Inspector}; +use revm::{Inspector, precompile::PrecompileWithAddress}; /// Object-safe trait that enables injecting extra precompiles when using /// `anvil` as a library. @@ -34,16 +34,17 @@ pub fn inject_precompiles( mod tests { use std::convert::Infallible; - use alloy_evm::{eth::EthEvmContext, precompiles::PrecompilesMap, EthEvm, Evm, EvmEnv}; + use alloy_evm::{EthEvm, Evm, EvmEnv, eth::EthEvmContext, precompiles::PrecompilesMap}; use alloy_op_evm::OpEvm; - use alloy_primitives::{address, Address, Bytes, TxKind, U256}; + use alloy_primitives::{Address, Bytes, TxKind, U256, address}; use foundry_evm_core::either_evm::EitherEvm; use itertools::Itertools; - use op_revm::{precompiles::OpPrecompiles, L1BlockInfo, OpContext, OpSpecId, OpTransaction}; + use op_revm::{L1BlockInfo, OpContext, OpSpecId, OpTransaction, precompiles::OpPrecompiles}; use revm::{ + Journal, context::{CfgEnv, Evm as RevmEvm, JournalTr, LocalContext, TxEnv}, database::{EmptyDB, EmptyDBTyped}, - handler::{instructions::EthInstructions, EthPrecompiles}, + handler::{EthPrecompiles, instructions::EthInstructions}, inspector::NoOpInspector, interpreter::interpreter::EthInterpreter, precompile::{ @@ -51,10 +52,9 @@ mod tests { Precompiles, }, primitives::hardfork::SpecId, - Journal, }; - use crate::{inject_precompiles, PrecompileFactory}; + use crate::{PrecompileFactory, inject_precompiles}; // A precompile activated in the `Prague` spec. const ETH_PRAGUE_PRECOMPILE: Address = address!("0x0000000000000000000000000000000000000011"); diff --git a/crates/anvil/src/filter.rs b/crates/anvil/src/filter.rs index 852d1b6447577..87377feff7e5b 100644 --- a/crates/anvil/src/filter.rs +++ b/crates/anvil/src/filter.rs @@ -1,14 +1,14 @@ //! Support for polling based filters use crate::{ + StorageInfo, eth::{backend::notifications::NewBlockNotifications, error::ToRpcResponseResult}, pubsub::filter_logs, - StorageInfo, }; -use alloy_primitives::{map::HashMap, TxHash}; +use alloy_primitives::{TxHash, map::HashMap}; use alloy_rpc_types::{Filter, FilteredParams, Log}; use anvil_core::eth::subscription::SubscriptionId; use anvil_rpc::response::ResponseResult; -use futures::{channel::mpsc::Receiver, Stream, StreamExt}; +use futures::{Stream, StreamExt, channel::mpsc::Receiver}; use std::{ pin::Pin, sync::Arc, diff --git a/crates/anvil/src/lib.rs b/crates/anvil/src/lib.rs index e6e43f95214e4..a23b414ef01cc 100644 --- a/crates/anvil/src/lib.rs +++ b/crates/anvil/src/lib.rs @@ -5,12 +5,12 @@ use crate::{ eth::{ + EthApi, backend::{info::StorageInfo, mem}, fees::{FeeHistoryService, FeeManager}, miner::{Miner, MiningMode}, pool::Pool, sign::{DevSigner, Signer as EthSigner}, - EthApi, }, filter::Filters, logging::{LoggingManager, NodeLogLayer}, @@ -45,7 +45,7 @@ mod service; mod config; pub use config::{ - AccountGenerator, ForkChoice, NodeConfig, CHAIN_ID, DEFAULT_GAS_LIMIT, VERSION_MESSAGE, + AccountGenerator, CHAIN_ID, DEFAULT_GAS_LIMIT, ForkChoice, NodeConfig, VERSION_MESSAGE, }; mod hardfork; @@ -54,7 +54,7 @@ pub use alloy_hardforks::EthereumHardfork; pub mod eth; /// Evm related abstractions mod evm; -pub use evm::{inject_precompiles, PrecompileFactory}; +pub use evm::{PrecompileFactory, inject_precompiles}; /// support for polling filters pub mod filter; diff --git a/crates/anvil/src/logging.rs b/crates/anvil/src/logging.rs index e738254cbbec5..6d44773a7ffc3 100644 --- a/crates/anvil/src/logging.rs +++ b/crates/anvil/src/logging.rs @@ -2,8 +2,8 @@ use parking_lot::RwLock; use std::sync::Arc; -use tracing::{subscriber::Interest, Metadata}; -use tracing_subscriber::{layer::Context, Layer}; +use tracing::{Metadata, subscriber::Interest}; +use tracing_subscriber::{Layer, layer::Context}; /// The target that identifies the events intended to be logged to stdout pub(crate) const NODE_USER_LOG_TARGET: &str = "node::user"; diff --git a/crates/anvil/src/pubsub.rs b/crates/anvil/src/pubsub.rs index 69f7896c72f78..5a63d3aa4dd78 100644 --- a/crates/anvil/src/pubsub.rs +++ b/crates/anvil/src/pubsub.rs @@ -1,13 +1,13 @@ use crate::{ - eth::{backend::notifications::NewBlockNotifications, error::to_rpc_result}, StorageInfo, + eth::{backend::notifications::NewBlockNotifications, error::to_rpc_result}, }; use alloy_network::AnyRpcTransaction; -use alloy_primitives::{TxHash, B256}; -use alloy_rpc_types::{pubsub::SubscriptionResult, FilteredParams, Log, Transaction}; +use alloy_primitives::{B256, TxHash}; +use alloy_rpc_types::{FilteredParams, Log, Transaction, pubsub::SubscriptionResult}; use anvil_core::eth::{block::Block, subscription::SubscriptionId, transaction::TypedReceipt}; use anvil_rpc::{request::Version, response::ResponseResult}; -use futures::{channel::mpsc::Receiver, ready, Stream, StreamExt}; +use futures::{Stream, StreamExt, channel::mpsc::Receiver, ready}; use serde::Serialize; use std::{ collections::VecDeque, diff --git a/crates/anvil/src/server/handler.rs b/crates/anvil/src/server/handler.rs index 3c474e9ee4b23..734091fdadc02 100644 --- a/crates/anvil/src/server/handler.rs +++ b/crates/anvil/src/server/handler.rs @@ -1,14 +1,14 @@ //! Contains RPC handlers use crate::{ + EthApi, eth::error::to_rpc_result, pubsub::{EthSubscription, LogsSubscription}, - EthApi, }; use alloy_rpc_types::{ - pubsub::{Params, SubscriptionKind}, FilteredParams, + pubsub::{Params, SubscriptionKind}, }; -use anvil_core::eth::{subscription::SubscriptionId, EthPubSub, EthRequest, EthRpcCall}; +use anvil_core::eth::{EthPubSub, EthRequest, EthRpcCall, subscription::SubscriptionId}; use anvil_rpc::{error::RpcError, response::ResponseResult}; use anvil_server::{PubSubContext, PubSubRpcHandler, RpcHandler}; diff --git a/crates/anvil/src/server/mod.rs b/crates/anvil/src/server/mod.rs index 2bd3796b14d37..18e3edd8161ea 100644 --- a/crates/anvil/src/server/mod.rs +++ b/crates/anvil/src/server/mod.rs @@ -1,7 +1,7 @@ //! Contains the code to launch an Ethereum RPC server. use crate::{EthApi, IpcTask}; -use anvil_server::{ipc::IpcEndpoint, ServerConfig}; +use anvil_server::{ServerConfig, ipc::IpcEndpoint}; use axum::Router; use futures::StreamExt; use handler::{HttpEthRpcHandler, PubSubEthRpcHandler}; diff --git a/crates/anvil/src/service.rs b/crates/anvil/src/service.rs index 55a9539de4e79..f471d2f867938 100644 --- a/crates/anvil/src/service.rs +++ b/crates/anvil/src/service.rs @@ -1,14 +1,14 @@ //! background service use crate::{ + NodeResult, eth::{ fees::FeeHistoryService, miner::Miner, - pool::{transactions::PoolTransaction, Pool}, + pool::{Pool, transactions::PoolTransaction}, }, filter::Filters, - mem::{storage::MinedBlockOutcome, Backend}, - NodeResult, + mem::{Backend, storage::MinedBlockOutcome}, }; use futures::{FutureExt, Stream, StreamExt}; use std::{ diff --git a/crates/anvil/src/shutdown.rs b/crates/anvil/src/shutdown.rs index bd79301db0ddf..b91fdbd2fcd67 100644 --- a/crates/anvil/src/shutdown.rs +++ b/crates/anvil/src/shutdown.rs @@ -1,9 +1,9 @@ //! Helper for shutdown signals use futures::{ + FutureExt, channel::oneshot, future::{FusedFuture, Shared}, - FutureExt, }; use std::{ pin::Pin, diff --git a/crates/anvil/src/tasks/mod.rs b/crates/anvil/src/tasks/mod.rs index 351571794e683..55496bb9e681d 100644 --- a/crates/anvil/src/tasks/mod.rs +++ b/crates/anvil/src/tasks/mod.rs @@ -2,7 +2,7 @@ #![allow(rustdoc::private_doc_tests)] -use crate::{shutdown::Shutdown, tasks::block_listener::BlockListener, EthApi}; +use crate::{EthApi, shutdown::Shutdown, tasks::block_listener::BlockListener}; use alloy_network::{AnyHeader, AnyNetwork}; use alloy_primitives::B256; use alloy_provider::Provider; @@ -52,7 +52,7 @@ impl TaskManager { /// ``` /// use alloy_network::Ethereum; /// use alloy_provider::RootProvider; - /// use anvil::{spawn, NodeConfig}; + /// use anvil::{NodeConfig, spawn}; /// /// # async fn t() { /// let endpoint = "http://...."; @@ -110,7 +110,7 @@ impl TaskManager { /// ``` /// use alloy_network::Ethereum; /// use alloy_provider::RootProvider; - /// use anvil::{spawn, NodeConfig}; + /// use anvil::{NodeConfig, spawn}; /// /// # async fn t() { /// let (api, handle) = spawn(NodeConfig::default().with_eth_rpc_url(Some("http://...."))).await; diff --git a/crates/anvil/tests/it/anvil.rs b/crates/anvil/tests/it/anvil.rs index 721aa404b36e1..7450d26f82867 100644 --- a/crates/anvil/tests/it/anvil.rs +++ b/crates/anvil/tests/it/anvil.rs @@ -5,7 +5,7 @@ use alloy_eips::BlockNumberOrTag; use alloy_hardforks::EthereumHardfork; use alloy_primitives::Address; use alloy_provider::Provider; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; #[tokio::test(flavor = "multi_thread")] async fn test_can_change_mining_mode() { diff --git a/crates/anvil/tests/it/api.rs b/crates/anvil/tests/it/api.rs index ce807eed6aa88..7acccb9a394d7 100644 --- a/crates/anvil/tests/it/api.rs +++ b/crates/anvil/tests/it/api.rs @@ -6,16 +6,16 @@ use crate::{ }; use alloy_network::{EthereumWallet, TransactionBuilder}; use alloy_primitives::{ + Address, B256, ChainId, U256, map::{AddressHashMap, B256HashMap, HashMap}, - Address, ChainId, B256, U256, }; use alloy_provider::Provider; use alloy_rpc_types::{ - request::TransactionRequest, state::AccountOverride, BlockId, BlockNumberOrTag, - BlockTransactions, + BlockId, BlockNumberOrTag, BlockTransactions, request::TransactionRequest, + state::AccountOverride, }; use alloy_serde::WithOtherFields; -use anvil::{eth::api::CLIENT_VERSION, spawn, NodeConfig, CHAIN_ID}; +use anvil::{CHAIN_ID, NodeConfig, eth::api::CLIENT_VERSION, spawn}; use futures::join; use std::time::Duration; diff --git a/crates/anvil/tests/it/eip4844.rs b/crates/anvil/tests/it/eip4844.rs index 2d713c3d955e3..3d512dbc333ff 100644 --- a/crates/anvil/tests/it/eip4844.rs +++ b/crates/anvil/tests/it/eip4844.rs @@ -1,16 +1,16 @@ use crate::utils::{http_provider, http_provider_with_signer}; use alloy_consensus::{SidecarBuilder, SimpleCoder, Transaction}; use alloy_eips::{ - eip4844::{BLOB_TX_MIN_BLOB_GASPRICE, DATA_GAS_PER_BLOB, MAX_DATA_GAS_PER_BLOCK_DENCUN}, Typed2718, + eip4844::{BLOB_TX_MIN_BLOB_GASPRICE, DATA_GAS_PER_BLOB, MAX_DATA_GAS_PER_BLOCK_DENCUN}, }; use alloy_hardforks::EthereumHardfork; use alloy_network::{EthereumWallet, ReceiptResponse, TransactionBuilder, TransactionBuilder4844}; -use alloy_primitives::{b256, Address, U256}; +use alloy_primitives::{Address, U256, b256}; use alloy_provider::Provider; use alloy_rpc_types::{BlockId, TransactionRequest}; use alloy_serde::WithOtherFields; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; #[tokio::test(flavor = "multi_thread")] async fn can_send_eip4844_transaction() { diff --git a/crates/anvil/tests/it/eip7702.rs b/crates/anvil/tests/it/eip7702.rs index 9424360119e4e..2faaed75a4c8d 100644 --- a/crates/anvil/tests/it/eip7702.rs +++ b/crates/anvil/tests/it/eip7702.rs @@ -1,13 +1,13 @@ use crate::utils::http_provider; -use alloy_consensus::{transaction::TxEip7702, SignableTransaction}; +use alloy_consensus::{SignableTransaction, transaction::TxEip7702}; use alloy_hardforks::EthereumHardfork; use alloy_network::{ReceiptResponse, TransactionBuilder, TxSignerSync}; -use alloy_primitives::{bytes, U256}; +use alloy_primitives::{U256, bytes}; use alloy_provider::{PendingTransactionConfig, Provider}; use alloy_rpc_types::{Authorization, TransactionRequest}; use alloy_serde::WithOtherFields; use alloy_signer::SignerSync; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; #[tokio::test(flavor = "multi_thread")] async fn can_send_eip7702_tx() { diff --git a/crates/anvil/tests/it/fork.rs b/crates/anvil/tests/it/fork.rs index c0e2eba8181d2..85e5e343e1fc1 100644 --- a/crates/anvil/tests/it/fork.rs +++ b/crates/anvil/tests/it/fork.rs @@ -1,22 +1,22 @@ //! various fork related test use crate::{ - abi::{Greeter, ERC721}, + abi::{ERC721, Greeter}, utils::{http_provider, http_provider_with_signer}, }; use alloy_chains::NamedChain; use alloy_network::{EthereumWallet, ReceiptResponse, TransactionBuilder, TransactionResponse}; -use alloy_primitives::{address, b256, bytes, uint, Address, Bytes, TxHash, TxKind, U256, U64}; +use alloy_primitives::{Address, Bytes, TxHash, TxKind, U64, U256, address, b256, bytes, uint}; use alloy_provider::Provider; use alloy_rpc_types::{ + BlockId, BlockNumberOrTag, anvil::Forking, request::{TransactionInput, TransactionRequest}, state::EvmOverrides, - BlockId, BlockNumberOrTag, }; use alloy_serde::WithOtherFields; use alloy_signer_local::PrivateKeySigner; -use anvil::{eth::EthApi, spawn, NodeConfig, NodeHandle}; +use anvil::{NodeConfig, NodeHandle, eth::EthApi, spawn}; use foundry_common::provider::get_http_provider; use foundry_config::Config; use foundry_test_utils::rpc::{self, next_http_rpc_endpoint, next_rpc_endpoint}; diff --git a/crates/anvil/tests/it/gas.rs b/crates/anvil/tests/it/gas.rs index 24f09d7358a0b..2becfb386d9f9 100644 --- a/crates/anvil/tests/it/gas.rs +++ b/crates/anvil/tests/it/gas.rs @@ -2,11 +2,11 @@ use crate::utils::http_provider_with_signer; use alloy_network::{EthereumWallet, TransactionBuilder}; -use alloy_primitives::{uint, Address, U256, U64}; +use alloy_primitives::{Address, U64, U256, uint}; use alloy_provider::Provider; use alloy_rpc_types::{BlockId, TransactionRequest}; use alloy_serde::WithOtherFields; -use anvil::{eth::fees::INITIAL_BASE_FEE, spawn, NodeConfig}; +use anvil::{NodeConfig, eth::fees::INITIAL_BASE_FEE, spawn}; const GAS_TRANSFER: u64 = 21_000; @@ -181,10 +181,11 @@ async fn test_tip_above_fee_cap() { let res = provider.send_transaction(tx.clone()).await; assert!(res.is_err()); - assert!(res - .unwrap_err() - .to_string() - .contains("max priority fee per gas higher than max fee per gas")); + assert!( + res.unwrap_err() + .to_string() + .contains("max priority fee per gas higher than max fee per gas") + ); } #[tokio::test(flavor = "multi_thread")] diff --git a/crates/anvil/tests/it/genesis.rs b/crates/anvil/tests/it/genesis.rs index 627e515d1065c..d60cb089128ce 100644 --- a/crates/anvil/tests/it/genesis.rs +++ b/crates/anvil/tests/it/genesis.rs @@ -4,7 +4,7 @@ use crate::fork::fork_config; use alloy_genesis::Genesis; use alloy_primitives::{Address, U256}; use alloy_provider::Provider; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; use std::str::FromStr; const GENESIS: &str = r#"{ diff --git a/crates/anvil/tests/it/ipc.rs b/crates/anvil/tests/it/ipc.rs index e5d99e01b333d..2529e198c32b1 100644 --- a/crates/anvil/tests/it/ipc.rs +++ b/crates/anvil/tests/it/ipc.rs @@ -3,7 +3,7 @@ use crate::{init_tracing, utils::connect_pubsub}; use alloy_primitives::U256; use alloy_provider::Provider; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; use futures::StreamExt; use tempfile::TempDir; diff --git a/crates/anvil/tests/it/logs.rs b/crates/anvil/tests/it/logs.rs index 5dbb28c2dd58c..6ed631e4a2359 100644 --- a/crates/anvil/tests/it/logs.rs +++ b/crates/anvil/tests/it/logs.rs @@ -5,10 +5,10 @@ use crate::{ utils::{http_provider_with_signer, ws_provider_with_signer}, }; use alloy_network::EthereumWallet; -use alloy_primitives::{map::B256HashSet, B256}; +use alloy_primitives::{B256, map::B256HashSet}; use alloy_provider::Provider; use alloy_rpc_types::{BlockNumberOrTag, Filter}; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; use futures::StreamExt; #[tokio::test(flavor = "multi_thread")] diff --git a/crates/anvil/tests/it/optimism.rs b/crates/anvil/tests/it/optimism.rs index f871cca724a97..93286030fe0bb 100644 --- a/crates/anvil/tests/it/optimism.rs +++ b/crates/anvil/tests/it/optimism.rs @@ -3,11 +3,11 @@ use crate::utils::{http_provider, http_provider_with_signer}; use alloy_eips::eip2718::Encodable2718; use alloy_network::{EthereumWallet, TransactionBuilder}; -use alloy_primitives::{b256, Address, TxHash, TxKind, U256}; +use alloy_primitives::{Address, TxHash, TxKind, U256, b256}; use alloy_provider::Provider; use alloy_rpc_types::TransactionRequest; use alloy_serde::WithOtherFields; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; use op_alloy_consensus::TxDeposit; use op_alloy_rpc_types::OpTransactionFields; diff --git a/crates/anvil/tests/it/otterscan.rs b/crates/anvil/tests/it/otterscan.rs index ffd70d1349ddb..b5b6be4b5b920 100644 --- a/crates/anvil/tests/it/otterscan.rs +++ b/crates/anvil/tests/it/otterscan.rs @@ -3,15 +3,15 @@ use crate::abi::Multicall; use alloy_hardforks::EthereumHardfork; use alloy_network::TransactionResponse; -use alloy_primitives::{address, Address, Bytes, U256}; +use alloy_primitives::{Address, Bytes, U256, address}; use alloy_provider::Provider; use alloy_rpc_types::{ - trace::otterscan::{InternalOperation, OperationType, TraceEntry}, BlockNumberOrTag, TransactionRequest, + trace::otterscan::{InternalOperation, OperationType, TraceEntry}, }; use alloy_serde::WithOtherFields; -use alloy_sol_types::{sol, SolCall, SolError, SolValue}; -use anvil::{spawn, NodeConfig}; +use alloy_sol_types::{SolCall, SolError, SolValue, sol}; +use anvil::{NodeConfig, spawn}; use std::collections::VecDeque; #[tokio::test(flavor = "multi_thread")] diff --git a/crates/anvil/tests/it/proof.rs b/crates/anvil/tests/it/proof.rs index c1dfa74d3d07b..abf0fc0d077f7 100644 --- a/crates/anvil/tests/it/proof.rs +++ b/crates/anvil/tests/it/proof.rs @@ -1,7 +1,7 @@ //! tests for `eth_getProof` -use alloy_primitives::{address, fixed_bytes, Address, Bytes, B256, U256}; -use anvil::{eth::EthApi, spawn, NodeConfig}; +use alloy_primitives::{Address, B256, Bytes, U256, address, fixed_bytes}; +use anvil::{NodeConfig, eth::EthApi, spawn}; use std::{collections::BTreeMap, str::FromStr}; async fn verify_account_proof( diff --git a/crates/anvil/tests/it/pubsub.rs b/crates/anvil/tests/it/pubsub.rs index 04515d83aa02b..5b96c7f85de7f 100644 --- a/crates/anvil/tests/it/pubsub.rs +++ b/crates/anvil/tests/it/pubsub.rs @@ -8,7 +8,7 @@ use alloy_pubsub::Subscription; use alloy_rpc_types::{Block as AlloyBlock, Filter, TransactionRequest}; use alloy_serde::WithOtherFields; use alloy_sol_types::sol; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; use futures::StreamExt; #[tokio::test(flavor = "multi_thread")] diff --git a/crates/anvil/tests/it/revert.rs b/crates/anvil/tests/it/revert.rs index 47e217419572f..ab85fc89abf80 100644 --- a/crates/anvil/tests/it/revert.rs +++ b/crates/anvil/tests/it/revert.rs @@ -1,11 +1,11 @@ use crate::abi::VendingMachine; use alloy_network::TransactionBuilder; -use alloy_primitives::{bytes, U256}; +use alloy_primitives::{U256, bytes}; use alloy_provider::Provider; use alloy_rpc_types::TransactionRequest; use alloy_serde::WithOtherFields; use alloy_sol_types::sol; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; #[tokio::test(flavor = "multi_thread")] async fn test_deploy_reverting() { diff --git a/crates/anvil/tests/it/sign.rs b/crates/anvil/tests/it/sign.rs index 0ff56f3641199..b6481115c3be0 100644 --- a/crates/anvil/tests/it/sign.rs +++ b/crates/anvil/tests/it/sign.rs @@ -6,7 +6,7 @@ use alloy_provider::Provider; use alloy_rpc_types::TransactionRequest; use alloy_serde::WithOtherFields; use alloy_signer::Signer; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; #[tokio::test(flavor = "multi_thread")] async fn can_sign_typed_data() { @@ -304,7 +304,10 @@ async fn can_sign_transaction() { // sign it via the eth_signTransaction API let signed_tx = api.sign_transaction(tx).await.unwrap(); - assert_eq!(signed_tx, "0x02f866827a690a65648252089470997970c51812dc3a010c7d01b50e0d17dc79c88203e980c001a0e4de88aefcf87ccb04466e60de66a83192e46aa26177d5ea35efbfd43fd0ecdca00e3148e0e8e0b9a6f9b329efd6e30c4a461920f3a27497be3dbefaba996601da"); + assert_eq!( + signed_tx, + "0x02f866827a690a65648252089470997970c51812dc3a010c7d01b50e0d17dc79c88203e980c001a0e4de88aefcf87ccb04466e60de66a83192e46aa26177d5ea35efbfd43fd0ecdca00e3148e0e8e0b9a6f9b329efd6e30c4a461920f3a27497be3dbefaba996601da" + ); } #[tokio::test(flavor = "multi_thread")] diff --git a/crates/anvil/tests/it/simulate.rs b/crates/anvil/tests/it/simulate.rs index e83a4c5a05955..1491b53a30039 100644 --- a/crates/anvil/tests/it/simulate.rs +++ b/crates/anvil/tests/it/simulate.rs @@ -1,13 +1,13 @@ //! general eth api tests -use alloy_primitives::{address, TxKind, U256}; +use alloy_primitives::{TxKind, U256, address}; use alloy_rpc_types::{ + BlockOverrides, request::TransactionRequest, simulate::{SimBlock, SimulatePayload}, state::{AccountOverride, StateOverridesBuilder}, - BlockOverrides, }; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; use foundry_test_utils::rpc; #[tokio::test(flavor = "multi_thread")] diff --git a/crates/anvil/tests/it/state.rs b/crates/anvil/tests/it/state.rs index fdb4c8b128679..75948e6578d52 100644 --- a/crates/anvil/tests/it/state.rs +++ b/crates/anvil/tests/it/state.rs @@ -2,11 +2,11 @@ use crate::abi::Greeter; use alloy_network::{ReceiptResponse, TransactionBuilder}; -use alloy_primitives::{address, utils::Unit, Bytes, Uint, U256}; +use alloy_primitives::{Bytes, U256, Uint, address, utils::Unit}; use alloy_provider::Provider; use alloy_rpc_types::{BlockId, TransactionRequest}; use alloy_serde::WithOtherFields; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; use foundry_test_utils::rpc::next_http_archive_rpc_url; #[tokio::test(flavor = "multi_thread")] diff --git a/crates/anvil/tests/it/traces.rs b/crates/anvil/tests/it/traces.rs index 2e073ca9c8735..ac79e56ee475f 100644 --- a/crates/anvil/tests/it/traces.rs +++ b/crates/anvil/tests/it/traces.rs @@ -7,14 +7,15 @@ use alloy_eips::BlockId; use alloy_hardforks::EthereumHardfork; use alloy_network::{EthereumWallet, TransactionBuilder}; use alloy_primitives::{ - hex::{self, FromHex}, Address, Bytes, U256, + hex::{self, FromHex}, }; use alloy_provider::{ - ext::{DebugApi, TraceApi}, Provider, + ext::{DebugApi, TraceApi}, }; use alloy_rpc_types::{ + TransactionRequest, state::StateOverride, trace::{ filter::{TraceFilter, TraceFilterMode}, @@ -24,11 +25,10 @@ use alloy_rpc_types::{ }, parity::{Action, LocalizedTransactionTrace}, }, - TransactionRequest, }; use alloy_serde::WithOtherFields; use alloy_sol_types::sol; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; #[tokio::test(flavor = "multi_thread")] async fn test_get_transfer_parity_traces() { diff --git a/crates/anvil/tests/it/transaction.rs b/crates/anvil/tests/it/transaction.rs index 7cb681af85a14..427e761344a65 100644 --- a/crates/anvil/tests/it/transaction.rs +++ b/crates/anvil/tests/it/transaction.rs @@ -4,18 +4,18 @@ use crate::{ }; use alloy_hardforks::EthereumHardfork; use alloy_network::{EthereumWallet, TransactionBuilder, TransactionResponse}; -use alloy_primitives::{address, hex, map::B256HashSet, Address, Bytes, FixedBytes, U256}; +use alloy_primitives::{Address, Bytes, FixedBytes, U256, address, hex, map::B256HashSet}; use alloy_provider::{Provider, WsConnect}; use alloy_rpc_types::{ - state::{AccountOverride, EvmOverrides, StateOverride, StateOverridesBuilder}, AccessList, AccessListItem, BlockId, BlockNumberOrTag, BlockOverrides, BlockTransactions, TransactionRequest, + state::{AccountOverride, EvmOverrides, StateOverride, StateOverridesBuilder}, }; use alloy_serde::WithOtherFields; use alloy_sol_types::SolValue; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; use eyre::Ok; -use futures::{future::join_all, FutureExt, StreamExt}; +use futures::{FutureExt, StreamExt, future::join_all}; use std::{str::FromStr, time::Duration}; use tokio::time::timeout; @@ -1171,7 +1171,9 @@ async fn test_block_override() { // function getBlockNumber() external view returns (uint256) { // return block.number; // } - let code = hex!("6080604052348015600e575f5ffd5b50600436106026575f3560e01c806342cbb15c14602a575b5f5ffd5b60306044565b604051603b91906061565b60405180910390f35b5f43905090565b5f819050919050565b605b81604b565b82525050565b5f60208201905060725f8301846054565b9291505056fea26469706673582212207741266d8151c5e7d1a96fc1697f8fc94e60e730b3f2861d398339c74a2180d464736f6c634300081e0033"); + let code = hex!( + "6080604052348015600e575f5ffd5b50600436106026575f3560e01c806342cbb15c14602a575b5f5ffd5b60306044565b604051603b91906061565b60405180910390f35b5f43905090565b5f819050919050565b605b81604b565b82525050565b5f60208201905060725f8301846054565b9291505056fea26469706673582212207741266d8151c5e7d1a96fc1697f8fc94e60e730b3f2861d398339c74a2180d464736f6c634300081e0033" + ); let account_override = AccountOverride { balance: Some(U256::from(1e18)), ..Default::default() }; diff --git a/crates/anvil/tests/it/txpool.rs b/crates/anvil/tests/it/txpool.rs index a883380a5f9aa..28f89451ed4b4 100644 --- a/crates/anvil/tests/it/txpool.rs +++ b/crates/anvil/tests/it/txpool.rs @@ -2,10 +2,10 @@ use alloy_network::TransactionBuilder; use alloy_primitives::U256; -use alloy_provider::{ext::TxPoolApi, Provider}; +use alloy_provider::{Provider, ext::TxPoolApi}; use alloy_rpc_types::TransactionRequest; use alloy_serde::WithOtherFields; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; #[tokio::test(flavor = "multi_thread")] async fn geth_txpool() { diff --git a/crates/anvil/tests/it/utils.rs b/crates/anvil/tests/it/utils.rs index 3c7e74bafcb2e..4a82c27745edd 100644 --- a/crates/anvil/tests/it/utils.rs +++ b/crates/anvil/tests/it/utils.rs @@ -1,10 +1,10 @@ use alloy_network::{Ethereum, EthereumWallet}; use alloy_provider::{ - fillers::{ChainIdFiller, FillProvider, GasFiller, JoinFill, NonceFiller, WalletFiller}, Identity, RootProvider, + fillers::{ChainIdFiller, FillProvider, GasFiller, JoinFill, NonceFiller, WalletFiller}, }; use foundry_common::provider::{ - get_http_provider, ProviderBuilder, RetryProvider, RetryProviderWithSigner, + ProviderBuilder, RetryProvider, RetryProviderWithSigner, get_http_provider, }; pub fn http_provider(http_endpoint: &str) -> RetryProvider { diff --git a/crates/anvil/tests/it/wsapi.rs b/crates/anvil/tests/it/wsapi.rs index ebe853a7d8789..ad5e7c87714e7 100644 --- a/crates/anvil/tests/it/wsapi.rs +++ b/crates/anvil/tests/it/wsapi.rs @@ -2,7 +2,7 @@ use alloy_primitives::U256; use alloy_provider::Provider; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; #[tokio::test(flavor = "multi_thread")] async fn can_get_block_number_ws() { diff --git a/crates/cast/src/args.rs b/crates/cast/src/args.rs index 6b75b45927f64..20706ab20cd4d 100644 --- a/crates/cast/src/args.rs +++ b/crates/cast/src/args.rs @@ -1,12 +1,12 @@ use crate::{ + Cast, SimpleCast, opts::{Cast as CastArgs, CastSubcommand, ToBaseArgs}, traces::identifier::SignaturesIdentifier, - Cast, SimpleCast, }; use alloy_consensus::transaction::{Recovered, SignerRecoverable}; use alloy_dyn_abi::{DynSolValue, ErrorExt, EventExt}; -use alloy_ens::{namehash, ProviderEnsExt}; -use alloy_primitives::{eip191_hash_message, hex, keccak256, Address, B256}; +use alloy_ens::{ProviderEnsExt, namehash}; +use alloy_primitives::{Address, B256, eip191_hash_message, hex, keccak256}; use alloy_provider::Provider; use alloy_rpc_types::{BlockId, BlockNumberOrTag::Latest}; use clap::{CommandFactory, Parser}; @@ -18,9 +18,9 @@ use foundry_common::{ fmt::{format_tokens, format_tokens_raw, format_uint_exp}, fs, selectors::{ - decode_calldata, decode_event_topic, decode_function_selector, decode_selectors, - import_selectors, parse_signatures, pretty_calldata, ParsedSignatures, SelectorImportData, - SelectorKind, + ParsedSignatures, SelectorImportData, SelectorKind, decode_calldata, decode_event_topic, + decode_function_selector, decode_selectors, import_selectors, parse_signatures, + pretty_calldata, }, shell, stdin, }; @@ -409,7 +409,9 @@ pub async fn run_command(args: CastArgs) -> Result<()> { { if resolve { let resolved = &resolve_results[pos]; - sh_println!("{selector}\t{arguments:max_args_len$}\t{state_mutability:max_mutability_len$}\t{resolved}")? + sh_println!( + "{selector}\t{arguments:max_args_len$}\t{state_mutability:max_mutability_len$}\t{resolved}" + )? } else { sh_println!("{selector}\t{arguments:max_args_len$}\t{state_mutability}")? } diff --git a/crates/cast/src/base.rs b/crates/cast/src/base.rs index 1b71d65131b0f..478aa3980c570 100644 --- a/crates/cast/src/base.rs +++ b/crates/cast/src/base.rs @@ -1,4 +1,4 @@ -use alloy_primitives::{utils::ParseUnits, Sign, I256, U256}; +use alloy_primitives::{I256, Sign, U256, utils::ParseUnits}; use eyre::Result; use std::{ convert::Infallible, @@ -384,11 +384,7 @@ impl NumberWithBase { } Base::Hexadecimal => format!("{:x}", self.number), }; - if s.starts_with('0') { - s.trim_start_matches('0').to_string() - } else { - s - } + if s.starts_with('0') { s.trim_start_matches('0').to_string() } else { s } } fn _parse_int(s: &str, base: Base) -> Result<(U256, bool)> { @@ -445,11 +441,7 @@ impl ToBase for NumberWithBase { fn to_base(&self, base: Base, add_prefix: bool) -> Result { let n = self.with_base(base); - if add_prefix { - Ok(format!("{n:#?}")) - } else { - Ok(format!("{n:?}")) - } + if add_prefix { Ok(format!("{n:#?}")) } else { Ok(format!("{n:?}")) } } } @@ -458,11 +450,7 @@ impl ToBase for I256 { fn to_base(&self, base: Base, add_prefix: bool) -> Result { let n = NumberWithBase::from(*self).with_base(base); - if add_prefix { - Ok(format!("{n:#?}")) - } else { - Ok(format!("{n:?}")) - } + if add_prefix { Ok(format!("{n:#?}")) } else { Ok(format!("{n:?}")) } } } @@ -471,11 +459,7 @@ impl ToBase for U256 { fn to_base(&self, base: Base, add_prefix: bool) -> Result { let n = NumberWithBase::from(*self).with_base(base); - if add_prefix { - Ok(format!("{n:#?}")) - } else { - Ok(format!("{n:?}")) - } + if add_prefix { Ok(format!("{n:#?}")) } else { Ok(format!("{n:?}")) } } } @@ -492,11 +476,7 @@ impl ToBase for str { fn to_base(&self, base: Base, add_prefix: bool) -> Result { let n = NumberWithBase::from_str(self)?.with_base(base); - if add_prefix { - Ok(format!("{n:#?}")) - } else { - Ok(format!("{n:?}")) - } + if add_prefix { Ok(format!("{n:#?}")) } else { Ok(format!("{n:?}")) } } } diff --git a/crates/cast/src/cmd/access_list.rs b/crates/cast/src/cmd/access_list.rs index 700a37b22a887..d455c6ac6e760 100644 --- a/crates/cast/src/cmd/access_list.rs +++ b/crates/cast/src/cmd/access_list.rs @@ -1,6 +1,6 @@ use crate::{ - tx::{CastTxBuilder, SenderKind}, Cast, + tx::{CastTxBuilder, SenderKind}, }; use alloy_ens::NameOrAddress; use alloy_rpc_types::BlockId; diff --git a/crates/cast/src/cmd/artifact.rs b/crates/cast/src/cmd/artifact.rs index 79ec880d34cfd..42a0609262e2e 100644 --- a/crates/cast/src/cmd/artifact.rs +++ b/crates/cast/src/cmd/artifact.rs @@ -4,7 +4,7 @@ use super::{ }; use alloy_primitives::Address; use alloy_provider::Provider; -use clap::{command, Parser}; +use clap::{Parser, command}; use eyre::Result; use foundry_cli::{ opts::{EtherscanOpts, RpcOpts}, diff --git a/crates/cast/src/cmd/call.rs b/crates/cast/src/cmd/call.rs index c329dbe3cc717..31d4d1a813a9b 100644 --- a/crates/cast/src/cmd/call.rs +++ b/crates/cast/src/cmd/call.rs @@ -1,29 +1,28 @@ use crate::{ + Cast, traces::TraceKind, tx::{CastTxBuilder, SenderKind}, - Cast, }; use alloy_ens::NameOrAddress; use alloy_primitives::{Address, Bytes, TxKind, U256}; use alloy_rpc_types::{ - state::{StateOverride, StateOverridesBuilder}, BlockId, BlockNumberOrTag, BlockOverrides, + state::{StateOverride, StateOverridesBuilder}, }; use clap::Parser; use eyre::Result; use foundry_cli::{ opts::{EthereumOpts, TransactionOpts}, - utils::{self, handle_traces, parse_ether_value, TraceResult}, + utils::{self, TraceResult, handle_traces, parse_ether_value}, }; use foundry_common::shell; use foundry_compilers::artifacts::EvmVersion; use foundry_config::{ + Config, figment::{ - self, + self, Figment, Metadata, Profile, value::{Dict, Map}, - Figment, Metadata, Profile, }, - Config, }; use foundry_evm::{ executors::TracingExecutor, @@ -389,11 +388,7 @@ impl CallArgs { if let Some(time) = self.block_time { overrides = overrides.with_time(time); } - if overrides.is_empty() { - Ok(None) - } else { - Ok(Some(overrides)) - } + if overrides.is_empty() { Ok(None) } else { Ok(Some(overrides)) } } } diff --git a/crates/cast/src/cmd/constructor_args.rs b/crates/cast/src/cmd/constructor_args.rs index 3d60673857f37..38f324de5270d 100644 --- a/crates/cast/src/cmd/constructor_args.rs +++ b/crates/cast/src/cmd/constructor_args.rs @@ -5,8 +5,8 @@ use super::{ use alloy_dyn_abi::DynSolType; use alloy_primitives::{Address, Bytes}; use alloy_provider::Provider; -use clap::{command, Parser}; -use eyre::{eyre, OptionExt, Result}; +use clap::{Parser, command}; +use eyre::{OptionExt, Result, eyre}; use foundry_cli::{ opts::{EtherscanOpts, RpcOpts}, utils::{self, LoadConfig}, diff --git a/crates/cast/src/cmd/create2.rs b/crates/cast/src/cmd/create2.rs index 3cab2caf0c8c9..8852ac8a88b95 100644 --- a/crates/cast/src/cmd/create2.rs +++ b/crates/cast/src/cmd/create2.rs @@ -1,12 +1,12 @@ -use alloy_primitives::{hex, keccak256, Address, B256, U256}; +use alloy_primitives::{Address, B256, U256, hex, keccak256}; use clap::Parser; use eyre::{Result, WrapErr}; -use rand::{rngs::StdRng, RngCore, SeedableRng}; +use rand::{RngCore, SeedableRng, rngs::StdRng}; use regex::RegexSetBuilder; use std::{ sync::{ - atomic::{AtomicBool, Ordering}, Arc, + atomic::{AtomicBool, Ordering}, }, time::Instant, }; diff --git a/crates/cast/src/cmd/creation_code.rs b/crates/cast/src/cmd/creation_code.rs index db47b1bdec523..a8034d3201a5d 100644 --- a/crates/cast/src/cmd/creation_code.rs +++ b/crates/cast/src/cmd/creation_code.rs @@ -2,10 +2,10 @@ use super::interface::{fetch_abi_from_etherscan, load_abi_from_file}; use crate::SimpleCast; use alloy_consensus::Transaction; use alloy_primitives::{Address, Bytes}; -use alloy_provider::{ext::TraceApi, Provider}; +use alloy_provider::{Provider, ext::TraceApi}; use alloy_rpc_types::trace::parity::{Action, CreateAction, CreateOutput, TraceOutput}; -use clap::{command, Parser}; -use eyre::{eyre, OptionExt, Result}; +use clap::{Parser, command}; +use eyre::{OptionExt, Result, eyre}; use foundry_block_explorers::Client; use foundry_cli::{ opts::{EtherscanOpts, RpcOpts}, diff --git a/crates/cast/src/cmd/da_estimate.rs b/crates/cast/src/cmd/da_estimate.rs index f4dfe98fe1d8f..db9e75a577f3e 100644 --- a/crates/cast/src/cmd/da_estimate.rs +++ b/crates/cast/src/cmd/da_estimate.rs @@ -41,7 +41,9 @@ impl DAEstimateArgs { da_estimate += op_alloy_flz::tx_estimated_size_fjord(&tx.encoded_2718()); } - sh_println!("Estimated data availability size for block {block_number} with {tx_count} transactions: {da_estimate}")?; + sh_println!( + "Estimated data availability size for block {block_number} with {tx_count} transactions: {da_estimate}" + )?; Ok(()) } diff --git a/crates/cast/src/cmd/estimate.rs b/crates/cast/src/cmd/estimate.rs index 8bcd29806ee65..031376e2747e3 100644 --- a/crates/cast/src/cmd/estimate.rs +++ b/crates/cast/src/cmd/estimate.rs @@ -7,7 +7,7 @@ use clap::Parser; use eyre::Result; use foundry_cli::{ opts::{EthereumOpts, TransactionOpts}, - utils::{self, parse_ether_value, LoadConfig}, + utils::{self, LoadConfig, parse_ether_value}, }; use std::str::FromStr; diff --git a/crates/cast/src/cmd/interface.rs b/crates/cast/src/cmd/interface.rs index 992f5b833eac3..31c283a0d74d5 100644 --- a/crates/cast/src/cmd/interface.rs +++ b/crates/cast/src/cmd/interface.rs @@ -5,8 +5,9 @@ use eyre::{Context, Result}; use foundry_block_explorers::Client; use foundry_cli::{opts::EtherscanOpts, utils::LoadConfig}; use foundry_common::{ + ContractsByArtifact, compile::{PathOrContractInfo, ProjectCompiler}, - find_target_path, fs, shell, ContractsByArtifact, + find_target_path, fs, shell, }; use foundry_config::load_config; use itertools::Itertools; diff --git a/crates/cast/src/cmd/logs.rs b/crates/cast/src/cmd/logs.rs index beb9afbef2015..f8a6212219ef1 100644 --- a/crates/cast/src/cmd/logs.rs +++ b/crates/cast/src/cmd/logs.rs @@ -3,7 +3,7 @@ use alloy_dyn_abi::{DynSolType, DynSolValue, Specifier}; use alloy_ens::NameOrAddress; use alloy_json_abi::Event; use alloy_network::AnyNetwork; -use alloy_primitives::{hex::FromHex, Address, B256}; +use alloy_primitives::{Address, B256, hex::FromHex}; use alloy_rpc_types::{BlockId, BlockNumberOrTag, Filter, FilterBlockOption, FilterSet, Topic}; use clap::Parser; use eyre::Result; @@ -270,7 +270,7 @@ mod tests { #[test] fn test_build_filter_sig_with_arguments() { let addr = Address::from_str(ADDRESS).unwrap(); - let addr = U256::from(U160::from_be_bytes(addr.0 .0)); + let addr = U256::from(U160::from_be_bytes(addr.0.0)); let expected = Filter { block_option: FilterBlockOption::Range { from_block: None, to_block: None }, address: vec![].into(), @@ -295,7 +295,7 @@ mod tests { #[test] fn test_build_filter_sig_with_skipped_arguments() { let addr = Address::from_str(ADDRESS).unwrap(); - let addr = U256::from(U160::from_be_bytes(addr.0 .0)); + let addr = U256::from(U160::from_be_bytes(addr.0.0)); let expected = Filter { block_option: FilterBlockOption::Range { from_block: None, to_block: None }, address: vec![].into(), diff --git a/crates/cast/src/cmd/mktx.rs b/crates/cast/src/cmd/mktx.rs index ebfb5afeadd47..df71528ddecdd 100644 --- a/crates/cast/src/cmd/mktx.rs +++ b/crates/cast/src/cmd/mktx.rs @@ -1,6 +1,6 @@ use crate::tx::{self, CastTxBuilder}; use alloy_ens::NameOrAddress; -use alloy_network::{eip2718::Encodable2718, EthereumWallet, TransactionBuilder}; +use alloy_network::{EthereumWallet, TransactionBuilder, eip2718::Encodable2718}; use alloy_primitives::hex; use alloy_provider::Provider; use alloy_signer::Signer; @@ -8,7 +8,7 @@ use clap::Parser; use eyre::{OptionExt, Result}; use foundry_cli::{ opts::{EthereumOpts, TransactionOpts}, - utils::{get_provider, LoadConfig}, + utils::{LoadConfig, get_provider}, }; use std::{path::PathBuf, str::FromStr}; diff --git a/crates/cast/src/cmd/run.rs b/crates/cast/src/cmd/run.rs index 04f52957ef668..705a8fe87f398 100644 --- a/crates/cast/src/cmd/run.rs +++ b/crates/cast/src/cmd/run.rs @@ -6,24 +6,23 @@ use clap::Parser; use eyre::{Result, WrapErr}; use foundry_cli::{ opts::{EtherscanOpts, RpcOpts}, - utils::{handle_traces, init_progress, TraceResult}, + utils::{TraceResult, handle_traces, init_progress}, }; -use foundry_common::{is_known_system_sender, shell, SYSTEM_TRANSACTION_TYPE}; +use foundry_common::{SYSTEM_TRANSACTION_TYPE, is_known_system_sender, shell}; use foundry_compilers::artifacts::EvmVersion; use foundry_config::{ + Config, figment::{ - self, + self, Figment, Metadata, Profile, value::{Dict, Map}, - Figment, Metadata, Profile, }, - Config, }; use foundry_evm::{ + Env, executors::{EvmError, TracingExecutor}, opts::EvmOpts, traces::{InternalTraceMode, TraceMode}, utils::configure_tx_env, - Env, }; use foundry_evm_core::env::AsEnvMut; diff --git a/crates/cast/src/cmd/send.rs b/crates/cast/src/cmd/send.rs index 35ec92f737e0e..e6b119b110f7c 100644 --- a/crates/cast/src/cmd/send.rs +++ b/crates/cast/src/cmd/send.rs @@ -1,6 +1,6 @@ use crate::{ - tx::{self, CastTxBuilder}, Cast, + tx::{self, CastTxBuilder}, }; use alloy_ens::NameOrAddress; use alloy_network::{AnyNetwork, EthereumWallet}; @@ -9,7 +9,7 @@ use alloy_rpc_types::TransactionRequest; use alloy_serde::WithOtherFields; use alloy_signer::Signer; use clap::Parser; -use eyre::{eyre, Result}; +use eyre::{Result, eyre}; use foundry_cli::{ opts::{EthereumOpts, TransactionOpts}, utils, @@ -111,12 +111,16 @@ impl SendTxArgs { // ensure we don't violate settings for transactions that can't be CREATE: 7702 and 4844 // which require mandatory target if to.is_none() && tx.auth.is_some() { - return Err(eyre!("EIP-7702 transactions can't be CREATE transactions and require a destination address")); + return Err(eyre!( + "EIP-7702 transactions can't be CREATE transactions and require a destination address" + )); } // ensure we don't violate settings for transactions that can't be CREATE: 7702 and 4844 // which require mandatory target if to.is_none() && blob_data.is_some() { - return Err(eyre!("EIP-4844 transactions can't be CREATE transactions and require a destination address")); + return Err(eyre!( + "EIP-4844 transactions can't be CREATE transactions and require a destination address" + )); } sig = constructor_sig; diff --git a/crates/cast/src/cmd/storage.rs b/crates/cast/src/cmd/storage.rs index cbf9a255d3a25..ec8a41a616e4c 100644 --- a/crates/cast/src/cmd/storage.rs +++ b/crates/cast/src/cmd/storage.rs @@ -1,11 +1,11 @@ -use crate::{opts::parse_slot, Cast}; +use crate::{Cast, opts::parse_slot}; use alloy_ens::NameOrAddress; use alloy_network::AnyNetwork; use alloy_primitives::{Address, B256, U256}; use alloy_provider::Provider; use alloy_rpc_types::BlockId; use clap::Parser; -use comfy_table::{modifiers::UTF8_ROUND_CORNERS, Cell, Table}; +use comfy_table::{Cell, Table, modifiers::UTF8_ROUND_CORNERS}; use eyre::Result; use foundry_block_explorers::Client; use foundry_cli::{ @@ -15,20 +15,21 @@ use foundry_cli::{ }; use foundry_common::{ abi::find_source, - compile::{etherscan_project, ProjectCompiler}, + compile::{ProjectCompiler, etherscan_project}, shell, }; use foundry_compilers::{ + Artifact, Project, artifacts::{ConfigurableContractArtifact, Contract, StorageLayout}, compilers::{ - solc::{Solc, SolcCompiler}, Compiler, + solc::{Solc, SolcCompiler}, }, - Artifact, Project, }; use foundry_config::{ - figment::{self, value::Dict, Metadata, Profile}, - impl_figment_convert_cast, Config, + Config, + figment::{self, Metadata, Profile, value::Dict}, + impl_figment_convert_cast, }; use semver::Version; use serde::{Deserialize, Serialize}; @@ -131,7 +132,9 @@ impl StorageArgs { } if !self.etherscan.has_key() { - eyre::bail!("You must provide an Etherscan API key if you're fetching a remote contract's storage."); + eyre::bail!( + "You must provide an Etherscan API key if you're fetching a remote contract's storage." + ); } let chain = utils::get_chain(config.chain, &provider).await?; @@ -174,7 +177,9 @@ impl StorageArgs { if is_storage_layout_empty(&artifact.storage_layout) && auto_detect { // try recompiling with the minimum version - sh_warn!("The requested contract was compiled with {version} while the minimum version for storage layouts is {MIN_SOLC} and as a result the output may be empty.")?; + sh_warn!( + "The requested contract was compiled with {version} while the minimum version for storage layouts is {MIN_SOLC} and as a result the output may be empty." + )?; let solc = Solc::find_or_install(&MIN_SOLC)?; project.compiler = SolcCompiler::Specific(solc); if let Ok(output) = ProjectCompiler::new().quiet(true).compile(&project) { @@ -344,11 +349,7 @@ fn add_storage_layout_output>(project: } fn is_storage_layout_empty(storage_layout: &Option) -> bool { - if let Some(s) = storage_layout { - s.storage.is_empty() - } else { - true - } + if let Some(s) = storage_layout { s.storage.is_empty() } else { true } } #[cfg(test)] @@ -361,9 +362,13 @@ mod tests { StorageArgs::parse_from(["foundry-cli", "addr.eth", "--etherscan-api-key", "dummykey"]); assert_eq!(args.etherscan.key(), Some("dummykey".to_string())); - unsafe { std::env::set_var("ETHERSCAN_API_KEY", "FXY"); } + unsafe { + std::env::set_var("ETHERSCAN_API_KEY", "FXY"); + } let config = args.load_config().unwrap(); - unsafe { std::env::remove_var("ETHERSCAN_API_KEY"); } + unsafe { + std::env::remove_var("ETHERSCAN_API_KEY"); + } assert_eq!(config.etherscan_api_key, Some("dummykey".to_string())); let key = config.get_etherscan_api_key(None).unwrap(); diff --git a/crates/cast/src/cmd/wallet/mod.rs b/crates/cast/src/cmd/wallet/mod.rs index e15c53ad33fea..fc1c009428913 100644 --- a/crates/cast/src/cmd/wallet/mod.rs +++ b/crates/cast/src/cmd/wallet/mod.rs @@ -1,15 +1,15 @@ use alloy_chains::Chain; use alloy_dyn_abi::TypedData; -use alloy_primitives::{hex, Address, Signature, B256, U256}; +use alloy_primitives::{Address, B256, Signature, U256, hex}; use alloy_provider::Provider; use alloy_rpc_types::Authorization; use alloy_signer::{ - k256::{elliptic_curve::sec1::ToEncodedPoint, SecretKey}, Signer, + k256::{SecretKey, elliptic_curve::sec1::ToEncodedPoint}, }; use alloy_signer_local::{ - coins_bip39::{English, Entropy, Mnemonic}, MnemonicBuilder, PrivateKeySigner, + coins_bip39::{English, Entropy, Mnemonic}, }; use clap::Parser; use eyre::{Context, Result}; @@ -276,7 +276,10 @@ impl WalletSubcommands { // If the path doesn't exist, it will fail to be canonicalized, // so we attach more context to the error message. Err(e) => { - eyre::bail!("If you specified a directory, please make sure it exists, or create it before running `cast wallet new `.\n{path} is not a directory.\nError: {}", e); + eyre::bail!( + "If you specified a directory, please make sure it exists, or create it before running `cast wallet new `.\n{path} is not a directory.\nError: {}", + e + ); } }; if !path.is_dir() { diff --git a/crates/cast/src/cmd/wallet/vanity.rs b/crates/cast/src/cmd/wallet/vanity.rs index 1c80e3165e858..0d3ae9957f5d8 100644 --- a/crates/cast/src/cmd/wallet/vanity.rs +++ b/crates/cast/src/cmd/wallet/vanity.rs @@ -1,4 +1,4 @@ -use alloy_primitives::{hex, Address}; +use alloy_primitives::{Address, hex}; use alloy_signer::{k256::ecdsa::SigningKey, utils::secret_key_to_address}; use alloy_signer_local::PrivateKeySigner; use clap::Parser; diff --git a/crates/cast/src/errors.rs b/crates/cast/src/errors.rs index 3e6c5977bfa4c..03ec7c3178a6f 100644 --- a/crates/cast/src/errors.rs +++ b/crates/cast/src/errors.rs @@ -20,7 +20,10 @@ impl fmt::Display for FunctionSignatureError { } Self::MissingEtherscan { sig } => { writeln!(f, "Failed to determine function signature for `{sig}`")?; - writeln!(f, "To lookup a function signature of a deployed contract by name, a valid ETHERSCAN_API_KEY must be set.")?; + writeln!( + f, + "To lookup a function signature of a deployed contract by name, a valid ETHERSCAN_API_KEY must be set." + )?; write!(f, "\tOr did you mean:\t {sig}()") } Self::UnknownChain(chain) => { diff --git a/crates/cast/src/lib.rs b/crates/cast/src/lib.rs index ac8b08b5cc291..f8ba79e1aaf63 100644 --- a/crates/cast/src/lib.rs +++ b/crates/cast/src/lib.rs @@ -9,17 +9,16 @@ use alloy_ens::NameOrAddress; use alloy_json_abi::Function; use alloy_network::{AnyNetwork, AnyRpcTransaction}; use alloy_primitives::{ - hex, - utils::{keccak256, ParseUnits, Unit}, - Address, Keccak256, Selector, TxHash, TxKind, B256, I256, U256, U64, + Address, B256, I256, Keccak256, Selector, TxHash, TxKind, U64, U256, hex, + utils::{ParseUnits, Unit, keccak256}, }; use alloy_provider::{ - network::eip2718::{Decodable2718, Encodable2718}, PendingTransactionBuilder, Provider, + network::eip2718::{Decodable2718, Encodable2718}, }; use alloy_rlp::Decodable; use alloy_rpc_types::{ - state::StateOverride, BlockId, BlockNumberOrTag, BlockOverrides, Filter, TransactionRequest, + BlockId, BlockNumberOrTag, BlockOverrides, Filter, TransactionRequest, state::StateOverride, }; use alloy_serde::WithOtherFields; use alloy_sol_types::sol; @@ -28,15 +27,16 @@ use chrono::DateTime; use eyre::{Context, ContextCompat, OptionExt, Result}; use foundry_block_explorers::Client; use foundry_common::{ + TransactionReceiptWithRevertReason, abi::{encode_function_args, get_func}, compile::etherscan_project, fmt::*, - fs, get_pretty_tx_receipt_attr, shell, TransactionReceiptWithRevertReason, + fs, get_pretty_tx_receipt_attr, shell, }; use foundry_compilers::flatten::Flattener; use foundry_config::Chain; use foundry_evm_core::ic::decode_instructions; -use futures::{future::Either, FutureExt, StreamExt}; +use futures::{FutureExt, StreamExt, future::Either}; use op_alloy_consensus::OpTxEnvelope; use rayon::prelude::*; use std::{ @@ -90,7 +90,7 @@ impl> Cast

{ /// # Example /// /// ``` - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use cast::Cast; /// /// # async fn foo() -> eyre::Result<()> { @@ -317,7 +317,7 @@ impl> Cast

{ /// # Example /// /// ``` - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use cast::Cast; /// /// # async fn foo() -> eyre::Result<()> { @@ -346,7 +346,7 @@ impl> Cast

{ /// # Example /// /// ``` - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use cast::Cast; /// /// # async fn foo() -> eyre::Result<()> { @@ -501,7 +501,7 @@ impl> Cast

{ /// /// ``` /// use alloy_primitives::Address; - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use cast::Cast; /// use std::str::FromStr; /// @@ -589,7 +589,7 @@ impl> Cast

{ /// /// ``` /// use alloy_primitives::Address; - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use cast::Cast; /// use std::str::FromStr; /// @@ -638,7 +638,7 @@ impl> Cast

{ /// /// ``` /// use alloy_primitives::Address; - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use cast::Cast; /// use std::str::FromStr; /// @@ -668,7 +668,7 @@ impl> Cast

{ /// /// ``` /// use alloy_primitives::{Address, U256}; - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use cast::Cast; /// use std::str::FromStr; /// @@ -691,7 +691,7 @@ impl> Cast

{ /// /// ``` /// use alloy_primitives::Address; - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use cast::Cast; /// use std::str::FromStr; /// @@ -727,7 +727,7 @@ impl> Cast

{ /// /// ``` /// use alloy_primitives::Address; - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use cast::Cast; /// use std::str::FromStr; /// @@ -750,7 +750,7 @@ impl> Cast

{ /// # Example /// /// ``` - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use cast::Cast; /// /// # async fn foo() -> eyre::Result<()> { @@ -814,7 +814,7 @@ impl> Cast

{ /// # Example /// /// ``` - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use cast::Cast; /// /// # async fn foo() -> eyre::Result<()> { @@ -875,7 +875,7 @@ impl> Cast

{ /// # Example /// /// ``` - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use cast::Cast; /// /// # async fn foo() -> eyre::Result<()> { @@ -906,7 +906,7 @@ impl> Cast

{ /// /// ``` /// use alloy_primitives::{Address, B256}; - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use cast::Cast; /// use std::str::FromStr; /// @@ -967,7 +967,7 @@ impl> Cast

{ /// /// ``` /// use alloy_primitives::fixed_bytes; - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use alloy_rpc_types::{BlockId, BlockNumberOrTag}; /// use cast::Cast; /// use std::{convert::TryFrom, str::FromStr}; @@ -1014,7 +1014,7 @@ impl> Cast

{ /// /// ``` /// use alloy_primitives::Address; - /// use alloy_provider::{network::AnyNetwork, ProviderBuilder, RootProvider}; + /// use alloy_provider::{ProviderBuilder, RootProvider, network::AnyNetwork}; /// use alloy_rpc_types::Filter; /// use alloy_transport::BoxTransport; /// use cast::Cast; @@ -1423,6 +1423,7 @@ impl SimpleCast { /// assert_eq!(Cast::parse_units("2.5", 6)?, "2500000"); /// assert_eq!(Cast::parse_units("1.0", 12)?, "1000000000000"); // 12 decimals /// assert_eq!(Cast::parse_units("1.23", 3)?, "1230"); // 3 decimals + /// /// # Ok(()) /// # } /// ``` @@ -1444,6 +1445,7 @@ impl SimpleCast { /// assert_eq!(Cast::format_units("2500000", 6)?, "2.500000"); /// assert_eq!(Cast::format_units("1000000000000", 12)?, "1"); // 12 decimals /// assert_eq!(Cast::format_units("1230", 3)?, "1.230"); // 3 decimals + /// /// # Ok(()) /// # } /// ``` @@ -1761,7 +1763,10 @@ impl SimpleCast { let func = get_func(sig)?; match encode_function_args(&func, args) { Ok(res) => Ok(hex::encode_prefixed(&res[4..])), - Err(e) => eyre::bail!("Could not ABI encode the function and arguments. Did you pass in the right types?\nError\n{}", e), + Err(e) => eyre::bail!( + "Could not ABI encode the function and arguments. Did you pass in the right types?\nError\n{}", + e + ), } } @@ -1791,7 +1796,10 @@ impl SimpleCast { let func = get_func(sig.as_str())?; let encoded = match encode_function_args_packed(&func, args) { Ok(res) => hex::encode(res), - Err(e) => eyre::bail!("Could not ABI encode the function and arguments. Did you pass in the right types?\nError\n{}", e), + Err(e) => eyre::bail!( + "Could not ABI encode the function and arguments. Did you pass in the right types?\nError\n{}", + e + ), }; Ok(format!("0x{encoded}")) } diff --git a/crates/cast/src/opts.rs b/crates/cast/src/opts.rs index f712f43bf0114..21b42cbab69f2 100644 --- a/crates/cast/src/opts.rs +++ b/crates/cast/src/opts.rs @@ -6,7 +6,7 @@ use crate::cmd::{ send::SendTxArgs, storage::StorageArgs, txpool::TxPoolSubcommands, wallet::WalletSubcommands, }; use alloy_ens::NameOrAddress; -use alloy_primitives::{Address, Selector, B256, U256}; +use alloy_primitives::{Address, B256, Selector, U256}; use alloy_rpc_types::BlockId; use clap::{Parser, Subcommand, ValueHint}; use eyre::Result; diff --git a/crates/cast/src/rlp_converter.rs b/crates/cast/src/rlp_converter.rs index ced4a825979f0..36b974fb2e976 100644 --- a/crates/cast/src/rlp_converter.rs +++ b/crates/cast/src/rlp_converter.rs @@ -1,4 +1,4 @@ -use alloy_primitives::{hex, U256}; +use alloy_primitives::{U256, hex}; use alloy_rlp::{Buf, Decodable, Encodable, Header}; use eyre::Context; use serde_json::Value; diff --git a/crates/cast/src/tx.rs b/crates/cast/src/tx.rs index 829d8e571ca80..8212e98c344c5 100644 --- a/crates/cast/src/tx.rs +++ b/crates/cast/src/tx.rs @@ -7,7 +7,7 @@ use alloy_network::{ AnyNetwork, AnyTypedTransaction, TransactionBuilder, TransactionBuilder4844, TransactionBuilder7702, }; -use alloy_primitives::{hex, Address, Bytes, TxKind, U256}; +use alloy_primitives::{Address, Bytes, TxKind, U256, hex}; use alloy_provider::Provider; use alloy_rpc_types::{AccessList, Authorization, TransactionInput, TransactionRequest}; use alloy_serde::WithOtherFields; diff --git a/crates/cast/tests/cli/main.rs b/crates/cast/tests/cli/main.rs index bf825cdd9f95f..92d2ac37c75fb 100644 --- a/crates/cast/tests/cli/main.rs +++ b/crates/cast/tests/cli/main.rs @@ -3,7 +3,7 @@ use alloy_chains::NamedChain; use alloy_hardforks::EthereumHardfork; use alloy_network::{TransactionBuilder, TransactionResponse}; -use alloy_primitives::{address, b256, Bytes, B256}; +use alloy_primitives::{B256, Bytes, address, b256}; use alloy_provider::{Provider, ProviderBuilder}; use alloy_rpc_types::{BlockNumberOrTag, Index, TransactionRequest}; use anvil::NodeConfig; diff --git a/crates/cheatcodes/src/config.rs b/crates/cheatcodes/src/config.rs index 1ad98cd93e92b..4ea7f2db28800 100644 --- a/crates/cheatcodes/src/config.rs +++ b/crates/cheatcodes/src/config.rs @@ -1,11 +1,11 @@ use super::Result; use crate::Vm::Rpc; -use alloy_primitives::{map::AddressHashMap, U256}; -use foundry_common::{fs::normalize_path, ContractsByArtifact}; -use foundry_compilers::{utils::canonicalize, ArtifactId, ProjectPathsConfig}; +use alloy_primitives::{U256, map::AddressHashMap}; +use foundry_common::{ContractsByArtifact, fs::normalize_path}; +use foundry_compilers::{ArtifactId, ProjectPathsConfig, utils::canonicalize}; use foundry_config::{ - cache::StorageCachingConfig, fs_permissions::FsAccessKind, Config, FsPermissions, - ResolvedRpcEndpoint, ResolvedRpcEndpoints, RpcEndpoint, RpcEndpointUrl, + Config, FsPermissions, ResolvedRpcEndpoint, ResolvedRpcEndpoints, RpcEndpoint, RpcEndpointUrl, + cache::StorageCachingConfig, fs_permissions::FsAccessKind, }; use foundry_evm_core::opts::EvmOpts; use std::{ diff --git a/crates/cheatcodes/src/crypto.rs b/crates/cheatcodes/src/crypto.rs index be6829ee3110b..fa0d7fd646c4a 100644 --- a/crates/cheatcodes/src/crypto.rs +++ b/crates/cheatcodes/src/crypto.rs @@ -1,14 +1,14 @@ //! Implementations of [`Crypto`](spec::Group::Crypto) Cheatcodes. use crate::{Cheatcode, Cheatcodes, Result, Vm::*}; -use alloy_primitives::{keccak256, Address, B256, U256}; +use alloy_primitives::{Address, B256, U256, keccak256}; use alloy_signer::{Signer, SignerSync}; use alloy_signer_local::{ + LocalSigner, MnemonicBuilder, PrivateKeySigner, coins_bip39::{ ChineseSimplified, ChineseTraditional, Czech, English, French, Italian, Japanese, Korean, Portuguese, Spanish, Wordlist, }, - LocalSigner, MnemonicBuilder, PrivateKeySigner, }; use alloy_sol_types::SolValue; use k256::{ @@ -16,7 +16,7 @@ use k256::{ elliptic_curve::{bigint::ArrayEncoding, sec1::ToEncodedPoint}, }; use p256::ecdsa::{ - signature::hazmat::PrehashSigner, Signature as P256Signature, SigningKey as P256SigningKey, + Signature as P256Signature, SigningKey as P256SigningKey, signature::hazmat::PrehashSigner, }; /// The BIP32 default derivation path prefix. @@ -261,7 +261,9 @@ fn sign_with_wallet( } else if signers.len() == 1 { *signers.keys().next().unwrap() } else { - bail!("could not determine signer, there are multiple signers available use vm.sign(signer, digest) to specify one"); + bail!( + "could not determine signer, there are multiple signers available use vm.sign(signer, digest) to specify one" + ); }; let wallet = signers @@ -390,7 +392,7 @@ fn derive_wallets( #[cfg(test)] mod tests { use super::*; - use alloy_primitives::{hex::FromHex, FixedBytes}; + use alloy_primitives::{FixedBytes, hex::FromHex}; use p256::ecdsa::signature::hazmat::PrehashVerifier; #[test] @@ -421,7 +423,10 @@ mod tests { ) .unwrap(); let result = sign_p256(&pk, &digest); - assert_eq!(result.err().unwrap().to_string(), "private key must be less than the NistP256 curve order (115792089210356248762697446949407573529996955224135760342422259061068512044369)"); + assert_eq!( + result.err().unwrap().to_string(), + "private key must be less than the NistP256 curve order (115792089210356248762697446949407573529996955224135760342422259061068512044369)" + ); } #[test] diff --git a/crates/cheatcodes/src/env.rs b/crates/cheatcodes/src/env.rs index dbf330617122e..348d1d4e67bde 100644 --- a/crates/cheatcodes/src/env.rs +++ b/crates/cheatcodes/src/env.rs @@ -1,6 +1,6 @@ //! Implementations of [`Environment`](spec::Group::Environment) cheatcodes. -use crate::{string, Cheatcode, Cheatcodes, Error, Result, Vm::*}; +use crate::{Cheatcode, Cheatcodes, Error, Result, Vm::*, string}; use alloy_dyn_abi::DynSolType; use alloy_sol_types::SolValue; use std::{env, sync::OnceLock}; @@ -20,7 +20,9 @@ impl Cheatcode for setEnvCall { } else if value.contains('\0') { Err(fmt_err!("environment variable value can't contain NUL character `\\0`")) } else { - unsafe { env::set_var(key, value); } + unsafe { + env::set_var(key, value); + } Ok(Default::default()) } } @@ -308,10 +310,14 @@ mod tests { fn parse_env_uint() { let key = "parse_env_uint"; let value = "t"; - unsafe { env::set_var(key, value); } + unsafe { + env::set_var(key, value); + } let err = env(key, &DynSolType::Uint(256)).unwrap_err().to_string(); assert_eq!(err.matches("$parse_env_uint").count(), 2, "{err:?}"); - unsafe { env::remove_var(key); } + unsafe { + env::remove_var(key); + } } } diff --git a/crates/cheatcodes/src/error.rs b/crates/cheatcodes/src/error.rs index 414c7dbed8f90..ffa76f83e3b7e 100644 --- a/crates/cheatcodes/src/error.rs +++ b/crates/cheatcodes/src/error.rs @@ -1,5 +1,5 @@ use crate::Vm; -use alloy_primitives::{hex, Address, Bytes}; +use alloy_primitives::{Address, Bytes, hex}; use alloy_signer::Error as SignerError; use alloy_signer_local::LocalSignerError; use alloy_sol_types::SolError; diff --git a/crates/cheatcodes/src/evm.rs b/crates/cheatcodes/src/evm.rs index 573ba31f939e7..f1a215e38c7b6 100644 --- a/crates/cheatcodes/src/evm.rs +++ b/crates/cheatcodes/src/evm.rs @@ -1,20 +1,20 @@ //! Implementations of [`Evm`](spec::Group::Evm) cheatcodes. use crate::{ - inspector::{Ecx, RecordDebugStepInfo}, BroadcastableTransaction, Cheatcode, Cheatcodes, CheatcodesExecutor, CheatsCtxt, Error, Result, Vm::*, + inspector::{Ecx, RecordDebugStepInfo}, }; use alloy_consensus::TxEnvelope; use alloy_genesis::{Genesis, GenesisAccount}; -use alloy_primitives::{map::HashMap, Address, Bytes, B256, U256}; +use alloy_primitives::{Address, B256, Bytes, U256, map::HashMap}; use alloy_rlp::Decodable; use alloy_sol_types::SolValue; use foundry_common::fs::{read_json_file, write_json_file}; use foundry_evm_core::{ + ContextExt, backend::{DatabaseExt, RevertStateSnapshotAction}, constants::{CALLER, CHEATCODE_ADDRESS, HARDHAT_CONSOLE_ADDRESS, TEST_CONTRACT_ADDRESS}, - ContextExt, }; use foundry_evm_traces::StackSnapshotType; use itertools::Itertools; @@ -22,11 +22,11 @@ use rand::Rng; use revm::{ bytecode::Bytecode, context::{Block, JournalTr}, - primitives::{hardfork::SpecId, KECCAK_EMPTY}, + primitives::{KECCAK_EMPTY, hardfork::SpecId}, state::Account, }; use std::{ - collections::{btree_map::Entry, BTreeMap}, + collections::{BTreeMap, btree_map::Entry}, fmt::Display, path::Path, }; diff --git a/crates/cheatcodes/src/evm/fork.rs b/crates/cheatcodes/src/evm/fork.rs index 65a7a04d401cc..bd7d1518dc9c7 100644 --- a/crates/cheatcodes/src/evm/fork.rs +++ b/crates/cheatcodes/src/evm/fork.rs @@ -1,6 +1,6 @@ use crate::{ - json::json_value_to_token, Cheatcode, Cheatcodes, CheatcodesExecutor, CheatsCtxt, DatabaseExt, - Result, Vm::*, + Cheatcode, Cheatcodes, CheatcodesExecutor, CheatsCtxt, DatabaseExt, Result, Vm::*, + json::json_value_to_token, }; use alloy_dyn_abi::DynSolValue; use alloy_primitives::{B256, U256}; @@ -8,7 +8,7 @@ use alloy_provider::Provider; use alloy_rpc_types::Filter; use alloy_sol_types::SolValue; use foundry_common::provider::ProviderBuilder; -use foundry_evm_core::{fork::CreateFork, AsEnvMut, ContextExt}; +use foundry_evm_core::{AsEnvMut, ContextExt, fork::CreateFork}; impl Cheatcode for activeForkCall { fn apply_stateful(&self, ccx: &mut CheatsCtxt) -> Result { diff --git a/crates/cheatcodes/src/evm/mapping.rs b/crates/cheatcodes/src/evm/mapping.rs index 29c12d6d3113c..787d241d717e2 100644 --- a/crates/cheatcodes/src/evm/mapping.rs +++ b/crates/cheatcodes/src/evm/mapping.rs @@ -1,13 +1,12 @@ use crate::{Cheatcode, Cheatcodes, Result, Vm::*}; use alloy_primitives::{ - keccak256, + Address, B256, U256, keccak256, map::{AddressHashMap, B256HashMap}, - Address, B256, U256, }; use alloy_sol_types::SolValue; use revm::{ bytecode::opcode, - interpreter::{interpreter_types::Jumps, Interpreter}, + interpreter::{Interpreter, interpreter_types::Jumps}, }; /// Recorded mapping slots. diff --git a/crates/cheatcodes/src/evm/prank.rs b/crates/cheatcodes/src/evm/prank.rs index 96ab6cb9df925..0639f47cc712a 100644 --- a/crates/cheatcodes/src/evm/prank.rs +++ b/crates/cheatcodes/src/evm/prank.rs @@ -49,11 +49,7 @@ impl Prank { /// Apply the prank by setting `used` to true if it is false /// Only returns self in the case it is updated (first application) pub fn first_time_applied(&self) -> Option { - if self.used { - None - } else { - Some(Self { used: true, ..*self }) - } + if self.used { None } else { Some(Self { used: true, ..*self }) } } } diff --git a/crates/cheatcodes/src/evm/record_debug_step.rs b/crates/cheatcodes/src/evm/record_debug_step.rs index bc78c2425c414..15f87943d46de 100644 --- a/crates/cheatcodes/src/evm/record_debug_step.rs +++ b/crates/cheatcodes/src/evm/record_debug_step.rs @@ -3,7 +3,7 @@ use alloy_primitives::{Bytes, U256}; use foundry_evm_traces::CallTraceArena; use revm::{bytecode::opcode::OpCode, interpreter::InstructionResult}; -use foundry_evm_core::buffer::{get_buffer_accesses, BufferKind}; +use foundry_evm_core::buffer::{BufferKind, get_buffer_accesses}; use revm_inspectors::tracing::types::{CallTraceStep, RecordedMemory, TraceMemberOrder}; use spec::Vm::DebugStep; diff --git a/crates/cheatcodes/src/fs.rs b/crates/cheatcodes/src/fs.rs index f1985eb32bbc1..2f20a71f29a3d 100644 --- a/crates/cheatcodes/src/fs.rs +++ b/crates/cheatcodes/src/fs.rs @@ -5,7 +5,7 @@ use crate::{Cheatcode, Cheatcodes, CheatcodesExecutor, CheatsCtxt, Result, Vm::* use alloy_dyn_abi::DynSolType; use alloy_json_abi::ContractObject; use alloy_network::AnyTransactionReceipt; -use alloy_primitives::{hex, map::Entry, Bytes, U256}; +use alloy_primitives::{Bytes, U256, hex, map::Entry}; use alloy_provider::network::ReceiptResponse; use alloy_sol_types::SolValue; use dialoguer::{Input, Password}; @@ -482,11 +482,7 @@ fn get_artifact_code(state: &Cheatcodes, path: &str, deployed: bool) -> Result> for Cheatcodes { }, }; - if count != expected.count { - Some((expected, count)) - } else { - None - } + if count != expected.count { Some((expected, count)) } else { None } }) .collect::>(); diff --git a/crates/cheatcodes/src/json.rs b/crates/cheatcodes/src/json.rs index 6ad36e4742901..ef0b5b30871ac 100644 --- a/crates/cheatcodes/src/json.rs +++ b/crates/cheatcodes/src/json.rs @@ -1,8 +1,8 @@ //! Implementations of [`Json`](spec::Group::Json) cheatcodes. -use crate::{string, Cheatcode, Cheatcodes, Result, Vm::*}; -use alloy_dyn_abi::{eip712_parser::EncodeType, DynSolType, DynSolValue, Resolver}; -use alloy_primitives::{hex, Address, B256, I256}; +use crate::{Cheatcode, Cheatcodes, Result, Vm::*, string}; +use alloy_dyn_abi::{DynSolType, DynSolValue, Resolver, eip712_parser::EncodeType}; +use alloy_primitives::{Address, B256, I256, hex}; use alloy_sol_types::SolValue; use foundry_common::fs; use foundry_config::fs_permissions::FsAccessKind; @@ -493,11 +493,7 @@ fn encode(values: Vec) -> Vec { /// Canonicalize a json path key to always start from the root of the document. /// Read more about json path syntax: pub(super) fn canonicalize_json_path(path: &str) -> Cow<'_, str> { - if !path.starts_with('$') { - format!("${path}").into() - } else { - path.into() - } + if !path.starts_with('$') { format!("${path}").into() } else { path.into() } } /// Converts a JSON [`Value`] to a [`DynSolValue`] by trying to guess encoded type. For safer diff --git a/crates/cheatcodes/src/lib.rs b/crates/cheatcodes/src/lib.rs index ca45a937b0b63..f7b30baab0519 100644 --- a/crates/cheatcodes/src/lib.rs +++ b/crates/cheatcodes/src/lib.rs @@ -20,13 +20,13 @@ use alloy_primitives::Address; use foundry_evm_core::backend::DatabaseExt; use spec::Status; +pub use Vm::ForgeContext; pub use config::CheatsConfig; pub use error::{Error, ErrorKind, Result}; pub use inspector::{ BroadcastableTransaction, BroadcastableTransactions, Cheatcodes, CheatcodesExecutor, }; pub use spec::{CheatcodeDef, Vm}; -pub use Vm::ForgeContext; #[macro_use] mod error; diff --git a/crates/cheatcodes/src/script.rs b/crates/cheatcodes/src/script.rs index 6e2fad1f09213..5563e48c1a8f7 100644 --- a/crates/cheatcodes/src/script.rs +++ b/crates/cheatcodes/src/script.rs @@ -2,18 +2,18 @@ use crate::{Cheatcode, CheatsCtxt, Result, Vm::*}; use alloy_consensus::{SidecarBuilder, SimpleCoder}; -use alloy_primitives::{Address, Uint, B256, U256}; +use alloy_primitives::{Address, B256, U256, Uint}; use alloy_rpc_types::Authorization; use alloy_signer::SignerSync; use alloy_signer_local::PrivateKeySigner; use alloy_sol_types::SolValue; -use foundry_wallets::{multi_wallet::MultiWallet, WalletSigner}; +use foundry_wallets::{WalletSigner, multi_wallet::MultiWallet}; use parking_lot::Mutex; use revm::{ bytecode::Bytecode, context::JournalTr, context_interface::transaction::SignedAuthorization, - primitives::{hardfork::SpecId, KECCAK_EMPTY}, + primitives::{KECCAK_EMPTY, hardfork::SpecId}, }; use std::sync::Arc; diff --git a/crates/cheatcodes/src/string.rs b/crates/cheatcodes/src/string.rs index 080d9bc0820ff..d627d49ac19e0 100644 --- a/crates/cheatcodes/src/string.rs +++ b/crates/cheatcodes/src/string.rs @@ -2,7 +2,7 @@ use crate::{Cheatcode, Cheatcodes, Result, Vm::*}; use alloy_dyn_abi::{DynSolType, DynSolValue}; -use alloy_primitives::{hex, U256}; +use alloy_primitives::{U256, hex}; use alloy_sol_types::SolValue; // address diff --git a/crates/cheatcodes/src/test/assert.rs b/crates/cheatcodes/src/test/assert.rs index 7bb433c88259f..f67162b68acc2 100644 --- a/crates/cheatcodes/src/test/assert.rs +++ b/crates/cheatcodes/src/test/assert.rs @@ -1,5 +1,5 @@ use crate::{CheatcodesExecutor, CheatsCtxt, Result, Vm::*}; -use alloy_primitives::{hex, I256, U256}; +use alloy_primitives::{I256, U256, hex}; use foundry_evm_core::{ abi::console::{format_units_int, format_units_uint}, backend::GLOBAL_FAIL_SLOT, @@ -453,19 +453,11 @@ impl_assertions! { } fn assert_true(condition: bool) -> Result, SimpleAssertionError> { - if condition { - Ok(Default::default()) - } else { - Err(SimpleAssertionError) - } + if condition { Ok(Default::default()) } else { Err(SimpleAssertionError) } } fn assert_false(condition: bool) -> Result, SimpleAssertionError> { - if !condition { - Ok(Default::default()) - } else { - Err(SimpleAssertionError) - } + if !condition { Ok(Default::default()) } else { Err(SimpleAssertionError) } } fn assert_eq<'a, T: PartialEq>(left: &'a T, right: &'a T) -> ComparisonResult<'a, T> { @@ -485,11 +477,7 @@ fn assert_not_eq<'a, T: PartialEq>(left: &'a T, right: &'a T) -> ComparisonResul } fn get_delta_uint(left: U256, right: U256) -> U256 { - if left > right { - left - right - } else { - right - left - } + if left > right { left - right } else { right - left } } fn get_delta_int(left: I256, right: I256) -> U256 { @@ -497,11 +485,7 @@ fn get_delta_int(left: I256, right: I256) -> U256 { let (right_sign, right_abs) = right.into_sign_and_abs(); if left_sign == right_sign { - if left_abs > right_abs { - left_abs - right_abs - } else { - right_abs - left_abs - } + if left_abs > right_abs { left_abs - right_abs } else { right_abs - left_abs } } else { left_abs + right_abs } diff --git a/crates/cheatcodes/src/test/assume.rs b/crates/cheatcodes/src/test/assume.rs index 6cdf3e621aece..98126bcee7621 100644 --- a/crates/cheatcodes/src/test/assume.rs +++ b/crates/cheatcodes/src/test/assume.rs @@ -2,7 +2,7 @@ use crate::{Cheatcode, Cheatcodes, CheatsCtxt, Error, Result}; use alloy_primitives::Address; use foundry_evm_core::constants::MAGIC_ASSUME; use spec::Vm::{ - assumeCall, assumeNoRevert_0Call, assumeNoRevert_1Call, assumeNoRevert_2Call, PotentialRevert, + PotentialRevert, assumeCall, assumeNoRevert_0Call, assumeNoRevert_1Call, assumeNoRevert_2Call, }; use std::fmt::Debug; @@ -46,11 +46,7 @@ impl AcceptableRevertParameters { impl Cheatcode for assumeCall { fn apply(&self, _state: &mut Cheatcodes) -> Result { let Self { condition } = self; - if *condition { - Ok(Default::default()) - } else { - Err(Error::from(MAGIC_ASSUME)) - } + if *condition { Ok(Default::default()) } else { Err(Error::from(MAGIC_ASSUME)) } } } diff --git a/crates/cheatcodes/src/test/expect.rs b/crates/cheatcodes/src/test/expect.rs index 1917331de54de..4b01060b1e470 100644 --- a/crates/cheatcodes/src/test/expect.rs +++ b/crates/cheatcodes/src/test/expect.rs @@ -5,8 +5,8 @@ use std::{ use crate::{Cheatcode, Cheatcodes, CheatsCtxt, Error, Result, Vm::*}; use alloy_primitives::{ - map::{hash_map::Entry, AddressHashMap, HashMap}, Address, Bytes, LogData as RawLog, U256, + map::{AddressHashMap, HashMap, hash_map::Entry}, }; use revm::{ context::JournalTr, diff --git a/crates/cheatcodes/src/test/revert_handlers.rs b/crates/cheatcodes/src/test/revert_handlers.rs index 92026b9a86697..7a12439af40a5 100644 --- a/crates/cheatcodes/src/test/revert_handlers.rs +++ b/crates/cheatcodes/src/test/revert_handlers.rs @@ -1,9 +1,9 @@ use crate::{Error, Result}; -use alloy_primitives::{address, hex, Address, Bytes}; +use alloy_primitives::{Address, Bytes, address, hex}; use alloy_sol_types::{SolError, SolValue}; use foundry_common::ContractsByArtifact; use foundry_evm_core::decode::RevertDecoder; -use revm::interpreter::{return_ok, InstructionResult}; +use revm::interpreter::{InstructionResult, return_ok}; use spec::Vm; use super::{ diff --git a/crates/cheatcodes/src/toml.rs b/crates/cheatcodes/src/toml.rs index b55ef2d16eedf..4ae16340ec6be 100644 --- a/crates/cheatcodes/src/toml.rs +++ b/crates/cheatcodes/src/toml.rs @@ -1,12 +1,12 @@ //! Implementations of [`Toml`](spec::Group::Toml) cheatcodes. use crate::{ + Cheatcode, Cheatcodes, Result, + Vm::*, json::{ canonicalize_json_path, check_json_key_exists, parse_json, parse_json_coerce, parse_json_keys, resolve_type, }, - Cheatcode, Cheatcodes, Result, - Vm::*, }; use alloy_dyn_abi::DynSolType; use alloy_sol_types::SolValue; diff --git a/crates/cheatcodes/src/utils.rs b/crates/cheatcodes/src/utils.rs index 8a18b4c429668..e86ad6e92962a 100644 --- a/crates/cheatcodes/src/utils.rs +++ b/crates/cheatcodes/src/utils.rs @@ -1,15 +1,15 @@ //! Implementations of [`Utilities`](spec::Group::Utilities) cheatcodes. use crate::{Cheatcode, Cheatcodes, CheatcodesExecutor, CheatsCtxt, Result, Vm::*}; -use alloy_dyn_abi::{eip712_parser::EncodeType, DynSolType, DynSolValue, Resolver, TypedData}; +use alloy_dyn_abi::{DynSolType, DynSolValue, Resolver, TypedData, eip712_parser::EncodeType}; use alloy_ens::namehash; -use alloy_primitives::{aliases::B32, keccak256, map::HashMap, Bytes, B64, U256}; +use alloy_primitives::{B64, Bytes, U256, aliases::B32, keccak256, map::HashMap}; use alloy_sol_types::SolValue; -use foundry_common::{fs, TYPE_BINDING_PREFIX}; +use foundry_common::{TYPE_BINDING_PREFIX, fs}; use foundry_config::fs_permissions::FsAccessKind; use foundry_evm_core::constants::DEFAULT_CREATE2_DEPLOYER; use proptest::prelude::Strategy; -use rand::{seq::SliceRandom, Rng, RngCore}; +use rand::{Rng, RngCore, seq::SliceRandom}; use revm::context::JournalTr; use std::path::PathBuf; diff --git a/crates/chisel/src/args.rs b/crates/chisel/src/args.rs index 3837953b5f3b2..a29572ba0241d 100644 --- a/crates/chisel/src/args.rs +++ b/crates/chisel/src/args.rs @@ -10,13 +10,13 @@ use foundry_cli::{ }; use foundry_common::fs; use foundry_config::{ + Config, figment::{ - value::{Dict, Map}, Metadata, Profile, Provider, + value::{Dict, Map}, }, - Config, }; -use rustyline::{config::Configurer, error::ReadlineError, Editor}; +use rustyline::{Editor, config::Configurer, error::ReadlineError}; use std::path::PathBuf; use tracing::debug; use yansi::Paint; @@ -194,15 +194,19 @@ async fn dispatch_repl_line(dispatcher: &mut ChiselDispatcher, line: &str) -> Re if let Some(msg) = msg { sh_println!("{}", msg.green())?; } - }, + } DispatchResult::UnrecognizedCommand(e) => sh_err!("{e}")?, DispatchResult::SolangParserFailed(e) => { sh_err!("{}", "Compilation error".red())?; sh_eprintln!("{}", format!("{e:?}").red())?; } DispatchResult::FileIoError(e) => sh_err!("{}", format!("File IO - {e}").red())?, - DispatchResult::CommandFailed(msg) | DispatchResult::Failure(Some(msg)) => sh_err!("{}", msg.red())?, - DispatchResult::Failure(None) => sh_err!("Please report this bug as a github issue if it persists: https://github.com/foundry-rs/foundry/issues/new/choose")?, + DispatchResult::CommandFailed(msg) | DispatchResult::Failure(Some(msg)) => { + sh_err!("{}", msg.red())? + } + DispatchResult::Failure(None) => sh_err!( + "Please report this bug as a github issue if it persists: https://github.com/foundry-rs/foundry/issues/new/choose" + )?, } Ok(r.is_error()) } diff --git a/crates/chisel/src/cmd.rs b/crates/chisel/src/cmd.rs index c13272bc90e2b..6f0e4218428c3 100644 --- a/crates/chisel/src/cmd.rs +++ b/crates/chisel/src/cmd.rs @@ -122,25 +122,81 @@ impl From for CmdDescriptor { // General ChiselCommand::Help => (&["help", "h"], "Display all commands", CmdCategory::General), ChiselCommand::Quit => (&["quit", "q"], "Quit Chisel", CmdCategory::General), - ChiselCommand::Exec => (&["exec [args]", "e [args]"], "Execute a shell command and print the output", CmdCategory::General), + ChiselCommand::Exec => ( + &["exec [args]", "e [args]"], + "Execute a shell command and print the output", + CmdCategory::General, + ), // Session - ChiselCommand::Clear => (&["clear", "c"], "Clear current session source", CmdCategory::Session), - ChiselCommand::Source => (&["source", "so"], "Display the source code of the current session", CmdCategory::Session), - ChiselCommand::Save => (&["save [id]", "s [id]"], "Save the current session to cache", CmdCategory::Session), - ChiselCommand::Load => (&["load ", "l "], "Load a previous session ID from cache", CmdCategory::Session), - ChiselCommand::ListSessions => (&["list", "ls"], "List all cached sessions", CmdCategory::Session), - ChiselCommand::ClearCache => (&["clearcache", "cc"], "Clear the chisel cache of all stored sessions", CmdCategory::Session), - ChiselCommand::Export => (&["export", "ex"], "Export the current session source to a script file", CmdCategory::Session), - ChiselCommand::Fetch => (&["fetch ", "fe "], "Fetch the interface of a verified contract on Etherscan", CmdCategory::Session), + ChiselCommand::Clear => { + (&["clear", "c"], "Clear current session source", CmdCategory::Session) + } + ChiselCommand::Source => ( + &["source", "so"], + "Display the source code of the current session", + CmdCategory::Session, + ), + ChiselCommand::Save => ( + &["save [id]", "s [id]"], + "Save the current session to cache", + CmdCategory::Session, + ), + ChiselCommand::Load => ( + &["load ", "l "], + "Load a previous session ID from cache", + CmdCategory::Session, + ), + ChiselCommand::ListSessions => { + (&["list", "ls"], "List all cached sessions", CmdCategory::Session) + } + ChiselCommand::ClearCache => ( + &["clearcache", "cc"], + "Clear the chisel cache of all stored sessions", + CmdCategory::Session, + ), + ChiselCommand::Export => ( + &["export", "ex"], + "Export the current session source to a script file", + CmdCategory::Session, + ), + ChiselCommand::Fetch => ( + &["fetch ", "fe "], + "Fetch the interface of a verified contract on Etherscan", + CmdCategory::Session, + ), // Environment - ChiselCommand::Fork => (&["fork ", "f "], "Fork an RPC for the current session. Supply 0 arguments to return to a local network", CmdCategory::Env), - ChiselCommand::Traces => (&["traces", "t"], "Enable / disable traces for the current session", CmdCategory::Env), - ChiselCommand::Calldata => (&["calldata [data]", "cd [data]"], "Set calldata (`msg.data`) for the current session (appended after function selector). Clears it if no argument provided.", CmdCategory::Env), + ChiselCommand::Fork => ( + &["fork ", "f "], + "Fork an RPC for the current session. Supply 0 arguments to return to a local network", + CmdCategory::Env, + ), + ChiselCommand::Traces => ( + &["traces", "t"], + "Enable / disable traces for the current session", + CmdCategory::Env, + ), + ChiselCommand::Calldata => ( + &["calldata [data]", "cd [data]"], + "Set calldata (`msg.data`) for the current session (appended after function selector). Clears it if no argument provided.", + CmdCategory::Env, + ), // Debug - ChiselCommand::MemDump => (&["memdump", "md"], "Dump the raw memory of the current state", CmdCategory::Debug), - ChiselCommand::StackDump => (&["stackdump", "sd"], "Dump the raw stack of the current state", CmdCategory::Debug), - ChiselCommand::Edit => (&["edit"], "Open the current session in an editor", CmdCategory::Session), - ChiselCommand::RawStack => (&["rawstack ", "rs "], "Display the raw value of a variable's stack allocation. For variables that are > 32 bytes in length, this will display their memory pointer.", CmdCategory::Debug), + ChiselCommand::MemDump => { + (&["memdump", "md"], "Dump the raw memory of the current state", CmdCategory::Debug) + } + ChiselCommand::StackDump => ( + &["stackdump", "sd"], + "Dump the raw stack of the current state", + CmdCategory::Debug, + ), + ChiselCommand::Edit => { + (&["edit"], "Open the current session in an editor", CmdCategory::Session) + } + ChiselCommand::RawStack => ( + &["rawstack ", "rs "], + "Display the raw value of a variable's stack allocation. For variables that are > 32 bytes in length, this will display their memory pointer.", + CmdCategory::Debug, + ), } } } diff --git a/crates/chisel/src/dispatcher.rs b/crates/chisel/src/dispatcher.rs index 13e63c1715beb..aed39d53d57cc 100644 --- a/crates/chisel/src/dispatcher.rs +++ b/crates/chisel/src/dispatcher.rs @@ -11,15 +11,15 @@ use crate::{ session_source::SessionSource, }; use alloy_json_abi::{InternalType, JsonAbi}; -use alloy_primitives::{hex, Address}; +use alloy_primitives::{Address, hex}; use forge_fmt::FormatterConfig; use foundry_config::RpcEndpointUrl; use foundry_evm::{ decode::decode_console_logs, traces::{ - decode_trace_arena, + CallTraceDecoder, CallTraceDecoderBuilder, TraceKind, decode_trace_arena, identifier::{SignaturesIdentifier, TraceIdentifiers}, - render_trace_arena, CallTraceDecoder, CallTraceDecoderBuilder, TraceKind, + render_trace_arena, }, }; use regex::Regex; @@ -960,7 +960,9 @@ impl ChiselDispatcher { result: &mut ChiselResult, ) -> eyre::Result<()> { if result.traces.is_empty() { - eyre::bail!("Unexpected error: No traces gathered. Please report this as a bug: https://github.com/foundry-rs/foundry/issues/new?assignees=&labels=T-bug&template=BUG-FORM.yml"); + eyre::bail!( + "Unexpected error: No traces gathered. Please report this as a bug: https://github.com/foundry-rs/foundry/issues/new?assignees=&labels=T-bug&template=BUG-FORM.yml" + ); } sh_println!("{}", "Traces:".green())?; diff --git a/crates/chisel/src/executor.rs b/crates/chisel/src/executor.rs index b490cdfc77c72..8285580263a3a 100644 --- a/crates/chisel/src/executor.rs +++ b/crates/chisel/src/executor.rs @@ -7,7 +7,7 @@ use crate::prelude::{ }; use alloy_dyn_abi::{DynSolType, DynSolValue}; use alloy_json_abi::EventParam; -use alloy_primitives::{hex, Address, B256, U256}; +use alloy_primitives::{Address, B256, U256, hex}; use core::fmt::Debug; use eyre::{Result, WrapErr}; use foundry_compilers::Artifact; @@ -1025,7 +1025,9 @@ impl Type { .collect::>>()?; Ok(Some(DynSolType::Tuple(inner_types))) } else { - eyre::bail!("Could not find any definition in contract \"{contract_name}\" for type: {custom_type:?}") + eyre::bail!( + "Could not find any definition in contract \"{contract_name}\" for type: {custom_type:?}" + ) } } else { // Check if the custom type is a variable or function within the REPL contract before diff --git a/crates/chisel/src/runner.rs b/crates/chisel/src/runner.rs index 72b083e1fb882..fab505cc40235 100644 --- a/crates/chisel/src/runner.rs +++ b/crates/chisel/src/runner.rs @@ -3,13 +3,13 @@ //! This module contains the `ChiselRunner` struct, which assists with deploying //! and calling the REPL contract on a in-memory REVM instance. -use alloy_primitives::{map::AddressHashMap, Address, Bytes, Log, U256}; +use alloy_primitives::{Address, Bytes, Log, U256, map::AddressHashMap}; use eyre::Result; use foundry_evm::{ executors::{DeployResult, Executor, RawCallResult}, traces::{TraceKind, Traces}, }; -use revm::interpreter::{return_ok, InstructionResult}; +use revm::interpreter::{InstructionResult, return_ok}; /// The function selector of the REPL contract's entrypoint, the `run()` function. static RUN_SELECTOR: [u8; 4] = [0xc0, 0x40, 0x62, 0x26]; diff --git a/crates/chisel/src/session.rs b/crates/chisel/src/session.rs index 2f293c1cd9172..6dc525a4ec1ea 100644 --- a/crates/chisel/src/session.rs +++ b/crates/chisel/src/session.rs @@ -7,7 +7,7 @@ use crate::prelude::{SessionSource, SessionSourceConfig}; use eyre::Result; use serde::{Deserialize, Serialize}; use std::path::Path; -use time::{format_description, OffsetDateTime}; +use time::{OffsetDateTime, format_description}; /// A Chisel REPL Session #[derive(Debug, Serialize, Deserialize)] diff --git a/crates/chisel/src/solidity_helper.rs b/crates/chisel/src/solidity_helper.rs index 5087e7b47c377..ddb4a072babd3 100644 --- a/crates/chisel/src/solidity_helper.rs +++ b/crates/chisel/src/solidity_helper.rs @@ -5,19 +5,19 @@ use crate::{ dispatcher::PROMPT_ARROW, - prelude::{ChiselCommand, COMMAND_LEADER, PROMPT_ARROW_STR}, + prelude::{COMMAND_LEADER, ChiselCommand, PROMPT_ARROW_STR}, }; use rustyline::{ + Helper, completion::Completer, highlight::{CmdKind, Highlighter}, hint::Hinter, validate::{ValidationContext, ValidationResult, Validator}, - Helper, }; use solar_parse::{ + Lexer, interface::{Session, SessionGlobals}, token::{Token, TokenKind}, - Lexer, }; use std::{borrow::Cow, ops::Range, str::FromStr}; use yansi::{Color, Style}; @@ -147,11 +147,7 @@ impl SolidityHelper { } } }); - if depth == [0; 3] { - ValidationResult::Valid(None) - } else { - ValidationResult::Incomplete - } + if depth == [0; 3] { ValidationResult::Valid(None) } else { ValidationResult::Incomplete } } /// Formats `input` with `style` into `out`, without checking `style.wrapping` or diff --git a/crates/cli/src/handler.rs b/crates/cli/src/handler.rs index f510f59d14509..a2ea58370afc1 100644 --- a/crates/cli/src/handler.rs +++ b/crates/cli/src/handler.rs @@ -80,7 +80,9 @@ impl EyreHandler for Handler { /// Panics are always caught by the more debug-centric handler. pub fn install() { if std::env::var_os("RUST_BACKTRACE").is_none() { - unsafe { std::env::set_var("RUST_BACKTRACE", "1"); } + unsafe { + std::env::set_var("RUST_BACKTRACE", "1"); + } } let panic_section = diff --git a/crates/cli/src/opts/build/core.rs b/crates/cli/src/opts/build/core.rs index dd7e49ec1c3ab..27e9e05f7853c 100644 --- a/crates/cli/src/opts/build/core.rs +++ b/crates/cli/src/opts/build/core.rs @@ -3,20 +3,19 @@ use crate::{opts::CompilerOpts, utils::LoadConfig}; use clap::{Parser, ValueHint}; use eyre::Result; use foundry_compilers::{ - artifacts::{remappings::Remapping, RevertStrings}, + Project, + artifacts::{RevertStrings, remappings::Remapping}, compilers::multi::MultiCompiler, utils::canonicalized, - Project, }; use foundry_config::{ - figment, + Config, Remappings, figment, figment::{ + Figment, Metadata, Profile, Provider, error::Kind::InvalidType, value::{Dict, Map, Value}, - Figment, Metadata, Profile, Provider, }, filter::SkipBuildFilter, - Config, Remappings, }; use serde::Serialize; use std::path::PathBuf; diff --git a/crates/cli/src/opts/build/mod.rs b/crates/cli/src/opts/build/mod.rs index 4deffb2a4c37d..53e6d2d94e88d 100644 --- a/crates/cli/src/opts/build/mod.rs +++ b/crates/cli/src/opts/build/mod.rs @@ -1,5 +1,5 @@ use clap::Parser; -use foundry_compilers::artifacts::{output_selection::ContractOutputSelection, EvmVersion}; +use foundry_compilers::artifacts::{EvmVersion, output_selection::ContractOutputSelection}; use serde::Serialize; mod core; diff --git a/crates/cli/src/opts/build/paths.rs b/crates/cli/src/opts/build/paths.rs index 263e03c14881a..70953887ace95 100644 --- a/crates/cli/src/opts/build/paths.rs +++ b/crates/cli/src/opts/build/paths.rs @@ -2,13 +2,13 @@ use clap::{Parser, ValueHint}; use eyre::Result; use foundry_compilers::artifacts::remappings::Remapping; use foundry_config::{ - figment, + Config, figment, figment::{ + Metadata, Profile, Provider, error::Kind::InvalidType, value::{Dict, Map, Value}, - Metadata, Profile, Provider, }, - find_project_root, remappings_from_env_var, Config, + find_project_root, remappings_from_env_var, }; use serde::Serialize; use std::path::PathBuf; diff --git a/crates/cli/src/opts/build/utils.rs b/crates/cli/src/opts/build/utils.rs index 004416c588439..0dedb38e2db61 100644 --- a/crates/cli/src/opts/build/utils.rs +++ b/crates/cli/src/opts/build/utils.rs @@ -2,12 +2,12 @@ use crate::{opts::BuildOpts, utils::LoadConfig}; use eyre::Result; use foundry_compilers::{ + CompilerInput, Graph, Project, artifacts::{Source, Sources}, multi::{MultiCompilerLanguage, MultiCompilerParsedSource}, solc::{SolcLanguage, SolcVersionedInput}, - CompilerInput, Graph, Project, }; -use solar_sema::{interface::Session, ParsingContext}; +use solar_sema::{ParsingContext, interface::Session}; use std::path::PathBuf; /// Builds a Solar [`solar_sema::ParsingContext`] from [`BuildOpts`]. diff --git a/crates/cli/src/opts/rpc.rs b/crates/cli/src/opts/rpc.rs index 2b508720a81a1..f591bbbda251b 100644 --- a/crates/cli/src/opts/rpc.rs +++ b/crates/cli/src/opts/rpc.rs @@ -4,12 +4,12 @@ use clap::Parser; use eyre::Result; use foundry_block_explorers::EtherscanApiVersion; use foundry_config::{ + Chain, Config, figment::{ - self, + self, Metadata, Profile, value::{Dict, Map}, - Metadata, Profile, }, - impl_figment_convert_cast, Chain, Config, + impl_figment_convert_cast, }; use foundry_wallets::WalletOpts; use serde::Serialize; diff --git a/crates/cli/src/opts/transaction.rs b/crates/cli/src/opts/transaction.rs index c0e229c35cda3..45557932f7a11 100644 --- a/crates/cli/src/opts/transaction.rs +++ b/crates/cli/src/opts/transaction.rs @@ -2,7 +2,7 @@ use std::str::FromStr; use crate::utils::{parse_ether_value, parse_json}; use alloy_eips::{eip2930::AccessList, eip7702::SignedAuthorization}; -use alloy_primitives::{hex, Address, U256, U64}; +use alloy_primitives::{Address, U64, U256, hex}; use alloy_rlp::Decodable; use clap::Parser; diff --git a/crates/cli/src/utils/abi.rs b/crates/cli/src/utils/abi.rs index d752312580df4..392b7e4cfada6 100644 --- a/crates/cli/src/utils/abi.rs +++ b/crates/cli/src/utils/abi.rs @@ -1,8 +1,8 @@ use alloy_chains::Chain; use alloy_ens::NameOrAddress; use alloy_json_abi::Function; -use alloy_primitives::{hex, Address}; -use alloy_provider::{network::AnyNetwork, Provider}; +use alloy_primitives::{Address, hex}; +use alloy_provider::{Provider, network::AnyNetwork}; use eyre::{OptionExt, Result}; use foundry_block_explorers::EtherscanApiVersion; use foundry_common::abi::{encode_function_args, get_func, get_func_etherscan}; diff --git a/crates/cli/src/utils/cmd.rs b/crates/cli/src/utils/cmd.rs index 21f411d446235..f74a6dadd652d 100644 --- a/crates/cli/src/utils/cmd.rs +++ b/crates/cli/src/utils/cmd.rs @@ -2,25 +2,26 @@ use alloy_json_abi::JsonAbi; use alloy_primitives::Address; use eyre::{Result, WrapErr}; use foundry_common::{ - compile::ProjectCompiler, fs, selectors::SelectorKind, shell, ContractsByArtifact, - TestFunctionExt, + ContractsByArtifact, TestFunctionExt, compile::ProjectCompiler, fs, selectors::SelectorKind, + shell, }; use foundry_compilers::{ + Artifact, ArtifactId, ProjectCompileOutput, artifacts::{CompactBytecode, Settings}, cache::{CacheEntry, CompilerCache}, utils::read_json_file, - Artifact, ArtifactId, ProjectCompileOutput, }; -use foundry_config::{error::ExtractConfigError, figment::Figment, Chain, Config, NamedChain}; +use foundry_config::{Chain, Config, NamedChain, error::ExtractConfigError, figment::Figment}; use foundry_debugger::Debugger; use foundry_evm::{ executors::{DeployResult, EvmError, RawCallResult}, opts::EvmOpts, traces::{ + CallTraceDecoder, CallTraceDecoderBuilder, TraceKind, Traces, debug::{ContractSources, DebugTraceIdentifier}, decode_trace_arena, identifier::{SignaturesCache, SignaturesIdentifier, TraceIdentifiers}, - render_trace_arena_inner, CallTraceDecoder, CallTraceDecoderBuilder, TraceKind, Traces, + render_trace_arena_inner, }, }; use std::{ @@ -118,7 +119,9 @@ pub fn get_cached_entry_by_name( pub fn ensure_clean_constructor(abi: &JsonAbi) -> Result<()> { if let Some(constructor) = &abi.constructor { if !constructor.inputs.is_empty() { - eyre::bail!("Contract constructor should have no arguments. Add those arguments to `run(...)` instead, and call it with `--sig run(...)`."); + eyre::bail!( + "Contract constructor should have no arguments. Add those arguments to `run(...)` instead, and call it with `--sig run(...)`." + ); } } Ok(()) diff --git a/crates/cli/src/utils/mod.rs b/crates/cli/src/utils/mod.rs index 4a20ae242b500..c1d3932f50a39 100644 --- a/crates/cli/src/utils/mod.rs +++ b/crates/cli/src/utils/mod.rs @@ -1,6 +1,6 @@ use alloy_json_abi::JsonAbi; use alloy_primitives::U256; -use alloy_provider::{network::AnyNetwork, Provider}; +use alloy_provider::{Provider, network::AnyNetwork}; use eyre::{ContextCompat, Result}; use foundry_common::{ provider::{ProviderBuilder, RetryProvider}, @@ -601,11 +601,7 @@ ignore them in the `.gitignore` file." // don't set this in cmd() because it's not wanted for all commands fn stderr(self) -> Stdio { - if self.quiet { - Stdio::piped() - } else { - Stdio::inherit() - } + if self.quiet { Stdio::piped() } else { Stdio::inherit() } } } diff --git a/crates/common/build.rs b/crates/common/build.rs index 7b5c0736435cd..aaba00e0d2da7 100644 --- a/crates/common/build.rs +++ b/crates/common/build.rs @@ -57,14 +57,16 @@ fn main() -> Result<(), Box> { // - The build profile. // Example: forge 0.3.0-nightly+3cb96bde9b.1737036656.debug println!( - "cargo:rustc-env=FOUNDRY_SEMVER_VERSION={pkg_version}{version_suffix}+{sha_short}.{build_timestamp_unix}.{profile}" - ); + "cargo:rustc-env=FOUNDRY_SEMVER_VERSION={pkg_version}{version_suffix}+{sha_short}.{build_timestamp_unix}.{profile}" + ); // The short version information for the Foundry CLI. // - The latest version from Cargo.toml // - The short SHA of the latest commit. // Example: 0.3.0-dev (3cb96bde9b) - println!("cargo:rustc-env=FOUNDRY_SHORT_VERSION={pkg_version}{version_suffix} ({sha_short} {build_timestamp})"); + println!( + "cargo:rustc-env=FOUNDRY_SHORT_VERSION={pkg_version}{version_suffix} ({sha_short} {build_timestamp})" + ); // The long version information for the Foundry CLI. // - The latest version from Cargo.toml. @@ -83,7 +85,9 @@ fn main() -> Result<(), Box> { // ``` println!("cargo:rustc-env=FOUNDRY_LONG_VERSION_0=Version: {pkg_version}{version_suffix}"); println!("cargo:rustc-env=FOUNDRY_LONG_VERSION_1=Commit SHA: {sha}"); - println!("cargo:rustc-env=FOUNDRY_LONG_VERSION_2=Build Timestamp: {build_timestamp} ({build_timestamp_unix})"); + println!( + "cargo:rustc-env=FOUNDRY_LONG_VERSION_2=Build Timestamp: {build_timestamp} ({build_timestamp_unix})" + ); println!("cargo:rustc-env=FOUNDRY_LONG_VERSION_3=Build Profile: {profile}"); Ok(()) diff --git a/crates/common/fmt/src/console.rs b/crates/common/fmt/src/console.rs index a8c4fe4ae5a7e..18ffd80903d6d 100644 --- a/crates/common/fmt/src/console.rs +++ b/crates/common/fmt/src/console.rs @@ -410,7 +410,7 @@ fn format_spec<'a>( #[cfg(test)] mod tests { use super::*; - use alloy_primitives::{address, B256}; + use alloy_primitives::{B256, address}; use foundry_macros::ConsoleFmt; use std::str::FromStr; diff --git a/crates/common/fmt/src/dynamic.rs b/crates/common/fmt/src/dynamic.rs index 266e53f0ee24e..44e8fbd662b95 100644 --- a/crates/common/fmt/src/dynamic.rs +++ b/crates/common/fmt/src/dynamic.rs @@ -149,7 +149,7 @@ pub fn format_token_raw(value: &DynSolValue) -> String { #[cfg(test)] mod tests { use super::*; - use alloy_primitives::{address, U256}; + use alloy_primitives::{U256, address}; #[test] fn parse_hex_uint() { diff --git a/crates/common/fmt/src/exp.rs b/crates/common/fmt/src/exp.rs index 84444615e6d09..41551a2f0ac62 100644 --- a/crates/common/fmt/src/exp.rs +++ b/crates/common/fmt/src/exp.rs @@ -1,4 +1,4 @@ -use alloy_primitives::{Sign, I256, U256}; +use alloy_primitives::{I256, Sign, U256}; use yansi::Paint; /// Returns the number expressed as a string in exponential notation diff --git a/crates/common/fmt/src/lib.rs b/crates/common/fmt/src/lib.rs index 473e5d8a33c38..f571b1a450fb4 100644 --- a/crates/common/fmt/src/lib.rs +++ b/crates/common/fmt/src/lib.rs @@ -3,7 +3,7 @@ #![cfg_attr(not(test), warn(unused_crate_dependencies))] mod console; -pub use console::{console_format, ConsoleFmt, FormatSpec}; +pub use console::{ConsoleFmt, FormatSpec, console_format}; mod dynamic; pub use dynamic::{format_token, format_token_raw, format_tokens, format_tokens_raw, parse_tokens}; @@ -12,4 +12,4 @@ mod exp; pub use exp::{format_int_exp, format_uint_exp, to_exp_notation}; mod ui; -pub use ui::{get_pretty_block_attr, get_pretty_tx_attr, EthValue, UIfmt}; +pub use ui::{EthValue, UIfmt, get_pretty_block_attr, get_pretty_tx_attr}; diff --git a/crates/common/fmt/src/ui.rs b/crates/common/fmt/src/ui.rs index 8bed28a542671..893d48f55c06c 100644 --- a/crates/common/fmt/src/ui.rs +++ b/crates/common/fmt/src/ui.rs @@ -7,7 +7,7 @@ use alloy_network::{ AnyHeader, AnyReceiptEnvelope, AnyRpcBlock, AnyRpcTransaction, AnyTransactionReceipt, AnyTxEnvelope, ReceiptResponse, }; -use alloy_primitives::{hex, Address, Bloom, Bytes, FixedBytes, Uint, I256, U256, U64, U8}; +use alloy_primitives::{Address, Bloom, Bytes, FixedBytes, I256, U8, U64, U256, Uint, hex}; use alloy_rpc_types::{ AccessListItem, Block, BlockTransactions, Header, Log, Transaction, TransactionReceipt, }; @@ -41,11 +41,7 @@ impl UIfmt for &T { impl UIfmt for Option { fn pretty(&self) -> String { - if let Some(inner) = self { - inner.pretty() - } else { - String::new() - } + if let Some(inner) = self { inner.pretty() } else { String::new() } } } diff --git a/crates/common/src/abi.rs b/crates/common/src/abi.rs index 38c7efda36e8f..eceec5773e330 100644 --- a/crates/common/src/abi.rs +++ b/crates/common/src/abi.rs @@ -2,10 +2,10 @@ use alloy_dyn_abi::{DynSolType, DynSolValue, FunctionExt, JsonAbiExt}; use alloy_json_abi::{Error, Event, Function, Param}; -use alloy_primitives::{hex, Address, LogData}; +use alloy_primitives::{Address, LogData, hex}; use eyre::{Context, ContextCompat, Result}; use foundry_block_explorers::{ - contract::ContractMetadata, errors::EtherscanError, Client, EtherscanApiVersion, + Client, EtherscanApiVersion, contract::ContractMetadata, errors::EtherscanError, }; use foundry_config::Chain; use std::pin::Pin; diff --git a/crates/common/src/calc.rs b/crates/common/src/calc.rs index 2d7d6fb9ebdc7..8e55f8d4a1b09 100644 --- a/crates/common/src/calc.rs +++ b/crates/common/src/calc.rs @@ -19,11 +19,7 @@ pub fn median_sorted(values: &[u64]) -> u64 { let len = values.len(); let mid = len / 2; - if len % 2 == 0 { - (values[mid - 1] + values[mid]) / 2 - } else { - values[mid] - } + if len % 2 == 0 { (values[mid - 1] + values[mid]) / 2 } else { values[mid] } } #[cfg(test)] diff --git a/crates/common/src/compile.rs b/crates/common/src/compile.rs index f160f2f8de74b..1e9bb08cb3912 100644 --- a/crates/common/src/compile.rs +++ b/crates/common/src/compile.rs @@ -1,26 +1,26 @@ //! Support for compiling [foundry_compilers::Project] use crate::{ + TestFunctionExt, preprocessor::TestOptimizerPreprocessor, - reports::{report_kind, ReportKind}, + reports::{ReportKind, report_kind}, shell, term::SpinnerReporter, - TestFunctionExt, }; -use comfy_table::{modifiers::UTF8_ROUND_CORNERS, Cell, Color, Table}; +use comfy_table::{Cell, Color, Table, modifiers::UTF8_ROUND_CORNERS}; use eyre::Result; use foundry_block_explorers::contract::Metadata; use foundry_compilers::{ - artifacts::{remappings::Remapping, BytecodeObject, Contract, Source}, + Artifact, Project, ProjectBuilder, ProjectCompileOutput, ProjectPathsConfig, SolcConfig, + artifacts::{BytecodeObject, Contract, Source, remappings::Remapping}, compilers::{ - solc::{Solc, SolcCompiler}, Compiler, + solc::{Solc, SolcCompiler}, }, info::ContractInfo as CompilerContractInfo, project::Preprocessor, report::{BasicStdoutReporter, NoReporter, Report}, solc::SolcSettings, - Artifact, Project, ProjectBuilder, ProjectCompileOutput, ProjectPathsConfig, SolcConfig, }; use num_format::{Locale, ToFormattedString}; use std::{ diff --git a/crates/common/src/constants.rs b/crates/common/src/constants.rs index 5e30eec89c9f0..0b83502ebe0aa 100644 --- a/crates/common/src/constants.rs +++ b/crates/common/src/constants.rs @@ -2,7 +2,7 @@ use alloy_consensus::Typed2718; use alloy_network::AnyTxEnvelope; -use alloy_primitives::{address, Address, Signature, B256}; +use alloy_primitives::{Address, B256, Signature, address}; use std::time::Duration; /// The dev chain-id, inherited from hardhat diff --git a/crates/common/src/contracts.rs b/crates/common/src/contracts.rs index e7dfac47ecd35..98759361019e2 100644 --- a/crates/common/src/contracts.rs +++ b/crates/common/src/contracts.rs @@ -3,15 +3,15 @@ use crate::compile::PathOrContractInfo; use alloy_dyn_abi::JsonAbiExt; use alloy_json_abi::{Event, Function, JsonAbi}; -use alloy_primitives::{hex, Address, Bytes, Selector, B256}; +use alloy_primitives::{Address, B256, Bytes, Selector, hex}; use eyre::{OptionExt, Result}; use foundry_compilers::{ + ArtifactId, Project, ProjectCompileOutput, artifacts::{ BytecodeObject, CompactBytecode, CompactContractBytecode, CompactDeployedBytecode, ConfigurableContractArtifact, ContractBytecodeSome, Offsets, }, utils::canonicalized, - ArtifactId, Project, ProjectCompileOutput, }; use std::{ collections::BTreeMap, @@ -500,7 +500,9 @@ pub fn find_matching_contract_artifact( .collect::>(); if possible_targets.is_empty() { - eyre::bail!("Could not find artifact linked to source `{target_path:?}` in the compiled artifacts"); + eyre::bail!( + "Could not find artifact linked to source `{target_path:?}` in the compiled artifacts" + ); } let (target_id, target_artifact) = possible_targets[0].clone(); @@ -514,7 +516,9 @@ pub fn find_matching_contract_artifact( if !target_id.name.contains(".") && possible_targets.iter().any(|(id, _)| id.name != target_id.name) { - eyre::bail!("Multiple contracts found in the same file, please specify the target : or "); + eyre::bail!( + "Multiple contracts found in the same file, please specify the target : or " + ); } // Otherwise, we're dealing with additional compiler profiles wherein `id.source` is the diff --git a/crates/common/src/evm.rs b/crates/common/src/evm.rs index 4a7e459e8fa16..90f973a7d06c5 100644 --- a/crates/common/src/evm.rs +++ b/crates/common/src/evm.rs @@ -1,16 +1,15 @@ //! CLI arguments for configuring the EVM settings. -use alloy_primitives::{map::HashMap, Address, B256, U256}; +use alloy_primitives::{Address, B256, U256, map::HashMap}; use clap::Parser; use eyre::ContextCompat; use foundry_config::{ + Chain, Config, figment::{ - self, + self, Metadata, Profile, Provider, error::Kind::InvalidType, value::{Dict, Map, Value}, - Metadata, Profile, Provider, }, - Chain, Config, }; use serde::Serialize; diff --git a/crates/common/src/fs.rs b/crates/common/src/fs.rs index 19675e425a4ce..51d81f5989eb5 100644 --- a/crates/common/src/fs.rs +++ b/crates/common/src/fs.rs @@ -1,7 +1,7 @@ //! Contains various `std::fs` wrapper functions that also contain the target path in their errors. use crate::errors::FsPathError; -use serde::{de::DeserializeOwned, Serialize}; +use serde::{Serialize, de::DeserializeOwned}; use std::{ fs::{self, File}, io::{BufWriter, Write}, diff --git a/crates/common/src/io/shell.rs b/crates/common/src/io/shell.rs index 19b3ae07e7900..89328fbe45a4e 100644 --- a/crates/common/src/io/shell.rs +++ b/crates/common/src/io/shell.rs @@ -10,11 +10,11 @@ use eyre::Result; use serde::{Deserialize, Serialize}; use std::{ fmt, - io::{prelude::*, IsTerminal}, + io::{IsTerminal, prelude::*}, ops::DerefMut, sync::{ - atomic::{AtomicBool, Ordering}, Mutex, OnceLock, PoisonError, + atomic::{AtomicBool, Ordering}, }, }; diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index a0912c38caf8e..4fd8597e57fb6 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -38,7 +38,7 @@ pub mod version; pub use constants::*; pub use contracts::*; -pub use io::{shell, stdin, Shell}; +pub use io::{Shell, shell, stdin}; pub use traits::*; pub use transactions::*; pub use utils::*; diff --git a/crates/common/src/preprocessor/deps.rs b/crates/common/src/preprocessor/deps.rs index 7d0f31b1d6b92..3286d14ae94d9 100644 --- a/crates/common/src/preprocessor/deps.rs +++ b/crates/common/src/preprocessor/deps.rs @@ -7,7 +7,7 @@ use itertools::Itertools; use solar_parse::interface::Session; use solar_sema::{ hir::{CallArgs, ContractId, Expr, ExprKind, Hir, NamedArg, Stmt, StmtKind, TypeKind, Visit}, - interface::{data_structures::Never, source_map::FileName, SourceMap}, + interface::{SourceMap, data_structures::Never, source_map::FileName}, }; use std::{ collections::{BTreeMap, BTreeSet, HashSet}, diff --git a/crates/common/src/preprocessor/mod.rs b/crates/common/src/preprocessor/mod.rs index ff8b0e66feae3..e77cd691d5a2f 100644 --- a/crates/common/src/preprocessor/mod.rs +++ b/crates/common/src/preprocessor/mod.rs @@ -1,24 +1,23 @@ use foundry_compilers::{ - apply_updates, + Compiler, Language, ProjectPathsConfig, apply_updates, artifacts::SolcLanguage, error::Result, multi::{MultiCompiler, MultiCompilerInput, MultiCompilerLanguage}, project::Preprocessor, solc::{SolcCompiler, SolcVersionedInput}, - Compiler, Language, ProjectPathsConfig, }; use solar_parse::{ ast::Span, interface::{Session, SourceMap}, }; -use solar_sema::{thread_local::ThreadLocal, ParsingContext}; +use solar_sema::{ParsingContext, thread_local::ThreadLocal}; use std::{collections::HashSet, ops::Range, path::PathBuf}; mod data; use data::{collect_preprocessor_data, create_deploy_helpers}; mod deps; -use deps::{remove_bytecode_dependencies, PreprocessorDependencies}; +use deps::{PreprocessorDependencies, remove_bytecode_dependencies}; /// Returns the range of the given span in the source map. #[track_caller] diff --git a/crates/common/src/provider/mod.rs b/crates/common/src/provider/mod.rs index 0603b91f97d2d..f08a1847e3438 100644 --- a/crates/common/src/provider/mod.rs +++ b/crates/common/src/provider/mod.rs @@ -3,12 +3,12 @@ pub mod runtime_transport; use crate::{ - provider::runtime_transport::RuntimeTransportBuilder, ALCHEMY_FREE_TIER_CUPS, REQUEST_TIMEOUT, + ALCHEMY_FREE_TIER_CUPS, REQUEST_TIMEOUT, provider::runtime_transport::RuntimeTransportBuilder, }; use alloy_provider::{ + Identity, ProviderBuilder as AlloyProviderBuilder, RootProvider, fillers::{ChainIdFiller, FillProvider, GasFiller, JoinFill, NonceFiller, WalletFiller}, network::{AnyNetwork, EthereumWallet}, - Identity, ProviderBuilder as AlloyProviderBuilder, RootProvider, }; use alloy_rpc_client::ClientBuilder; use alloy_transport::{layers::RetryBackoffLayer, utils::guess_local_url}; diff --git a/crates/common/src/reports.rs b/crates/common/src/reports.rs index 0fdf4502eb68b..cb00a7eda43c7 100644 --- a/crates/common/src/reports.rs +++ b/crates/common/src/reports.rs @@ -11,9 +11,5 @@ pub enum ReportKind { /// Determine the kind of report to generate based on the current shell. pub fn report_kind() -> ReportKind { - if shell::is_json() { - ReportKind::JSON - } else { - ReportKind::Text - } + if shell::is_json() { ReportKind::JSON } else { ReportKind::Text } } diff --git a/crates/common/src/selectors.rs b/crates/common/src/selectors.rs index 9dc20044f2ce5..326cb5e369def 100644 --- a/crates/common/src/selectors.rs +++ b/crates/common/src/selectors.rs @@ -4,15 +4,15 @@ use crate::{abi::abi_decode_calldata, provider::runtime_transport::RuntimeTransportBuilder}; use alloy_json_abi::JsonAbi; -use alloy_primitives::{map::HashMap, Selector, B256}; +use alloy_primitives::{B256, Selector, map::HashMap}; use eyre::Context; use itertools::Itertools; -use serde::{de::DeserializeOwned, Deserialize, Serialize}; +use serde::{Deserialize, Serialize, de::DeserializeOwned}; use std::{ fmt, sync::{ - atomic::{AtomicBool, AtomicUsize, Ordering}, Arc, + atomic::{AtomicBool, AtomicUsize, Ordering}, }, time::Duration, }; diff --git a/crates/common/src/serde_helpers.rs b/crates/common/src/serde_helpers.rs index 90634de397424..e643997abbd13 100644 --- a/crates/common/src/serde_helpers.rs +++ b/crates/common/src/serde_helpers.rs @@ -1,7 +1,7 @@ //! Misc Serde helpers for foundry crates. use alloy_primitives::U256; -use serde::{de, Deserialize, Deserializer}; +use serde::{Deserialize, Deserializer, de}; use std::str::FromStr; /// Helper type to parse both `u64` and `U256` diff --git a/crates/common/src/term.rs b/crates/common/src/term.rs index 931c29948ff01..904be01da93e8 100644 --- a/crates/common/src/term.rs +++ b/crates/common/src/term.rs @@ -8,11 +8,11 @@ use itertools::Itertools; use semver::Version; use std::{ io, - io::{prelude::*, IsTerminal}, + io::{IsTerminal, prelude::*}, path::{Path, PathBuf}, sync::{ - mpsc::{self, TryRecvError}, LazyLock, + mpsc::{self, TryRecvError}, }, thread, time::Duration, diff --git a/crates/common/src/transactions.rs b/crates/common/src/transactions.rs index 0933764b5c6d1..6a62c7c2dda68 100644 --- a/crates/common/src/transactions.rs +++ b/crates/common/src/transactions.rs @@ -1,12 +1,12 @@ //! Wrappers for transactions. -use alloy_consensus::{transaction::SignerRecoverable, Transaction, TxEnvelope}; +use alloy_consensus::{Transaction, TxEnvelope, transaction::SignerRecoverable}; use alloy_eips::eip7702::SignedAuthorization; use alloy_network::AnyTransactionReceipt; use alloy_primitives::{Address, TxKind, U256}; use alloy_provider::{ - network::{AnyNetwork, ReceiptResponse, TransactionBuilder}, Provider, + network::{AnyNetwork, ReceiptResponse, TransactionBuilder}, }; use alloy_rpc_types::{BlockId, TransactionRequest}; use alloy_serde::WithOtherFields; diff --git a/crates/common/src/utils.rs b/crates/common/src/utils.rs index a655d1e3d713f..1a020e2785ed9 100644 --- a/crates/common/src/utils.rs +++ b/crates/common/src/utils.rs @@ -1,6 +1,6 @@ //! Uncategorised utilities. -use alloy_primitives::{keccak256, B256, U256}; +use alloy_primitives::{B256, U256, keccak256}; /// Block on a future using the current tokio runtime on the current thread. pub fn block_on(future: F) -> F::Output { block_on_handle(&tokio::runtime::Handle::current(), future) @@ -48,9 +48,5 @@ pub fn ignore_metadata_hash(bytecode: &[u8]) -> &[u8] { return bytecode; } let (rest, metadata) = rest.split_at(rest.len() - metadata_len); - if ciborium::from_reader::(metadata).is_ok() { - rest - } else { - bytecode - } + if ciborium::from_reader::(metadata).is_ok() { rest } else { bytecode } } diff --git a/crates/common/src/version.rs b/crates/common/src/version.rs index aae9788aab93f..30c49ed0cfa4a 100644 --- a/crates/common/src/version.rs +++ b/crates/common/src/version.rs @@ -21,6 +21,5 @@ pub const LONG_VERSION: &str = concat!( pub const IS_NIGHTLY_VERSION: bool = option_env!("FOUNDRY_IS_NIGHTLY_VERSION").is_some(); /// The warning message for nightly versions. -pub const NIGHTLY_VERSION_WARNING_MESSAGE: &str = - "This is a nightly build of Foundry. It is recommended to use the latest stable version. \ +pub const NIGHTLY_VERSION_WARNING_MESSAGE: &str = "This is a nightly build of Foundry. It is recommended to use the latest stable version. \ To mute this warning set `FOUNDRY_DISABLE_NIGHTLY_WARNING` in your environment. \n"; diff --git a/crates/config/src/compilation.rs b/crates/config/src/compilation.rs index 8bb48f525bb54..bdd222348d055 100644 --- a/crates/config/src/compilation.rs +++ b/crates/config/src/compilation.rs @@ -1,10 +1,10 @@ use crate::{filter::GlobMatcher, serde_helpers}; use foundry_compilers::{ + RestrictionsWithVersion, artifacts::{BytecodeHash, EvmVersion}, multi::{MultiCompilerRestrictions, MultiCompilerSettings}, settings::VyperRestrictions, solc::{Restriction, SolcRestrictions}, - RestrictionsWithVersion, }; use semver::VersionReq; use serde::{Deserialize, Serialize}; diff --git a/crates/config/src/endpoints.rs b/crates/config/src/endpoints.rs index 1758e6a4870bf..f8870b0b01666 100644 --- a/crates/config/src/endpoints.rs +++ b/crates/config/src/endpoints.rs @@ -1,7 +1,7 @@ //! Support for multiple RPC-endpoints -use crate::resolve::{interpolate, UnresolvedEnvVarError, RE_PLACEHOLDER}; -use serde::{ser::SerializeMap, Deserialize, Deserializer, Serialize, Serializer}; +use crate::resolve::{RE_PLACEHOLDER, UnresolvedEnvVarError, interpolate}; +use serde::{Deserialize, Deserializer, Serialize, Serializer, ser::SerializeMap}; use std::{ collections::BTreeMap, fmt, diff --git a/crates/config/src/etherscan.rs b/crates/config/src/etherscan.rs index 0b44722e177a4..e0be320ed2450 100644 --- a/crates/config/src/etherscan.rs +++ b/crates/config/src/etherscan.rs @@ -1,13 +1,13 @@ //! Support for multiple Etherscan keys. use crate::{ - resolve::{interpolate, UnresolvedEnvVarError, RE_PLACEHOLDER}, Chain, Config, NamedChain, + resolve::{RE_PLACEHOLDER, UnresolvedEnvVarError, interpolate}, }; use figment::{ + Error, Metadata, Profile, Provider, providers::Env, value::{Dict, Map}, - Error, Metadata, Profile, Provider, }; use foundry_block_explorers::EtherscanApiVersion; use heck::ToKebabCase; @@ -509,7 +509,9 @@ mod tests { let config = resolved.remove("mainnet").unwrap(); assert!(config.is_err()); - unsafe { std::env::set_var(env, "ABCDEFG"); } + unsafe { + std::env::set_var(env, "ABCDEFG"); + } let mut resolved = configs.resolved(EtherscanApiVersion::V2); let config = resolved.remove("mainnet").unwrap().unwrap(); @@ -517,7 +519,9 @@ mod tests { let client = config.into_client().unwrap(); assert_eq!(*client.etherscan_api_version(), EtherscanApiVersion::V2); - unsafe { std::env::remove_var(env); } + unsafe { + std::env::remove_var(env); + } } #[test] diff --git a/crates/config/src/inline/mod.rs b/crates/config/src/inline/mod.rs index fa67b2426cf00..b463c1555ef9d 100644 --- a/crates/config/src/inline/mod.rs +++ b/crates/config/src/inline/mod.rs @@ -1,8 +1,8 @@ use crate::Config; use alloy_primitives::map::HashMap; use figment::{ - value::{Dict, Map, Value}, Figment, Profile, Provider, + value::{Dict, Map, Value}, }; use foundry_compilers::ProjectCompileOutput; use itertools::Itertools; diff --git a/crates/config/src/inline/natspec.rs b/crates/config/src/inline/natspec.rs index 92c610081d068..75962d9ba348c 100644 --- a/crates/config/src/inline/natspec.rs +++ b/crates/config/src/inline/natspec.rs @@ -1,17 +1,17 @@ -use super::{InlineConfigError, InlineConfigErrorKind, INLINE_CONFIG_PREFIX}; +use super::{INLINE_CONFIG_PREFIX, InlineConfigError, InlineConfigErrorKind}; use figment::Profile; use foundry_compilers::{ - artifacts::{ast::NodeType, Node}, ProjectCompileOutput, + artifacts::{Node, ast::NodeType}, }; use itertools::Itertools; use serde_json::Value; use solar_parse::{ + Parser, ast::{ - interface::{self, Session}, Arena, CommentKind, Item, ItemKind, + interface::{self, Session}, }, - Parser, }; use std::{collections::BTreeMap, path::Path}; diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs index fa2b4f7e3a23e..555c5952294d6 100644 --- a/crates/config/src/lib.rs +++ b/crates/config/src/lib.rs @@ -9,34 +9,35 @@ extern crate tracing; use crate::cache::StorageCachingConfig; -use alloy_primitives::{address, map::AddressHashMap, Address, FixedBytes, B256, U256}; +use alloy_primitives::{Address, B256, FixedBytes, U256, address, map::AddressHashMap}; use eyre::{ContextCompat, WrapErr}; use figment::{ + Error, Figment, Metadata, Profile, Provider, providers::{Env, Format, Serialized, Toml}, value::{Dict, Map, Value}, - Error, Figment, Metadata, Profile, Provider, }; use filter::GlobMatcher; use foundry_compilers::{ + ArtifactOutput, ConfigurableArtifacts, Graph, Project, ProjectPathsConfig, + RestrictionsWithVersion, VyperLanguage, artifacts::{ + BytecodeHash, DebuggingSettings, EvmVersion, Libraries, ModelCheckerSettings, + ModelCheckerTarget, Optimizer, OptimizerDetails, RevertStrings, Settings, SettingsMetadata, + Severity, output_selection::{ContractOutputSelection, OutputSelection}, remappings::{RelativeRemapping, Remapping}, - serde_helpers, BytecodeHash, DebuggingSettings, EvmVersion, Libraries, - ModelCheckerSettings, ModelCheckerTarget, Optimizer, OptimizerDetails, RevertStrings, - Settings, SettingsMetadata, Severity, + serde_helpers, }, cache::SOLIDITY_FILES_CACHE_FILENAME, compilers::{ + Compiler, multi::{MultiCompiler, MultiCompilerSettings}, solc::{Solc, SolcCompiler}, vyper::{Vyper, VyperSettings}, - Compiler, }, error::SolcError, multi::{MultiCompilerParsedSource, MultiCompilerRestrictions}, solc::{CliSettings, SolcSettings}, - ArtifactOutput, ConfigurableArtifacts, Graph, Project, ProjectPathsConfig, - RestrictionsWithVersion, VyperLanguage, }; use regex::Regex; use revm::primitives::hardfork::SpecId; @@ -118,7 +119,7 @@ pub mod soldeer; use soldeer::{SoldeerConfig, SoldeerDependencyConfig}; mod vyper; -pub use vyper::{normalize_evm_version_vyper, VyperConfig}; +pub use vyper::{VyperConfig, normalize_evm_version_vyper}; mod bind_json; use bind_json::BindJsonConfig; @@ -1300,11 +1301,7 @@ impl Config { &'a self, fallback: impl Into>, ) -> Result, UnresolvedEnvVarError> { - if let Some(url) = self.get_rpc_url() { - url - } else { - Ok(fallback.into()) - } + if let Some(url) = self.get_rpc_url() { url } else { Ok(fallback.into()) } } /// Returns the configured rpc or `"http://localhost:8545"` if no `eth_rpc_url` is set @@ -1433,20 +1430,12 @@ impl Config { /// Returns the remapping for the project's _test_ directory, but only if it exists pub fn get_test_dir_remapping(&self) -> Option { - if self.root.join(&self.test).exists() { - get_dir_remapping(&self.test) - } else { - None - } + if self.root.join(&self.test).exists() { get_dir_remapping(&self.test) } else { None } } /// Returns the remapping for the project's _script_ directory, but only if it exists pub fn get_script_dir_remapping(&self) -> Option { - if self.root.join(&self.script).exists() { - get_dir_remapping(&self.script) - } else { - None - } + if self.root.join(&self.script).exists() { get_dir_remapping(&self.script) } else { None } } /// Returns the `Optimizer` based on the configured settings @@ -2482,11 +2471,7 @@ impl SolcReq { impl> From for SolcReq { fn from(s: T) -> Self { let s = s.as_ref(); - if let Ok(v) = Version::from_str(s) { - Self::Version(v) - } else { - Self::Local(s.into()) - } + if let Ok(v) = Version::from_str(s) { Self::Version(v) } else { Self::Local(s.into()) } } } @@ -2572,16 +2557,16 @@ mod tests { endpoints::RpcEndpointType, etherscan::ResolvedEtherscanConfigs, }; + use NamedChain::Moonbeam; use endpoints::{RpcAuth, RpcEndpointConfig}; use figment::error::Kind::InvalidType; use foundry_compilers::artifacts::{ - vyper::VyperOptimizationMode, ModelCheckerEngine, YulDetails, + ModelCheckerEngine, YulDetails, vyper::VyperOptimizationMode, }; use similar_asserts::assert_eq; use soldeer_core::remappings::RemappingsLocation; use std::{fs::File, io::Write}; use tempfile::tempdir; - use NamedChain::Moonbeam; // Helper function to clear `__warnings` in config, since it will be populated during loading // from file, causing testing problem when comparing to those created from `default()`, etc. @@ -3014,11 +2999,15 @@ mod tests { )?; let config = Config::load().unwrap(); - assert!(config - .get_etherscan_config_with_chain(Some(NamedChain::BinanceSmartChain.into())) - .is_err()); + assert!( + config + .get_etherscan_config_with_chain(Some(NamedChain::BinanceSmartChain.into())) + .is_err() + ); - unsafe { std::env::set_var(env_key, env_value); } + unsafe { + std::env::set_var(env_key, env_value); + } assert_eq!( config @@ -3041,7 +3030,9 @@ mod tests { "via etherscan_api_key" ); - unsafe { std::env::remove_var(env_key); } + unsafe { + std::env::remove_var(env_key); + } Ok(()) }); } @@ -3278,7 +3269,10 @@ mod tests { let config = config.get_etherscan_config_with_chain(Some(NamedChain::Arbitrum.into())); assert!(config.is_err()); - assert_eq!(config.unwrap_err().to_string(), "At least one of `url` or `chain` must be present for Etherscan config with unknown alias `arbitrum_alias`"); + assert_eq!( + config.unwrap_err().to_string(), + "At least one of `url` or `chain` must be present for Etherscan config with unknown alias `arbitrum_alias`" + ); Ok(()) }); @@ -4169,8 +4163,10 @@ mod tests { let config = Config::load().unwrap(); assert_eq!( config.libraries, - vec!["src/DssSpell.sol:DssExecLib:0x8De6DDbCd5053d32292AAA0D2105A32d108484a6" - .to_string()] + vec![ + "src/DssSpell.sol:DssExecLib:0x8De6DDbCd5053d32292AAA0D2105A32d108484a6" + .to_string() + ] ); jail.set_env( @@ -4180,8 +4176,10 @@ mod tests { let config = Config::load().unwrap(); assert_eq!( config.libraries, - vec!["src/DssSpell.sol:DssExecLib:0x8De6DDbCd5053d32292AAA0D2105A32d108484a6" - .to_string(),] + vec![ + "src/DssSpell.sol:DssExecLib:0x8De6DDbCd5053d32292AAA0D2105A32d108484a6" + .to_string(), + ] ); jail.set_env( diff --git a/crates/config/src/lint.rs b/crates/config/src/lint.rs index ec9b2b4b00748..fbb80c5d83cb8 100644 --- a/crates/config/src/lint.rs +++ b/crates/config/src/lint.rs @@ -102,7 +102,9 @@ impl FromStr for Severity { "low" => Ok(Self::Low), "info" => Ok(Self::Info), "gas" => Ok(Self::Gas), - _ => Err(format!("unknown variant: found `{s}`, expected `one of `High`, `Med`, `Low`, `Info`, `Gas``")), + _ => Err(format!( + "unknown variant: found `{s}`, expected `one of `High`, `Med`, `Low`, `Info`, `Gas``" + )), } } } diff --git a/crates/config/src/macros.rs b/crates/config/src/macros.rs index cb5dc9771abc9..12679e7002e38 100644 --- a/crates/config/src/macros.rs +++ b/crates/config/src/macros.rs @@ -95,8 +95,9 @@ macro_rules! impl_figment_convert { /// /// ```rust /// use foundry_config::{ +/// Config, /// figment::{value::*, *}, -/// impl_figment_convert, merge_impl_figment_convert, Config, +/// impl_figment_convert, merge_impl_figment_convert, /// }; /// use std::path::PathBuf; /// diff --git a/crates/config/src/providers/ext.rs b/crates/config/src/providers/ext.rs index 64c99c771ba38..79bd47b1b3678 100644 --- a/crates/config/src/providers/ext.rs +++ b/crates/config/src/providers/ext.rs @@ -1,8 +1,8 @@ -use crate::{utils, Config}; +use crate::{Config, utils}; use figment::{ + Error, Figment, Metadata, Profile, Provider, providers::{Env, Format, Toml}, value::{Dict, Map, Value}, - Error, Figment, Metadata, Profile, Provider, }; use foundry_compilers::ProjectPathsConfig; use heck::ToSnakeCase; @@ -109,11 +109,7 @@ impl Provider for TomlFileProvider { } fn data(&self) -> Result, Error> { - if let Some(cache) = self.cache.as_ref() { - cache.clone() - } else { - self.read() - } + if let Some(cache) = self.cache.as_ref() { cache.clone() } else { self.read() } } } diff --git a/crates/config/src/providers/remappings.rs b/crates/config/src/providers/remappings.rs index 289c2294ac09f..c46a5b3ead53e 100644 --- a/crates/config/src/providers/remappings.rs +++ b/crates/config/src/providers/remappings.rs @@ -1,12 +1,12 @@ -use crate::{foundry_toml_dirs, remappings_from_env_var, remappings_from_newline, Config}; +use crate::{Config, foundry_toml_dirs, remappings_from_env_var, remappings_from_newline}; use figment::{ - value::{Dict, Map}, Error, Figment, Metadata, Profile, Provider, + value::{Dict, Map}, }; use foundry_compilers::artifacts::remappings::{RelativeRemapping, Remapping}; use std::{ borrow::Cow, - collections::{btree_map::Entry, BTreeMap, HashSet}, + collections::{BTreeMap, HashSet, btree_map::Entry}, fs, path::{Path, PathBuf}, }; @@ -451,11 +451,15 @@ mod tests { let result = remappings.into_inner(); assert_eq!(result.len(), 2, "Should allow same name with different contexts"); - assert!(result - .iter() - .any(|r| r.context == Some("test/".to_string()) && r.path == "test/Contract.sol")); - assert!(result - .iter() - .any(|r| r.context == Some("prod/".to_string()) && r.path == "prod/Contract.sol")); + assert!( + result + .iter() + .any(|r| r.context == Some("test/".to_string()) && r.path == "test/Contract.sol") + ); + assert!( + result + .iter() + .any(|r| r.context == Some("prod/".to_string()) && r.path == "prod/Contract.sol") + ); } } diff --git a/crates/config/src/providers/warnings.rs b/crates/config/src/providers/warnings.rs index 944225be18c2c..68512220c480e 100644 --- a/crates/config/src/providers/warnings.rs +++ b/crates/config/src/providers/warnings.rs @@ -1,7 +1,7 @@ -use crate::{Config, Warning, DEPRECATIONS}; +use crate::{Config, DEPRECATIONS, Warning}; use figment::{ - value::{Dict, Map, Value}, Error, Figment, Metadata, Profile, Provider, + value::{Dict, Map, Value}, }; use std::collections::BTreeMap; diff --git a/crates/config/src/utils.rs b/crates/config/src/utils.rs index bcb20ab698afb..d9a834fdff1db 100644 --- a/crates/config/src/utils.rs +++ b/crates/config/src/utils.rs @@ -4,11 +4,11 @@ use crate::Config; use alloy_primitives::U256; use figment::value::Value; use foundry_compilers::artifacts::{ - remappings::{Remapping, RemappingError}, EvmVersion, + remappings::{Remapping, RemappingError}, }; use revm::primitives::hardfork::SpecId; -use serde::{de::Error, Deserialize, Deserializer}; +use serde::{Deserialize, Deserializer, de::Error}; use std::{ io, path::{Path, PathBuf}, diff --git a/crates/config/src/vyper.rs b/crates/config/src/vyper.rs index 12596e3bce401..56d8b9419c33f 100644 --- a/crates/config/src/vyper.rs +++ b/crates/config/src/vyper.rs @@ -1,6 +1,6 @@ //! Vyper specific configuration types. -use foundry_compilers::artifacts::{vyper::VyperOptimizationMode, EvmVersion}; +use foundry_compilers::artifacts::{EvmVersion, vyper::VyperOptimizationMode}; use serde::{Deserialize, Serialize}; use std::path::PathBuf; diff --git a/crates/config/src/warning.rs b/crates/config/src/warning.rs index a19104eaf7b4d..bbfe113d5a2ae 100644 --- a/crates/config/src/warning.rs +++ b/crates/config/src/warning.rs @@ -82,7 +82,10 @@ impl fmt::Display for Warning { write!(f, "Key `{old}` is being deprecated and will be removed in future versions.") } Self::DeprecatedKey { old, new } => { - write!(f, "Key `{old}` is being deprecated in favor of `{new}`. It will be removed in future versions.") + write!( + f, + "Key `{old}` is being deprecated in favor of `{new}`. It will be removed in future versions." + ) } } } diff --git a/crates/debugger/src/builder.rs b/crates/debugger/src/builder.rs index fd2dce3dfe099..341da2767ca5d 100644 --- a/crates/debugger/src/builder.rs +++ b/crates/debugger/src/builder.rs @@ -1,9 +1,9 @@ //! Debugger builder. -use crate::{node::flatten_call_trace, DebugNode, Debugger}; -use alloy_primitives::{map::AddressHashMap, Address}; +use crate::{DebugNode, Debugger, node::flatten_call_trace}; +use alloy_primitives::{Address, map::AddressHashMap}; use foundry_common::{evm::Breakpoints, get_contract_name}; -use foundry_evm_traces::{debug::ContractSources, CallTraceArena, CallTraceDecoder, Traces}; +use foundry_evm_traces::{CallTraceArena, CallTraceDecoder, Traces, debug::ContractSources}; /// Debugger builder. #[derive(Debug, Default)] #[must_use = "builders do nothing unless you call `build` on them"] diff --git a/crates/debugger/src/debugger.rs b/crates/debugger/src/debugger.rs index 907232cad7e98..776d149578b0f 100644 --- a/crates/debugger/src/debugger.rs +++ b/crates/debugger/src/debugger.rs @@ -1,6 +1,6 @@ //! Debugger implementation. -use crate::{tui::TUI, DebugNode, DebuggerBuilder, ExitReason}; +use crate::{DebugNode, DebuggerBuilder, ExitReason, tui::TUI}; use alloy_primitives::map::AddressHashMap; use eyre::Result; use foundry_common::evm::Breakpoints; diff --git a/crates/debugger/src/dump.rs b/crates/debugger/src/dump.rs index 2d50b4079ed4b..6a910d26f8de9 100644 --- a/crates/debugger/src/dump.rs +++ b/crates/debugger/src/dump.rs @@ -1,4 +1,4 @@ -use crate::{debugger::DebuggerContext, DebugNode}; +use crate::{DebugNode, debugger::DebuggerContext}; use alloy_primitives::map::AddressMap; use foundry_common::fs::write_json_file; use foundry_compilers::{ diff --git a/crates/debugger/src/tui/context.rs b/crates/debugger/src/tui/context.rs index a2a4c987a78d6..dc37589288aac 100644 --- a/crates/debugger/src/tui/context.rs +++ b/crates/debugger/src/tui/context.rs @@ -1,7 +1,7 @@ //! Debugger context and event handler implementation. -use crate::{debugger::DebuggerContext, DebugNode, ExitReason}; -use alloy_primitives::{hex, Address}; +use crate::{DebugNode, ExitReason, debugger::DebuggerContext}; +use alloy_primitives::{Address, hex}; use crossterm::event::{Event, KeyCode, KeyEvent, KeyModifiers, MouseEvent, MouseEventKind}; use foundry_evm_core::buffer::BufferKind; use revm::bytecode::opcode::OpCode; diff --git a/crates/debugger/src/tui/draw.rs b/crates/debugger/src/tui/draw.rs index 580d6f958ac44..b05039e5e8d6d 100644 --- a/crates/debugger/src/tui/draw.rs +++ b/crates/debugger/src/tui/draw.rs @@ -3,14 +3,14 @@ use super::context::TUIContext; use crate::op::OpcodeParam; use foundry_compilers::artifacts::sourcemap::SourceElement; -use foundry_evm_core::buffer::{get_buffer_accesses, BufferKind}; +use foundry_evm_core::buffer::{BufferKind, get_buffer_accesses}; use foundry_evm_traces::debug::SourceData; use ratatui::{ + Frame, layout::{Alignment, Constraint, Direction, Layout, Rect}, style::{Color, Modifier, Style}, text::{Line, Span, Text}, widgets::{Block, Borders, List, ListItem, ListState, Paragraph, Wrap}, - Frame, }; use revm_inspectors::tracing::types::CallKind; use std::{collections::VecDeque, fmt::Write, io}; diff --git a/crates/debugger/src/tui/mod.rs b/crates/debugger/src/tui/mod.rs index ba27243256705..43a49d2348311 100644 --- a/crates/debugger/src/tui/mod.rs +++ b/crates/debugger/src/tui/mod.rs @@ -3,17 +3,17 @@ use crossterm::{ event::{self, DisableMouseCapture, EnableMouseCapture, Event}, execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode}, }; use eyre::Result; use ratatui::{ - backend::{Backend, CrosstermBackend}, Terminal, + backend::{Backend, CrosstermBackend}, }; use std::{ io, ops::ControlFlow, - sync::{mpsc, Arc}, + sync::{Arc, mpsc}, thread, time::{Duration, Instant}, }; diff --git a/crates/doc/src/builder.rs b/crates/doc/src/builder.rs index 6c2bec99d19f8..9e4751512cd9e 100644 --- a/crates/doc/src/builder.rs +++ b/crates/doc/src/builder.rs @@ -1,11 +1,11 @@ use crate::{ - document::DocumentContent, helpers::merge_toml_table, AsDoc, BufWriter, Document, ParseItem, - ParseSource, Parser, Preprocessor, + AsDoc, BufWriter, Document, ParseItem, ParseSource, Parser, Preprocessor, + document::DocumentContent, helpers::merge_toml_table, }; use alloy_primitives::map::HashMap; use forge_fmt::{FormatterConfig, Visitable}; use foundry_compilers::{compilers::solc::SOLC_EXTENSIONS, utils::source_files_iter}; -use foundry_config::{filter::expand_globs, DocConfig}; +use foundry_config::{DocConfig, filter::expand_globs}; use itertools::Itertools; use mdbook::MDBook; use rayon::prelude::*; @@ -361,11 +361,7 @@ impl DocBuilder { Some(self.config.book.clone()) } else { let book_path = self.config.book.join("book.toml"); - if book_path.is_file() { - Some(book_path) - } else { - None - } + if book_path.is_file() { Some(book_path) } else { None } } }; diff --git a/crates/doc/src/helpers.rs b/crates/doc/src/helpers.rs index 013d606c76e36..7b36e2e257b71 100644 --- a/crates/doc/src/helpers.rs +++ b/crates/doc/src/helpers.rs @@ -1,4 +1,4 @@ -use toml::{value::Table, Value}; +use toml::{Value, value::Table}; /// Merge original toml table with the override. pub(crate) fn merge_toml_table(table: &mut Table, override_table: Table) { diff --git a/crates/doc/src/lib.rs b/crates/doc/src/lib.rs index 174c76600d8a0..c5201e73efb0d 100644 --- a/crates/doc/src/lib.rs +++ b/crates/doc/src/lib.rs @@ -21,7 +21,7 @@ mod helpers; mod parser; pub use parser::{ - error, Comment, CommentTag, Comments, CommentsRef, ParseItem, ParseSource, Parser, + Comment, CommentTag, Comments, CommentsRef, ParseItem, ParseSource, Parser, error, }; mod preprocessor; diff --git a/crates/doc/src/parser/comment.rs b/crates/doc/src/parser/comment.rs index 9a64662665c31..18729ec02fd94 100644 --- a/crates/doc/src/parser/comment.rs +++ b/crates/doc/src/parser/comment.rs @@ -1,5 +1,5 @@ use alloy_primitives::map::HashMap; -use derive_more::{derive::Display, Deref, DerefMut}; +use derive_more::{Deref, DerefMut, derive::Display}; use solang_parser::doccomment::DocCommentTag; /// The natspec comment tag explaining the purpose of the comment. @@ -88,11 +88,7 @@ impl Comment { pub fn match_first_word(&self, expected: &str) -> Option<&str> { self.split_first_word().and_then( |(word, rest)| { - if word == expected { - Some(rest) - } else { - None - } + if word == expected { Some(rest) } else { None } }, ) } diff --git a/crates/doc/src/parser/item.rs b/crates/doc/src/parser/item.rs index 5cc39f3e9aec6..18fcd085eb45c 100644 --- a/crates/doc/src/parser/item.rs +++ b/crates/doc/src/parser/item.rs @@ -1,7 +1,7 @@ -use crate::{error::ParserResult, Comments}; +use crate::{Comments, error::ParserResult}; use forge_fmt::{ - solang_ext::SafeUnwrap, Comments as FmtComments, Formatter, FormatterConfig, InlineConfig, - Visitor, + Comments as FmtComments, Formatter, FormatterConfig, InlineConfig, Visitor, + solang_ext::SafeUnwrap, }; use solang_parser::pt::{ ContractDefinition, ContractTy, EnumDefinition, ErrorDefinition, EventDefinition, diff --git a/crates/doc/src/parser/mod.rs b/crates/doc/src/parser/mod.rs index 1cf496c22f94b..734e8fa2c990c 100644 --- a/crates/doc/src/parser/mod.rs +++ b/crates/doc/src/parser/mod.rs @@ -3,7 +3,7 @@ use forge_fmt::{FormatterConfig, Visitable, Visitor}; use itertools::Itertools; use solang_parser::{ - doccomment::{parse_doccomments, DocComment}, + doccomment::{DocComment, parse_doccomments}, pt::{ Comment as SolangComment, EnumDefinition, ErrorDefinition, EventDefinition, FunctionDefinition, Identifier, Loc, SourceUnit, SourceUnitPart, StructDefinition, diff --git a/crates/doc/src/preprocessor/contract_inheritance.rs b/crates/doc/src/preprocessor/contract_inheritance.rs index 915105bd5bd72..f670db384816b 100644 --- a/crates/doc/src/preprocessor/contract_inheritance.rs +++ b/crates/doc/src/preprocessor/contract_inheritance.rs @@ -1,5 +1,5 @@ use super::{Preprocessor, PreprocessorId}; -use crate::{document::DocumentContent, Document, ParseSource, PreprocessorOutput}; +use crate::{Document, ParseSource, PreprocessorOutput, document::DocumentContent}; use alloy_primitives::map::HashMap; use forge_fmt::solang_ext::SafeUnwrap; use std::path::PathBuf; diff --git a/crates/doc/src/preprocessor/inheritdoc.rs b/crates/doc/src/preprocessor/inheritdoc.rs index 8a3ef7fe338c3..7daddc2f4980f 100644 --- a/crates/doc/src/preprocessor/inheritdoc.rs +++ b/crates/doc/src/preprocessor/inheritdoc.rs @@ -1,6 +1,6 @@ use super::{Preprocessor, PreprocessorId}; use crate::{ - document::DocumentContent, Comments, Document, ParseItem, ParseSource, PreprocessorOutput, + Comments, Document, ParseItem, ParseSource, PreprocessorOutput, document::DocumentContent, }; use alloy_primitives::map::HashMap; use forge_fmt::solang_ext::SafeUnwrap; diff --git a/crates/doc/src/preprocessor/mod.rs b/crates/doc/src/preprocessor/mod.rs index 5011b59a1b5e8..e51bf3cbba5de 100644 --- a/crates/doc/src/preprocessor/mod.rs +++ b/crates/doc/src/preprocessor/mod.rs @@ -5,19 +5,19 @@ use alloy_primitives::map::HashMap; use std::{fmt::Debug, path::PathBuf}; mod contract_inheritance; -pub use contract_inheritance::{ContractInheritance, CONTRACT_INHERITANCE_ID}; +pub use contract_inheritance::{CONTRACT_INHERITANCE_ID, ContractInheritance}; mod inheritdoc; -pub use inheritdoc::{Inheritdoc, INHERITDOC_ID}; +pub use inheritdoc::{INHERITDOC_ID, Inheritdoc}; mod infer_hyperlinks; -pub use infer_hyperlinks::{InferInlineHyperlinks, INFER_INLINE_HYPERLINKS_ID}; +pub use infer_hyperlinks::{INFER_INLINE_HYPERLINKS_ID, InferInlineHyperlinks}; mod git_source; -pub use git_source::{GitSource, GIT_SOURCE_ID}; +pub use git_source::{GIT_SOURCE_ID, GitSource}; mod deployments; -pub use deployments::{Deployment, Deployments, DEPLOYMENTS_ID}; +pub use deployments::{DEPLOYMENTS_ID, Deployment, Deployments}; /// The preprocessor id. #[derive(Debug, PartialEq, Eq, Hash)] diff --git a/crates/doc/src/writer/as_doc.rs b/crates/doc/src/writer/as_doc.rs index efdf45af25a83..34127e2831765 100644 --- a/crates/doc/src/writer/as_doc.rs +++ b/crates/doc/src/writer/as_doc.rs @@ -1,9 +1,9 @@ use crate::{ - document::{read_context, DocumentContent}, + CONTRACT_INHERITANCE_ID, CommentTag, Comments, CommentsRef, DEPLOYMENTS_ID, Document, + GIT_SOURCE_ID, INHERITDOC_ID, Markdown, PreprocessorOutput, + document::{DocumentContent, read_context}, parser::ParseSource, writer::BufWriter, - CommentTag, Comments, CommentsRef, Document, Markdown, PreprocessorOutput, - CONTRACT_INHERITANCE_ID, DEPLOYMENTS_ID, GIT_SOURCE_ID, INHERITDOC_ID, }; use forge_fmt::solang_ext::SafeUnwrap; use itertools::Itertools; diff --git a/crates/doc/src/writer/buf_writer.rs b/crates/doc/src/writer/buf_writer.rs index 4bb7f9612db47..bbfb979d9469d 100644 --- a/crates/doc/src/writer/buf_writer.rs +++ b/crates/doc/src/writer/buf_writer.rs @@ -1,4 +1,4 @@ -use crate::{writer::traits::ParamLike, AsDoc, CommentTag, Comments, Deployment, Markdown}; +use crate::{AsDoc, CommentTag, Comments, Deployment, Markdown, writer::traits::ParamLike}; use itertools::Itertools; use solang_parser::pt::{ErrorParameter, EventParameter, Parameter, VariableDeclaration}; use std::{ diff --git a/crates/evm/core/src/backend/cow.rs b/crates/evm/core/src/backend/cow.rs index 4220150e6536b..92aed22808c61 100644 --- a/crates/evm/core/src/backend/cow.rs +++ b/crates/evm/core/src/backend/cow.rs @@ -2,12 +2,12 @@ use super::BackendError; use crate::{ + AsEnvMut, Env, EnvMut, InspectorExt, backend::{ - diagnostic::RevertDiagnostic, Backend, DatabaseExt, JournaledState, LocalForkId, - RevertStateSnapshotAction, + Backend, DatabaseExt, JournaledState, LocalForkId, RevertStateSnapshotAction, + diagnostic::RevertDiagnostic, }, fork::{CreateFork, ForkId}, - AsEnvMut, Env, EnvMut, InspectorExt, }; use alloy_evm::Evm; use alloy_genesis::GenesisAccount; @@ -16,12 +16,12 @@ use alloy_rpc_types::TransactionRequest; use eyre::WrapErr; use foundry_fork_db::DatabaseError; use revm::{ + Database, DatabaseCommit, bytecode::Bytecode, context_interface::result::ResultAndState, database::DatabaseRef, - primitives::{hardfork::SpecId, HashMap as Map}, + primitives::{HashMap as Map, hardfork::SpecId}, state::{Account, AccountInfo}, - Database, DatabaseCommit, }; use std::{borrow::Cow, collections::BTreeMap}; diff --git a/crates/evm/core/src/backend/diagnostic.rs b/crates/evm/core/src/backend/diagnostic.rs index df215508da1c0..02ffa2881c781 100644 --- a/crates/evm/core/src/backend/diagnostic.rs +++ b/crates/evm/core/src/backend/diagnostic.rs @@ -1,5 +1,5 @@ use crate::backend::LocalForkId; -use alloy_primitives::{map::AddressHashMap, Address}; +use alloy_primitives::{Address, map::AddressHashMap}; use itertools::Itertools; /// Represents possible diagnostic cases on revert @@ -41,7 +41,9 @@ impl RevertDiagnostic { if *persistent { format!("Contract {contract_label} does not exist") } else { - format!("Contract {contract_label} does not exist and is not marked as persistent, see `vm.makePersistent()`") + format!( + "Contract {contract_label} does not exist and is not marked as persistent, see `vm.makePersistent()`" + ) } } } diff --git a/crates/evm/core/src/backend/in_memory_db.rs b/crates/evm/core/src/backend/in_memory_db.rs index 0ffa718fb3671..cf8eea1aa4355 100644 --- a/crates/evm/core/src/backend/in_memory_db.rs +++ b/crates/evm/core/src/backend/in_memory_db.rs @@ -4,11 +4,11 @@ use crate::state_snapshot::StateSnapshots; use alloy_primitives::{Address, B256, U256}; use foundry_fork_db::DatabaseError; use revm::{ + Database, DatabaseCommit, bytecode::Bytecode, database::{CacheDB, DatabaseRef, EmptyDB}, primitives::HashMap as Map, state::{Account, AccountInfo}, - Database, DatabaseCommit, }; /// Type alias for an in-memory database. diff --git a/crates/evm/core/src/backend/mod.rs b/crates/evm/core/src/backend/mod.rs index 892bf40c075bf..8a2e57407e472 100644 --- a/crates/evm/core/src/backend/mod.rs +++ b/crates/evm/core/src/backend/mod.rs @@ -1,32 +1,32 @@ //! Foundry's main executor backend abstraction and implementation. use crate::{ + AsEnvMut, Env, EnvMut, InspectorExt, constants::{CALLER, CHEATCODE_ADDRESS, DEFAULT_CREATE2_DEPLOYER, TEST_CONTRACT_ADDRESS}, evm::new_evm_with_inspector, fork::{CreateFork, ForkId, MultiFork}, state_snapshot::StateSnapshots, utils::{configure_tx_env, configure_tx_req_env}, - AsEnvMut, Env, EnvMut, InspectorExt, }; use alloy_consensus::Typed2718; use alloy_evm::Evm; use alloy_genesis::GenesisAccount; use alloy_network::{AnyRpcBlock, AnyTxEnvelope, TransactionResponse}; -use alloy_primitives::{keccak256, uint, Address, TxKind, B256, U256}; +use alloy_primitives::{Address, B256, TxKind, U256, keccak256, uint}; use alloy_rpc_types::{BlockNumberOrTag, Transaction, TransactionRequest}; use eyre::Context; -use foundry_common::{is_known_system_sender, SYSTEM_TRANSACTION_TYPE}; -pub use foundry_fork_db::{cache::BlockchainDbMeta, BlockchainDb, SharedBackend}; +use foundry_common::{SYSTEM_TRANSACTION_TYPE, is_known_system_sender}; +pub use foundry_fork_db::{BlockchainDb, SharedBackend, cache::BlockchainDbMeta}; use revm::{ + Database, DatabaseCommit, JournalEntry, bytecode::Bytecode, context::JournalInner, context_interface::{block::BlobExcessGasAndPrice, result::ResultAndState}, database::{CacheDB, DatabaseRef}, inspector::NoOpInspector, precompile::{PrecompileSpecId, Precompiles}, - primitives::{hardfork::SpecId, HashMap as Map, Log, KECCAK_EMPTY}, + primitives::{HashMap as Map, KECCAK_EMPTY, Log, hardfork::SpecId}, state::{Account, AccountInfo, EvmState, EvmStorageSlot}, - Database, DatabaseCommit, JournalEntry, }; use std::{ collections::{BTreeMap, HashMap, HashSet}, @@ -1337,11 +1337,7 @@ impl DatabaseExt for Backend { } eyre::bail!("Requested fork `{}` does not exit", id) } - if let Some(id) = self.active_fork_id() { - Ok(id) - } else { - eyre::bail!("No fork active") - } + if let Some(id) = self.active_fork_id() { Ok(id) } else { eyre::bail!("No fork active") } } fn ensure_fork_id(&self, id: LocalForkId) -> eyre::Result<&ForkId> { diff --git a/crates/evm/core/src/backend/snapshot.rs b/crates/evm/core/src/backend/snapshot.rs index d26d9a55e750d..05329f0298005 100644 --- a/crates/evm/core/src/backend/snapshot.rs +++ b/crates/evm/core/src/backend/snapshot.rs @@ -1,8 +1,8 @@ use super::JournaledState; use crate::Env; use alloy_primitives::{ - map::{AddressHashMap, HashMap}, B256, U256, + map::{AddressHashMap, HashMap}, }; use revm::state::AccountInfo; use serde::{Deserialize, Serialize}; diff --git a/crates/evm/core/src/constants.rs b/crates/evm/core/src/constants.rs index feb8fc0e667e0..c69098ea8d992 100644 --- a/crates/evm/core/src/constants.rs +++ b/crates/evm/core/src/constants.rs @@ -1,4 +1,4 @@ -use alloy_primitives::{address, b256, hex, Address, B256}; +use alloy_primitives::{Address, B256, address, b256, hex}; /// The cheatcode handler address. /// @@ -47,9 +47,13 @@ pub const DEFAULT_CREATE2_DEPLOYER_DEPLOYER: Address = pub const DEFAULT_CREATE2_DEPLOYER: Address = address!("0x4e59b44847b379578588920ca78fbf26c0b4956c"); /// The initcode of the default CREATE2 deployer. -pub const DEFAULT_CREATE2_DEPLOYER_CODE: &[u8] = &hex!("604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"); +pub const DEFAULT_CREATE2_DEPLOYER_CODE: &[u8] = &hex!( + "604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3" +); /// The runtime code of the default CREATE2 deployer. -pub const DEFAULT_CREATE2_DEPLOYER_RUNTIME_CODE: &[u8] = &hex!("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"); +pub const DEFAULT_CREATE2_DEPLOYER_RUNTIME_CODE: &[u8] = &hex!( + "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3" +); /// The hash of the default CREATE2 deployer code. /// /// This is calculated as `keccak256([`DEFAULT_CREATE2_DEPLOYER_RUNTIME_CODE`])`. diff --git a/crates/evm/core/src/decode.rs b/crates/evm/core/src/decode.rs index c3dab88f49cd5..554ece1fde390 100644 --- a/crates/evm/core/src/decode.rs +++ b/crates/evm/core/src/decode.rs @@ -1,9 +1,9 @@ //! Various utilities to decode test results. -use crate::abi::{console, Vm}; +use crate::abi::{Vm, console}; use alloy_dyn_abi::JsonAbiExt; use alloy_json_abi::{Error, JsonAbi}; -use alloy_primitives::{hex, map::HashMap, Log, Selector}; +use alloy_primitives::{Log, Selector, hex, map::HashMap}; use alloy_sol_types::{ ContractError::Revert, RevertReason, RevertReason::ContractError, SolEventInterface, SolInterface, SolValue, @@ -129,11 +129,7 @@ impl RevertDecoder { /// than user output. pub fn decode(&self, err: &[u8], status: Option) -> String { self.maybe_decode(err, status).unwrap_or_else(|| { - if err.is_empty() { - "".to_string() - } else { - trimmed_hex(err) - } + if err.is_empty() { "".to_string() } else { trimmed_hex(err) } }) } @@ -272,7 +268,10 @@ mod tests { "0xe17594de" "756688fe00000000000000000000000000000000000000000000000000000000" ); - assert_eq!(decoder.decode(data, None), "custom error 0xe17594de: 756688fe00000000000000000000000000000000000000000000000000000000"); + assert_eq!( + decoder.decode(data, None), + "custom error 0xe17594de: 756688fe00000000000000000000000000000000000000000000000000000000" + ); /* abi.encodeWithSelector(ValidationFailed.selector, abi.encodeWithSelector(InvalidNonce.selector)) diff --git a/crates/evm/core/src/either_evm.rs b/crates/evm/core/src/either_evm.rs index 2ef9f894f144b..e958eeb94df34 100644 --- a/crates/evm/core/src/either_evm.rs +++ b/crates/evm/core/src/either_evm.rs @@ -1,16 +1,16 @@ -use alloy_evm::{eth::EthEvmContext, Database, EthEvm, Evm, EvmEnv}; +use alloy_evm::{Database, EthEvm, Evm, EvmEnv, eth::EthEvmContext}; use alloy_op_evm::OpEvm; use alloy_primitives::{Address, Bytes}; use op_revm::{OpContext, OpHaltReason, OpSpecId, OpTransaction, OpTransactionError}; use revm::{ + DatabaseCommit, Inspector, context::{ - result::{EVMError, ExecutionResult, HaltReason, ResultAndState}, BlockEnv, TxEnv, + result::{EVMError, ExecutionResult, HaltReason, ResultAndState}, }, handler::PrecompileProvider, interpreter::InterpreterResult, primitives::hardfork::SpecId, - DatabaseCommit, Inspector, }; /// Alias for result type returned by [`Evm::transact`] methods. diff --git a/crates/evm/core/src/env.rs b/crates/evm/core/src/env.rs index a7708f132380d..000f3ad06b0ed 100644 --- a/crates/evm/core/src/env.rs +++ b/crates/evm/core/src/env.rs @@ -1,8 +1,8 @@ pub use alloy_evm::EvmEnv; use revm::{ + Context, Database, Journal, JournalEntry, context::{BlockEnv, CfgEnv, JournalInner, JournalTr, TxEnv}, primitives::hardfork::SpecId, - Context, Database, Journal, JournalEntry, }; /// Helper container type for [`EvmEnv`] and [`TxEnv`]. diff --git a/crates/evm/core/src/evm.rs b/crates/evm/core/src/evm.rs index ab216fe4117d2..38be8fd9378f3 100644 --- a/crates/evm/core/src/evm.rs +++ b/crates/evm/core/src/evm.rs @@ -1,34 +1,34 @@ use std::ops::{Deref, DerefMut}; use crate::{ - backend::DatabaseExt, constants::DEFAULT_CREATE2_DEPLOYER_CODEHASH, Env, InspectorExt, + Env, InspectorExt, backend::DatabaseExt, constants::DEFAULT_CREATE2_DEPLOYER_CODEHASH, }; use alloy_consensus::constants::KECCAK_EMPTY; use alloy_evm::{ + Evm, EvmEnv, eth::EthEvmContext, precompiles::{DynPrecompile, PrecompilesMap}, - Evm, EvmEnv, }; use alloy_primitives::{Address, Bytes, U256}; use foundry_fork_db::DatabaseError; use revm::{ + Context, ExecuteEvm, Journal, context::{ - result::{EVMError, HaltReason, ResultAndState}, BlockEnv, CfgEnv, ContextTr, CreateScheme, Evm as RevmEvm, JournalTr, LocalContext, TxEnv, + result::{EVMError, HaltReason, ResultAndState}, }, handler::{ - instructions::EthInstructions, EthFrame, EthPrecompiles, FrameInitOrResult, FrameResult, - Handler, ItemOrResult, MainnetHandler, + EthFrame, EthPrecompiles, FrameInitOrResult, FrameResult, Handler, ItemOrResult, + MainnetHandler, instructions::EthInstructions, }, inspector::InspectorHandler, interpreter::{ - interpreter::EthInterpreter, return_ok, CallInput, CallInputs, CallOutcome, CallScheme, - CallValue, CreateInputs, CreateOutcome, FrameInput, Gas, InstructionResult, - InterpreterResult, + CallInput, CallInputs, CallOutcome, CallScheme, CallValue, CreateInputs, CreateOutcome, + FrameInput, Gas, InstructionResult, InterpreterResult, interpreter::EthInterpreter, + return_ok, }, - precompile::{secp256r1::P256VERIFY, PrecompileSpecId, Precompiles}, + precompile::{PrecompileSpecId, Precompiles, secp256r1::P256VERIFY}, primitives::hardfork::SpecId, - Context, ExecuteEvm, Journal, }; pub fn new_evm_with_inspector<'i, 'db, I: InspectorExt + ?Sized>( diff --git a/crates/evm/core/src/fork/database.rs b/crates/evm/core/src/fork/database.rs index 30549f028aace..8780bac3333fe 100644 --- a/crates/evm/core/src/fork/database.rs +++ b/crates/evm/core/src/fork/database.rs @@ -4,15 +4,15 @@ use crate::{ backend::{RevertStateSnapshotAction, StateSnapshot}, state_snapshot::StateSnapshots, }; -use alloy_primitives::{map::HashMap, Address, B256, U256}; +use alloy_primitives::{Address, B256, U256, map::HashMap}; use alloy_rpc_types::BlockId; use foundry_fork_db::{BlockchainDb, DatabaseError, SharedBackend}; use parking_lot::Mutex; use revm::{ + Database, DatabaseCommit, bytecode::Bytecode, database::{CacheDB, DatabaseRef}, state::{Account, AccountInfo}, - Database, DatabaseCommit, }; use std::sync::Arc; diff --git a/crates/evm/core/src/fork/init.rs b/crates/evm/core/src/fork/init.rs index 8b23ae5b8531a..70a12d38ec72c 100644 --- a/crates/evm/core/src/fork/init.rs +++ b/crates/evm/core/src/fork/init.rs @@ -1,7 +1,7 @@ -use crate::{utils::apply_chain_and_block_specific_env_changes, AsEnvMut, Env, EvmEnv}; +use crate::{AsEnvMut, Env, EvmEnv, utils::apply_chain_and_block_specific_env_changes}; use alloy_consensus::BlockHeader; use alloy_primitives::Address; -use alloy_provider::{network::BlockResponse, Network, Provider}; +use alloy_provider::{Network, Provider, network::BlockResponse}; use alloy_rpc_types::BlockNumberOrTag; use eyre::WrapErr; use foundry_common::NON_ARCHIVE_NODE_WARNING; diff --git a/crates/evm/core/src/fork/multi.rs b/crates/evm/core/src/fork/multi.rs index e5c7fc7cd6ade..987164e413225 100644 --- a/crates/evm/core/src/fork/multi.rs +++ b/crates/evm/core/src/fork/multi.rs @@ -10,20 +10,20 @@ use alloy_primitives::map::HashMap; use alloy_provider::network::BlockResponse; use foundry_common::provider::{ProviderBuilder, RetryProvider}; use foundry_config::Config; -use foundry_fork_db::{cache::BlockchainDbMeta, BackendHandler, BlockchainDb, SharedBackend}; +use foundry_fork_db::{BackendHandler, BlockchainDb, SharedBackend, cache::BlockchainDbMeta}; use futures::{ - channel::mpsc::{channel, Receiver, Sender}, + FutureExt, StreamExt, + channel::mpsc::{Receiver, Sender, channel}, stream::{Fuse, Stream}, task::{Context, Poll}, - FutureExt, StreamExt, }; use std::{ fmt::{self, Write}, pin::Pin, sync::{ - atomic::AtomicUsize, - mpsc::{channel as oneshot_channel, Sender as OneshotSender}, Arc, + atomic::AtomicUsize, + mpsc::{Sender as OneshotSender, channel as oneshot_channel}, }, time::Duration, }; diff --git a/crates/evm/core/src/lib.rs b/crates/evm/core/src/lib.rs index 4a9bad9392107..3f2ec812bb67d 100644 --- a/crates/evm/core/src/lib.rs +++ b/crates/evm/core/src/lib.rs @@ -10,7 +10,7 @@ use alloy_evm::eth::EthEvmContext; use alloy_primitives::Address; use auto_impl::auto_impl; use backend::DatabaseExt; -use revm::{inspector::NoOpInspector, interpreter::CreateInputs, Inspector}; +use revm::{Inspector, inspector::NoOpInspector, interpreter::CreateInputs}; use revm_inspectors::access_list::AccessListInspector; #[macro_use] diff --git a/crates/evm/core/src/opts.rs b/crates/evm/core/src/opts.rs index d02050112716b..61d9953db1e49 100644 --- a/crates/evm/core/src/opts.rs +++ b/crates/evm/core/src/opts.rs @@ -1,13 +1,13 @@ use super::fork::environment; use crate::{ - constants::DEFAULT_CREATE2_DEPLOYER, - fork::{configure_env, CreateFork}, EvmEnv, + constants::DEFAULT_CREATE2_DEPLOYER, + fork::{CreateFork, configure_env}, }; use alloy_primitives::{Address, B256, U256}; -use alloy_provider::{network::AnyRpcBlock, Provider}; +use alloy_provider::{Provider, network::AnyRpcBlock}; use eyre::WrapErr; -use foundry_common::{provider::ProviderBuilder, ALCHEMY_FREE_TIER_CUPS}; +use foundry_common::{ALCHEMY_FREE_TIER_CUPS, provider::ProviderBuilder}; use foundry_config::{Chain, Config, GasLimit}; use revm::context::{BlockEnv, TxEnv}; use serde::{Deserialize, Serialize}; diff --git a/crates/evm/core/src/precompiles.rs b/crates/evm/core/src/precompiles.rs index d265ff20591bd..62f7397a12bf9 100644 --- a/crates/evm/core/src/precompiles.rs +++ b/crates/evm/core/src/precompiles.rs @@ -1,4 +1,4 @@ -use alloy_primitives::{address, Address}; +use alloy_primitives::{Address, address}; /// The ECRecover precompile address. pub const EC_RECOVER: Address = address!("0x0000000000000000000000000000000000000001"); diff --git a/crates/evm/core/src/state_snapshot.rs b/crates/evm/core/src/state_snapshot.rs index 3be1172aded5d..9c06b3fbf49dc 100644 --- a/crates/evm/core/src/state_snapshot.rs +++ b/crates/evm/core/src/state_snapshot.rs @@ -1,6 +1,6 @@ //! Support for snapshotting different states -use alloy_primitives::{map::HashMap, U256}; +use alloy_primitives::{U256, map::HashMap}; use std::ops::Add; /// Represents all state snapshots diff --git a/crates/evm/core/src/utils.rs b/crates/evm/core/src/utils.rs index 9ff6bcc8aec63..93f8e29820896 100644 --- a/crates/evm/core/src/utils.rs +++ b/crates/evm/core/src/utils.rs @@ -1,14 +1,14 @@ use alloy_consensus::BlockHeader; use alloy_json_abi::{Function, JsonAbi}; use alloy_network::{ + AnyTxEnvelope, TransactionResponse, eip2718::{ EIP1559_TX_TYPE_ID, EIP2930_TX_TYPE_ID, EIP4844_TX_TYPE_ID, EIP7702_TX_TYPE_ID, LEGACY_TX_TYPE_ID, }, - AnyTxEnvelope, TransactionResponse, }; -use alloy_primitives::{Address, Selector, TxKind, B256, U256}; -use alloy_provider::{network::BlockResponse, Network}; +use alloy_primitives::{Address, B256, Selector, TxKind, U256}; +use alloy_provider::{Network, network::BlockResponse}; use alloy_rpc_types::{Transaction, TransactionRequest}; use foundry_common::is_impersonated_tx; use foundry_config::NamedChain; diff --git a/crates/evm/coverage/src/analysis.rs b/crates/evm/coverage/src/analysis.rs index 37bd4d381e53a..383e7b8a7f1dc 100644 --- a/crates/evm/coverage/src/analysis.rs +++ b/crates/evm/coverage/src/analysis.rs @@ -2,8 +2,8 @@ use super::{CoverageItem, CoverageItemKind, SourceLocation}; use alloy_primitives::map::HashMap; use foundry_common::TestFunctionExt; use foundry_compilers::artifacts::{ - ast::{self, Ast, Node, NodeType}, Source, + ast::{self, Ast, Node, NodeType}, }; use rayon::prelude::*; use std::sync::Arc; diff --git a/crates/evm/coverage/src/inspector.rs b/crates/evm/coverage/src/inspector.rs index dfed9589e55fc..039e6c9805930 100644 --- a/crates/evm/coverage/src/inspector.rs +++ b/crates/evm/coverage/src/inspector.rs @@ -1,10 +1,10 @@ use crate::{HitMap, HitMaps}; use alloy_primitives::B256; use revm::{ + Inspector, context::ContextTr, inspector::JournalExt, - interpreter::{interpreter_types::Jumps, Interpreter}, - Inspector, + interpreter::{Interpreter, interpreter_types::Jumps}, }; use std::ptr::NonNull; diff --git a/crates/evm/coverage/src/lib.rs b/crates/evm/coverage/src/lib.rs index 793e0ee56670c..e0df01e5a572c 100644 --- a/crates/evm/coverage/src/lib.rs +++ b/crates/evm/coverage/src/lib.rs @@ -9,8 +9,8 @@ extern crate tracing; use alloy_primitives::{ - map::{B256HashMap, HashMap}, Bytes, + map::{B256HashMap, HashMap}, }; use analysis::SourceAnalysis; use eyre::Result; diff --git a/crates/evm/evm/src/executors/builder.rs b/crates/evm/evm/src/executors/builder.rs index a60934046efe1..8407f9aa09ff9 100644 --- a/crates/evm/evm/src/executors/builder.rs +++ b/crates/evm/evm/src/executors/builder.rs @@ -1,5 +1,5 @@ use crate::{executors::Executor, inspectors::InspectorStackBuilder}; -use foundry_evm_core::{backend::Backend, Env}; +use foundry_evm_core::{Env, backend::Backend}; use revm::primitives::hardfork::SpecId; /// The builder that allows to configure an evm [`Executor`] which a stack of optional diff --git a/crates/evm/evm/src/executors/fuzz/mod.rs b/crates/evm/evm/src/executors/fuzz/mod.rs index a64b072193587..7f3e5d2f38cae 100644 --- a/crates/evm/evm/src/executors/fuzz/mod.rs +++ b/crates/evm/evm/src/executors/fuzz/mod.rs @@ -1,7 +1,7 @@ use crate::executors::{Executor, FuzzTestTimer, RawCallResult}; use alloy_dyn_abi::JsonAbiExt; use alloy_json_abi::Function; -use alloy_primitives::{map::HashMap, Address, Bytes, Log, U256}; +use alloy_primitives::{Address, Bytes, Log, U256, map::HashMap}; use eyre::Result; use foundry_common::evm::Breakpoints; use foundry_config::FuzzConfig; @@ -11,8 +11,8 @@ use foundry_evm_core::{ }; use foundry_evm_coverage::HitMaps; use foundry_evm_fuzz::{ - strategies::{fuzz_calldata, fuzz_calldata_from_state, EvmFuzzState}, BaseCounterExample, CounterExample, FuzzCase, FuzzError, FuzzFixtures, FuzzTestResult, + strategies::{EvmFuzzState, fuzz_calldata, fuzz_calldata_from_state}, }; use foundry_evm_traces::SparsedTraceArena; use indicatif::ProgressBar; diff --git a/crates/evm/evm/src/executors/fuzz/types.rs b/crates/evm/evm/src/executors/fuzz/types.rs index 1bda778e7c9cf..890702aa44cca 100644 --- a/crates/evm/evm/src/executors/fuzz/types.rs +++ b/crates/evm/evm/src/executors/fuzz/types.rs @@ -1,5 +1,5 @@ use crate::executors::RawCallResult; -use alloy_primitives::{map::HashMap, Bytes, Log}; +use alloy_primitives::{Bytes, Log, map::HashMap}; use foundry_common::evm::Breakpoints; use foundry_evm_coverage::HitMaps; use foundry_evm_fuzz::FuzzCase; diff --git a/crates/evm/evm/src/executors/invariant/error.rs b/crates/evm/evm/src/executors/invariant/error.rs index 0ff4b4c52f962..f9b5984a60f46 100644 --- a/crates/evm/evm/src/executors/invariant/error.rs +++ b/crates/evm/evm/src/executors/invariant/error.rs @@ -3,7 +3,7 @@ use crate::executors::RawCallResult; use alloy_primitives::{Address, Bytes}; use foundry_config::InvariantConfig; use foundry_evm_core::decode::RevertDecoder; -use foundry_evm_fuzz::{invariant::FuzzRunIdentifiedContracts, Reason}; +use foundry_evm_fuzz::{Reason, invariant::FuzzRunIdentifiedContracts}; use proptest::test_runner::TestError; /// Stores information about failures and reverts of the invariant tests. diff --git a/crates/evm/evm/src/executors/invariant/mod.rs b/crates/evm/evm/src/executors/invariant/mod.rs index e970e223d53fe..f1cb871edf5f3 100644 --- a/crates/evm/evm/src/executors/invariant/mod.rs +++ b/crates/evm/evm/src/executors/invariant/mod.rs @@ -2,9 +2,9 @@ use crate::{ executors::{Executor, RawCallResult}, inspectors::Fuzzer, }; -use alloy_primitives::{map::HashMap, Address, Bytes, FixedBytes, Selector, U256}; -use alloy_sol_types::{sol, SolCall}; -use eyre::{eyre, ContextCompat, Result}; +use alloy_primitives::{Address, Bytes, FixedBytes, Selector, U256, map::HashMap}; +use alloy_sol_types::{SolCall, sol}; +use eyre::{ContextCompat, Result, eyre}; use foundry_common::contracts::{ContractsByAddress, ContractsByArtifact}; use foundry_config::InvariantConfig; use foundry_evm_core::{ @@ -15,12 +15,12 @@ use foundry_evm_core::{ precompiles::PRECOMPILES, }; use foundry_evm_fuzz::{ + FuzzCase, FuzzFixtures, FuzzedCases, invariant::{ ArtifactFilters, BasicTxDetails, FuzzRunIdentifiedContracts, InvariantContract, RandomCallGenerator, SenderFilters, TargetedContract, TargetedContracts, }, - strategies::{invariant_strat, override_call_strat, EvmFuzzState}, - FuzzCase, FuzzFixtures, FuzzedCases, + strategies::{EvmFuzzState, invariant_strat, override_call_strat}, }; use foundry_evm_traces::{CallTraceArena, SparsedTraceArena}; use indicatif::ProgressBar; @@ -34,7 +34,7 @@ use revm::state::Account; use shrink::shrink_sequence; use std::{ cell::RefCell, - collections::{btree_map::Entry, HashMap as Map}, + collections::{HashMap as Map, btree_map::Entry}, sync::Arc, }; @@ -681,7 +681,9 @@ impl<'a> InvariantExecutor<'a> { return Ok(artifact.identifier()) } - eyre::bail!("{contract} not found in the project. Allowed format: `contract_name` or `contract_path:contract_name`."); + eyre::bail!( + "{contract} not found in the project. Allowed format: `contract_name` or `contract_path:contract_name`." + ); } /// Selects senders and contracts based on the contract methods `targetSenders() -> address[]`, diff --git a/crates/evm/evm/src/executors/invariant/replay.rs b/crates/evm/evm/src/executors/invariant/replay.rs index ab11f3728ae99..007cea802a8dd 100644 --- a/crates/evm/evm/src/executors/invariant/replay.rs +++ b/crates/evm/evm/src/executors/invariant/replay.rs @@ -4,15 +4,15 @@ use super::{ }; use crate::executors::Executor; use alloy_dyn_abi::JsonAbiExt; -use alloy_primitives::{map::HashMap, Log, U256}; +use alloy_primitives::{Log, U256, map::HashMap}; use eyre::Result; use foundry_common::{ContractsByAddress, ContractsByArtifact}; use foundry_evm_coverage::HitMaps; use foundry_evm_fuzz::{ - invariant::{BasicTxDetails, InvariantContract}, BaseCounterExample, + invariant::{BasicTxDetails, InvariantContract}, }; -use foundry_evm_traces::{load_contracts, TraceKind, TraceMode, Traces}; +use foundry_evm_traces::{TraceKind, TraceMode, Traces, load_contracts}; use indicatif::ProgressBar; use parking_lot::RwLock; use proptest::test_runner::TestError; diff --git a/crates/evm/evm/src/executors/invariant/result.rs b/crates/evm/evm/src/executors/invariant/result.rs index 8920a1209342a..125562ad4f3a5 100644 --- a/crates/evm/evm/src/executors/invariant/result.rs +++ b/crates/evm/evm/src/executors/invariant/result.rs @@ -1,6 +1,6 @@ use super::{ - call_after_invariant_function, call_invariant_function, error::FailedInvariantCaseData, InvariantFailures, InvariantFuzzError, InvariantMetrics, InvariantTest, InvariantTestRun, + call_after_invariant_function, call_invariant_function, error::FailedInvariantCaseData, }; use crate::executors::{Executor, RawCallResult}; use alloy_dyn_abi::JsonAbiExt; @@ -9,8 +9,8 @@ use foundry_config::InvariantConfig; use foundry_evm_core::utils::StateChangeset; use foundry_evm_coverage::HitMaps; use foundry_evm_fuzz::{ - invariant::{BasicTxDetails, FuzzRunIdentifiedContracts, InvariantContract}, FuzzedCases, + invariant::{BasicTxDetails, FuzzRunIdentifiedContracts, InvariantContract}, }; use revm_inspectors::tracing::CallTraceArena; use std::{borrow::Cow, collections::HashMap}; diff --git a/crates/evm/evm/src/executors/invariant/shrink.rs b/crates/evm/evm/src/executors/invariant/shrink.rs index c468c58eefa63..aa193d0baa3d9 100644 --- a/crates/evm/evm/src/executors/invariant/shrink.rs +++ b/crates/evm/evm/src/executors/invariant/shrink.rs @@ -1,8 +1,8 @@ use crate::executors::{ + Executor, invariant::{ call_after_invariant_function, call_invariant_function, error::FailedInvariantCaseData, }, - Executor, }; use alloy_primitives::{Address, Bytes, U256}; use foundry_evm_core::constants::MAGIC_ASSUME; diff --git a/crates/evm/evm/src/executors/mod.rs b/crates/evm/evm/src/executors/mod.rs index bfd57a4a0ccee..734b8fbca869a 100644 --- a/crates/evm/evm/src/executors/mod.rs +++ b/crates/evm/evm/src/executors/mod.rs @@ -7,19 +7,20 @@ // the concrete `Executor` type. use crate::{ + Env, inspectors::{ - cheatcodes::BroadcastableTransactions, Cheatcodes, InspectorData, InspectorStack, + Cheatcodes, InspectorData, InspectorStack, cheatcodes::BroadcastableTransactions, }, - Env, }; use alloy_dyn_abi::{DynSolValue, FunctionExt, JsonAbiExt}; use alloy_json_abi::Function; use alloy_primitives::{ - map::{AddressHashMap, HashMap}, Address, Bytes, Log, TxKind, U256, + map::{AddressHashMap, HashMap}, }; -use alloy_sol_types::{sol, SolCall}; +use alloy_sol_types::{SolCall, sol}; use foundry_evm_core::{ + EvmEnv, InspectorExt, backend::{Backend, BackendError, BackendResult, CowBackend, DatabaseExt, GLOBAL_FAIL_SLOT}, constants::{ CALLER, CHEATCODE_ADDRESS, CHEATCODE_CONTRACT_HASH, DEFAULT_CREATE2_DEPLOYER, @@ -27,7 +28,6 @@ use foundry_evm_core::{ }, decode::{RevertDecoder, SkipReason}, utils::StateChangeset, - EvmEnv, InspectorExt, }; use foundry_evm_coverage::HitMaps; use foundry_evm_traces::{SparsedTraceArena, TraceMode}; @@ -39,7 +39,7 @@ use revm::{ transaction::SignedAuthorization, }, database::{DatabaseCommit, DatabaseRef}, - interpreter::{return_ok, InstructionResult}, + interpreter::{InstructionResult, return_ok}, primitives::hardfork::SpecId, }; use std::{ @@ -876,11 +876,7 @@ impl RawCallResult { /// Returns an `EvmError` if the call failed, otherwise returns `self`. pub fn into_result(self, rd: Option<&RevertDecoder>) -> Result { - if self.exit_reason.is_ok() { - Ok(self) - } else { - Err(self.into_evm_error(rd)) - } + if self.exit_reason.is_ok() { Ok(self) } else { Err(self.into_evm_error(rd)) } } /// Decodes the result of the call with the given function. diff --git a/crates/evm/evm/src/executors/trace.rs b/crates/evm/evm/src/executors/trace.rs index c58ee8ddd6e59..ee58be36d03ea 100644 --- a/crates/evm/evm/src/executors/trace.rs +++ b/crates/evm/evm/src/executors/trace.rs @@ -1,10 +1,10 @@ use crate::{ - executors::{Executor, ExecutorBuilder}, Env, + executors::{Executor, ExecutorBuilder}, }; use alloy_primitives::Address; use foundry_compilers::artifacts::EvmVersion; -use foundry_config::{utils::evm_spec_id, Chain, Config}; +use foundry_config::{Chain, Config, utils::evm_spec_id}; use foundry_evm_core::{backend::Backend, fork::CreateFork, opts::EvmOpts}; use foundry_evm_traces::TraceMode; use revm::primitives::hardfork::SpecId; diff --git a/crates/evm/evm/src/inspectors/chisel_state.rs b/crates/evm/evm/src/inspectors/chisel_state.rs index 67ff8255a261e..600c6ca3c41c7 100644 --- a/crates/evm/evm/src/inspectors/chisel_state.rs +++ b/crates/evm/evm/src/inspectors/chisel_state.rs @@ -1,12 +1,12 @@ use alloy_primitives::U256; use foundry_evm_core::backend::DatabaseError; use revm::{ + Database, Inspector, context::ContextTr, inspector::JournalExt, interpreter::{ - interpreter::EthInterpreter, interpreter_types::Jumps, InstructionResult, Interpreter, + InstructionResult, Interpreter, interpreter::EthInterpreter, interpreter_types::Jumps, }, - Database, Inspector, }; /// An inspector for Chisel diff --git a/crates/evm/evm/src/inspectors/custom_printer.rs b/crates/evm/evm/src/inspectors/custom_printer.rs index a35958ee550d0..4d14798ba417d 100644 --- a/crates/evm/evm/src/inspectors/custom_printer.rs +++ b/crates/evm/evm/src/inspectors/custom_printer.rs @@ -4,16 +4,16 @@ use foundry_common::sh_println; use foundry_evm_core::backend::DatabaseError; use revm::{ + Database, Inspector, bytecode::opcode::OpCode, context::{ContextTr, JournalTr}, - inspector::{inspectors::GasInspector, JournalExt}, + inspector::{JournalExt, inspectors::GasInspector}, interpreter::{ + CallInputs, CallOutcome, CreateInputs, CreateOutcome, Interpreter, interpreter::EthInterpreter, interpreter_types::{Jumps, LoopControl, MemoryTr}, - CallInputs, CallOutcome, CreateInputs, CreateOutcome, Interpreter, }, primitives::{Address, U256}, - Database, Inspector, }; /// Custom print [Inspector], it has step level information of execution. diff --git a/crates/evm/evm/src/inspectors/logs.rs b/crates/evm/evm/src/inspectors/logs.rs index 32af7bdbce6c8..b27115cbc8195 100644 --- a/crates/evm/evm/src/inspectors/logs.rs +++ b/crates/evm/evm/src/inspectors/logs.rs @@ -1,17 +1,17 @@ use alloy_primitives::Log; use alloy_sol_types::{SolEvent, SolInterface, SolValue}; -use foundry_common::{fmt::ConsoleFmt, ErrorExt}; +use foundry_common::{ErrorExt, fmt::ConsoleFmt}; use foundry_evm_core::{ - abi::console, backend::DatabaseError, constants::HARDHAT_CONSOLE_ADDRESS, InspectorExt, + InspectorExt, abi::console, backend::DatabaseError, constants::HARDHAT_CONSOLE_ADDRESS, }; use revm::{ + Database, Inspector, context::ContextTr, inspector::JournalExt, interpreter::{ - interpreter::EthInterpreter, CallInputs, CallOutcome, Gas, InstructionResult, Interpreter, - InterpreterResult, + CallInputs, CallOutcome, Gas, InstructionResult, Interpreter, InterpreterResult, + interpreter::EthInterpreter, }, - Database, Inspector, }; /// An inspector that collects logs during execution. diff --git a/crates/evm/evm/src/inspectors/revert_diagnostic.rs b/crates/evm/evm/src/inspectors/revert_diagnostic.rs index c5da1b5b9c1b9..f867ce4d0dd88 100644 --- a/crates/evm/evm/src/inspectors/revert_diagnostic.rs +++ b/crates/evm/evm/src/inspectors/revert_diagnostic.rs @@ -5,14 +5,14 @@ use foundry_evm_core::{ constants::{CHEATCODE_ADDRESS, HARDHAT_CONSOLE_ADDRESS}, }; use revm::{ + Database, Inspector, bytecode::opcode, context::{ContextTr, JournalTr}, inspector::JournalExt, interpreter::{ - interpreter::EthInterpreter, interpreter_types::Jumps, CallInputs, CallOutcome, CallScheme, - InstructionResult, Interpreter, InterpreterAction, InterpreterResult, + CallInputs, CallOutcome, CallScheme, InstructionResult, Interpreter, InterpreterAction, + InterpreterResult, interpreter::EthInterpreter, interpreter_types::Jumps, }, - Database, Inspector, }; use std::fmt; @@ -73,11 +73,7 @@ impl RevertDiagnostic { /// Returns the effective target address whose code would be executed. /// For delegate calls, this is the `bytecode_address`. Otherwise, it's the `target_address`. fn code_target_address(&self, inputs: &mut CallInputs) -> Address { - if is_delegatecall(inputs.scheme) { - inputs.bytecode_address - } else { - inputs.target_address - } + if is_delegatecall(inputs.scheme) { inputs.bytecode_address } else { inputs.target_address } } /// Derives the revert reason based on the cached data. Should only be called after a revert. diff --git a/crates/evm/evm/src/inspectors/script.rs b/crates/evm/evm/src/inspectors/script.rs index 205215f08db08..c86356aea47bd 100644 --- a/crates/evm/evm/src/inspectors/script.rs +++ b/crates/evm/evm/src/inspectors/script.rs @@ -3,13 +3,13 @@ use alloy_primitives::Address; use foundry_common::sh_err; use foundry_evm_core::backend::DatabaseError; use revm::{ + Inspector, bytecode::opcode::ADDRESS, context::ContextTr, inspector::JournalExt, interpreter::{ - interpreter::EthInterpreter, interpreter_types::Jumps, InstructionResult, Interpreter, + InstructionResult, Interpreter, interpreter::EthInterpreter, interpreter_types::Jumps, }, - Inspector, }; /// An inspector that enforces certain rules during script execution. diff --git a/crates/evm/evm/src/inspectors/stack.rs b/crates/evm/evm/src/inspectors/stack.rs index 520de5f45e2aa..ca1c3936ea433 100644 --- a/crates/evm/evm/src/inspectors/stack.rs +++ b/crates/evm/evm/src/inspectors/stack.rs @@ -2,23 +2,24 @@ use super::{ Cheatcodes, CheatsConfig, ChiselState, CoverageCollector, CustomPrintTracer, Fuzzer, LogCollector, RevertDiagnostic, ScriptExecutionInspector, TracingInspector, }; -use alloy_evm::{eth::EthEvmContext, Evm}; +use alloy_evm::{Evm, eth::EthEvmContext}; use alloy_primitives::{ - map::{AddressHashMap, HashMap}, Address, Bytes, Log, TxKind, U256, + map::{AddressHashMap, HashMap}, }; use foundry_cheatcodes::{CheatcodesExecutor, Wallets}; use foundry_evm_core::{ + ContextExt, Env, InspectorExt, backend::{DatabaseExt, JournaledState}, evm::new_evm_with_inspector, - ContextExt, Env, InspectorExt, }; use foundry_evm_coverage::HitMaps; use foundry_evm_traces::{SparsedTraceArena, TraceMode}; use revm::{ + Inspector, context::{ - result::{ExecutionResult, Output}, BlockEnv, + result::{ExecutionResult, Output}, }, context_interface::CreateScheme, interpreter::{ @@ -26,7 +27,6 @@ use revm::{ EOFCreateKind, Gas, InstructionResult, Interpreter, InterpreterResult, }, state::{Account, AccountStatus}, - Inspector, }; use std::{ ops::{Deref, DerefMut}, diff --git a/crates/evm/evm/src/lib.rs b/crates/evm/evm/src/lib.rs index 92d39026aa677..bdca9d2eaa6ce 100644 --- a/crates/evm/evm/src/lib.rs +++ b/crates/evm/evm/src/lib.rs @@ -12,7 +12,7 @@ pub mod executors; pub mod inspectors; pub use foundry_evm_core::{ - backend, constants, decode, fork, opts, utils, Env, EnvMut, EvmEnv, InspectorExt, + Env, EnvMut, EvmEnv, InspectorExt, backend, constants, decode, fork, opts, utils, }; pub use foundry_evm_coverage as coverage; pub use foundry_evm_fuzz as fuzz; diff --git a/crates/evm/fuzz/src/inspector.rs b/crates/evm/fuzz/src/inspector.rs index 279f0878382ac..eb9499e58f67a 100644 --- a/crates/evm/fuzz/src/inspector.rs +++ b/crates/evm/fuzz/src/inspector.rs @@ -1,9 +1,9 @@ use crate::{invariant::RandomCallGenerator, strategies::EvmFuzzState}; use revm::{ + Inspector, context::{ContextTr, Transaction}, inspector::JournalExt, interpreter::{CallInput, CallInputs, CallOutcome, CallScheme, Interpreter}, - Inspector, }; /// An inspector that can fuzz and collect data for that effect. diff --git a/crates/evm/fuzz/src/invariant/mod.rs b/crates/evm/fuzz/src/invariant/mod.rs index c681512de1e60..61dbf6a8eb3cf 100644 --- a/crates/evm/fuzz/src/invariant/mod.rs +++ b/crates/evm/fuzz/src/invariant/mod.rs @@ -10,7 +10,7 @@ pub use call_override::RandomCallGenerator; mod filters; pub use filters::{ArtifactFilters, SenderFilters}; use foundry_common::{ContractsByAddress, ContractsByArtifact}; -use foundry_evm_core::utils::{get_function, StateChangeset}; +use foundry_evm_core::utils::{StateChangeset, get_function}; /// Contracts identified as targets during a fuzz run. /// diff --git a/crates/evm/fuzz/src/lib.rs b/crates/evm/fuzz/src/lib.rs index bce67dfe320fa..7b5f963ebdc46 100644 --- a/crates/evm/fuzz/src/lib.rs +++ b/crates/evm/fuzz/src/lib.rs @@ -10,8 +10,8 @@ extern crate tracing; use alloy_dyn_abi::{DynSolValue, JsonAbiExt}; use alloy_primitives::{ - map::{AddressHashMap, HashMap}, Address, Bytes, Log, + map::{AddressHashMap, HashMap}, }; use foundry_common::{calc, contracts::ContractsByAddress, evm::Breakpoints}; use foundry_evm_coverage::HitMaps; diff --git a/crates/evm/fuzz/src/strategies/calldata.rs b/crates/evm/fuzz/src/strategies/calldata.rs index c07008b09fffb..c792af57f5b4e 100644 --- a/crates/evm/fuzz/src/strategies/calldata.rs +++ b/crates/evm/fuzz/src/strategies/calldata.rs @@ -1,6 +1,6 @@ use crate::{ - strategies::{fuzz_param_from_state, fuzz_param_with_fixtures, EvmFuzzState}, FuzzFixtures, + strategies::{EvmFuzzState, fuzz_param_from_state, fuzz_param_with_fixtures}, }; use alloy_dyn_abi::JsonAbiExt; use alloy_json_abi::Function; @@ -9,7 +9,10 @@ use proptest::prelude::Strategy; /// Given a function, it returns a strategy which generates valid calldata /// for that function's input types, following declared test fixtures. -pub fn fuzz_calldata(func: Function, fuzz_fixtures: &FuzzFixtures) -> impl Strategy + use<> { +pub fn fuzz_calldata( + func: Function, + fuzz_fixtures: &FuzzFixtures, +) -> impl Strategy + use<> { // We need to compose all the strategies generated for each parameter in all // possible combinations, accounting any parameter declared fixture let strats = func @@ -62,10 +65,10 @@ pub fn fuzz_calldata_from_state( #[cfg(test)] mod tests { - use crate::{strategies::fuzz_calldata, FuzzFixtures}; + use crate::{FuzzFixtures, strategies::fuzz_calldata}; use alloy_dyn_abi::{DynSolValue, JsonAbiExt}; use alloy_json_abi::Function; - use alloy_primitives::{map::HashMap, Address}; + use alloy_primitives::{Address, map::HashMap}; use proptest::prelude::Strategy; #[test] diff --git a/crates/evm/fuzz/src/strategies/int.rs b/crates/evm/fuzz/src/strategies/int.rs index c13f9414155b1..306e05f62f3e1 100644 --- a/crates/evm/fuzz/src/strategies/int.rs +++ b/crates/evm/fuzz/src/strategies/int.rs @@ -1,5 +1,5 @@ use alloy_dyn_abi::{DynSolType, DynSolValue}; -use alloy_primitives::{Sign, I256, U256}; +use alloy_primitives::{I256, Sign, U256}; use proptest::{ prelude::Rng, strategy::{NewTree, Strategy, ValueTree}, diff --git a/crates/evm/fuzz/src/strategies/invariants.rs b/crates/evm/fuzz/src/strategies/invariants.rs index ee51781b796af..45da85bec2c1c 100644 --- a/crates/evm/fuzz/src/strategies/invariants.rs +++ b/crates/evm/fuzz/src/strategies/invariants.rs @@ -1,8 +1,8 @@ use super::{fuzz_calldata, fuzz_param_from_state}; use crate::{ - invariant::{BasicTxDetails, CallDetails, FuzzRunIdentifiedContracts, SenderFilters}, - strategies::{fuzz_calldata_from_state, fuzz_param, EvmFuzzState}, FuzzFixtures, + invariant::{BasicTxDetails, CallDetails, FuzzRunIdentifiedContracts, SenderFilters}, + strategies::{EvmFuzzState, fuzz_calldata_from_state, fuzz_param}, }; use alloy_json_abi::Function; use alloy_primitives::Address; @@ -42,7 +42,12 @@ pub fn override_call_strat( func.prop_flat_map({ move |func| { - fuzz_contract_with_calldata(fuzz_state.clone(), fuzz_fixtures.clone(), target_address, func) + fuzz_contract_with_calldata( + fuzz_state.clone(), + fuzz_fixtures.clone(), + target_address, + func, + ) } }) }) @@ -72,7 +77,8 @@ pub fn invariant_strat( let contracts = contracts.targets.lock(); let functions = contracts.fuzzed_functions(); let (target_address, target_function) = selector.select(functions); - let sender = select_random_sender(fuzz_state.clone(), senders.clone(), dictionary_weight); + let sender = + select_random_sender(fuzz_state.clone(), senders.clone(), dictionary_weight); let call_details = fuzz_contract_with_calldata( fuzz_state.clone(), fuzz_fixtures.clone(), diff --git a/crates/evm/fuzz/src/strategies/param.rs b/crates/evm/fuzz/src/strategies/param.rs index 07732332d90e0..cf67658a55bc4 100644 --- a/crates/evm/fuzz/src/strategies/param.rs +++ b/crates/evm/fuzz/src/strategies/param.rs @@ -2,7 +2,7 @@ use super::state::EvmFuzzState; use alloy_dyn_abi::{DynSolType, DynSolValue}; use alloy_primitives::{Address, B256, I256, U256}; use proptest::prelude::*; -use rand::{rngs::StdRng, SeedableRng}; +use rand::{SeedableRng, rngs::StdRng}; /// The max length of arrays we fuzz for is 256. const MAX_ARRAY_LEN: usize = 256; @@ -227,8 +227,8 @@ pub fn fuzz_param_from_state( #[cfg(test)] mod tests { use crate::{ - strategies::{fuzz_calldata, fuzz_calldata_from_state, EvmFuzzState}, FuzzFixtures, + strategies::{EvmFuzzState, fuzz_calldata, fuzz_calldata_from_state}, }; use foundry_common::abi::get_func; use foundry_config::FuzzDictionaryConfig; diff --git a/crates/evm/fuzz/src/strategies/state.rs b/crates/evm/fuzz/src/strategies/state.rs index 80c0c029865d2..16a8fc013d78f 100644 --- a/crates/evm/fuzz/src/strategies/state.rs +++ b/crates/evm/fuzz/src/strategies/state.rs @@ -2,13 +2,13 @@ use crate::invariant::{BasicTxDetails, FuzzRunIdentifiedContracts}; use alloy_dyn_abi::{DynSolType, DynSolValue, EventExt, FunctionExt}; use alloy_json_abi::{Function, JsonAbi}; use alloy_primitives::{ + Address, B256, Bytes, Log, U256, map::{AddressIndexSet, B256IndexSet, HashMap}, - Address, Bytes, Log, B256, U256, }; use foundry_common::ignore_metadata_hash; use foundry_config::FuzzDictionaryConfig; use foundry_evm_core::utils::StateChangeset; -use parking_lot::{lock_api::RwLockReadGuard, RawRwLock, RwLock}; +use parking_lot::{RawRwLock, RwLock, lock_api::RwLockReadGuard}; use revm::{ bytecode::opcode, database::{CacheDB, DatabaseRef, DbAccount}, diff --git a/crates/evm/fuzz/src/strategies/uint.rs b/crates/evm/fuzz/src/strategies/uint.rs index 3d63ef92d36b4..bc2bc994ff1c6 100644 --- a/crates/evm/fuzz/src/strategies/uint.rs +++ b/crates/evm/fuzz/src/strategies/uint.rs @@ -169,11 +169,7 @@ impl UintStrategy { } fn type_max(&self) -> U256 { - if self.bits < 256 { - (U256::from(1) << self.bits) - U256::from(1) - } else { - U256::MAX - } + if self.bits < 256 { (U256::from(1) << self.bits) - U256::from(1) } else { U256::MAX } } } diff --git a/crates/evm/traces/src/debug/mod.rs b/crates/evm/traces/src/debug/mod.rs index 0e07124597aa3..4f007f181eb3a 100644 --- a/crates/evm/traces/src/debug/mod.rs +++ b/crates/evm/traces/src/debug/mod.rs @@ -1,8 +1,8 @@ mod sources; use crate::CallTraceNode; use alloy_dyn_abi::{ - parser::{Parameters, Storage}, DynSolType, DynSolValue, Specifier, + parser::{Parameters, Storage}, }; use alloy_primitives::U256; use foundry_common::fmt::format_token; diff --git a/crates/evm/traces/src/debug/sources.rs b/crates/evm/traces/src/debug/sources.rs index 8cd0928eead63..ee49a80b25693 100644 --- a/crates/evm/traces/src/debug/sources.rs +++ b/crates/evm/traces/src/debug/sources.rs @@ -1,17 +1,17 @@ use eyre::{Context, Result}; use foundry_common::compact_to_contract; use foundry_compilers::{ + Artifact, Compiler, ProjectCompileOutput, artifacts::{ - sourcemap::{SourceElement, SourceMap}, Bytecode, Contract, ContractBytecodeSome, Libraries, Source, + sourcemap::{SourceElement, SourceMap}, }, multi::MultiCompilerLanguage, - Artifact, Compiler, ProjectCompileOutput, }; use foundry_evm_core::ic::PcIcMap; use foundry_linking::Linker; use rayon::prelude::*; -use solar_parse::{interface::Session, Parser}; +use solar_parse::{Parser, interface::Session}; use std::{ collections::{BTreeMap, HashMap, HashSet}, fmt::Write, diff --git a/crates/evm/traces/src/decoder/mod.rs b/crates/evm/traces/src/decoder/mod.rs index 44b9c9cd729b6..2ad19884fc286 100644 --- a/crates/evm/traces/src/decoder/mod.rs +++ b/crates/evm/traces/src/decoder/mod.rs @@ -1,20 +1,20 @@ use crate::{ + CallTrace, CallTraceArena, CallTraceNode, DecodedCallData, debug::DebugTraceIdentifier, identifier::{IdentifiedAddress, LocalTraceIdentifier, SignaturesIdentifier, TraceIdentifier}, - CallTrace, CallTraceArena, CallTraceNode, DecodedCallData, }; use alloy_dyn_abi::{DecodedEvent, DynSolValue, EventExt, FunctionExt, JsonAbiExt}; use alloy_json_abi::{Error, Event, Function, JsonAbi}; use alloy_primitives::{ - map::{hash_map::Entry, HashMap, HashSet}, - Address, LogData, Selector, B256, + Address, B256, LogData, Selector, + map::{HashMap, HashSet, hash_map::Entry}, }; use foundry_common::{ - abi::get_indexed_event, fmt::format_token, get_contract_name, selectors::SelectorKind, - ContractsByArtifact, SELECTOR_LEN, + ContractsByArtifact, SELECTOR_LEN, abi::get_indexed_event, fmt::format_token, + get_contract_name, selectors::SelectorKind, }; use foundry_evm_core::{ - abi::{console, Vm}, + abi::{Vm, console}, constants::{ CALLER, CHEATCODE_ADDRESS, DEFAULT_CREATE2_DEPLOYER, HARDHAT_CONSOLE_ADDRESS, TEST_CONTRACT_ADDRESS, diff --git a/crates/evm/traces/src/decoder/precompiles.rs b/crates/evm/traces/src/decoder/precompiles.rs index 245c70e10ec57..d6ff23637cce8 100644 --- a/crates/evm/traces/src/decoder/precompiles.rs +++ b/crates/evm/traces/src/decoder/precompiles.rs @@ -1,6 +1,6 @@ use crate::{CallTrace, DecodedCallData}; -use alloy_primitives::{hex, Address, B256, U256}; -use alloy_sol_types::{abi, sol, SolCall}; +use alloy_primitives::{Address, B256, U256, hex}; +use alloy_sol_types::{SolCall, abi, sol}; use foundry_evm_core::precompiles::{ BLAKE_2F, EC_ADD, EC_MUL, EC_PAIRING, EC_RECOVER, IDENTITY, MOD_EXP, POINT_EVALUATION, RIPEMD_160, SHA_256, diff --git a/crates/evm/traces/src/folded_stack_trace.rs b/crates/evm/traces/src/folded_stack_trace.rs index 603ff96a7e3d9..8b843b56c0efa 100644 --- a/crates/evm/traces/src/folded_stack_trace.rs +++ b/crates/evm/traces/src/folded_stack_trace.rs @@ -1,7 +1,7 @@ use alloy_primitives::hex::ToHexExt; use revm_inspectors::tracing::{ - types::{CallTraceNode, CallTraceStep, DecodedTraceStep, TraceMemberOrder}, CallTraceArena, + types::{CallTraceNode, CallTraceStep, DecodedTraceStep, TraceMemberOrder}, }; /// Builds a folded stack trace from a call trace arena. diff --git a/crates/evm/traces/src/identifier/etherscan.rs b/crates/evm/traces/src/identifier/etherscan.rs index 941e111a67bb0..ab6e598af945c 100644 --- a/crates/evm/traces/src/identifier/etherscan.rs +++ b/crates/evm/traces/src/identifier/etherscan.rs @@ -18,8 +18,8 @@ use std::{ collections::BTreeMap, pin::Pin, sync::{ - atomic::{AtomicBool, Ordering}, Arc, + atomic::{AtomicBool, Ordering}, }, }; use tokio::time::{Duration, Interval}; diff --git a/crates/evm/traces/src/identifier/local.rs b/crates/evm/traces/src/identifier/local.rs index f0bb8cd9d7d76..214703b74cf2b 100644 --- a/crates/evm/traces/src/identifier/local.rs +++ b/crates/evm/traces/src/identifier/local.rs @@ -1,7 +1,7 @@ use super::{IdentifiedAddress, TraceIdentifier}; use alloy_dyn_abi::JsonAbiExt; use alloy_json_abi::JsonAbi; -use foundry_common::contracts::{bytecode_diff_score, ContractsByArtifact}; +use foundry_common::contracts::{ContractsByArtifact, bytecode_diff_score}; use foundry_compilers::ArtifactId; use revm_inspectors::tracing::types::CallTraceNode; use std::borrow::Cow; @@ -118,11 +118,7 @@ impl<'a> LocalTraceIdentifier<'a> { // Note: the diff score can be inaccurate for small contracts so we're using a relatively // high threshold here to avoid filtering out too many contracts. - if min_score < 0.85 { - min_score_id - } else { - None - } + if min_score < 0.85 { min_score_id } else { None } } /// Returns the index of the artifact with the given code length, or the index of the first diff --git a/crates/evm/traces/src/identifier/signatures.rs b/crates/evm/traces/src/identifier/signatures.rs index 549430cf67df4..8b25b718fb9b9 100644 --- a/crates/evm/traces/src/identifier/signatures.rs +++ b/crates/evm/traces/src/identifier/signatures.rs @@ -1,5 +1,5 @@ use alloy_json_abi::{Error, Event, Function, JsonAbi}; -use alloy_primitives::{map::HashMap, Selector, B256}; +use alloy_primitives::{B256, Selector, map::HashMap}; use eyre::Result; use foundry_common::{ abi::{get_error, get_event, get_func}, diff --git a/crates/evm/traces/src/lib.rs b/crates/evm/traces/src/lib.rs index ab024a2c1f530..57749200f6b1d 100644 --- a/crates/evm/traces/src/lib.rs +++ b/crates/evm/traces/src/lib.rs @@ -17,8 +17,8 @@ use foundry_common::{ }; use revm::bytecode::opcode::OpCode; use revm_inspectors::tracing::{ - types::{DecodedTraceStep, TraceMemberOrder}, OpcodeFilter, + types::{DecodedTraceStep, TraceMemberOrder}, }; use serde::{Deserialize, Serialize}; use std::{ @@ -30,12 +30,12 @@ use std::{ use alloy_primitives::map::HashMap; pub use revm_inspectors::tracing::{ + CallTraceArena, FourByteInspector, GethTraceBuilder, ParityTraceBuilder, StackSnapshotType, + TraceWriter, TracingInspector, TracingInspectorConfig, types::{ CallKind, CallLog, CallTrace, CallTraceNode, DecodedCallData, DecodedCallLog, DecodedCallTrace, }, - CallTraceArena, FourByteInspector, GethTraceBuilder, ParityTraceBuilder, StackSnapshotType, - TraceWriter, TracingInspector, TracingInspectorConfig, }; /// Call trace address identifiers. @@ -335,11 +335,7 @@ impl TraceMode { } pub fn with_debug(self, yes: bool) -> Self { - if yes { - std::cmp::max(self, Self::Debug) - } else { - self - } + if yes { std::cmp::max(self, Self::Debug) } else { self } } pub fn with_decode_internal(self, mode: InternalTraceMode) -> Self { @@ -347,19 +343,11 @@ impl TraceMode { } pub fn with_state_changes(self, yes: bool) -> Self { - if yes { - std::cmp::max(self, Self::RecordStateDiff) - } else { - self - } + if yes { std::cmp::max(self, Self::RecordStateDiff) } else { self } } pub fn with_verbosity(self, verbosity: u8) -> Self { - if verbosity >= 3 { - std::cmp::max(self, Self::Call) - } else { - self - } + if verbosity >= 3 { std::cmp::max(self, Self::Call) } else { self } } pub fn into_config(self) -> Option { diff --git a/crates/fmt/src/formatter.rs b/crates/fmt/src/formatter.rs index 12065ddd9ac20..ca91e98235af2 100644 --- a/crates/fmt/src/formatter.rs +++ b/crates/fmt/src/formatter.rs @@ -1,6 +1,7 @@ //! A Solidity formatter use crate::{ + FormatterConfig, InlineConfig, IntTypes, buffer::*, chunk::*, comments::{ @@ -12,7 +13,6 @@ use crate::{ solang_ext::{pt::*, *}, string::{QuoteState, QuotedStringExt}, visit::{Visitable, Visitor}, - FormatterConfig, InlineConfig, IntTypes, }; use alloy_primitives::Address; use foundry_config::fmt::{HexUnderscore, MultilineFuncHeaderStyle, SingleLineBlockStyle}; @@ -1412,11 +1412,7 @@ impl<'a, W: Write> Formatter<'a, W> { .quote_state_char_indices() .find_map( |(state, _, ch)| { - if matches!(state, QuoteState::Opening(_)) { - Some(ch) - } else { - None - } + if matches!(state, QuoteState::Opening(_)) { Some(ch) } else { None } }, ) .expect("Could not find quote character for quoted string") diff --git a/crates/fmt/src/helpers.rs b/crates/fmt/src/helpers.rs index 1d036ba6b66d0..d6aef883a20ae 100644 --- a/crates/fmt/src/helpers.rs +++ b/crates/fmt/src/helpers.rs @@ -1,6 +1,6 @@ use crate::{ - inline_config::{InlineConfig, InvalidInlineConfigItem}, Comments, Formatter, FormatterConfig, FormatterError, Visitable, + inline_config::{InlineConfig, InvalidInlineConfigItem}, }; use ariadne::{Color, Fmt, Label, Report, ReportKind, Source}; use itertools::Itertools; diff --git a/crates/fmt/src/lib.rs b/crates/fmt/src/lib.rs index 006b4db02abe8..0ad3e336f7af2 100644 --- a/crates/fmt/src/lib.rs +++ b/crates/fmt/src/lib.rs @@ -21,7 +21,7 @@ pub use foundry_config::fmt::*; pub use comments::Comments; pub use formatter::{Formatter, FormatterError}; pub use helpers::{ - format, format_diagnostics_report, format_to, offset_to_line_column, parse, parse2, Parsed, + Parsed, format, format_diagnostics_report, format_to, offset_to_line_column, parse, parse2, }; pub use inline_config::InlineConfig; pub use visit::{Visitable, Visitor}; diff --git a/crates/fmt/src/visit.rs b/crates/fmt/src/visit.rs index b0d93ce0e84c6..86eeec7d57b62 100644 --- a/crates/fmt/src/visit.rs +++ b/crates/fmt/src/visit.rs @@ -1,6 +1,6 @@ //! Visitor helpers to traverse the [solang Solidity Parse Tree](solang_parser::pt). -use crate::solang_ext::{pt::*, CodeLocationExt}; +use crate::solang_ext::{CodeLocationExt, pt::*}; /// A trait that is invoked while traversing the Solidity Parse Tree. /// Each method of the [Visitor] trait is a hook that can be potentially overridden. @@ -412,11 +412,7 @@ where where V: Visitor, { - if let Some(inner) = self.as_mut() { - inner.visit(v) - } else { - Ok(()) - } + if let Some(inner) = self.as_mut() { inner.visit(v) } else { Ok(()) } } } diff --git a/crates/fmt/tests/formatter.rs b/crates/fmt/tests/formatter.rs index 2e0a8dc896296..c633c8530f3d7 100644 --- a/crates/fmt/tests/formatter.rs +++ b/crates/fmt/tests/formatter.rs @@ -1,4 +1,4 @@ -use forge_fmt::{format_to, parse, solang_ext::AstEq, FormatterConfig}; +use forge_fmt::{FormatterConfig, format_to, parse, solang_ext::AstEq}; use itertools::Itertools; use std::{fs, path::PathBuf}; use tracing_subscriber::{EnvFilter, FmtSubscriber}; diff --git a/crates/forge/src/args.rs b/crates/forge/src/args.rs index 2d411d7c30bc8..e26514c1c21fb 100644 --- a/crates/forge/src/args.rs +++ b/crates/forge/src/args.rs @@ -7,7 +7,7 @@ use clap_complete::generate; use eyre::Result; use foundry_cli::{handler, utils}; use foundry_common::shell; -use foundry_evm::inspectors::cheatcodes::{set_execution_context, ForgeContext}; +use foundry_evm::inspectors::cheatcodes::{ForgeContext, set_execution_context}; /// Run the `forge` command line interface. pub fn run() -> Result<()> { diff --git a/crates/forge/src/cmd/bind.rs b/crates/forge/src/cmd/bind.rs index b1f2aef0e5d31..acf69b158ae07 100644 --- a/crates/forge/src/cmd/bind.rs +++ b/crates/forge/src/cmd/bind.rs @@ -202,11 +202,7 @@ impl BindArgs { .get_json_files(artifacts)? .filter_map(|(name, path)| { trace!(?path, "parsing SolMacroGen from file"); - if dup.insert(name.clone()) { - Some(SolMacroGen::new(path, name)) - } else { - None - } + if dup.insert(name.clone()) { Some(SolMacroGen::new(path, name)) } else { None } }) .collect::>(); diff --git a/crates/forge/src/cmd/bind_json.rs b/crates/forge/src/cmd/bind_json.rs index fc5ca28bccdf7..0dc665a8439bf 100644 --- a/crates/forge/src/cmd/bind_json.rs +++ b/crates/forge/src/cmd/bind_json.rs @@ -2,15 +2,15 @@ use super::eip712::Resolver; use clap::{Parser, ValueHint}; use eyre::Result; use foundry_cli::{ - opts::{solar_pcx_from_solc_project, BuildOpts}, + opts::{BuildOpts, solar_pcx_from_solc_project}, utils::LoadConfig, }; -use foundry_common::{fs, TYPE_BINDING_PREFIX}; +use foundry_common::{TYPE_BINDING_PREFIX, fs}; use foundry_compilers::{ + CompilerInput, Graph, Project, artifacts::{Source, Sources}, multi::{MultiCompilerLanguage, MultiCompilerParsedSource}, solc::{SolcLanguage, SolcVersionedInput}, - CompilerInput, Graph, Project, }; use foundry_config::Config; use itertools::Itertools; @@ -18,9 +18,9 @@ use path_slash::PathExt; use rayon::prelude::*; use semver::Version; use solar_parse::{ - ast::{self, interface::source_map::FileName, visit::Visit, Arena, FunctionKind, Span, VarMut}, - interface::Session, Parser as SolarParser, + ast::{self, Arena, FunctionKind, Span, VarMut, interface::source_map::FileName, visit::Visit}, + interface::Session, }; use solar_sema::thread_local::ThreadLocal; use std::{ diff --git a/crates/forge/src/cmd/build.rs b/crates/forge/src/cmd/build.rs index 4805865311581..272cae93badaa 100644 --- a/crates/forge/src/cmd/build.rs +++ b/crates/forge/src/cmd/build.rs @@ -4,24 +4,23 @@ use eyre::Result; use forge_lint::{linter::Linter, sol::SolidityLinter}; use foundry_cli::{ opts::BuildOpts, - utils::{cache_local_signatures, LoadConfig}, + utils::{LoadConfig, cache_local_signatures}, }; use foundry_common::{compile::ProjectCompiler, shell}; use foundry_compilers::{ - compilers::{multi::MultiCompilerLanguage, Language}, + Project, ProjectCompileOutput, + compilers::{Language, multi::MultiCompilerLanguage}, solc::SolcLanguage, utils::source_files_iter, - Project, ProjectCompileOutput, }; use foundry_config::{ + Config, figment::{ - self, + self, Metadata, Profile, Provider, error::Kind::InvalidType, value::{Dict, Map, Value}, - Metadata, Profile, Provider, }, filter::expand_globs, - Config, }; use serde::Serialize; use std::path::PathBuf; diff --git a/crates/forge/src/cmd/cache.rs b/crates/forge/src/cmd/cache.rs index efbdde5cb6981..40fd0480d08a0 100644 --- a/crates/forge/src/cmd/cache.rs +++ b/crates/forge/src/cmd/cache.rs @@ -1,10 +1,10 @@ use cache::Cache; use clap::{ - builder::{PossibleValuesParser, TypedValueParser}, Arg, Command, Parser, Subcommand, + builder::{PossibleValuesParser, TypedValueParser}, }; use eyre::Result; -use foundry_config::{cache, Chain, Config, NamedChain}; +use foundry_config::{Chain, Config, NamedChain, cache}; use std::{ffi::OsStr, str::FromStr}; use strum::VariantNames; diff --git a/crates/forge/src/cmd/clone.rs b/crates/forge/src/cmd/clone.rs index b1a28b60c70f5..dfff5d82d0e6c 100644 --- a/crates/forge/src/cmd/clone.rs +++ b/crates/forge/src/cmd/clone.rs @@ -3,9 +3,9 @@ use alloy_primitives::{Address, Bytes, ChainId, TxHash}; use clap::{Parser, ValueHint}; use eyre::Result; use foundry_block_explorers::{ + Client, contract::{ContractCreationData, ContractMetadata, Metadata}, errors::EtherscanError, - Client, }; use foundry_cli::{ opts::EtherscanOpts, @@ -13,13 +13,13 @@ use foundry_cli::{ }; use foundry_common::{compile::ProjectCompiler, fs}; use foundry_compilers::{ + ProjectCompileOutput, ProjectPathsConfig, artifacts::{ + ConfigurableContractArtifact, Settings, StorageLayout, output_selection::ContractOutputSelection, remappings::{RelativeRemapping, Remapping}, - ConfigurableContractArtifact, Settings, StorageLayout, }, compilers::solc::Solc, - ProjectCompileOutput, ProjectPathsConfig, }; use foundry_config::{Chain, Config}; use std::{ @@ -810,9 +810,25 @@ mod tests { // remember to remove CBOR metadata from the creation code const CREATION_ARRAY: [(&str, &str, &str); 4] = [ - ("0x35Fb958109b70799a8f9Bc2a8b1Ee4cC62034193", "BearXNFTStaking", "608060405234801561001057600080fd5b50613000806100206000396000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80638129fc1c11610130578063bca35a71116100b8578063dada55011161007c578063dada550114610458578063f2fde38b1461046b578063f83d08ba1461047e578063fbb0022714610486578063fccd7f721461048e57600080fd5b8063bca35a71146103fa578063bf9befb11461040d578063c89d5b8b14610416578063d5d423001461041e578063d976e09f1461042657600080fd5b8063b1c92f95116100ff578063b1c92f95146103c5578063b549445c146103ce578063b81f8e89146103d6578063b9ade5b7146103de578063ba0848db146103e757600080fd5b80638129fc1c146103905780638da5cb5b14610398578063aaed083b146103a9578063b10dcc93146103b257600080fd5b8063367c164e116101b35780635923489b116101825780635923489b146103245780636e2751211461034f578063706ce3e114610362578063715018a614610375578063760a2e8a1461037d57600080fd5b8063367c164e146102bd57806338ff8a85146102d05780633a17f4f0146102f1578063426233601461030457600080fd5b8063206635e7116101fa578063206635e71461026d5780632afe761a146102805780632bd30f1114610289578063305f839a146102ab57806333ddacd1146102b457600080fd5b8062944f621461022b5780630d00368b146102405780630e8feed41461025c578063120957fd14610264575b600080fd5b61023e610239366004612aa4565b6104bc565b005b61024960735481565b6040519081526020015b60405180910390f35b61023e61053a565b610249606d5481565b61023e61027b366004612b2c565b61057e565b610249606f5481565b60785461029b90610100900460ff1681565b6040519015158152602001610253565b61024960715481565b61024960765481565b61023e6102cb366004612bc2565b6105d1565b6102e36102de366004612aa4565b610829565b604051610253929190612c16565b61023e6102ff366004612aa4565b6109e1565b610317610312366004612aa4565b610a56565b6040516102539190612c2f565b606a54610337906001600160a01b031681565b6040516001600160a01b039091168152602001610253565b6102e361035d366004612aa4565b610b4c565b606b54610337906001600160a01b031681565b61023e610cf8565b61029b61038b366004612aa4565b610d2e565b61023e610dc2565b6033546001600160a01b0316610337565b61024960705481565b61023e6103c0366004612b2c565b610fc0565b610249606e5481565b61023e611236565b61023e6112bb565b61024960725481565b6102e36103f5366004612aa4565b6112ef565b61023e610408366004612aa4565b61149b565b610249606c5481565b610249611510565b606f54610249565b610439610434366004612aa4565b611594565b6040805192151583526001600160a01b03909116602083015201610253565b606954610337906001600160a01b031681565b61023e610479366004612aa4565b6115cf565b61023e611667565b61023e6116a0565b6104a161049c366004612aa4565b6116e1565b60408051938452602084019290925290820152606001610253565b6033546001600160a01b031633146104ef5760405162461bcd60e51b81526004016104e690612c42565b60405180910390fd5b606b546001600160a01b03163b6105185760405162461bcd60e51b81526004016104e690612c77565b606b80546001600160a01b0319166001600160a01b0392909216919091179055565b600061054533611594565b509050806105655760405162461bcd60e51b81526004016104e690612cae565b61056e33610d2e565b61057b5761057b33611c73565b50565b610587336116e1565b505060765560005b81518110156105cd576105bb8282815181106105ad576105ad612cda565b602002602001015133611d7b565b806105c581612d06565b91505061058f565b5050565b606a54604051636eb1769f60e11b815233600482015273871770e3e03bfaefa3597056e540a1a9c9ac7f6b602482015282916001600160a01b03169063dd62ed3e90604401602060405180830381865afa158015610633573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106579190612d21565b10156106bb5760405162461bcd60e51b815260206004820152602d60248201527f596f75206861766520746f20617070726f766520726f6f747820746f2073746160448201526c1ada5b99c818dbdb9d1c9858dd609a1b60648201526084016104e6565b606a546040516323b872dd60e01b815233600482015273871770e3e03bfaefa3597056e540a1a9c9ac7f6b6024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610726573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074a9190612d3a565b50606a546040516326c7e79d60e21b8152600481018390526001600160a01b0390911690639b1f9e7490602401600060405180830381600087803b15801561079157600080fd5b505af11580156107a5573d6000803e3d6000fd5b5050606b546001600160a01b031691506379c650689050336107c88460056120a1565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561080e57600080fd5b505af1158015610822573d6000803e3d6000fd5b5050505050565b600060606000805b6001600160a01b0385166000908152607460205260409020548110156108bc576001600160a01b0385166000908152607460205260409020805461089791908390811061088057610880612cda565b906000526020600020906005020160000154612129565b156108aa576108a7600183612d5c565b91505b806108b481612d06565b915050610831565b5060008167ffffffffffffffff8111156108d8576108d8612ac1565b604051908082528060200260200182016040528015610901578160200160208202803683370190505b5090506000805b6001600160a01b0387166000908152607460205260409020548110156109d5576001600160a01b0387166000908152607460205260409020805461095791908390811061088057610880612cda565b156109c3576001600160a01b038716600090815260746020526040902080548290811061098657610986612cda565b9060005260206000209060050201600001548383815181106109aa576109aa612cda565b60209081029190910101526109c0826001612154565b91505b806109cd81612d06565b915050610908565b50919590945092505050565b6033546001600160a01b03163314610a0b5760405162461bcd60e51b81526004016104e690612c42565b6069546001600160a01b03163b610a345760405162461bcd60e51b81526004016104e690612c77565b606980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152607460205260408120546060919067ffffffffffffffff811115610a8b57610a8b612ac1565b604051908082528060200260200182016040528015610ab4578160200160208202803683370190505b50905060005b6001600160a01b038416600090815260746020526040902054811015610b45576001600160a01b0384166000908152607460205260409020805482908110610b0457610b04612cda565b906000526020600020906005020160000154828281518110610b2857610b28612cda565b602090810291909101015280610b3d81612d06565b915050610aba565b5092915050565b600060606000805b6001600160a01b038516600090815260746020526040902054811015610bdf576001600160a01b03851660009081526074602052604090208054610bba919083908110610ba357610ba3612cda565b9060005260206000209060050201600001546121b3565b15610bcd57610bca826001612154565b91505b80610bd781612d06565b915050610b54565b5060008167ffffffffffffffff811115610bfb57610bfb612ac1565b604051908082528060200260200182016040528015610c24578160200160208202803683370190505b5090506000805b6001600160a01b0387166000908152607460205260409020548110156109d5576001600160a01b03871660009081526074602052604090208054610c7a919083908110610ba357610ba3612cda565b15610ce6576001600160a01b0387166000908152607460205260409020805482908110610ca957610ca9612cda565b906000526020600020906005020160000154838381518110610ccd57610ccd612cda565b6020908102919091010152610ce3826001612154565b91505b80610cf081612d06565b915050610c2b565b6033546001600160a01b03163314610d225760405162461bcd60e51b81526004016104e690612c42565b610d2c60006121d0565b565b60006001815b6001600160a01b038416600090815260746020526040902054811015610b45576001600160a01b03841660009081526074602052604081208054610d9a919084908110610d8357610d83612cda565b906000526020600020906005020160010154612222565b9050603c8111610daa5750610db0565b60009250505b80610dba81612d06565b915050610d34565b600054610100900460ff16610ddd5760005460ff1615610de1565b303b155b610e445760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104e6565b600054610100900460ff16158015610e66576000805461ffff19166101011790555b610e6e61223c565b606580546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560668054821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2179055620151806067556312cc030060685560698054821673e22e1e620dffb03065cd77db0162249c0c91bf01179055606a8054821673d718ad25285d65ef4d79262a6cd3aea6a8e01023179055606b80549091167399cfdf48d0ba4885a73786148a2f89d86c7021701790556000606c5568056bc75e2d63100000606d556802b5e3af16b1880000606e55690257058e269742680000606f819055681b1ae4d6e2ef5000006070819055610bb8607181905591610f709190612d74565b610f7a9190612d8b565b607255607154606e54606d54610f909190612d74565b610f9a9190612d8b565b60735560006076556078805460ff19169055801561057b576000805461ff001916905550565b6000610fcb33611594565b50905080610feb5760405162461bcd60e51b81526004016104e690612cae565b607854610100900460ff161561102c5760405162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b60448201526064016104e6565b600061103733610a56565b90508051835111156110775760405162461bcd60e51b81526020600482015260096024820152684964206572726f727360b81b60448201526064016104e6565b6000805b84518110156110fd5760005b83518110156110ea578381815181106110a2576110a2612cda565b60200260200101518683815181106110bc576110bc612cda565b602002602001015114156110d8576110d5836001612154565b92505b806110e281612d06565b915050611087565b50806110f581612d06565b91505061107b565b50835181141561123057835161112761111e82678ac7230489e800006120a1565b606f5490612154565b606f55611132612273565b600060768190555b855181101561122d5760695486516001600160a01b03909116906323b872dd90309033908a908690811061117057611170612cda565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156111ca57600080fd5b505af11580156111de573d6000803e3d6000fd5b5050606c80549250905060006111f383612dad565b919050555061121b3387838151811061120e5761120e612cda565b602002602001015161229b565b8061122581612d06565b91505061113a565b50505b50505050565b60785460ff166112ac5760005b60755481101561057b576001607760006075848154811061126657611266612cda565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055806112a481612d06565b915050611243565b6078805460ff19166001179055565b60006112c633611594565b509050806112e65760405162461bcd60e51b81526004016104e690612cae565b61057b33612470565b600060606000805b6001600160a01b038516600090815260746020526040902054811015611382576001600160a01b0385166000908152607460205260409020805461135d91908390811061134657611346612cda565b906000526020600020906005020160000154612574565b156113705761136d600183612d5c565b91505b8061137a81612d06565b9150506112f7565b5060008167ffffffffffffffff81111561139e5761139e612ac1565b6040519080825280602002602001820160405280156113c7578160200160208202803683370190505b5090506000805b6001600160a01b0387166000908152607460205260409020548110156109d5576001600160a01b0387166000908152607460205260409020805461141d91908390811061134657611346612cda565b15611489576001600160a01b038716600090815260746020526040902080548290811061144c5761144c612cda565b90600052602060002090600502016000015483838151811061147057611470612cda565b6020908102919091010152611486826001612154565b91505b8061149381612d06565b9150506113ce565b6033546001600160a01b031633146114c55760405162461bcd60e51b81526004016104e690612c42565b606a546001600160a01b03163b6114ee5760405162461bcd60e51b81526004016104e690612c77565b606a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000806064606f5460016115249190612dc4565b61152e9190612d8b565b611539906001612d5c565b606d546115469190612dc4565b90506000606d54826115589190612d74565b905060006001606d548361156c9190612d8b565b6115769190612d8b565b611581906001612dc4565b61158c906064612dc4565b949350505050565b6001600160a01b038116600090815260776020526040812054819060ff161515600114156115c457506001929050565b506000928392509050565b6033546001600160a01b031633146115f95760405162461bcd60e51b81526004016104e690612c42565b6001600160a01b03811661165e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104e6565b61057b816121d0565b73d0d725208fd36be1561050fc1dd6a651d7ea7c89331415610d2c576078805461ff001981166101009182900460ff1615909102179055565b60006116ab33611594565b509050806116cb5760405162461bcd60e51b81526004016104e690612cae565b6116d433610d2e565b61057b5761057b336125aa565b600080808080808087816116f482610829565b509050600061170283610b4c565b50905060058110611a3b57600160005b6001600160a01b038516600090815260746020526040902054811015611a0e576001600160a01b0385166000908152607460205260408120805461177891908490811061176157611761612cda565b906000526020600020906005020160040154612222565b6001600160a01b038716600090815260746020526040902080549192506117a99184908110610ba357610ba3612cda565b806117de57506001600160a01b038616600090815260746020526040902080546117de91908490811061088057610880612cda565b80156117ea5750600181105b156117f457600092505b82801561181857506001600160a01b03861660009081526074602052604090205415155b156118715761186a8561182c83600a612dc4565b6118369190612dc4565b6118648661184585600a612dc4565b61184f9190612dc4565b60765461186490670de0b6b3a7640000612798565b90612154565b995061188e565b8261188e5760765461188b90670de0b6b3a7640000612798565b99505b6001600160a01b038616600090815260746020526040902080546118bd91908490811061088057610880612cda565b15611950576001600160a01b038616600090815260746020526040812080546119089190859081106118f1576118f1612cda565b906000526020600020906005020160020154612222565b90508061192861192182680ad78ebc5ac6200000612dc4565b8c90612154565b9a5061194761194082680ad78ebc5ac6200000612dc4565b8b90612154565b995050506119fb565b6001600160a01b0386166000908152607460205260409020805461197f919084908110610ba357610ba3612cda565b156119fb576001600160a01b038616600090815260746020526040812080546119b39190859081106118f1576118f1612cda565b905060008190506119d76002606d54846119cd9190612dc4565b6119219190612d8b565b9a506119f66002606d54836119ec9190612dc4565b6119409190612d8b565b995050505b5080611a0681612d06565b915050611712565b508515611a3557606b54606654611a32916001600160a01b039081169116886127da565b94505b50611c4f565b60005b6001600160a01b038416600090815260746020526040902054811015611c28576001600160a01b03841660009081526074602052604090208054611a8d91908390811061088057610880612cda565b15611b9f576001600160a01b03841660009081526074602052604081208054611ac191908490811061176157611761612cda565b9050611ad8611ad182600a612dc4565b8a90612154565b98506000611b1560746000886001600160a01b03166001600160a01b0316815260200190815260200160002084815481106118f1576118f1612cda565b9050611b2d611ad182680ad78ebc5ac6200000612dc4565b98506000611b8160746000896001600160a01b03166001600160a01b031681526020019081526020016000208581548110611b6a57611b6a612cda565b906000526020600020906005020160030154612222565b9050611b99611ad182680ad78ebc5ac6200000612dc4565b98505050505b6001600160a01b03841660009081526074602052604090208054611bce919083908110610ba357610ba3612cda565b15611c16576001600160a01b03841660009081526074602052604081208054611c0291908490811061176157611761612cda565b9050611c12611ad182600a612dc4565b9850505b80611c2081612d06565b915050611a3e565b508415611c4f57606b54606654611c4c916001600160a01b039081169116876127da565b93505b611c6187670de0b6b3a7640000612dc4565b9b959a50929850939650505050505050565b6000611c7e826116e1565b5091505080156105cd57606b5460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015611cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cff9190612d3a565b5060005b6001600160a01b038316600090815260746020526040902054811015611d76576001600160a01b0383166000908152607460205260409020805442919083908110611d5057611d50612cda565b600091825260209091206002600590920201015580611d6e81612d06565b915050611d03565b505050565b607054606f5410611db857607354606d6000828254611d9a9190612d74565b9091555050606f54611db490678ac7230489e80000612905565b606f555b6069546040516331a9108f60e11b8152600481018490526001600160a01b03838116921690636352211e90602401602060405180830381865afa158015611e03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e279190612de3565b6001600160a01b031614611e7d5760405162461bcd60e51b815260206004820152601e60248201527f596f7520617265206e6f742061206f776e6572206f6620746865206e6674000060448201526064016104e6565b60695460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c590604401602060405180830381865afa158015611ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eef9190612d3a565b1515600114611f575760405162461bcd60e51b815260206004820152602e60248201527f596f752073686f756c6420617070726f7665206e667420746f2074686520737460448201526d185ada5b99c818dbdb9d1c9858dd60921b60648201526084016104e6565b6069546040516323b872dd60e01b81526001600160a01b03838116600483015230602483015260448201859052909116906323b872dd90606401600060405180830381600087803b158015611fab57600080fd5b505af1158015611fbf573d6000803e3d6000fd5b505050506000611fce82611594565b50905060006040518060a001604052808581526020014281526020014281526020014281526020014281525090506120126001606c5461215490919063ffffffff16565b606c556001600160a01b03831660009081526074602090815260408083208054600181810183559185529383902085516005909502019384559184015191830191909155820151600282015560608201516003820155608082015160049091015581611230576001600160a01b0383166000908152607760205260409020805460ff1916600117905550505050565b6000826120b057506000612123565b60006120bc8385612dc4565b9050826120c98583612d8b565b146121205760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016104e6565b90505b92915050565b60008064e8d4a510008310158015612146575064e8d4a510058311155b156121235750600192915050565b6000806121618385612d5c565b9050838110156121205760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016104e6565b600080610e7483116121c757506001612123565b50600092915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6067546000906122328342612d74565b6121239190612d8b565b600054610100900460ff166122635760405162461bcd60e51b81526004016104e690612e00565b61226b612947565b610d2c61296e565b61227c33612470565b61228533610d2e565b610d2c5761229233611c73565b610d2c336125aa565b60005b6001600160a01b038316600090815260746020526040902054811015612428576001600160a01b03831660009081526074602052604090208054839190839081106122eb576122eb612cda565b9060005260206000209060050201600001541415612416576001600160a01b0383166000908152607460205260409020805461232990600190612d74565b8154811061233957612339612cda565b906000526020600020906005020160746000856001600160a01b03166001600160a01b03168152602001908152602001600020828154811061237d5761237d612cda565b60009182526020808320845460059093020191825560018085015490830155600280850154908301556003808501549083015560049384015493909101929092556001600160a01b03851681526074909152604090208054806123e2576123e2612e4b565b6000828152602081206005600019909301928302018181556001810182905560028101829055600381018290556004015590555b8061242081612d06565b91505061229e565b506001600160a01b0382166000908152607460205260409020546105cd576001600160a01b038216600090815260746020526040812061246791612a3f565b6105cd8261299e565b600061247b826116e1565b509091505080156105cd57606a5460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af11580156124d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fd9190612d3a565b5060005b6001600160a01b038316600090815260746020526040902054811015611d76576001600160a01b038316600090815260746020526040902080544291908390811061254e5761254e612cda565b60009182526020909120600460059092020101558061256c81612d06565b915050612501565b60006509184e72a00682101561258c57506000919050565b6509184e72b4b38211156125a257506000919050565b506001919050565b60006125b5826116e1565b5091505080156105cd57606b5460655460405163095ea7b360e01b81526001600160a01b0391821660048201526024810184905291169063095ea7b3906044016020604051808303816000875af1158015612614573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126389190612d3a565b5060408051600280825260608083018452926020830190803683375050606b5482519293506001600160a01b03169183915060009061267957612679612cda565b6001600160a01b0392831660209182029290920101526066548251911690829060019081106126aa576126aa612cda565b6001600160a01b03928316602091820292909201015260655460405163791ac94760e01b815291169063791ac947906126f0908590600090869089904290600401612e9a565b600060405180830381600087803b15801561270a57600080fd5b505af115801561271e573d6000803e3d6000fd5b5050505060005b6001600160a01b038416600090815260746020526040902054811015611230576001600160a01b038416600090815260746020526040902080544291908390811061277257612772612cda565b60009182526020909120600360059092020101558061279081612d06565b915050612725565b600061212083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506129d7565b6040805160028082526060808301845260009390929190602083019080368337019050509050848160008151811061281457612814612cda565b60200260200101906001600160a01b031690816001600160a01b031681525050838160018151811061284857612848612cda565b6001600160a01b03928316602091820292909201015260655460405163d06ca61f60e01b8152600092919091169063d06ca61f9061288c9087908690600401612ed6565b600060405180830381865afa1580156128a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128d19190810190612eef565b905080600183516128e29190612d74565b815181106128f2576128f2612cda565b6020026020010151925050509392505050565b600061212083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a0e565b600054610100900460ff16610d2c5760405162461bcd60e51b81526004016104e690612e00565b600054610100900460ff166129955760405162461bcd60e51b81526004016104e690612e00565b610d2c336121d0565b6000806129aa83611594565b915091508115611d76576001600160a01b03166000908152607760205260409020805460ff191690555050565b600081836129f85760405162461bcd60e51b81526004016104e69190612f75565b506000612a058486612d8b565b95945050505050565b60008184841115612a325760405162461bcd60e51b81526004016104e69190612f75565b506000612a058486612d74565b508054600082556005029060005260206000209081019061057b91905b80821115612a8b5760008082556001820181905560028201819055600382018190556004820155600501612a5c565b5090565b6001600160a01b038116811461057b57600080fd5b600060208284031215612ab657600080fd5b813561212081612a8f565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612b0057612b00612ac1565b604052919050565b600067ffffffffffffffff821115612b2257612b22612ac1565b5060051b60200190565b60006020808385031215612b3f57600080fd5b823567ffffffffffffffff811115612b5657600080fd5b8301601f81018513612b6757600080fd5b8035612b7a612b7582612b08565b612ad7565b81815260059190911b82018301908381019087831115612b9957600080fd5b928401925b82841015612bb757833582529284019290840190612b9e565b979650505050505050565b600060208284031215612bd457600080fd5b5035919050565b600081518084526020808501945080840160005b83811015612c0b57815187529582019590820190600101612bef565b509495945050505050565b82815260406020820152600061158c6040830184612bdb565b6020815260006121206020830184612bdb565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f41646472657373206973206e6f7420636f6e7472616374000000000000000000604082015260600190565b6020808252601290820152712cb7ba9030b932903737ba1039ba30b5b2b960711b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612d1a57612d1a612cf0565b5060010190565b600060208284031215612d3357600080fd5b5051919050565b600060208284031215612d4c57600080fd5b8151801515811461212057600080fd5b60008219821115612d6f57612d6f612cf0565b500190565b600082821015612d8657612d86612cf0565b500390565b600082612da857634e487b7160e01b600052601260045260246000fd5b500490565b600081612dbc57612dbc612cf0565b506000190190565b6000816000190483118215151615612dde57612dde612cf0565b500290565b600060208284031215612df557600080fd5b815161212081612a8f565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b600081518084526020808501945080840160005b83811015612c0b5781516001600160a01b031687529582019590820190600101612e75565b85815284602082015260a060408201526000612eb960a0830186612e61565b6001600160a01b0394909416606083015250608001529392505050565b82815260406020820152600061158c6040830184612e61565b60006020808385031215612f0257600080fd5b825167ffffffffffffffff811115612f1957600080fd5b8301601f81018513612f2a57600080fd5b8051612f38612b7582612b08565b81815260059190911b82018301908381019087831115612f5757600080fd5b928401925b82841015612bb757835182529284019290840190612f5c565b600060208083528351808285015260005b81811015612fa257858101830151858201604001528201612f86565b81811115612fb4576000604083870101525b50601f01601f191692909201604001939250505056fe"), - ("0x8B3D32cf2bb4d0D16656f4c0b04Fa546274f1545", "GovernorCharlieDelegate", "608060405234801561001057600080fd5b50613e45806100206000396000f3fe60806040526004361061031a5760003560e01c80637b3c71d3116101ab578063d50572ee116100f7578063f0843ba811610095578063fc176c041161006f578063fc176c0414610b82578063fc4eee4214610ba2578063fc66ff1414610bb8578063fe0d94c114610bd857600080fd5b8063f0843ba814610b12578063f2b0653714610b32578063f682e04c14610b6257600080fd5b8063de7bc127116100d1578063de7bc127146109ec578063deaaa7cc14610a02578063e23a9a5214610a36578063e837159c14610afc57600080fd5b8063d50572ee146109a0578063da35c664146109b6578063ddf0b009146109cc57600080fd5b8063a6d8784a11610164578063c1a287e21161013e578063c1a287e214610933578063c4d66de81461094a578063c5a8425d1461096a578063c9fb9e871461098a57600080fd5b8063a6d8784a146108e7578063abaac6a8146108fd578063b58131b01461091d57600080fd5b80637b3c71d31461083c5780637bdbe4d01461085c5780637cae57bb14610871578063806bd5811461088757806386d37e8b146108a757806399533365146108c757600080fd5b80632fedff591161026a5780633e4f49e61161022357806350442098116101fd578063504420981461074657806356781388146107665780635c60da1b1461078657806366176743146107be57600080fd5b80633e4f49e6146106d957806340e58ee5146107065780634d6733d21461072657600080fd5b80632fedff59146105ee578063328dd9821461060e57806338bd0dda1461063e5780633932abb11461066b5780633af32abf146106815780633bccf4fd146106b957600080fd5b8063158ef93e116102d757806318b62629116102b157806318b626291461056e5780631dfb1b5a1461058457806320606b70146105a457806324bc1a64146105d857600080fd5b8063158ef93e146104f757806317977c611461052157806317ba1b8b1461054e57600080fd5b8063013cf08b1461031f57806302a251a31461042857806306fdde031461044c5780630825f38f146104a25780630ea2d98c146104b7578063140499ea146104d7575b600080fd5b34801561032b57600080fd5b506103b361033a3660046132ee565b60096020819052600091825260409091208054600182015460028301546007840154600885015495850154600a860154600b870154600c880154600d890154600e9099015497996001600160a01b0390971698959794969593949293919260ff808316936101008404821693620100009004909116918d565b604080519d8e526001600160a01b03909c1660208e01529a8c019990995260608b019790975260808a019590955260a089019390935260c088019190915260e08701521515610100860152151561012085015215156101408401526101608301526101808201526101a0015b60405180910390f35b34801561043457600080fd5b5061043e60045481565b60405190815260200161041f565b34801561045857600080fd5b506104956040518060400160405280601a81526020017f496e7465726573742050726f746f636f6c20476f7665726e6f7200000000000081525081565b60405161041f9190613363565b6104b56104b0366004613450565b610beb565b005b3480156104c357600080fd5b506104b56104d23660046132ee565b610e61565b3480156104e357600080fd5b506104b56104f23660046134d6565b610ec6565b34801561050357600080fd5b506012546105119060ff1681565b604051901515815260200161041f565b34801561052d57600080fd5b5061043e61053c3660046134d6565b600a6020526000908152604090205481565b34801561055a57600080fd5b506104b56105693660046132ee565b610f07565b34801561057a57600080fd5b5061043e600f5481565b34801561059057600080fd5b506104b561059f3660046132ee565b610f64565b3480156105b057600080fd5b5061043e7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156105e457600080fd5b5061043e60015481565b3480156105fa57600080fd5b506104b56106093660046132ee565b610fc1565b34801561061a57600080fd5b5061062e6106293660046132ee565b61101e565b60405161041f94939291906135ba565b34801561064a57600080fd5b5061043e6106593660046134d6565b600d6020526000908152604090205481565b34801561067757600080fd5b5061043e60035481565b34801561068d57600080fd5b5061051161069c3660046134d6565b6001600160a01b03166000908152600d6020526040902054421090565b3480156106c557600080fd5b506104b56106d4366004613623565b6112af565b3480156106e557600080fd5b506106f96106f43660046132ee565b611516565b60405161041f9190613687565b34801561071257600080fd5b506104b56107213660046132ee565b61169e565b34801561073257600080fd5b506104b56107413660046136af565b611b80565b34801561075257600080fd5b506104b56107613660046132ee565b611c45565b34801561077257600080fd5b506104b56107813660046136d9565b611ca2565b34801561079257600080fd5b506000546107a6906001600160a01b031681565b6040516001600160a01b03909116815260200161041f565b3480156107ca57600080fd5b506108146107d9366004613705565b601160209081526000928352604080842090915290825290205460ff808216916101008104909116906201000090046001600160601b031683565b60408051931515845260ff90921660208401526001600160601b03169082015260600161041f565b34801561084857600080fd5b506104b5610857366004613728565b611d09565b34801561086857600080fd5b5061043e600a81565b34801561087d57600080fd5b5061043e600c5481565b34801561089357600080fd5b506104b56108a23660046132ee565b611d58565b3480156108b357600080fd5b506104b56108c23660046132ee565b611db5565b3480156108d357600080fd5b506104b56108e23660046134d6565b611e12565b3480156108f357600080fd5b5061043e60155481565b34801561090957600080fd5b506104b56109183660046132ee565b611e8b565b34801561092957600080fd5b5061043e60055481565b34801561093f57600080fd5b5061043e6212750081565b34801561095657600080fd5b506104b56109653660046134d6565b611ee8565b34801561097657600080fd5b50600e546107a6906001600160a01b031681565b34801561099657600080fd5b5061043e60135481565b3480156109ac57600080fd5b5061043e60025481565b3480156109c257600080fd5b5061043e60075481565b3480156109d857600080fd5b506104b56109e73660046132ee565b611fd9565b3480156109f857600080fd5b5061043e60105481565b348015610a0e57600080fd5b5061043e7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610a4257600080fd5b50610acc610a51366004613705565b60408051606081018252600080825260208201819052918101919091525060009182526011602090815260408084206001600160a01b03939093168452918152918190208151606081018352905460ff8082161515835261010082041693820193909352620100009092046001600160601b03169082015290565b6040805182511515815260208084015160ff1690820152918101516001600160601b03169082015260600161041f565b348015610b0857600080fd5b5061043e60145481565b348015610b1e57600080fd5b506104b5610b2d3660046132ee565b61238f565b348015610b3e57600080fd5b50610511610b4d3660046132ee565b600b6020526000908152604090205460ff1681565b348015610b6e57600080fd5b5061043e610b7d3660046139b0565b6123ec565b348015610b8e57600080fd5b506104b5610b9d3660046132ee565b612a48565b348015610bae57600080fd5b5061043e60065481565b348015610bc457600080fd5b506008546107a6906001600160a01b031681565b6104b5610be63660046132ee565b612aa5565b60008585858585604051602001610c06959493929190613a91565b60408051601f1981840301815291815281516020928301206000818152600b90935291205490915060ff16610c7b5760405162461bcd60e51b81526020600482015260166024820152753a3c103430b9b713ba103132b2b71038bab2bab2b21760511b60448201526064015b60405180910390fd5b81421015610ccb5760405162461bcd60e51b815260206004820152601d60248201527f7478206861736e2774207375727061737365642074696d656c6f636b2e0000006044820152606401610c72565b610cd86212750083613af3565b421115610d165760405162461bcd60e51b815260206004820152600c60248201526b3a3c1034b99039ba30b6329760a11b6044820152606401610c72565b6000818152600b60205260409020805460ff191690558351606090610d3c575082610d68565b848051906020012084604051602001610d56929190613b0b565b60405160208183030381529060405290505b6000876001600160a01b03168783604051610d839190613b3c565b60006040518083038185875af1925050503d8060008114610dc0576040519150601f19603f3d011682016040523d82523d6000602084013e610dc5565b606091505b5050905080610e0f5760405162461bcd60e51b81526020600482015260166024820152753a3c1032bc32b1baba34b7b7103932bb32b93a32b21760511b6044820152606401610c72565b876001600160a01b0316837fa560e3198060a2f10670c1ec5b403077ea6ae93ca8de1c32b451dc1a943cd6e789898989604051610e4f9493929190613b58565b60405180910390a35050505050505050565b333014610e805760405162461bcd60e51b8152600401610c7290613b95565b600480549082905560408051828152602081018490527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882891015b60405180910390a15050565b333014610ee55760405162461bcd60e51b8152600401610c7290613b95565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b333014610f265760405162461bcd60e51b8152600401610c7290613b95565b600580549082905560408051828152602081018490527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054619101610eba565b333014610f835760405162461bcd60e51b8152600401610c7290613b95565b600380549082905560408051828152602081018490527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a939101610eba565b333014610fe05760405162461bcd60e51b8152600401610c7290613b95565b601480549082905560408051828152602081018490527f519a192fe8db9e38785eb494c69f530ddb21b9e34322f8d08fe29bd3849749889101610eba565b606080606080600060096000878152602001908152602001600020905080600301816004018260050183600601838054806020026020016040519081016040528092919081815260200182805480156110a057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611082575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156110f257602002820191906000526020600020905b8154815260200190600101908083116110de575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b828210156111c657838290600052602060002001805461113990613bcc565b80601f016020809104026020016040519081016040528092919081815260200182805461116590613bcc565b80156111b25780601f10611187576101008083540402835291602001916111b2565b820191906000526020600020905b81548152906001019060200180831161119557829003601f168201915b50505050508152602001906001019061111a565b50505050915080805480602002602001604051908101604052809291908181526020016000905b8282101561129957838290600052602060002001805461120c90613bcc565b80601f016020809104026020016040519081016040528092919081815260200182805461123890613bcc565b80156112855780601f1061125a57610100808354040283529160200191611285565b820191906000526020600020905b81548152906001019060200180831161126857829003601f168201915b5050505050815260200190600101906111ed565b5050505090509450945094509450509193509193565b604080518082018252601a81527f496e7465726573742050726f746f636f6c20476f7665726e6f7200000000000060209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f75a838dcd8ee5903cc7f4a5799344d0080864f57a6e9911f8bdfb4c8ddce9b5481840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff8816610100808401919091528451808403909101815261012083019094528351939092019290922061190160f01b6101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561143c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661149f5760405162461bcd60e51b815260206004820181905260248201527f63617374566f746542795369673a20696e76616c6964207369676e61747572656044820152606401610c72565b88816001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a6114d7858e8e612c90565b6040805160ff90931683526001600160601b039091166020830152606090820181905260009082015260800160405180910390a3505050505050505050565b6000816007541015801561152b575060065482115b6115775760405162461bcd60e51b815260206004820152601a60248201527f73746174653a20696e76616c69642070726f706f73616c2069640000000000006044820152606401610c72565b600082815260096020908152604080832060018101546001600160a01b03168452600d90925290912054600c82015442919091109060ff16156115be575060029392505050565b816007015443116115d3575060009392505050565b816008015443116115e8575060019392505050565b8080156115fc575081600d015482600a0154115b80611618575080158015611618575081600a0154826009015411155b80611633575080158015611633575081600d01548260090154105b15611642575060039392505050565b6002820154611655575060049392505050565b600c820154610100900460ff1615611671575060079392505050565b6212750082600201546116849190613af3565b4210611694575060069392505050565b5060059392505050565b60076116a982611516565b60078111156116ba576116ba613671565b14156117085760405162461bcd60e51b815260206004820152601d60248201527f63616e742063616e63656c2065786563757465642070726f706f73616c0000006044820152606401610c72565b600081815260096020526040902060018101546001600160a01b0316336001600160a01b0316146119755760018101546001600160a01b03166000908152600d6020526040902054421015611878576005546008546001838101546001600160a01b039283169263782d6fe1929116906117829043613c07565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440160206040518083038186803b1580156117c657600080fd5b505afa1580156117da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fe9190613c1e565b6001600160601b03161080156118275750600e546001600160a01b0316336001600160a01b0316145b6118735760405162461bcd60e51b815260206004820152601c60248201527f63616e63656c3a2077686974656c69737465642070726f706f736572000000006044820152606401610c72565b611975565b6005546008546001838101546001600160a01b039283169263782d6fe1929116906118a39043613c07565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440160206040518083038186803b1580156118e757600080fd5b505afa1580156118fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191f9190613c1e565b6001600160601b0316106119755760405162461bcd60e51b815260206004820181905260248201527f63616e63656c3a2070726f706f7365722061626f7665207468726573686f6c646044820152606401610c72565b600c8101805460ff1916600117905560005b6003820154811015611b5057611b3e8260030182815481106119ab576119ab613c47565b6000918252602090912001546004840180546001600160a01b0390921691849081106119d9576119d9613c47565b90600052602060002001548460050184815481106119f9576119f9613c47565b906000526020600020018054611a0e90613bcc565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3a90613bcc565b8015611a875780601f10611a5c57610100808354040283529160200191611a87565b820191906000526020600020905b815481529060010190602001808311611a6a57829003601f168201915b5050505050856006018581548110611aa157611aa1613c47565b906000526020600020018054611ab690613bcc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae290613bcc565b8015611b2f5780601f10611b0457610100808354040283529160200191611b2f565b820191906000526020600020905b815481529060010190602001808311611b1257829003601f168201915b50505050508660020154612f12565b80611b4881613c5d565b915050611987565b5060405182907f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90600090a25050565b333014611b9f5760405162461bcd60e51b8152600401610c7290613b95565b42601554611bad9190613af3565b8110611bf45760405162461bcd60e51b81526020600482015260166024820152750caf0e0d2e4c2e8d2dedc40caf0c6cacac8e640dac2f60531b6044820152606401610c72565b6001600160a01b0382166000818152600d6020908152604091829020849055815192835282018390527f4e7b7545bc5744d0e30425959f4687475774b6c7edad77d24cb51c7d967d45159101610eba565b333014611c645760405162461bcd60e51b8152600401610c7290613b95565b601080549082905560408051828152602081018490527f2a61b867418a359864adca8bb250ea65ee8bd41dbfd0279198d8e7552d4a27c29101610eba565b81337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda483611cd1838583612c90565b6040805160ff90931683526001600160601b039091166020830152606090820181905260009082015260800160405180910390a35050565b83337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda485611d38838583612c90565b8686604051611d4a9493929190613c78565b60405180910390a350505050565b333014611d775760405162461bcd60e51b8152600401610c7290613b95565b601380549082905560408051828152602081018490527f8cb5451eee8feb516cec9cd600201bbc31a30886d70c841a085a3fa69a4294d19101610eba565b333014611dd45760405162461bcd60e51b8152600401610c7290613b95565b600180549082905560408051828152602081018490527fa74554b0f53da47d07ec571d712428b3720460f54f81375fbcf78f6b5f72e7ed9101610eba565b333014611e315760405162461bcd60e51b8152600401610c7290613b95565b600e80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f80a07e73e552148844a9c216d9724212d609cfa54e9c1a2e97203bdd2c4ad3419101610eba565b333014611eaa5760405162461bcd60e51b8152600401610c7290613b95565b600f80549082905560408051828152602081018490527f80a384652af83fc00bfd40ef94edda7ede83e7db39931b2c889821573f314e239101610eba565b60125460ff1615611f3b5760405162461bcd60e51b815260206004820152601860248201527f616c7265616479206265656e20696e697469616c697a656400000000000000006044820152606401610c72565b600880546001600160a01b0319166001600160a01b0392909216919091179055619d8060045561335460035569d3c21bcecceda10000006005556202a300600c5560006007556a084595161401484a00000060019081556a21165458500521280000006002556119aa600f5561a8c06010556a01a784379d99db420000006013556146506014556301e133806015556012805460ff19169091179055565b6004611fe482611516565b6007811115611ff557611ff5613671565b146120425760405162461bcd60e51b815260206004820152601f60248201527f63616e206f6e6c792062652071756575656420696620737563636565646564006044820152606401610c72565b6000818152600960205260408120600e8101549091906120629042613af3565b905060005b600383015481101561234d57600b600084600301838154811061208c5761208c613c47565b6000918252602090912001546004860180546001600160a01b0390921691859081106120ba576120ba613c47565b90600052602060002001548660050185815481106120da576120da613c47565b906000526020600020018760060186815481106120f9576120f9613c47565b9060005260206000200187604051602001612118959493929190613d62565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff161561218e5760405162461bcd60e51b815260206004820152601760248201527f70726f706f73616c20616c7265616479207175657565640000000000000000006044820152606401610c72565b61233a8360030182815481106121a6576121a6613c47565b6000918252602090912001546004850180546001600160a01b0390921691849081106121d4576121d4613c47565b90600052602060002001548560050184815481106121f4576121f4613c47565b90600052602060002001805461220990613bcc565b80601f016020809104026020016040519081016040528092919081815260200182805461223590613bcc565b80156122825780601f1061225757610100808354040283529160200191612282565b820191906000526020600020905b81548152906001019060200180831161226557829003601f168201915b505050505086600601858154811061229c5761229c613c47565b9060005260206000200180546122b190613bcc565b80601f01602080910402602001604051908101604052809291908181526020018280546122dd90613bcc565b801561232a5780601f106122ff5761010080835404028352916020019161232a565b820191906000526020600020905b81548152906001019060200180831161230d57829003601f168201915b50505050508688600e0154612fac565b508061234581613c5d565b915050612067565b506002820181905560405181815283907f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28929060200160405180910390a2505050565b3330146123ae5760405162461bcd60e51b8152600401610c7290613b95565b600280549082905560408051828152602081018490527fc2adf06da6765dba7faaccde4c0ce3f91c35dd3390e7f0b6bc2844202c9fa9529101610eba565b6000600154600014156124365760405162461bcd60e51b8152602060048201526012602482015271436861726c6965206e6f742061637469766560701b6044820152606401610c72565b6005546008546001600160a01b031663782d6fe133612456600143613c07565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440160206040518083038186803b15801561249a57600080fd5b505afa1580156124ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d29190613c1e565b6001600160601b03161015806124ec57506124ec3361069c565b6125385760405162461bcd60e51b815260206004820152601e60248201527f766f7465732062656c6f772070726f706f73616c207468726573686f6c6400006044820152606401610c72565b8551875114801561254a575084518751145b8015612557575083518751145b6125a35760405162461bcd60e51b815260206004820152601a60248201527f696e666f726d6174696f6e206172697479206d69736d617463680000000000006044820152606401610c72565b86516125e85760405162461bcd60e51b81526020600482015260146024820152736d7573742070726f7669646520616374696f6e7360601b6044820152606401610c72565b600a8751111561262d5760405162461bcd60e51b815260206004820152601060248201526f746f6f206d616e7920616374696f6e7360801b6044820152606401610c72565b336000908152600a6020526040902054801561271657600061264e82611516565b9050600181600781111561266457612664613671565b14156126b25760405162461bcd60e51b815260206004820152601e60248201527f6f6e65206c6976652070726f706f73616c207065722070726f706f73657200006044820152606401610c72565b60008160078111156126c6576126c6613671565b14156127145760405162461bcd60e51b815260206004820152601e60248201527f6f6e65206c6976652070726f706f73616c207065722070726f706f73657200006044820152606401610c72565b505b6007805490600061272683613c5d565b9190505550600060405180610220016040528060075481526020016127483390565b6001600160a01b03168152602001600081526020018a8152602001898152602001888152602001878152602001600354436127839190613af3565b8152602001600454600354436127999190613af3565b6127a39190613af3565b815260200160008152602001600081526020016000815260200160001515815260200160001515815260200185151581526020016001548152602001600c5481525090508380156127fa57506127f83361069c565b155b1561282c574360e08201819052600f5461281391613af3565b6101008201526002546101e08201526010546102008201525b6128353361069c565b15612876576013546101e08201526014546128509043613af3565b60e08201526004546014546128659043613af3565b61286f9190613af3565b6101008201525b805160009081526009602090815260409182902083518155818401516001820180546001600160a01b0319166001600160a01b03909216919091179055918301516002830155606083015180518493926128d792600385019291019061309d565b50608082015180516128f3916004840191602090910190613102565b5060a0820151805161290f91600584019160209091019061313d565b5060c0820151805161292b916006840191602090910190613196565b5060e08281015160078301556101008084015160088401556101208401516009840155610140840151600a80850191909155610160850151600b850155610180850151600c850180546101a08801516101c089015161ffff1990921693151561ff0019169390931792151585029290921762ff0000191662010000921515929092029190911790556101e0850151600d85015561020090940151600e9093019290925583516020808601516001600160a01b0316600090815294905260409384902055830151835191840151925190923392917f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e091612a33918f918f918f918f918f90613d9b565b60405180910390a45198975050505050505050565b333014612a675760405162461bcd60e51b8152600401610c7290613b95565b600c80549082905560408051828152602081018490527fed0229422af39d4d7d33f7a27d31d6f5cb20ec628293da58dd6e8a528ed466be9101610eba565b6005612ab082611516565b6007811115612ac157612ac1613671565b14612b0e5760405162461bcd60e51b815260206004820152601c60248201527f63616e206f6e6c792062652065786563276420696620717565756564000000006044820152606401610c72565b6000818152600960205260408120600c8101805461ff001916610100179055905b6003820154811015612c6057306001600160a01b0316630825f38f836004018381548110612b5f57612b5f613c47565b9060005260206000200154846003018481548110612b7f57612b7f613c47565b6000918252602090912001546004860180546001600160a01b039092169186908110612bad57612bad613c47565b9060005260206000200154866005018681548110612bcd57612bcd613c47565b90600052602060002001876006018781548110612bec57612bec613c47565b9060005260206000200188600201546040518763ffffffff1660e01b8152600401612c1b959493929190613d62565b6000604051808303818588803b158015612c3457600080fd5b505af1158015612c48573d6000803e3d6000fd5b50505050508080612c5890613c5d565b915050612b2f565b5060405182907f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90600090a25050565b60006001612c9d84611516565b6007811115612cae57612cae613671565b14612cee5760405162461bcd60e51b815260206004820152601060248201526f1d9bdd1a5b99c81a5cc818db1bdcd95960821b6044820152606401610c72565b60028260ff161115612d365760405162461bcd60e51b8152602060048201526011602482015270696e76616c696420766f7465207479706560781b6044820152606401610c72565b6000838152600960209081526040808320601183528184206001600160a01b0389168552909252909120805460ff1615612da85760405162461bcd60e51b81526020600482015260136024820152721d9bdd195c88185b1c9958591e481d9bdd1959606a1b6044820152606401610c72565b600854600783015460405163782d6fe160e01b81526000926001600160a01b03169163782d6fe191612df2918b916004016001600160a01b03929092168252602082015260400190565b60206040518083038186803b158015612e0a57600080fd5b505afa158015612e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e429190613c1e565b905060ff8516612e6f57806001600160601b031683600a0154612e659190613af3565b600a840155612ec9565b8460ff1660011415612e9e57806001600160601b03168360090154612e949190613af3565b6009840155612ec9565b8460ff1660021415612ec957806001600160601b031683600b0154612ec39190613af3565b600b8401555b81546001600160601b03821662010000026dffffffffffffffffffffffff00001960ff88166101000261ffff199093169290921760011791909116179091559150509392505050565b60008585858585604051602001612f2d959493929190613a91565b60408051601f1981840301815282825280516020918201206000818152600b909252919020805460ff1916905591506001600160a01b0387169082907f2fffc091a501fd91bfbff27141450d3acb40fb8e6d8382b243ec7a812a3aaf8790612f9c908990899089908990613b58565b60405180910390a3505050505050565b6000612fb88242613af3565b831015612ffd5760405162461bcd60e51b815260206004820152601360248201527236bab9ba1039b0ba34b9b33c903232b630bc9760691b6044820152606401610c72565b60008787878787604051602001613018959493929190613a91565b60408051601f1981840301815282825280516020918201206000818152600b909252919020805460ff1916600117905591506001600160a01b0389169082907f76e2796dc3a81d57b0e8504b647febcbeeb5f4af818e164f11eef8131a6a763f9061308a908b908b908b908b90613b58565b60405180910390a3979650505050505050565b8280548282559060005260206000209081019282156130f2579160200282015b828111156130f257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906130bd565b506130fe9291506131ef565b5090565b8280548282559060005260206000209081019282156130f2579160200282015b828111156130f2578251825591602001919060010190613122565b82805482825590600052602060002090810192821561318a579160200282015b8281111561318a578251805161317a918491602090910190613204565b509160200191906001019061315d565b506130fe929150613277565b8280548282559060005260206000209081019282156131e3579160200282015b828111156131e357825180516131d3918491602090910190613204565b50916020019190600101906131b6565b506130fe929150613294565b5b808211156130fe57600081556001016131f0565b82805461321090613bcc565b90600052602060002090601f01602090048101928261323257600085556130f2565b82601f1061324b57805160ff19168380011785556130f2565b828001600101855582156130f257918201828111156130f2578251825591602001919060010190613122565b808211156130fe57600061328b82826132b1565b50600101613277565b808211156130fe5760006132a882826132b1565b50600101613294565b5080546132bd90613bcc565b6000825580601f106132cd575050565b601f0160209004906000526020600020908101906132eb91906131ef565b50565b60006020828403121561330057600080fd5b5035919050565b60005b8381101561332257818101518382015260200161330a565b83811115613331576000848401525b50505050565b6000815180845261334f816020860160208601613307565b601f01601f19169290920160200192915050565b6020815260006133766020830184613337565b9392505050565b80356001600160a01b038116811461339457600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156133d8576133d8613399565b604052919050565b600082601f8301126133f157600080fd5b813567ffffffffffffffff81111561340b5761340b613399565b61341e601f8201601f19166020016133af565b81815284602083860101111561343357600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561346857600080fd5b6134718661337d565b945060208601359350604086013567ffffffffffffffff8082111561349557600080fd5b6134a189838a016133e0565b945060608801359150808211156134b757600080fd5b506134c4888289016133e0565b95989497509295608001359392505050565b6000602082840312156134e857600080fd5b6133768261337d565b600081518084526020808501945080840160005b8381101561352a5781516001600160a01b031687529582019590820190600101613505565b509495945050505050565b600081518084526020808501945080840160005b8381101561352a57815187529582019590820190600101613549565b600081518084526020808501808196508360051b8101915082860160005b858110156135ad57828403895261359b848351613337565b98850198935090840190600101613583565b5091979650505050505050565b6080815260006135cd60808301876134f1565b82810360208401526135df8187613535565b905082810360408401526135f38186613565565b905082810360608401526136078185613565565b979650505050505050565b803560ff8116811461339457600080fd5b600080600080600060a0868803121561363b57600080fd5b8535945061364b60208701613612565b935061365960408701613612565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b60208101600883106136a957634e487b7160e01b600052602160045260246000fd5b91905290565b600080604083850312156136c257600080fd5b6136cb8361337d565b946020939093013593505050565b600080604083850312156136ec57600080fd5b823591506136fc60208401613612565b90509250929050565b6000806040838503121561371857600080fd5b823591506136fc6020840161337d565b6000806000806060858703121561373e57600080fd5b8435935061374e60208601613612565b9250604085013567ffffffffffffffff8082111561376b57600080fd5b818701915087601f83011261377f57600080fd5b81358181111561378e57600080fd5b8860208285010111156137a057600080fd5b95989497505060200194505050565b600067ffffffffffffffff8211156137c9576137c9613399565b5060051b60200190565b600082601f8301126137e457600080fd5b813560206137f96137f4836137af565b6133af565b82815260059290921b8401810191818101908684111561381857600080fd5b8286015b8481101561383a5761382d8161337d565b835291830191830161381c565b509695505050505050565b600082601f83011261385657600080fd5b813560206138666137f4836137af565b82815260059290921b8401810191818101908684111561388557600080fd5b8286015b8481101561383a5780358352918301918301613889565b600082601f8301126138b157600080fd5b813560206138c16137f4836137af565b82815260059290921b840181019181810190868411156138e057600080fd5b8286015b8481101561383a57803567ffffffffffffffff8111156139045760008081fd5b6139128986838b01016133e0565b8452509183019183016138e4565b600082601f83011261393157600080fd5b813560206139416137f4836137af565b82815260059290921b8401810191818101908684111561396057600080fd5b8286015b8481101561383a57803567ffffffffffffffff8111156139845760008081fd5b6139928986838b01016133e0565b845250918301918301613964565b8035801515811461339457600080fd5b60008060008060008060c087890312156139c957600080fd5b863567ffffffffffffffff808211156139e157600080fd5b6139ed8a838b016137d3565b97506020890135915080821115613a0357600080fd5b613a0f8a838b01613845565b96506040890135915080821115613a2557600080fd5b613a318a838b016138a0565b95506060890135915080821115613a4757600080fd5b613a538a838b01613920565b94506080890135915080821115613a6957600080fd5b50613a7689828a016133e0565b925050613a8560a088016139a0565b90509295509295509295565b60018060a01b038616815284602082015260a060408201526000613ab860a0830186613337565b8281036060840152613aca8186613337565b9150508260808301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115613b0657613b06613add565b500190565b6001600160e01b0319831681528151600090613b2e816004850160208701613307565b919091016004019392505050565b60008251613b4e818460208701613307565b9190910192915050565b848152608060208201526000613b716080830186613337565b8281036040840152613b838186613337565b91505082606083015295945050505050565b60208082526017908201527f6d75737420636f6d652066726f6d2074686520676f762e000000000000000000604082015260600190565b600181811c90821680613be057607f821691505b60208210811415613c0157634e487b7160e01b600052602260045260246000fd5b50919050565b600082821015613c1957613c19613add565b500390565b600060208284031215613c3057600080fd5b81516001600160601b038116811461337657600080fd5b634e487b7160e01b600052603260045260246000fd5b6000600019821415613c7157613c71613add565b5060010190565b60ff851681526001600160601b038416602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b8054600090600181811c9080831680613cdb57607f831692505b6020808410821415613cfd57634e487b7160e01b600052602260045260246000fd5b838852818015613d145760018114613d2857613d56565b60ff19861689830152604089019650613d56565b876000528160002060005b86811015613d4e5781548b8201850152908501908301613d33565b8a0183019750505b50505050505092915050565b60018060a01b038616815284602082015260a060408201526000613d8960a0830186613cc1565b8281036060840152613aca8186613cc1565b60c081526000613dae60c08301896134f1565b8281036020840152613dc08189613535565b90508281036040840152613dd48188613565565b90508281036060840152613de88187613565565b905084608084015282810360a0840152613e028185613337565b999850505050505050505056fe"), - ("0xDb53f47aC61FE54F456A4eb3E09832D08Dd7BEec", "PoolExercise", "6101c06040523480156200001257600080fd5b50604051620030713803806200307183398101604081905262000035916200016a565b6001600160a01b038681166101005285811660805284811660a05283811660c052821660e052600f81900b61012052858585858585620000846000808062000101602090811b6200011917901c565b6101408181525050620000a660016000806200010160201b620001191760201c565b6101608181525050620000c860026000806200010160201b620001191760201c565b6101808181525050620000ea60036000806200010160201b620001191760201c565b6101a05250620002319a5050505050505050505050565b600081600f0b6080846001600160401b0316901b60f88660078111156200012c576200012c620001f4565b6200013992911b6200020a565b6200014591906200020a565b949350505050565b80516001600160a01b03811681146200016557600080fd5b919050565b60008060008060008060c087890312156200018457600080fd5b6200018f876200014d565b95506200019f602088016200014d565b9450620001af604088016200014d565b9350620001bf606088016200014d565b9250620001cf608088016200014d565b915060a087015180600f0b8114620001e657600080fd5b809150509295509295509295565b634e487b7160e01b600052602160045260246000fd5b600082198211156200022c57634e487b7160e01b600052601160045260246000fd5b500190565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051612d6f6200030260003960008181610e1c015261137b015260008181610e420152818161135101526113f4015260008181611327015281816114b801526122c90152600081816112fe015281816113cb0152818161148f015281816114e101526122ef0152600081816103a8015281816107ed0152610cda0152600050506000818161176601526117b201526000610485015260008181611964015261212c015260005050612d6f6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063477130981461003b578063b50e7ee314610050575b600080fd5b61004e610049366004612986565b610063565b005b61004e61005e3660046129c7565b610109565b336001600160a01b038416146100f9576001600160a01b03831660009081527f1799cf914cb0cb442ca7c7ac709ee40d0cb89e87351dc08d517fbda27d50c68c6020908152604080832033845290915290205460ff166100f95760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd08185c1c1c9bdd995960a21b60448201526064015b60405180910390fd5b61010483838361015f565b505050565b6101156000838361015f565b5050565b600081600f0b60808467ffffffffffffffff16901b60f8866007811115610142576101426129e9565b61014d92911b612a15565b6101579190612a15565b949350505050565b608082901c8260006001600160a01b0386161560f883901c600481600781111561018b5761018b6129e9565b14806101a8575060068160078111156101a6576101a66129e9565b145b6101e35760405162461bcd60e51b815260206004820152600c60248201526b696e76616c6964207479706560a01b60448201526064016100f0565b8115806101f95750428567ffffffffffffffff16105b6102335760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08195e1c1a5c995960aa1b60448201526064016100f0565b6004816007811115610247576102476129e9565b149250506000610262600080516020612d1a83398151915290565b9050600061026f826104c0565b9050428667ffffffffffffffff16101561029a576102978267ffffffffffffffff8816610526565b90505b82806102be5750836102b45784600f0b81600f0b126102be565b84600f0b81600f0b135b6102f45760405162461bcd60e51b81526020600482015260076024820152666e6f742049544d60c81b60448201526064016100f0565b6000841561033a5785600f0b82600f0b1315610335576103328861032984610320600f82900b8b61061e565b600f0b90610659565b600f0b906106b1565b90505b610367565b85600f0b82600f0b12156103675761036461035d89610329600f8a900b8661061e565b8490610719565b90505b6000841561038c5761037b89838c89610754565b6103859082612a15565b9050610454565b6103978b8b8b6108cb565b600082156103ff576103d58c6103d07f0000000000000000000000000000000000000000000000000000000000000000600f0b866106b1565b610a5d565b90506103e18183612a15565b91506103ff8c6103f089610a8c565b6103fa8487612a2d565b610ae1565b604080518c8152602081018c9052908101849052606081018290526001600160a01b038d16907f31939b125e073bbdbf69ac6eb0cb59489894a9bea509d658589af5917b53cca19060800160405180910390a2505b610474898361046e6104678a6000610bb1565b8c8c610119565b89610be4565b61047e9082612a15565b90506104b37f00000000000000000000000000000000000000000000000000000000000000006104ad88610e13565b83610e67565b5050505050505050505050565b60004282600c015414156104de576104d88242610e82565b92915050565b6104e782610eb0565b90506104f38242610e82565b600f0b61050557610505824283610fd3565b42600c830155610516826001611051565b610521826000611051565b919050565b600080610535610e1084612a5a565b600881901c6000818152601287016020526040812054929350909160ff84169190821b821c90610568620e100042612a5a565b90505b811580156105795750808411155b156105a65760128801600061058d86612a7c565b955085815260200190815260200160002054915061056b565b600060805b80156105d25783811c156105ca576105c38183612a15565b93811c9391505b60011c6105ab565b5060118901600060018360086105e88a84612a15565b6105f392911b612a2d565b6105fd9190612a2d565b8152602081019190915260400160002054600f0b9998505050505050505050565b6000600f82810b9084900b0360016001607f1b03198112801590610649575060016001607f1b038113155b61065257600080fd5b9392505050565b600081600f0b6000141561066c57600080fd5b600082600f0b604085600f0b901b8161068757610687612a44565b05905060016001607f1b03198112801590610649575060016001607f1b0381131561065257600080fd5b6000816106c0575060006104d8565b600083600f0b12156106d157600080fd5b600f83900b6001600160801b038316810260401c90608084901c026001600160c01b0381111561070057600080fd5b60401b811981111561071157600080fd5b019392505050565b600080610737838560030160149054906101000a900460ff166110e1565b9050610157818560030160159054906101000a900460ff166110f7565b60008281527fb31c2c74f86ca3ce94d901f5f5bbe66f7161eec2f7b5aa0b75a86371436424eb602052604081205b85156108c25760006107a9600161079884611112565b6107a29190612a2d565b839061111c565b905060006107b78287611128565b9050878111156107c45750865b600080881561084657896107d8848b612a97565b6107e29190612a5a565b9150610815846103d07f0000000000000000000000000000000000000000000000000000000000000000600f0b856106b1565b90506108218187612a15565b955061082d828a612a2d565b98506108468461083c89610a8c565b6103fa8486612a2d565b610850838b612a2d565b99506001600160a01b0384167f31939b125e073bbdbf69ac6eb0cb59489894a9bea509d658589af5917b53cca189856108898587612a2d565b604080519384526020840192909252908201526060810184905260800160405180910390a26108b98489856108cb565b50505050610782565b50949350505050565b6001600160a01b03831661092d5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016100f0565b61095b3384600061093d866111db565b610946866111db565b60405180602001604052806000815250611226565b60008281527f1799cf914cb0cb442ca7c7ac709ee40d0cb89e87351dc08d517fbda27d50c68b602090815260408083206001600160a01b038716845291829052909120548211156109fc5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015264616e63657360d81b60648201526084016100f0565b6001600160a01b03841660008181526020838152604080832080548790039055805187815291820186905291929133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a450505050565b600080610a6984611762565b9050612710610a788285612a97565b610a829190612a5a565b6101579084612a2d565b600081610ab157600080516020612d1a833981519152546001600160a01b03166104d8565b50507fbbd6af8edd89d04327b00c29df7f272b9b1ae01bf6d9c54a784f935706df52ec546001600160a01b031690565b80610aeb57505050565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820183905283169063a9059cbb90604401602060405180830381600087803b158015610b3557600080fd5b505af1158015610b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6d9190612ab6565b6101045760405162461bcd60e51b8152602060048201526015602482015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b60448201526064016100f0565b60008215610bcf5781610bc5576005610bc8565b60045b90506104d8565b81610bdb576007610652565b60069392505050565b60008281527fb31c2c74f86ca3ce94d901f5f5bbe66f7161eec2f7b5aa0b75a86371436424eb60205260408120835b8615610e09576000610c3a6001610c2985611112565b610c339190612a2d565b849061111c565b90506000610c488288611128565b905088811115610c555750875b600089610c62838b612a97565b610c6c9190612a5a565b9050610c78818a612a2d565b9850610c84828b612a2d565b9950600087610cc35781610cb4610c9f600f88900b866106b1565b600080516020612d1a83398151915290610719565b610cbe9190612a2d565b610ccd565b610ccd8284612a2d565b90506000610d02856103d07f0000000000000000000000000000000000000000000000000000000000000000600f0b856106b1565b9050610d0e8189612a15565b975082610d2a600080516020612d1a833981519152878c61182c565b15610d5457610d4386610d3d8486612a2d565b8c611869565b610d4d8282612a15565b9050610d7d565b610d7086610d618c610e13565b610d6b8587612a2d565b610e67565b610d7a8382612a15565b90505b610d97600080516020612d1a833981519152878c8461192c565b610da2868c876108cb565b6001600160a01b0386167f69a2ef6bf9e7ff92cbf1b71963ba1751b1abe8f99e3b3aae2ab99e416df614938c610dd88587612a2d565b60408051928352602083019190915281018890526060810185905260800160405180910390a2505050505050610c13565b5050949350505050565b600081610e40577f00000000000000000000000000000000000000000000000000000000000000006104d8565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b61010483838360405180602001604052806000815250611a6c565b60006011830181610e95610e1085612a5a565b8152602081019190915260400160002054600f0b9392505050565b6000808260030160009054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0357600080fd5b505afa158015610f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b9190612ad8565b905060008360020160009054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8f57600080fd5b505afa158015610fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc79190612ad8565b90506101578282611b93565b6000610fe1610e1084612a5a565b6000818152601186016020526040902080546001600160801b0319166001600160801b038516179055905061101a60ff80831690612a2d565b6001901b846012016000600884901c815260200190815260200160002060008282546110469190612a15565b909155505050505050565b80151560009081526013830160205260409020805415806110725750805442105b1561107c57505050565b60006110888484611c2e565b90506110c384826110bd6110b286600101546110ad898b611c9890919063ffffffff16565b6110e1565b600f86900b90611cc6565b86611cf9565b50501515600090815260139091016020526040812081815560010155565b6000610652836110f284600a612bd5565b611d76565b600061065261110783600a612bd5565b600f85900b906106b1565b60006104d8825490565b60006106528383611dad565b60006001600160a01b0383166111945760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016100f0565b7f1799cf914cb0cb442ca7c7ac709ee40d0cb89e87351dc08d517fbda27d50c68b6000928352602090815260408084206001600160a01b0395909516845293905250205490565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061121557611215612be4565b602090810291909101015292915050565b611234868686868686611e33565b600080516020612d1a83398151915260005b845181101561175857600085828151811061126357611263612be4565b60200260200101519050600085838151811061128157611281612be4565b60200260200101519050806000141561129b575050611746565b6001600160a01b0389166112b8576112b66015850183612011565b505b6001600160a01b0388161580156112e857506000828152600080516020612cfa8339815191526020526040902054155b156112fc576112fa601585018361201d565b505b7f000000000000000000000000000000000000000000000000000000000000000082148061134957507f000000000000000000000000000000000000000000000000000000000000000082145b8061137357507f000000000000000000000000000000000000000000000000000000000000000082145b8061139d57507f000000000000000000000000000000000000000000000000000000000000000082145b1561148d576001600160a01b038916158015906113c257506001600160a01b03881615155b1561148d5760007f000000000000000000000000000000000000000000000000000000000000000083148061141657507f000000000000000000000000000000000000000000000000000000000000000083145b6001600160a01b038b166000908152600d870160209081526040808320841515845290915290205490915042906114509062015180612a15565b1061148b5760405162461bcd60e51b815260206004820152600b60248201526a1b1a5c481b1bd8dac80c5960aa1b60448201526064016100f0565b505b7f00000000000000000000000000000000000000000000000000000000000000008214806114da57507f000000000000000000000000000000000000000000000000000000000000000082145b15611682577f00000000000000000000000000000000000000000000000000000000000000008214600061150e8683612029565b90506001600160a01b038b161561163857600061152b8c86611128565b9050818111801561154557506115418285612a15565b8111155b156115dd576001600160a01b038c166000908152601488016020908152604080832086151580855260138c01845282852054855290835281842090845290915290205484906115949083612a2d565b10156115d25760405162461bcd60e51b815260206004820152600d60248201526c496e7375662062616c616e636560981b60448201526064016100f0565b6115dd878d85612043565b6001600160a01b038b161561163657611611878d858c8a8151811061160457611604612be4565b602002602001015161192c565b611636878c858c8a8151811061162957611629612be4565b60200260200101516120f4565b505b6001600160a01b038a161561167f5760006116538b86611128565b905081811115801561166d57508161166b8583612a15565b115b1561167d5761167d878c85612218565b505b50505b60f882901c826001600160a01b038b16158015906116a857506001600160a01b038a1615155b80156116e0575060058260078111156116c3576116c36129e9565b14806116e0575060078260078111156116de576116de6129e9565b145b1561174157600060058360078111156116fb576116fb6129e9565b1490506000816117225761171d611716600f85900b876106b1565b8990610719565b611724565b845b9050611732888e848461192c565b61173e888d84846120f4565b50505b505050505b8061175081612a7c565b915050611246565b5050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615610521576040516303793c8d60e11b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906306f2791a9060240160206040518083038186803b1580156117f457600080fd5b505afa158015611808573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d89190612ad8565b6001600160a01b0382166000908152600e840160209081526040808320841515845290915281205480158061186057504281115b95945050505050565b600080516020612d1a83398151915261188b84611885846122c0565b85610e67565b60006101048061189b8142612a5a565b6118a59190612a97565b6118af9190612a15565b6001600160a01b03861660009081526014840160209081526040808320848452825280832087151584529091528120805492935086929091906118f3908490612a15565b90915550508215156000908152601383016020526040812060018101805491928792611920908490612a15565b90915550505550505050565b6001600160a01b03808416600090815260178601602090815260408083208615158452825280832054601889019092529091205490917f00000000000000000000000000000000000000000000000000000000000000001663edaf7d5b863087866119978982612a2d565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015290151560448401526064830152608482015260a4810184905260c401600060405180830381600087803b1580156119fa57600080fd5b505af1158015611a0e573d6000803e3d6000fd5b505050508282611a1e9190612a2d565b6001600160a01b038616600090815260178801602090815260408083208815158452909152902055611a508382612a2d565b9315156000908152601890960160205250506040909320555050565b6001600160a01b038416611acc5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016100f0565b611aeb33600086611adc876111db565b611ae5876111db565b86611226565b60008381527f1799cf914cb0cb442ca7c7ac709ee40d0cb89e87351dc08d517fbda27d50c68b602090815260408083206001600160a01b0388168452918290528220805491928592611b3e908490612a15565b909155505060408051858152602081018590526001600160a01b0387169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b600081611b9f57600080fd5b600080841215611bb457836000039350600190505b6000831215611bc65760009290920391155b6000611bd28585612314565b90508115611c00576001607f1b816001600160801b03161115611bf457600080fd5b60000391506104d89050565b60016001607f1b03816001600160801b03161115611c1d57600080fd5b91506104d89050565b505092915050565b600080611c4b83611c40576001611c43565b60005b600080610119565b831515600090815260138601602052604090206001015490915061015790600080516020612cfa83398151915260008481526020919091526040902054611c929190612a2d565b6110ad86865b600081611cb3576003830154600160a81b900460ff16610652565b505060030154600160a01b900460ff1690565b6000600f83810b9083900b0160016001607f1b03198112801590610649575060016001607f1b0381131561065257600080fd5b6000611d058583612476565b90506000611d16868387878761248f565b9050611d23868285612595565b60408051600f83810b825287810b602083015286900b818301529051841515917f4e23621c6f591f14bf9505cb8326b45af9dc6c5569fd608de2a7a2ddd6146b2e919081900360600190a2505050505050565b600081611d8257600080fd5b6000611d8e8484612314565b905060016001607f1b036001600160801b038216111561065257600080fd5b81546000908210611e0b5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016100f0565b826000018281548110611e2057611e20612be4565b9060005260206000200154905092915050565b836001600160a01b0316856001600160a01b031614612009576001600160a01b0385811660009081527fb31c2c74f86ca3ce94d901f5f5bbe66f7161eec2f7b5aa0b75a86371436424ec602052604080822092871682528120600080516020612cfa833981519152927fb31c2c74f86ca3ce94d901f5f5bbe66f7161eec2f7b5aa0b75a86371436424eb929091905b87518110156104b3576000878281518110611edf57611edf612be4565b602002602001015190506000811115611ff6576000898381518110611f0657611f06612be4565b6020026020010151905060006001600160a01b03168c6001600160a01b03161415611f545760008181526020889052604081208054849290611f49908490612a15565b90915550611f8a9050565b81611f5f8d83611128565b1415611f8a576000818152602087905260409020611f7d908d6125ec565b50611f88858261201d565b505b6001600160a01b038b16611fc15760008181526020889052604081208054849290611fb6908490612a2d565b90915550611ff49050565b611fcb8b82611128565b611ff4576000818152602087905260409020611fe7908c612601565b50611ff28482612011565b505b505b508061200181612a7c565b915050611ec2565b505050505050565b60006106528383612612565b60006106528383612661565b60008161203a578260040154610652565b50506005015490565b6001600160a01b03821661205657600080fd5b8015156000908152600f8401602090815260408083206010870190925290912061208184838361274c565b61208c575050505050565b6001600160a01b0393841660008181526020838152604080832080549683528184208054978a16808652838620805499909b166001600160a01b0319998a168117909b5599855295909252822080548616909717909655528054821690558254169091555050565b6001600160a01b03808416600090815260178601602090815260408083208615158452825280832054601889019092529091205490917f00000000000000000000000000000000000000000000000000000000000000001663edaf7d5b8630878661215f8982612a15565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015290151560448401526064830152608482015260a4810184905260c401600060405180830381600087803b1580156121c257600080fd5b505af11580156121d6573d6000803e3d6000fd5b5050505082826121e69190612a15565b6001600160a01b038616600090815260178801602090815260408083208815158452909152902055611a508382612a15565b6001600160a01b03821661222b57600080fd5b8015156000908152600f8401602090815260408083206010870190925290912061225684838361274c565b15612262575050505050565b60008080526020828152604080832080546001600160a01b0390811680865296845282852080546001600160a01b03199081169a909216998a1790558885529490925282208054841690941790935580528154169092179091555050565b6000816122ed577f00000000000000000000000000000000000000000000000000000000000000006104d8565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b60008161232057600080fd5b60006001600160c01b03841161234b5782604085901b8161234357612343612a44565b049050612462565b60c084811c6401000000008110612364576020918201911c5b620100008110612376576010918201911c5b6101008110612387576008918201911c5b60108110612397576004918201911c5b600481106123a7576002918201911c5b600281106123b6576001820191505b60bf820360018603901c6001018260ff0387901b816123d7576123d7612a44565b0492506001600160801b038311156123ee57600080fd5b608085901c83026001600160801b038616840260c088901c604089901b8281101561241a576001820391505b608084901b92900382811015612431576001820391505b829003608084901c821461244757612447612bfa565b88818161245657612456612a44565b04870196505050505050505b6001600160801b0381111561065257600080fd5b60006124828383612798565b90506106528382846127bf565b600080826124a4576019870154600f0b6124b4565b6019870154600160801b9004600f0b5b905080600f0b600014156124cc57506008860154600f0b5b60405163e101a89b60e01b8152600f87810b600483015286810b602483015285810b604483015282900b6064820152730f6e8ef18fb5bb61d545fee60f779d8aed60408f9063e101a89b9060840160206040518083038186803b15801561253257600080fd5b505af4158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a9190612c10565b915067b33333333333333382600f0b121561258b5767b33333333333333391505b5095945050505050565b80156125c5576009830180546001600160801b0384166001600160801b031990911617905542600b840155505050565b6008830180546001600160801b03808516600160801b02911617905542600a840155505050565b6000610652836001600160a01b038416612661565b6000610652836001600160a01b0384165b6000818152600183016020526040812054612659575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104d8565b5060006104d8565b60008181526001830160205260408120548015612742576000612685600183612a2d565b8554909150600090869061269b90600190612a2d565b815481106126ab576126ab612be4565b90600052602060002001549050808660000183815481106126ce576126ce612be4565b6000918252602090912001556126e5826001612a15565b6000828152600188016020526040902055855486908061270757612707612c33565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104d8565b60009150506104d8565b6001600160a01b0383811660009081526020849052604081205490911615158061015757506000808052602083905260409020546001600160a01b039081169085161490509392505050565b6000816127b3576008830154600160801b9004600f0b610652565b505060090154600f0b90565b600080826127d15784600a01546127d7565b84600b01545b6127e19042612a2d565b905061a8c0811115612800576127f961a8c082612a2d565b9050612809565b83915050610652565b600061281782613840611d76565b9050600061282a85611c40576001611c43565b851515600090815260188901602090815260408083205460138c01835281842060010154858552600080516020612cfa83398151915290935290832054939450926128889161287891612a2d565b6128829084612a2d565b83611d76565b6040805161012081018252600f87810b82528b810b602083015283900b8183015267b333333333333333606082015267e666666666666666608082018190526801000000000000000060a0830181905260c083015260e082015268056fc2a2c515da32ea6101008201529051634916d70d60e01b8152919250730f6e8ef18fb5bb61d545fee60f779d8aed60408f91634916d70d9161292991600401612c49565b60206040518083038186803b15801561294157600080fd5b505af4158015612955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129799190612c10565b9998505050505050505050565b60008060006060848603121561299b57600080fd5b83356001600160a01b03811681146129b257600080fd5b95602085013595506040909401359392505050565b600080604083850312156129da57600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115612a2857612a286129ff565b500190565b600082821015612a3f57612a3f6129ff565b500390565b634e487b7160e01b600052601260045260246000fd5b600082612a7757634e487b7160e01b600052601260045260246000fd5b500490565b6000600019821415612a9057612a906129ff565b5060010190565b6000816000190483118215151615612ab157612ab16129ff565b500290565b600060208284031215612ac857600080fd5b8151801515811461065257600080fd5b600060208284031215612aea57600080fd5b5051919050565b600181815b80851115612b2c578160001904821115612b1257612b126129ff565b80851615612b1f57918102915b93841c9390800290612af6565b509250929050565b600082612b43575060016104d8565b81612b50575060006104d8565b8160018114612b665760028114612b7057612b8c565b60019150506104d8565b60ff841115612b8157612b816129ff565b50506001821b6104d8565b5060208310610133831016604e8410600b8410161715612baf575081810a6104d8565b612bb98383612af1565b8060001904821115612bcd57612bcd6129ff565b029392505050565b600061065260ff841683612b34565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b600060208284031215612c2257600080fd5b815180600f0b811461065257600080fd5b634e487b7160e01b600052603160045260246000fd5b6000610120820190508251600f0b82526020830151600f0b60208301526040830151612c7a6040840182600f0b9052565b506060830151612c8f6060840182600f0b9052565b506080830151612ca46080840182600f0b9052565b5060a0830151612cb960a0840182600f0b9052565b5060c0830151612cce60c0840182600f0b9052565b5060e0830151612ce360e0840182600f0b9052565b5061010080840151611c2682850182600f0b905256feb31c2c74f86ca3ce94d901f5f5bbe66f7161eec2f7b5aa0b75a86371436424eabbd6af8edd89d04327b00c29df7f272b9b1ae01bf6d9c54a784f935706df52eb"), - ("0x71356E37e0368Bd10bFDbF41dC052fE5FA24cD05", "MainchainGatewayV2", "608060405234801561001057600080fd5b506000805460ff1916905561582e806200002b6000396000f3fe60806040526004361061032d5760003560e01c80639157921c116101a5578063b2975794116100ec578063d547741f11610095578063dafae4081161006f578063dafae4081461096e578063dff525e11461098e578063e400327c146109ae578063e75235b8146109ce5761033c565b8063d547741f14610901578063d55ed10314610921578063d64af2a61461094e5761033c565b8063cdb67444116100c6578063cdb674441461089c578063cdf64a76146108b4578063d19773d2146108d45761033c565b8063b29757941461082f578063b9c362091461085c578063ca15c8731461087c5761033c565b8063a3912ec81161014e578063affed0e011610128578063affed0e0146107cc578063b1a2567e146107e2578063b1d08a03146108025761033c565b8063a3912ec81461033a578063ab7965661461077f578063ac78dfe8146107ac5761033c565b8063994390891161017f57806399439089146107155780639dcc4da314610735578063a217fddf1461076a5761033c565b80639157921c1461068f57806391d14854146106af57806393c5678f146106f55761033c565b806336568abe116102745780635c975abb1161021d5780637de5dedd116101f75780637de5dedd146106115780638456cb59146106265780638f34e3471461063b5780639010d07c1461066f5761033c565b80635c975abb146105ac5780636932be98146105c45780636c1ce670146105f15761033c565b80634d0d66731161024e5780634d0d66731461052f5780634d493f4e1461054f57806359122f6b1461057f5761033c565b806336568abe146104e75780633f4ba83a146105075780634b14557e1461051c5761033c565b80631d4a7210116102d65780632f2ff15d116102b05780632f2ff15d1461049b578063302d12db146104bb5780633644e515146104d25761033c565b80631d4a721014610428578063248a9ca3146104555780632dfdf0b5146104855761033c565b8063180ff1e911610307578063180ff1e9146103d55780631a8e55b0146103e85780631b6e7594146104085761033c565b806301ffc9a71461034457806317ce2dd41461037957806317fcb39b1461039d5761033c565b3661033c5761033a6109e6565b005b61033a6109e6565b34801561035057600080fd5b5061036461035f366004614843565b610a69565b60405190151581526020015b60405180910390f35b34801561038557600080fd5b5061038f60755481565b604051908152602001610370565b3480156103a957600080fd5b506074546103bd906001600160a01b031681565b6040516001600160a01b039091168152602001610370565b61033a6103e33660046148f4565b610aad565b3480156103f457600080fd5b5061033a6104033660046149e6565b610dbd565b34801561041457600080fd5b5061033a610423366004614a52565b610e8f565b34801561043457600080fd5b5061038f610443366004614aec565b603e6020526000908152604090205481565b34801561046157600080fd5b5061038f610470366004614b09565b60009081526072602052604090206001015490565b34801561049157600080fd5b5061038f60765481565b3480156104a757600080fd5b5061033a6104b6366004614b22565b610f64565b3480156104c757600080fd5b5061038f620f424081565b3480156104de57600080fd5b5060775461038f565b3480156104f357600080fd5b5061033a610502366004614b22565b610f8f565b34801561051357600080fd5b5061033a61101b565b61033a61052a366004614b52565b611083565b34801561053b57600080fd5b5061036461054a366004614b7d565b6110e1565b34801561055b57600080fd5b5061036461056a366004614b09565b607a6020526000908152604090205460ff1681565b34801561058b57600080fd5b5061038f61059a366004614aec565b603a6020526000908152604090205481565b3480156105b857600080fd5b5060005460ff16610364565b3480156105d057600080fd5b5061038f6105df366004614b09565b60796020526000908152604090205481565b3480156105fd57600080fd5b5061036461060c366004614c06565b61118c565b34801561061d57600080fd5b5061038f61119f565b34801561063257600080fd5b5061033a611234565b34801561064757600080fd5b5061038f7f5e5712e902fff5e704bc4d506ad976718319e019e9d2a872528a01a85db433e481565b34801561067b57600080fd5b506103bd61068a366004614c32565b61129c565b34801561069b57600080fd5b5061033a6106aa366004614c54565b6112b4565b3480156106bb57600080fd5b506103646106ca366004614b22565b60009182526072602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561070157600080fd5b5061033a6107103660046149e6565b6115ca565b34801561072157600080fd5b506003546103bd906001600160a01b031681565b34801561074157600080fd5b50610755610750366004614c32565b611696565b60408051928352602083019190915201610370565b34801561077657600080fd5b5061038f600081565b34801561078b57600080fd5b5061038f61079a366004614aec565b603c6020526000908152604090205481565b3480156107b857600080fd5b506103646107c7366004614b09565b61172f565b3480156107d857600080fd5b5061038f60045481565b3480156107ee57600080fd5b5061033a6107fd3660046149e6565b6117ce565b34801561080e57600080fd5b5061038f61081d366004614aec565b60396020526000908152604090205481565b34801561083b57600080fd5b5061084f61084a366004614aec565b61189a565b6040516103709190614ca5565b34801561086857600080fd5b50610755610877366004614c32565b611992565b34801561088857600080fd5b5061038f610897366004614b09565b611a17565b3480156108a857600080fd5b50603754603854610755565b3480156108c057600080fd5b5061033a6108cf366004614aec565b611a2e565b3480156108e057600080fd5b5061038f6108ef366004614aec565b603b6020526000908152604090205481565b34801561090d57600080fd5b5061033a61091c366004614b22565b611a97565b34801561092d57600080fd5b5061038f61093c366004614aec565b603d6020526000908152604090205481565b34801561095a57600080fd5b5061033a610969366004614aec565b611abd565b34801561097a57600080fd5b50610364610989366004614b09565b611b26565b34801561099a57600080fd5b5061033a6109a9366004614cd2565b611bbd565b3480156109ba57600080fd5b5061033a6109c93660046149e6565b611cc7565b3480156109da57600080fd5b50600154600254610755565b60005460ff1615610a315760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b6074546001600160a01b03163314610a6757610a4b614802565b338152604080820151349101528051610a65908290611d93565b505b565b60006001600160e01b031982167f5a05180f000000000000000000000000000000000000000000000000000000001480610aa75750610aa78261210a565b92915050565b607154610100900460ff16610ac85760715460ff1615610acc565b303b155b610b3e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a28565b607154610100900460ff16158015610b60576071805461ffff19166101011790555b610b6b60008d612171565b6075899055610b798b61217b565b610b828a6121dd565b610c29604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f159f52c1e3a2b6a6aad3950adf713516211484e0516dad685ea662a094b7c43b918101919091527fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a560608201524660808201523060a082015260c00160408051601f198184030181529190528051602090910120607755565b610c338887612238565b5050610c3f87876122f8565b5050610c496123d3565b6000610c558680614da6565b90501115610d1657610c7e610c6a8680614da6565b610c776020890189614da6565b8787612467565b610ca4610c8b8680614da6565b8660005b602002810190610c9f9190614da6565b612666565b610cca610cb18680614da6565b8660015b602002810190610cc59190614da6565b612779565b610cf0610cd78680614da6565b8660025b602002810190610ceb9190614da6565b61288c565b610d16610cfd8680614da6565b8660035b602002810190610d119190614da6565b612a30565b60005b610d266040870187614da6565b9050811015610d9c57610d8a7f5e5712e902fff5e704bc4d506ad976718319e019e9d2a872528a01a85db433e4610d606040890189614da6565b84818110610d7057610d70614d90565b9050602002016020810190610d859190614aec565b612b43565b80610d9481614e06565b915050610d19565b508015610daf576071805461ff00191690555b505050505050505050505050565b6000805160206157b9833981519152546001600160a01b03163314610e1d5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b82610e7d5760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b610e8984848484612779565b50505050565b6000805160206157b9833981519152546001600160a01b03163314610eef5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b84610f4e5760405162461bcd60e51b815260206004820152602960248201527f4d61696e636861696e4761746577617956323a20717565727920666f7220656d60448201526870747920617272617960b81b6064820152608401610a28565b610f5c868686868686612467565b505050505050565b600082815260726020526040902060010154610f808133612b65565b610f8a8383612b43565b505050565b6001600160a01b038116331461100d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610a28565b6110178282612be5565b5050565b6000805160206157b9833981519152546001600160a01b0316331461107b5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b610a67612c07565b60005460ff16156110c95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a28565b610a656110db36839003830183614ec0565b33611d93565b6000805460ff16156111285760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a28565b611184848484808060200260200160405190810160405280939291908181526020016000905b8282101561117a5761116b60608302860136819003810190614f13565b8152602001906001019061114e565b5050505050612ca3565b949350505050565b600061119883836133bc565b9392505050565b600061122f600360009054906101000a90046001600160a01b03166001600160a01b031663926323d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156111f257600080fd5b505afa158015611206573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122a9190614f89565b613480565b905090565b6000805160206157b9833981519152546001600160a01b031633146112945760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b610a676134b6565b60008281526073602052604081206111989083613531565b7f5e5712e902fff5e704bc4d506ad976718319e019e9d2a872528a01a85db433e46112df8133612b65565b60006112f86112f336859003850185614ff0565b61353d565b905061130c6112f336859003850185614ff0565b8335600090815260796020526040902054146113765760405162461bcd60e51b815260206004820152602360248201527f4d61696e636861696e4761746577617956323a20696e76616c696420726563656044820152621a5c1d60ea1b6064820152608401610a28565b82356000908152607a602052604090205460ff166113fc5760405162461bcd60e51b815260206004820152603160248201527f4d61696e636861696e4761746577617956323a20717565727920666f7220617060448201527f70726f766564207769746864726177616c0000000000000000000000000000006064820152608401610a28565b82356000908152607a602052604090819020805460ff19169055517fd639511b37b3b002cca6cfe6bca0d833945a5af5a045578a0627fc43b79b26309061144690839086906150c4565b60405180910390a160006114606080850160608601614aec565b9050600061147661012086016101008701615151565b600181111561148757611487614c71565b141561154f5760006114a2368690038601610100870161516e565b6001600160a01b0383166000908152603b60205260409020549091506114ce90610140870135906135c6565b604082015260006114e8368790038701610100880161516e565b60408301519091506114ff9061014088013561518a565b604082015260745461151f908390339086906001600160a01b03166135e0565b6115486115326060880160408901614aec565b60745483919086906001600160a01b03166135e0565b505061158b565b61158b6115626060860160408701614aec565b60745483906001600160a01b03166115833689900389016101008a0161516e565b9291906135e0565b7f21e88e956aa3e086f6388e899965cef814688f99ad8bb29b08d396571016372d82856040516115bc9291906150c4565b60405180910390a150505050565b6000805160206157b9833981519152546001600160a01b0316331461162a5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b8261168a5760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b610e8984848484612666565b6000806116b86000805160206157b9833981519152546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146117115760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b61171b84846122f8565b90925090506117286123d3565b9250929050565b6003546040805163926323d560e01b815290516000926001600160a01b03169163926323d5916004808301926020929190829003018186803b15801561177457600080fd5b505afa158015611788573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ac9190614f89565b6037546117b991906151a1565b6038546117c690846151a1565b101592915050565b6000805160206157b9833981519152546001600160a01b0316331461182e5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b8261188e5760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b610e898484848461288c565b60408051808201909152600080825260208201526001600160a01b0382166000908152607860205260409081902081518083019092528054829060ff1660018111156118e8576118e8614c71565b60018111156118f9576118f9614c71565b815290546001600160a01b036101009091048116602092830152908201519192501661198d5760405162461bcd60e51b815260206004820152602560248201527f4d61696e636861696e4761746577617956323a20756e737570706f727465642060448201527f746f6b656e0000000000000000000000000000000000000000000000000000006064820152608401610a28565b919050565b6000806119b46000805160206157b9833981519152546001600160a01b031690565b6001600160a01b0316336001600160a01b031614611a0d5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b61171b8484612238565b6000818152607360205260408120610aa790613a13565b6000805160206157b9833981519152546001600160a01b03163314611a8e5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b610a65816121dd565b600082815260726020526040902060010154611ab38133612b65565b610f8a8383612be5565b6000805160206157b9833981519152546001600160a01b03163314611b1d5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b610a658161217b565b6003546040805163926323d560e01b815290516000926001600160a01b03169163926323d5916004808301926020929190829003018186803b158015611b6b57600080fd5b505afa158015611b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba39190614f89565b600154611bb091906151a1565b6002546117c690846151a1565b6000805160206157b9833981519152546001600160a01b03163314611c1d5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b85611c7c5760405162461bcd60e51b815260206004820152602960248201527f4d61696e636861696e4761746577617956323a20717565727920666f7220656d60448201526870747920617272617960b81b6064820152608401610a28565b611c8a878787878787612467565b611c978787836000610c8f565b611ca48787836001610cb5565b611cb18787836002610cdb565b611cbe8787836003610d01565b50505050505050565b6000805160206157b9833981519152546001600160a01b03163314611d275760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b82611d875760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b610e8984848484612a30565b604080518082018252600080825260208201526074549184015190916001600160a01b031690611dc290613a1d565b60208401516001600160a01b0316611ee1573484604001516040015114611e375760405162461bcd60e51b815260206004820152602360248201527f4d61696e636861696e4761746577617956323a20696e76616c69642072657175604482015262195cdd60ea1b6064820152608401610a28565b611e408161189a565b6040850151519092506001811115611e5a57611e5a614c71565b82516001811115611e6d57611e6d614c71565b14611ecd5760405162461bcd60e51b815260206004820152602a60248201527f4d61696e636861696e4761746577617956323a20696e76616c696420746f6b656044820152691b881cdd185b99185c9960b21b6064820152608401610a28565b6001600160a01b0381166020850152612087565b3415611f3b5760405162461bcd60e51b815260206004820152602360248201527f4d61696e636861696e4761746577617956323a20696e76616c69642072657175604482015262195cdd60ea1b6064820152608401610a28565b611f48846020015161189a565b6040850151519092506001811115611f6257611f62614c71565b82516001811115611f7557611f75614c71565b14611fd55760405162461bcd60e51b815260206004820152602a60248201527f4d61696e636861696e4761746577617956323a20696e76616c696420746f6b656044820152691b881cdd185b99185c9960b21b6064820152608401610a28565b60208401516040850151611fec9185903090613ac7565b83602001516001600160a01b0316816001600160a01b031614156120875760408481015181015190517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b03821690632e1a7d4d90602401600060405180830381600087803b15801561206e57600080fd5b505af1158015612082573d6000803e3d6000fd5b505050505b607680546000918261209883614e06565b91905055905060006120bf858386602001516075548a613ce190949392919063ffffffff16565b90507fd7b25068d9dc8d00765254cfb7f5070f98d263c8d68931d937c7362fa738048b6120eb8261353d565b826040516120fa9291906151c0565b60405180910390a1505050505050565b60006001600160e01b031982167f7965db0b000000000000000000000000000000000000000000000000000000001480610aa757507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610aa7565b6110178282612b43565b6074805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f9d2334c23be647e994f27a72c5eee42a43d5bdcfe15bb88e939103c2b114cbaf906020015b60405180910390a150565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fef40dc07567635f84f5edbd2f8dbc16b40d9d282dd8e7e6f4ff58236b6836169906020016121d2565b6000808284111561228b5760405162461bcd60e51b815260206004820152601c60248201527f4761746577617956323a20696e76616c6964207468726573686f6c64000000006044820152606401610a28565b505060018054600280549285905583905560048054919291849186919060006122b383614e06565b9091555060408051868152602081018690527f976f8a9c5bdf8248dec172376d6e2b80a8e3df2f0328e381c6db8e1cf138c0f891015b60405180910390a49250929050565b600080828411156123715760405162461bcd60e51b815260206004820152602760248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c696420746860448201527f726573686f6c64000000000000000000000000000000000000000000000000006064820152608401610a28565b5050603780546038805492859055839055600480549192918491869190600061239983614e06565b9091555060408051868152602081018690527f31312c97b89cc751b832d98fd459b967a2c3eef3b49757d1cf5ebaa12bb6eee191016122e9565b6002546037546123e391906151a1565b6038546001546123f391906151a1565b1115610a675760405162461bcd60e51b815260206004820152602860248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c696420746860448201527f726573686f6c64730000000000000000000000000000000000000000000000006064820152608401610a28565b848314801561247557508481145b6124e75760405162461bcd60e51b815260206004820152602860248201527f4d61696e636861696e4761746577617956323a20696e76616c6964206172726160448201527f79206c656e6774680000000000000000000000000000000000000000000000006064820152608401610a28565b60005b8581101561262c5784848281811061250457612504614d90565b90506020020160208101906125199190614aec565b6078600089898581811061252f5761252f614d90565b90506020020160208101906125449190614aec565b6001600160a01b039081168252602082019290925260400160002080547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010093909216929092021790558282828181106125a3576125a3614d90565b90506020020160208101906125b89190615151565b607860008989858181106125ce576125ce614d90565b90506020020160208101906125e39190614aec565b6001600160a01b031681526020810191909152604001600020805460ff19166001838181111561261557612615614c71565b02179055508061262481614e06565b9150506124ea565b507fa4f03cc9c0e0aeb5b71b4ec800702753f65748c2cf3064695ba8e8b46be704448686868686866040516120fa969594939291906152c1565b8281146126c85760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b60005b83811015612743578282828181106126e5576126e5614d90565b905060200201356039600087878581811061270257612702614d90565b90506020020160208101906127179190614aec565b6001600160a01b031681526020810191909152604001600020558061273b81614e06565b9150506126cb565b507f80bc635c452ae67f12f9b6f12ad4daa6dbbc04eeb9ebb87d354ce10c0e210dc0848484846040516115bc9493929190615339565b8281146127db5760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b60005b83811015612856578282828181106127f8576127f8614d90565b90506020020135603a600087878581811061281557612815614d90565b905060200201602081019061282a9190614aec565b6001600160a01b031681526020810191909152604001600020558061284e81614e06565b9150506127de565b507f64557254143204d91ba2d95acb9fda1e5fea55f77efd028685765bc1e94dd4b5848484846040516115bc9493929190615339565b8281146128ee5760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b60005b838110156129fa57620f424083838381811061290f5761290f614d90565b90506020020135111561298a5760405162461bcd60e51b815260206004820152602860248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c696420706560448201527f7263656e746167650000000000000000000000000000000000000000000000006064820152608401610a28565b82828281811061299c5761299c614d90565b90506020020135603b60008787858181106129b9576129b9614d90565b90506020020160208101906129ce9190614aec565b6001600160a01b03168152602081019190915260400160002055806129f281614e06565b9150506128f1565b507fb05f5de88ae0294ebb6f67c5af2fcbbd593cc6bdfe543e2869794a4c8ce3ea50848484846040516115bc9493929190615339565b828114612a925760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b60005b83811015612b0d57828282818110612aaf57612aaf614d90565b90506020020135603c6000878785818110612acc57612acc614d90565b9050602002016020810190612ae19190614aec565b6001600160a01b0316815260208101919091526040016000205580612b0581614e06565b915050612a95565b507fb5d2963614d72181b4df1f993d45b83edf42fa19710f0204217ba1b3e183bb73848484846040516115bc9493929190615339565b612b4d8282613db6565b6000828152607360205260409020610f8a9082613e58565b60008281526072602090815260408083206001600160a01b038516845290915290205460ff1661101757612ba3816001600160a01b03166014613e6d565b612bae836020613e6d565b604051602001612bbf9291906153d0565b60408051601f198184030181529082905262461bcd60e51b8252610a2891600401615451565b612bef828261404e565b6000828152607360205260409020610f8a90826140d1565b60005460ff16612c595760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a28565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000823561014084013582612cbe6080870160608801614aec565b9050612cdb612cd6368890038801610100890161516e565b613a1d565b6001612ced6040880160208901615151565b6001811115612cfe57612cfe614c71565b14612d715760405162461bcd60e51b815260206004820152602860248201527f4d61696e636861696e4761746577617956323a20696e76616c6964207265636560448201527f697074206b696e640000000000000000000000000000000000000000000000006064820152608401610a28565b60808601354614612de95760405162461bcd60e51b8152602060048201526024808201527f4d61696e636861696e4761746577617956323a20696e76616c6964206368616960448201527f6e206964000000000000000000000000000000000000000000000000000000006064820152608401610a28565b6000612dfe61084a6080890160608a01614aec565b9050612e1261012088016101008901615151565b6001811115612e2357612e23614c71565b81516001811115612e3657612e36614c71565b148015612e675750612e4e60e0880160c08901614aec565b6001600160a01b031681602001516001600160a01b0316145b612ebf5760405162461bcd60e51b815260206004820152602360248201527f4d61696e636861696e4761746577617956323a20696e76616c696420726563656044820152621a5c1d60ea1b6064820152608401610a28565b60008481526079602052604090205415612f415760405162461bcd60e51b815260206004820152603260248201527f4d61696e636861696e4761746577617956323a20717565727920666f7220707260448201527f6f636573736564207769746864726177616c00000000000000000000000000006064820152608401610a28565b6001612f5561012089016101008a01615151565b6001811115612f6657612f66614c71565b1480612f795750612f7782846133bc565b155b612feb5760405162461bcd60e51b815260206004820152603260248201527f4d61696e636861696e4761746577617956323a2072656163686564206461696c60448201527f79207769746864726177616c206c696d697400000000000000000000000000006064820152608401610a28565b6000612fff6112f3368a90038a018a614ff0565b9050600061300f607754836140e6565b6003549091506001600160a01b0316600061303d6130356101208d016101008e01615151565b878985614142565b60408051606081018252600080825260208201819052918101829052919b50919250819081906000805b8f5181101561323c578f818151811061308257613082614d90565b6020908102919091018101518051818301516040808401518151600081529586018083528f905260ff9093169085015260608401526080830152935060019060a0016020604051602081039080840390855afa1580156130e6573d6000803e3d6000fd5b505050602060405103519450846001600160a01b0316846001600160a01b0316106131795760405162461bcd60e51b815260206004820152602160248201527f4d61696e636861696e4761746577617956323a20696e76616c6964206f72646560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a28565b6040517f953865650000000000000000000000000000000000000000000000000000000081526001600160a01b03808716600483015286955089169063953865659060240160206040518083038186803b1580156131d657600080fd5b505afa1580156131ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061320e9190614f89565b6132189083615484565b915086821061322a576001955061323c565b8061323481614e06565b915050613067565b50846132b05760405162461bcd60e51b815260206004820152603660248201527f4d61696e636861696e4761746577617956323a20717565727920666f7220696e60448201527f73756666696369656e7420766f746520776569676874000000000000000000006064820152608401610a28565b50505060008a81526079602052604090208690555050881561332c576000888152607a602052604090819020805460ff19166001179055517f89e52969465b1f1866fc5d46fd62de953962e9cb33552443cd999eba05bd20dc906133179086908e906150c4565b60405180910390a15050505050505050610aa7565b6133368688614233565b61337561334960608d0160408e01614aec565b87607460009054906101000a90046001600160a01b03168e61010001803603810190611583919061516e565b7f21e88e956aa3e086f6388e899965cef814688f99ad8bb29b08d396571016372d848c6040516133a69291906150c4565b60405180910390a1505050505050505092915050565b6001600160a01b0382166000908152603a602052604081205482106133e357506000610aa7565b60006133f2620151804261549c565b6001600160a01b0385166000908152603e60205260409020549091508111156134385750506001600160a01b0382166000908152603c6020526040902054811015610aa7565b6001600160a01b0384166000908152603d602052604090205461345c908490615484565b6001600160a01b0385166000908152603c602052604090205411159150610aa79050565b600060025460016002548460015461349891906151a1565b6134a29190615484565b6134ac919061518a565b610aa7919061549c565b60005460ff16156134fc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a28565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612c863390565b600061119883836142c3565b60007fb9d1fe7c9deeec5dc90a2f47ff1684239519f2545b2228d3d91fb27df3189eea60001b8260000151836020015161357a85604001516142ed565b61358786606001516142ed565b6135948760800151614350565b6040516020016135a9969594939291906154be565b604051602081830303815290604052805190602001209050919050565b6000620f42406135d683856151a1565b611198919061549c565b6000816001600160a01b0316836001600160a01b031614156136905760408086015190516001600160a01b0386169180156108fc02916000818181858888f1935050505061368b57816001600160a01b031663d0e30db086604001516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561366757600080fd5b505af115801561367b573d6000803e3d6000fd5b505050505061368b858585614393565b613a0c565b6000855160018111156136a5576136a5614c71565b1415613866576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b15801561370657600080fd5b505afa15801561371a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373e9190614f89565b9050856040015181101561385557836001600160a01b03166340c10f193083896040015161376c919061518a565b6040516001600160a01b03909216602483015260448201526064016040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516137c091906154f8565b6000604051808303816000865af19150503d80600081146137fd576040519150601f19603f3d011682016040523d82523d6000602084013e613802565b606091505b505080925050816138555760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e3a204552433230206d696e74696e67206661696c656400000000006044820152606401610a28565b613860868686614393565b50613a0c565b60018551600181111561387b5761387b614c71565b141561399e5761389083858760200151614437565b61368b57602085810151604080516001600160a01b038881166024830152604480830194909452825180830390940184526064909101825292820180516001600160e01b03167f40c10f1900000000000000000000000000000000000000000000000000000000179052519185169161390991906154f8565b6000604051808303816000865af19150503d8060008114613946576040519150601f19603f3d011682016040523d82523d6000602084013e61394b565b606091505b5050809150508061368b5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e3a20455243373231206d696e74696e67206661696c6564000000006044820152606401610a28565b60405162461bcd60e51b815260206004820152602160248201527f546f6b656e3a20756e737570706f7274656420746f6b656e207374616e64617260448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a28565b5050505050565b6000610aa7825490565b600081516001811115613a3257613a32614c71565b148015613a43575060008160400151115b8015613a5157506020810151155b80613a7b5750600181516001811115613a6c57613a6c614c71565b148015613a7b57506040810151155b610a655760405162461bcd60e51b815260206004820152601360248201527f546f6b656e3a20696e76616c696420696e666f000000000000000000000000006044820152606401610a28565b600060608186516001811115613adf57613adf614c71565b1415613bbd5760408681015181516001600160a01b038881166024830152878116604483015260648083019390935283518083039093018352608490910183526020820180516001600160e01b03166323b872dd60e01b179052915191851691613b4991906154f8565b6000604051808303816000865af19150503d8060008114613b86576040519150601f19603f3d011682016040523d82523d6000602084013e613b8b565b606091505b509092509050818015613bb6575080511580613bb6575080806020019051810190613bb69190615514565b9150613c84565b600186516001811115613bd257613bd2614c71565b141561399e57602086810151604080516001600160a01b0389811660248301528881166044830152606480830194909452825180830390940184526084909101825292820180516001600160e01b03166323b872dd60e01b1790525191851691613c3c91906154f8565b6000604051808303816000865af19150503d8060008114613c79576040519150601f19603f3d011682016040523d82523d6000602084013e613c7e565b606091505b50909250505b81610f5c57613c92866144e2565b613ca6866001600160a01b03166014613e6d565b613cba866001600160a01b03166014613e6d565b613cce866001600160a01b03166014613e6d565b604051602001612bbf9493929190615536565b613d516040805160a08101825260008082526020808301829052835160608082018652838252818301849052818601849052848601919091528451808201865283815280830184905280860184905281850152845190810185528281529081018290529283015290608082015290565b83815260006020820181905250604080820180516001600160a01b039788169052602080890151825190891690820152905146908301528751606084018051918916909152805195909716940193909352935182015292909201516080820152919050565b60008281526072602090815260408083206001600160a01b038516845290915290205460ff166110175760008281526072602090815260408083206001600160a01b03851684529091529020805460ff19166001179055613e143390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000611198836001600160a01b03841661454f565b60606000613e7c8360026151a1565b613e87906002615484565b67ffffffffffffffff811115613e9f57613e9f614e21565b6040519080825280601f01601f191660200182016040528015613ec9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613f0057613f00614d90565b60200101906001600160f81b031916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613f4b57613f4b614d90565b60200101906001600160f81b031916908160001a9053506000613f6f8460026151a1565b613f7a906001615484565b90505b6001811115613fff577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110613fbb57613fbb614d90565b1a60f81b828281518110613fd157613fd1614d90565b60200101906001600160f81b031916908160001a90535060049490941c93613ff881615606565b9050613f7d565b5083156111985760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a28565b60008281526072602090815260408083206001600160a01b038516845290915290205460ff16156110175760008281526072602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000611198836001600160a01b03841661459e565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091526022820185905260428083018590528351808403909101815260629092019092528051910120600090611198565b6000806000836001600160a01b031663926323d56040518163ffffffff1660e01b815260040160206040518083038186803b15801561418057600080fd5b505afa158015614194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141b89190614f89565b90506141c381613480565b925060008760018111156141d9576141d9614c71565b1415614229576001600160a01b038616600090815260396020526040902054851061420a5761420781614691565b92505b6001600160a01b0386166000908152603a602052604090205485101591505b5094509492505050565b6000614242620151804261549c565b6001600160a01b0384166000908152603e6020526040902054909150811115614291576001600160a01b03929092166000908152603e6020908152604080832094909455603d90529190912055565b6001600160a01b0383166000908152603d6020526040812080548492906142b9908490615484565b9091555050505050565b60008260000182815481106142da576142da614d90565b9060005260206000200154905092915050565b805160208083015160408085015190516000946135a9947f353bdd8d69b9e3185b3972e08b03845c0c14a21a390215302776a7a34b0e87649491939192019384526001600160a01b03928316602085015291166040830152606082015260800190565b805160208083015160408085015190516000946135a9947f1e2b74b2a792d5c0f0b6e59b037fa9d43d84fbb759337f0112fcc15ca414fc8d94919391920161561d565b600080845160018111156143a9576143a9614c71565b14156143c5576143be828486604001516146a9565b90506143ef565b6001845160018111156143da576143da614c71565b141561399e576143be82848660200151614437565b80610e89576143fd846144e2565b614411846001600160a01b03166014613e6d565b614425846001600160a01b03166014613e6d565b604051602001612bbf93929190615648565b604080513060248201526001600160a01b038481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092861691614495916154f8565b6000604051808303816000865af19150503d80600081146144d2576040519150601f19603f3d011682016040523d82523d6000602084013e6144d7565b606091505b509095945050505050565b606061450d826000015160018111156144fd576144fd614c71565b6001600160a01b03166001613e6d565b61451a8360200151614795565b6145278460400151614795565b604051602001614539939291906156d9565b6040516020818303038152906040529050919050565b600081815260018301602052604081205461459657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610aa7565b506000610aa7565b600081815260018301602052604081205480156146875760006145c260018361518a565b85549091506000906145d69060019061518a565b905081811461463b5760008660000182815481106145f6576145f6614d90565b906000526020600020015490508087600001848154811061461957614619614d90565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061464c5761464c6157a2565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610aa7565b6000915050610aa7565b600060385460016038548460375461349891906151a1565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b03167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000926060929087169161471f91906154f8565b6000604051808303816000865af19150503d806000811461475c576040519150601f19603f3d011682016040523d82523d6000602084013e614761565b606091505b50909250905081801561478c57508051158061478c57508080602001905181019061478c9190615514565b95945050505050565b6060816147d557505060408051808201909152600481527f3078303000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156147f857806147e981614e06565b915050600882901c91506147d9565b6111848482613e6d565b604080516060810182526000808252602082015290810161483e6040805160608101909152806000815260200160008152602001600081525090565b905290565b60006020828403121561485557600080fd5b81356001600160e01b03198116811461119857600080fd5b6001600160a01b0381168114610a6557600080fd5b803561198d8161486d565b8060608101831015610aa757600080fd5b8060808101831015610aa757600080fd5b60008083601f8401126148c157600080fd5b50813567ffffffffffffffff8111156148d957600080fd5b6020830191508360208260051b850101111561172857600080fd5b60008060008060008060008060008060006101408c8e03121561491657600080fd5b61491f8c614882565b9a5061492d60208d01614882565b995061493b60408d01614882565b985060608c0135975060808c0135965060a08c0135955060c08c0135945067ffffffffffffffff8060e08e0135111561497357600080fd5b6149838e60e08f01358f0161488d565b9450806101008e0135111561499757600080fd5b6149a88e6101008f01358f0161489e565b9350806101208e013511156149bc57600080fd5b506149ce8d6101208e01358e016148af565b81935080925050509295989b509295989b9093969950565b600080600080604085870312156149fc57600080fd5b843567ffffffffffffffff80821115614a1457600080fd5b614a20888389016148af565b90965094506020870135915080821115614a3957600080fd5b50614a46878288016148af565b95989497509550505050565b60008060008060008060608789031215614a6b57600080fd5b863567ffffffffffffffff80821115614a8357600080fd5b614a8f8a838b016148af565b90985096506020890135915080821115614aa857600080fd5b614ab48a838b016148af565b90965094506040890135915080821115614acd57600080fd5b50614ada89828a016148af565b979a9699509497509295939492505050565b600060208284031215614afe57600080fd5b81356111988161486d565b600060208284031215614b1b57600080fd5b5035919050565b60008060408385031215614b3557600080fd5b823591506020830135614b478161486d565b809150509250929050565b600060a08284031215614b6457600080fd5b50919050565b60006101608284031215614b6457600080fd5b60008060006101808486031215614b9357600080fd5b614b9d8585614b6a565b925061016084013567ffffffffffffffff80821115614bbb57600080fd5b818601915086601f830112614bcf57600080fd5b813581811115614bde57600080fd5b876020606083028501011115614bf357600080fd5b6020830194508093505050509250925092565b60008060408385031215614c1957600080fd5b8235614c248161486d565b946020939093013593505050565b60008060408385031215614c4557600080fd5b50508035926020909101359150565b60006101608284031215614c6757600080fd5b6111988383614b6a565b634e487b7160e01b600052602160045260246000fd5b60028110610a6557634e487b7160e01b600052602160045260246000fd5b81516040820190614cb581614c87565b808352506001600160a01b03602084015116602083015292915050565b60008060008060008060006080888a031215614ced57600080fd5b873567ffffffffffffffff80821115614d0557600080fd5b614d118b838c016148af565b909950975060208a0135915080821115614d2a57600080fd5b614d368b838c016148af565b909750955060408a0135915080821115614d4f57600080fd5b614d5b8b838c016148af565b909550935060608a0135915080821115614d7457600080fd5b50614d818a828b0161489e565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112614dbd57600080fd5b83018035915067ffffffffffffffff821115614dd857600080fd5b6020019150600581901b360382131561172857600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415614e1a57614e1a614df0565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715614e6857634e487b7160e01b600052604160045260246000fd5b60405290565b60028110610a6557600080fd5b600060608284031215614e8d57600080fd5b614e95614e37565b90508135614ea281614e6e565b80825250602082013560208201526040820135604082015292915050565b600060a08284031215614ed257600080fd5b614eda614e37565b8235614ee58161486d565b81526020830135614ef58161486d565b6020820152614f078460408501614e7b565b60408201529392505050565b600060608284031215614f2557600080fd5b6040516060810181811067ffffffffffffffff82111715614f5657634e487b7160e01b600052604160045260246000fd5b604052823560ff81168114614f6a57600080fd5b8152602083810135908201526040928301359281019290925250919050565b600060208284031215614f9b57600080fd5b5051919050565b600060608284031215614fb457600080fd5b614fbc614e37565b90508135614fc98161486d565b81526020820135614fd98161486d565b806020830152506040820135604082015292915050565b6000610160828403121561500357600080fd5b60405160a0810181811067ffffffffffffffff8211171561503457634e487b7160e01b600052604160045260246000fd5b60405282358152602083013561504981614e6e565b602082015261505b8460408501614fa2565b604082015261506d8460a08501614fa2565b6060820152615080846101008501614e7b565b60808201529392505050565b80356150978161486d565b6001600160a01b0390811683526020820135906150b38261486d565b166020830152604090810135910152565b6000610180820190508382528235602083015260208301356150e581614e6e565b6150ee81614c87565b80604084015250615105606083016040850161508c565b61511560c0830160a0850161508c565b61012061010084013561512781614e6e565b61513081614c87565b81840152830135610140808401919091529092013561016090910152919050565b60006020828403121561516357600080fd5b813561119881614e6e565b60006060828403121561518057600080fd5b6111988383614e7b565b60008282101561519c5761519c614df0565b500390565b60008160001904831182151516156151bb576151bb614df0565b500290565b6000610180820190508382528251602083015260208301516151e181614c87565b6040838101919091528381015180516001600160a01b03908116606086015260208201511660808501529081015160a084015250606083015180516001600160a01b0390811660c085015260208201511660e08401526040810151610100840152506080830151805161525381614c87565b6101208401526020810151610140840152604001516101609092019190915292915050565b8183526000602080850194508260005b858110156152b657813561529b8161486d565b6001600160a01b031687529582019590820190600101615288565b509495945050505050565b6060815260006152d560608301888a615278565b6020838203818501526152e982888a615278565b8481036040860152858152869250810160005b8681101561532a57833561530f81614e6e565b61531881614c87565b825292820192908201906001016152fc565b509a9950505050505050505050565b60408152600061534d604083018688615278565b82810360208401528381527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84111561538557600080fd5b8360051b80866020840137600091016020019081529695505050505050565b60005b838110156153bf5781810151838201526020016153a7565b83811115610e895750506000910152565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516154088160178501602088016153a4565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516154458160288401602088016153a4565b01602801949350505050565b60208152600082518060208401526154708160408501602087016153a4565b601f01601f19169190910160400192915050565b6000821982111561549757615497614df0565b500190565b6000826154b957634e487b7160e01b600052601260045260246000fd5b500490565b8681526020810186905260c081016154d586614c87565b8560408301528460608301528360808301528260a0830152979650505050505050565b6000825161550a8184602087016153a4565b9190910192915050565b60006020828403121561552657600080fd5b8151801515811461119857600080fd5b7f546f6b656e3a20636f756c64206e6f74207472616e7366657220000000000000815260008551602061556f82601a8601838b016153a4565b7f2066726f6d200000000000000000000000000000000000000000000000000000601a9285019283015286516155aa81838501848b016153a4565b630103a37960e51b92018181019290925285516155cd81602485018985016153a4565b660103a37b5b2b7160cd1b6024939091019283015284516155f481602b85018489016153a4565b91909101602b01979650505050505050565b60008161561557615615614df0565b506000190190565b8481526080810161562d85614c87565b84602083015283604083015282606083015295945050505050565b7f546f6b656e3a20636f756c64206e6f74207472616e736665722000000000000081526000845161568081601a8501602089016153a4565b630103a37960e51b601a9184019182015284516156a481601e8401602089016153a4565b660103a37b5b2b7160cd1b601e929091019182015283516156cc8160258401602088016153a4565b0160250195945050505050565b7f546f6b656e496e666f280000000000000000000000000000000000000000000081526000845161571181600a8501602089016153a4565b80830190507f2c0000000000000000000000000000000000000000000000000000000000000080600a830152855161575081600b850160208a016153a4565b600b920191820152835161576b81600c8401602088016153a4565b7f2900000000000000000000000000000000000000000000000000000000000000600c9290910191820152600d0195945050505050565b634e487b7160e01b600052603160045260246000fdfeb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610348617350726f787941646d696e3a20756e617574686f72697a65642073656e64") + ( + "0x35Fb958109b70799a8f9Bc2a8b1Ee4cC62034193", + "BearXNFTStaking", + "608060405234801561001057600080fd5b50613000806100206000396000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80638129fc1c11610130578063bca35a71116100b8578063dada55011161007c578063dada550114610458578063f2fde38b1461046b578063f83d08ba1461047e578063fbb0022714610486578063fccd7f721461048e57600080fd5b8063bca35a71146103fa578063bf9befb11461040d578063c89d5b8b14610416578063d5d423001461041e578063d976e09f1461042657600080fd5b8063b1c92f95116100ff578063b1c92f95146103c5578063b549445c146103ce578063b81f8e89146103d6578063b9ade5b7146103de578063ba0848db146103e757600080fd5b80638129fc1c146103905780638da5cb5b14610398578063aaed083b146103a9578063b10dcc93146103b257600080fd5b8063367c164e116101b35780635923489b116101825780635923489b146103245780636e2751211461034f578063706ce3e114610362578063715018a614610375578063760a2e8a1461037d57600080fd5b8063367c164e146102bd57806338ff8a85146102d05780633a17f4f0146102f1578063426233601461030457600080fd5b8063206635e7116101fa578063206635e71461026d5780632afe761a146102805780632bd30f1114610289578063305f839a146102ab57806333ddacd1146102b457600080fd5b8062944f621461022b5780630d00368b146102405780630e8feed41461025c578063120957fd14610264575b600080fd5b61023e610239366004612aa4565b6104bc565b005b61024960735481565b6040519081526020015b60405180910390f35b61023e61053a565b610249606d5481565b61023e61027b366004612b2c565b61057e565b610249606f5481565b60785461029b90610100900460ff1681565b6040519015158152602001610253565b61024960715481565b61024960765481565b61023e6102cb366004612bc2565b6105d1565b6102e36102de366004612aa4565b610829565b604051610253929190612c16565b61023e6102ff366004612aa4565b6109e1565b610317610312366004612aa4565b610a56565b6040516102539190612c2f565b606a54610337906001600160a01b031681565b6040516001600160a01b039091168152602001610253565b6102e361035d366004612aa4565b610b4c565b606b54610337906001600160a01b031681565b61023e610cf8565b61029b61038b366004612aa4565b610d2e565b61023e610dc2565b6033546001600160a01b0316610337565b61024960705481565b61023e6103c0366004612b2c565b610fc0565b610249606e5481565b61023e611236565b61023e6112bb565b61024960725481565b6102e36103f5366004612aa4565b6112ef565b61023e610408366004612aa4565b61149b565b610249606c5481565b610249611510565b606f54610249565b610439610434366004612aa4565b611594565b6040805192151583526001600160a01b03909116602083015201610253565b606954610337906001600160a01b031681565b61023e610479366004612aa4565b6115cf565b61023e611667565b61023e6116a0565b6104a161049c366004612aa4565b6116e1565b60408051938452602084019290925290820152606001610253565b6033546001600160a01b031633146104ef5760405162461bcd60e51b81526004016104e690612c42565b60405180910390fd5b606b546001600160a01b03163b6105185760405162461bcd60e51b81526004016104e690612c77565b606b80546001600160a01b0319166001600160a01b0392909216919091179055565b600061054533611594565b509050806105655760405162461bcd60e51b81526004016104e690612cae565b61056e33610d2e565b61057b5761057b33611c73565b50565b610587336116e1565b505060765560005b81518110156105cd576105bb8282815181106105ad576105ad612cda565b602002602001015133611d7b565b806105c581612d06565b91505061058f565b5050565b606a54604051636eb1769f60e11b815233600482015273871770e3e03bfaefa3597056e540a1a9c9ac7f6b602482015282916001600160a01b03169063dd62ed3e90604401602060405180830381865afa158015610633573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106579190612d21565b10156106bb5760405162461bcd60e51b815260206004820152602d60248201527f596f75206861766520746f20617070726f766520726f6f747820746f2073746160448201526c1ada5b99c818dbdb9d1c9858dd609a1b60648201526084016104e6565b606a546040516323b872dd60e01b815233600482015273871770e3e03bfaefa3597056e540a1a9c9ac7f6b6024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610726573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074a9190612d3a565b50606a546040516326c7e79d60e21b8152600481018390526001600160a01b0390911690639b1f9e7490602401600060405180830381600087803b15801561079157600080fd5b505af11580156107a5573d6000803e3d6000fd5b5050606b546001600160a01b031691506379c650689050336107c88460056120a1565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561080e57600080fd5b505af1158015610822573d6000803e3d6000fd5b5050505050565b600060606000805b6001600160a01b0385166000908152607460205260409020548110156108bc576001600160a01b0385166000908152607460205260409020805461089791908390811061088057610880612cda565b906000526020600020906005020160000154612129565b156108aa576108a7600183612d5c565b91505b806108b481612d06565b915050610831565b5060008167ffffffffffffffff8111156108d8576108d8612ac1565b604051908082528060200260200182016040528015610901578160200160208202803683370190505b5090506000805b6001600160a01b0387166000908152607460205260409020548110156109d5576001600160a01b0387166000908152607460205260409020805461095791908390811061088057610880612cda565b156109c3576001600160a01b038716600090815260746020526040902080548290811061098657610986612cda565b9060005260206000209060050201600001548383815181106109aa576109aa612cda565b60209081029190910101526109c0826001612154565b91505b806109cd81612d06565b915050610908565b50919590945092505050565b6033546001600160a01b03163314610a0b5760405162461bcd60e51b81526004016104e690612c42565b6069546001600160a01b03163b610a345760405162461bcd60e51b81526004016104e690612c77565b606980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152607460205260408120546060919067ffffffffffffffff811115610a8b57610a8b612ac1565b604051908082528060200260200182016040528015610ab4578160200160208202803683370190505b50905060005b6001600160a01b038416600090815260746020526040902054811015610b45576001600160a01b0384166000908152607460205260409020805482908110610b0457610b04612cda565b906000526020600020906005020160000154828281518110610b2857610b28612cda565b602090810291909101015280610b3d81612d06565b915050610aba565b5092915050565b600060606000805b6001600160a01b038516600090815260746020526040902054811015610bdf576001600160a01b03851660009081526074602052604090208054610bba919083908110610ba357610ba3612cda565b9060005260206000209060050201600001546121b3565b15610bcd57610bca826001612154565b91505b80610bd781612d06565b915050610b54565b5060008167ffffffffffffffff811115610bfb57610bfb612ac1565b604051908082528060200260200182016040528015610c24578160200160208202803683370190505b5090506000805b6001600160a01b0387166000908152607460205260409020548110156109d5576001600160a01b03871660009081526074602052604090208054610c7a919083908110610ba357610ba3612cda565b15610ce6576001600160a01b0387166000908152607460205260409020805482908110610ca957610ca9612cda565b906000526020600020906005020160000154838381518110610ccd57610ccd612cda565b6020908102919091010152610ce3826001612154565b91505b80610cf081612d06565b915050610c2b565b6033546001600160a01b03163314610d225760405162461bcd60e51b81526004016104e690612c42565b610d2c60006121d0565b565b60006001815b6001600160a01b038416600090815260746020526040902054811015610b45576001600160a01b03841660009081526074602052604081208054610d9a919084908110610d8357610d83612cda565b906000526020600020906005020160010154612222565b9050603c8111610daa5750610db0565b60009250505b80610dba81612d06565b915050610d34565b600054610100900460ff16610ddd5760005460ff1615610de1565b303b155b610e445760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104e6565b600054610100900460ff16158015610e66576000805461ffff19166101011790555b610e6e61223c565b606580546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560668054821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2179055620151806067556312cc030060685560698054821673e22e1e620dffb03065cd77db0162249c0c91bf01179055606a8054821673d718ad25285d65ef4d79262a6cd3aea6a8e01023179055606b80549091167399cfdf48d0ba4885a73786148a2f89d86c7021701790556000606c5568056bc75e2d63100000606d556802b5e3af16b1880000606e55690257058e269742680000606f819055681b1ae4d6e2ef5000006070819055610bb8607181905591610f709190612d74565b610f7a9190612d8b565b607255607154606e54606d54610f909190612d74565b610f9a9190612d8b565b60735560006076556078805460ff19169055801561057b576000805461ff001916905550565b6000610fcb33611594565b50905080610feb5760405162461bcd60e51b81526004016104e690612cae565b607854610100900460ff161561102c5760405162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b60448201526064016104e6565b600061103733610a56565b90508051835111156110775760405162461bcd60e51b81526020600482015260096024820152684964206572726f727360b81b60448201526064016104e6565b6000805b84518110156110fd5760005b83518110156110ea578381815181106110a2576110a2612cda565b60200260200101518683815181106110bc576110bc612cda565b602002602001015114156110d8576110d5836001612154565b92505b806110e281612d06565b915050611087565b50806110f581612d06565b91505061107b565b50835181141561123057835161112761111e82678ac7230489e800006120a1565b606f5490612154565b606f55611132612273565b600060768190555b855181101561122d5760695486516001600160a01b03909116906323b872dd90309033908a908690811061117057611170612cda565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156111ca57600080fd5b505af11580156111de573d6000803e3d6000fd5b5050606c80549250905060006111f383612dad565b919050555061121b3387838151811061120e5761120e612cda565b602002602001015161229b565b8061122581612d06565b91505061113a565b50505b50505050565b60785460ff166112ac5760005b60755481101561057b576001607760006075848154811061126657611266612cda565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055806112a481612d06565b915050611243565b6078805460ff19166001179055565b60006112c633611594565b509050806112e65760405162461bcd60e51b81526004016104e690612cae565b61057b33612470565b600060606000805b6001600160a01b038516600090815260746020526040902054811015611382576001600160a01b0385166000908152607460205260409020805461135d91908390811061134657611346612cda565b906000526020600020906005020160000154612574565b156113705761136d600183612d5c565b91505b8061137a81612d06565b9150506112f7565b5060008167ffffffffffffffff81111561139e5761139e612ac1565b6040519080825280602002602001820160405280156113c7578160200160208202803683370190505b5090506000805b6001600160a01b0387166000908152607460205260409020548110156109d5576001600160a01b0387166000908152607460205260409020805461141d91908390811061134657611346612cda565b15611489576001600160a01b038716600090815260746020526040902080548290811061144c5761144c612cda565b90600052602060002090600502016000015483838151811061147057611470612cda565b6020908102919091010152611486826001612154565b91505b8061149381612d06565b9150506113ce565b6033546001600160a01b031633146114c55760405162461bcd60e51b81526004016104e690612c42565b606a546001600160a01b03163b6114ee5760405162461bcd60e51b81526004016104e690612c77565b606a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000806064606f5460016115249190612dc4565b61152e9190612d8b565b611539906001612d5c565b606d546115469190612dc4565b90506000606d54826115589190612d74565b905060006001606d548361156c9190612d8b565b6115769190612d8b565b611581906001612dc4565b61158c906064612dc4565b949350505050565b6001600160a01b038116600090815260776020526040812054819060ff161515600114156115c457506001929050565b506000928392509050565b6033546001600160a01b031633146115f95760405162461bcd60e51b81526004016104e690612c42565b6001600160a01b03811661165e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104e6565b61057b816121d0565b73d0d725208fd36be1561050fc1dd6a651d7ea7c89331415610d2c576078805461ff001981166101009182900460ff1615909102179055565b60006116ab33611594565b509050806116cb5760405162461bcd60e51b81526004016104e690612cae565b6116d433610d2e565b61057b5761057b336125aa565b600080808080808087816116f482610829565b509050600061170283610b4c565b50905060058110611a3b57600160005b6001600160a01b038516600090815260746020526040902054811015611a0e576001600160a01b0385166000908152607460205260408120805461177891908490811061176157611761612cda565b906000526020600020906005020160040154612222565b6001600160a01b038716600090815260746020526040902080549192506117a99184908110610ba357610ba3612cda565b806117de57506001600160a01b038616600090815260746020526040902080546117de91908490811061088057610880612cda565b80156117ea5750600181105b156117f457600092505b82801561181857506001600160a01b03861660009081526074602052604090205415155b156118715761186a8561182c83600a612dc4565b6118369190612dc4565b6118648661184585600a612dc4565b61184f9190612dc4565b60765461186490670de0b6b3a7640000612798565b90612154565b995061188e565b8261188e5760765461188b90670de0b6b3a7640000612798565b99505b6001600160a01b038616600090815260746020526040902080546118bd91908490811061088057610880612cda565b15611950576001600160a01b038616600090815260746020526040812080546119089190859081106118f1576118f1612cda565b906000526020600020906005020160020154612222565b90508061192861192182680ad78ebc5ac6200000612dc4565b8c90612154565b9a5061194761194082680ad78ebc5ac6200000612dc4565b8b90612154565b995050506119fb565b6001600160a01b0386166000908152607460205260409020805461197f919084908110610ba357610ba3612cda565b156119fb576001600160a01b038616600090815260746020526040812080546119b39190859081106118f1576118f1612cda565b905060008190506119d76002606d54846119cd9190612dc4565b6119219190612d8b565b9a506119f66002606d54836119ec9190612dc4565b6119409190612d8b565b995050505b5080611a0681612d06565b915050611712565b508515611a3557606b54606654611a32916001600160a01b039081169116886127da565b94505b50611c4f565b60005b6001600160a01b038416600090815260746020526040902054811015611c28576001600160a01b03841660009081526074602052604090208054611a8d91908390811061088057610880612cda565b15611b9f576001600160a01b03841660009081526074602052604081208054611ac191908490811061176157611761612cda565b9050611ad8611ad182600a612dc4565b8a90612154565b98506000611b1560746000886001600160a01b03166001600160a01b0316815260200190815260200160002084815481106118f1576118f1612cda565b9050611b2d611ad182680ad78ebc5ac6200000612dc4565b98506000611b8160746000896001600160a01b03166001600160a01b031681526020019081526020016000208581548110611b6a57611b6a612cda565b906000526020600020906005020160030154612222565b9050611b99611ad182680ad78ebc5ac6200000612dc4565b98505050505b6001600160a01b03841660009081526074602052604090208054611bce919083908110610ba357610ba3612cda565b15611c16576001600160a01b03841660009081526074602052604081208054611c0291908490811061176157611761612cda565b9050611c12611ad182600a612dc4565b9850505b80611c2081612d06565b915050611a3e565b508415611c4f57606b54606654611c4c916001600160a01b039081169116876127da565b93505b611c6187670de0b6b3a7640000612dc4565b9b959a50929850939650505050505050565b6000611c7e826116e1565b5091505080156105cd57606b5460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015611cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cff9190612d3a565b5060005b6001600160a01b038316600090815260746020526040902054811015611d76576001600160a01b0383166000908152607460205260409020805442919083908110611d5057611d50612cda565b600091825260209091206002600590920201015580611d6e81612d06565b915050611d03565b505050565b607054606f5410611db857607354606d6000828254611d9a9190612d74565b9091555050606f54611db490678ac7230489e80000612905565b606f555b6069546040516331a9108f60e11b8152600481018490526001600160a01b03838116921690636352211e90602401602060405180830381865afa158015611e03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e279190612de3565b6001600160a01b031614611e7d5760405162461bcd60e51b815260206004820152601e60248201527f596f7520617265206e6f742061206f776e6572206f6620746865206e6674000060448201526064016104e6565b60695460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c590604401602060405180830381865afa158015611ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eef9190612d3a565b1515600114611f575760405162461bcd60e51b815260206004820152602e60248201527f596f752073686f756c6420617070726f7665206e667420746f2074686520737460448201526d185ada5b99c818dbdb9d1c9858dd60921b60648201526084016104e6565b6069546040516323b872dd60e01b81526001600160a01b03838116600483015230602483015260448201859052909116906323b872dd90606401600060405180830381600087803b158015611fab57600080fd5b505af1158015611fbf573d6000803e3d6000fd5b505050506000611fce82611594565b50905060006040518060a001604052808581526020014281526020014281526020014281526020014281525090506120126001606c5461215490919063ffffffff16565b606c556001600160a01b03831660009081526074602090815260408083208054600181810183559185529383902085516005909502019384559184015191830191909155820151600282015560608201516003820155608082015160049091015581611230576001600160a01b0383166000908152607760205260409020805460ff1916600117905550505050565b6000826120b057506000612123565b60006120bc8385612dc4565b9050826120c98583612d8b565b146121205760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016104e6565b90505b92915050565b60008064e8d4a510008310158015612146575064e8d4a510058311155b156121235750600192915050565b6000806121618385612d5c565b9050838110156121205760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016104e6565b600080610e7483116121c757506001612123565b50600092915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6067546000906122328342612d74565b6121239190612d8b565b600054610100900460ff166122635760405162461bcd60e51b81526004016104e690612e00565b61226b612947565b610d2c61296e565b61227c33612470565b61228533610d2e565b610d2c5761229233611c73565b610d2c336125aa565b60005b6001600160a01b038316600090815260746020526040902054811015612428576001600160a01b03831660009081526074602052604090208054839190839081106122eb576122eb612cda565b9060005260206000209060050201600001541415612416576001600160a01b0383166000908152607460205260409020805461232990600190612d74565b8154811061233957612339612cda565b906000526020600020906005020160746000856001600160a01b03166001600160a01b03168152602001908152602001600020828154811061237d5761237d612cda565b60009182526020808320845460059093020191825560018085015490830155600280850154908301556003808501549083015560049384015493909101929092556001600160a01b03851681526074909152604090208054806123e2576123e2612e4b565b6000828152602081206005600019909301928302018181556001810182905560028101829055600381018290556004015590555b8061242081612d06565b91505061229e565b506001600160a01b0382166000908152607460205260409020546105cd576001600160a01b038216600090815260746020526040812061246791612a3f565b6105cd8261299e565b600061247b826116e1565b509091505080156105cd57606a5460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af11580156124d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fd9190612d3a565b5060005b6001600160a01b038316600090815260746020526040902054811015611d76576001600160a01b038316600090815260746020526040902080544291908390811061254e5761254e612cda565b60009182526020909120600460059092020101558061256c81612d06565b915050612501565b60006509184e72a00682101561258c57506000919050565b6509184e72b4b38211156125a257506000919050565b506001919050565b60006125b5826116e1565b5091505080156105cd57606b5460655460405163095ea7b360e01b81526001600160a01b0391821660048201526024810184905291169063095ea7b3906044016020604051808303816000875af1158015612614573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126389190612d3a565b5060408051600280825260608083018452926020830190803683375050606b5482519293506001600160a01b03169183915060009061267957612679612cda565b6001600160a01b0392831660209182029290920101526066548251911690829060019081106126aa576126aa612cda565b6001600160a01b03928316602091820292909201015260655460405163791ac94760e01b815291169063791ac947906126f0908590600090869089904290600401612e9a565b600060405180830381600087803b15801561270a57600080fd5b505af115801561271e573d6000803e3d6000fd5b5050505060005b6001600160a01b038416600090815260746020526040902054811015611230576001600160a01b038416600090815260746020526040902080544291908390811061277257612772612cda565b60009182526020909120600360059092020101558061279081612d06565b915050612725565b600061212083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506129d7565b6040805160028082526060808301845260009390929190602083019080368337019050509050848160008151811061281457612814612cda565b60200260200101906001600160a01b031690816001600160a01b031681525050838160018151811061284857612848612cda565b6001600160a01b03928316602091820292909201015260655460405163d06ca61f60e01b8152600092919091169063d06ca61f9061288c9087908690600401612ed6565b600060405180830381865afa1580156128a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128d19190810190612eef565b905080600183516128e29190612d74565b815181106128f2576128f2612cda565b6020026020010151925050509392505050565b600061212083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a0e565b600054610100900460ff16610d2c5760405162461bcd60e51b81526004016104e690612e00565b600054610100900460ff166129955760405162461bcd60e51b81526004016104e690612e00565b610d2c336121d0565b6000806129aa83611594565b915091508115611d76576001600160a01b03166000908152607760205260409020805460ff191690555050565b600081836129f85760405162461bcd60e51b81526004016104e69190612f75565b506000612a058486612d8b565b95945050505050565b60008184841115612a325760405162461bcd60e51b81526004016104e69190612f75565b506000612a058486612d74565b508054600082556005029060005260206000209081019061057b91905b80821115612a8b5760008082556001820181905560028201819055600382018190556004820155600501612a5c565b5090565b6001600160a01b038116811461057b57600080fd5b600060208284031215612ab657600080fd5b813561212081612a8f565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612b0057612b00612ac1565b604052919050565b600067ffffffffffffffff821115612b2257612b22612ac1565b5060051b60200190565b60006020808385031215612b3f57600080fd5b823567ffffffffffffffff811115612b5657600080fd5b8301601f81018513612b6757600080fd5b8035612b7a612b7582612b08565b612ad7565b81815260059190911b82018301908381019087831115612b9957600080fd5b928401925b82841015612bb757833582529284019290840190612b9e565b979650505050505050565b600060208284031215612bd457600080fd5b5035919050565b600081518084526020808501945080840160005b83811015612c0b57815187529582019590820190600101612bef565b509495945050505050565b82815260406020820152600061158c6040830184612bdb565b6020815260006121206020830184612bdb565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f41646472657373206973206e6f7420636f6e7472616374000000000000000000604082015260600190565b6020808252601290820152712cb7ba9030b932903737ba1039ba30b5b2b960711b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612d1a57612d1a612cf0565b5060010190565b600060208284031215612d3357600080fd5b5051919050565b600060208284031215612d4c57600080fd5b8151801515811461212057600080fd5b60008219821115612d6f57612d6f612cf0565b500190565b600082821015612d8657612d86612cf0565b500390565b600082612da857634e487b7160e01b600052601260045260246000fd5b500490565b600081612dbc57612dbc612cf0565b506000190190565b6000816000190483118215151615612dde57612dde612cf0565b500290565b600060208284031215612df557600080fd5b815161212081612a8f565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b600081518084526020808501945080840160005b83811015612c0b5781516001600160a01b031687529582019590820190600101612e75565b85815284602082015260a060408201526000612eb960a0830186612e61565b6001600160a01b0394909416606083015250608001529392505050565b82815260406020820152600061158c6040830184612e61565b60006020808385031215612f0257600080fd5b825167ffffffffffffffff811115612f1957600080fd5b8301601f81018513612f2a57600080fd5b8051612f38612b7582612b08565b81815260059190911b82018301908381019087831115612f5757600080fd5b928401925b82841015612bb757835182529284019290840190612f5c565b600060208083528351808285015260005b81811015612fa257858101830151858201604001528201612f86565b81811115612fb4576000604083870101525b50601f01601f191692909201604001939250505056fe", + ), + ( + "0x8B3D32cf2bb4d0D16656f4c0b04Fa546274f1545", + "GovernorCharlieDelegate", + "608060405234801561001057600080fd5b50613e45806100206000396000f3fe60806040526004361061031a5760003560e01c80637b3c71d3116101ab578063d50572ee116100f7578063f0843ba811610095578063fc176c041161006f578063fc176c0414610b82578063fc4eee4214610ba2578063fc66ff1414610bb8578063fe0d94c114610bd857600080fd5b8063f0843ba814610b12578063f2b0653714610b32578063f682e04c14610b6257600080fd5b8063de7bc127116100d1578063de7bc127146109ec578063deaaa7cc14610a02578063e23a9a5214610a36578063e837159c14610afc57600080fd5b8063d50572ee146109a0578063da35c664146109b6578063ddf0b009146109cc57600080fd5b8063a6d8784a11610164578063c1a287e21161013e578063c1a287e214610933578063c4d66de81461094a578063c5a8425d1461096a578063c9fb9e871461098a57600080fd5b8063a6d8784a146108e7578063abaac6a8146108fd578063b58131b01461091d57600080fd5b80637b3c71d31461083c5780637bdbe4d01461085c5780637cae57bb14610871578063806bd5811461088757806386d37e8b146108a757806399533365146108c757600080fd5b80632fedff591161026a5780633e4f49e61161022357806350442098116101fd578063504420981461074657806356781388146107665780635c60da1b1461078657806366176743146107be57600080fd5b80633e4f49e6146106d957806340e58ee5146107065780634d6733d21461072657600080fd5b80632fedff59146105ee578063328dd9821461060e57806338bd0dda1461063e5780633932abb11461066b5780633af32abf146106815780633bccf4fd146106b957600080fd5b8063158ef93e116102d757806318b62629116102b157806318b626291461056e5780631dfb1b5a1461058457806320606b70146105a457806324bc1a64146105d857600080fd5b8063158ef93e146104f757806317977c611461052157806317ba1b8b1461054e57600080fd5b8063013cf08b1461031f57806302a251a31461042857806306fdde031461044c5780630825f38f146104a25780630ea2d98c146104b7578063140499ea146104d7575b600080fd5b34801561032b57600080fd5b506103b361033a3660046132ee565b60096020819052600091825260409091208054600182015460028301546007840154600885015495850154600a860154600b870154600c880154600d890154600e9099015497996001600160a01b0390971698959794969593949293919260ff808316936101008404821693620100009004909116918d565b604080519d8e526001600160a01b03909c1660208e01529a8c019990995260608b019790975260808a019590955260a089019390935260c088019190915260e08701521515610100860152151561012085015215156101408401526101608301526101808201526101a0015b60405180910390f35b34801561043457600080fd5b5061043e60045481565b60405190815260200161041f565b34801561045857600080fd5b506104956040518060400160405280601a81526020017f496e7465726573742050726f746f636f6c20476f7665726e6f7200000000000081525081565b60405161041f9190613363565b6104b56104b0366004613450565b610beb565b005b3480156104c357600080fd5b506104b56104d23660046132ee565b610e61565b3480156104e357600080fd5b506104b56104f23660046134d6565b610ec6565b34801561050357600080fd5b506012546105119060ff1681565b604051901515815260200161041f565b34801561052d57600080fd5b5061043e61053c3660046134d6565b600a6020526000908152604090205481565b34801561055a57600080fd5b506104b56105693660046132ee565b610f07565b34801561057a57600080fd5b5061043e600f5481565b34801561059057600080fd5b506104b561059f3660046132ee565b610f64565b3480156105b057600080fd5b5061043e7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156105e457600080fd5b5061043e60015481565b3480156105fa57600080fd5b506104b56106093660046132ee565b610fc1565b34801561061a57600080fd5b5061062e6106293660046132ee565b61101e565b60405161041f94939291906135ba565b34801561064a57600080fd5b5061043e6106593660046134d6565b600d6020526000908152604090205481565b34801561067757600080fd5b5061043e60035481565b34801561068d57600080fd5b5061051161069c3660046134d6565b6001600160a01b03166000908152600d6020526040902054421090565b3480156106c557600080fd5b506104b56106d4366004613623565b6112af565b3480156106e557600080fd5b506106f96106f43660046132ee565b611516565b60405161041f9190613687565b34801561071257600080fd5b506104b56107213660046132ee565b61169e565b34801561073257600080fd5b506104b56107413660046136af565b611b80565b34801561075257600080fd5b506104b56107613660046132ee565b611c45565b34801561077257600080fd5b506104b56107813660046136d9565b611ca2565b34801561079257600080fd5b506000546107a6906001600160a01b031681565b6040516001600160a01b03909116815260200161041f565b3480156107ca57600080fd5b506108146107d9366004613705565b601160209081526000928352604080842090915290825290205460ff808216916101008104909116906201000090046001600160601b031683565b60408051931515845260ff90921660208401526001600160601b03169082015260600161041f565b34801561084857600080fd5b506104b5610857366004613728565b611d09565b34801561086857600080fd5b5061043e600a81565b34801561087d57600080fd5b5061043e600c5481565b34801561089357600080fd5b506104b56108a23660046132ee565b611d58565b3480156108b357600080fd5b506104b56108c23660046132ee565b611db5565b3480156108d357600080fd5b506104b56108e23660046134d6565b611e12565b3480156108f357600080fd5b5061043e60155481565b34801561090957600080fd5b506104b56109183660046132ee565b611e8b565b34801561092957600080fd5b5061043e60055481565b34801561093f57600080fd5b5061043e6212750081565b34801561095657600080fd5b506104b56109653660046134d6565b611ee8565b34801561097657600080fd5b50600e546107a6906001600160a01b031681565b34801561099657600080fd5b5061043e60135481565b3480156109ac57600080fd5b5061043e60025481565b3480156109c257600080fd5b5061043e60075481565b3480156109d857600080fd5b506104b56109e73660046132ee565b611fd9565b3480156109f857600080fd5b5061043e60105481565b348015610a0e57600080fd5b5061043e7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610a4257600080fd5b50610acc610a51366004613705565b60408051606081018252600080825260208201819052918101919091525060009182526011602090815260408084206001600160a01b03939093168452918152918190208151606081018352905460ff8082161515835261010082041693820193909352620100009092046001600160601b03169082015290565b6040805182511515815260208084015160ff1690820152918101516001600160601b03169082015260600161041f565b348015610b0857600080fd5b5061043e60145481565b348015610b1e57600080fd5b506104b5610b2d3660046132ee565b61238f565b348015610b3e57600080fd5b50610511610b4d3660046132ee565b600b6020526000908152604090205460ff1681565b348015610b6e57600080fd5b5061043e610b7d3660046139b0565b6123ec565b348015610b8e57600080fd5b506104b5610b9d3660046132ee565b612a48565b348015610bae57600080fd5b5061043e60065481565b348015610bc457600080fd5b506008546107a6906001600160a01b031681565b6104b5610be63660046132ee565b612aa5565b60008585858585604051602001610c06959493929190613a91565b60408051601f1981840301815291815281516020928301206000818152600b90935291205490915060ff16610c7b5760405162461bcd60e51b81526020600482015260166024820152753a3c103430b9b713ba103132b2b71038bab2bab2b21760511b60448201526064015b60405180910390fd5b81421015610ccb5760405162461bcd60e51b815260206004820152601d60248201527f7478206861736e2774207375727061737365642074696d656c6f636b2e0000006044820152606401610c72565b610cd86212750083613af3565b421115610d165760405162461bcd60e51b815260206004820152600c60248201526b3a3c1034b99039ba30b6329760a11b6044820152606401610c72565b6000818152600b60205260409020805460ff191690558351606090610d3c575082610d68565b848051906020012084604051602001610d56929190613b0b565b60405160208183030381529060405290505b6000876001600160a01b03168783604051610d839190613b3c565b60006040518083038185875af1925050503d8060008114610dc0576040519150601f19603f3d011682016040523d82523d6000602084013e610dc5565b606091505b5050905080610e0f5760405162461bcd60e51b81526020600482015260166024820152753a3c1032bc32b1baba34b7b7103932bb32b93a32b21760511b6044820152606401610c72565b876001600160a01b0316837fa560e3198060a2f10670c1ec5b403077ea6ae93ca8de1c32b451dc1a943cd6e789898989604051610e4f9493929190613b58565b60405180910390a35050505050505050565b333014610e805760405162461bcd60e51b8152600401610c7290613b95565b600480549082905560408051828152602081018490527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882891015b60405180910390a15050565b333014610ee55760405162461bcd60e51b8152600401610c7290613b95565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b333014610f265760405162461bcd60e51b8152600401610c7290613b95565b600580549082905560408051828152602081018490527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054619101610eba565b333014610f835760405162461bcd60e51b8152600401610c7290613b95565b600380549082905560408051828152602081018490527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a939101610eba565b333014610fe05760405162461bcd60e51b8152600401610c7290613b95565b601480549082905560408051828152602081018490527f519a192fe8db9e38785eb494c69f530ddb21b9e34322f8d08fe29bd3849749889101610eba565b606080606080600060096000878152602001908152602001600020905080600301816004018260050183600601838054806020026020016040519081016040528092919081815260200182805480156110a057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611082575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156110f257602002820191906000526020600020905b8154815260200190600101908083116110de575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b828210156111c657838290600052602060002001805461113990613bcc565b80601f016020809104026020016040519081016040528092919081815260200182805461116590613bcc565b80156111b25780601f10611187576101008083540402835291602001916111b2565b820191906000526020600020905b81548152906001019060200180831161119557829003601f168201915b50505050508152602001906001019061111a565b50505050915080805480602002602001604051908101604052809291908181526020016000905b8282101561129957838290600052602060002001805461120c90613bcc565b80601f016020809104026020016040519081016040528092919081815260200182805461123890613bcc565b80156112855780601f1061125a57610100808354040283529160200191611285565b820191906000526020600020905b81548152906001019060200180831161126857829003601f168201915b5050505050815260200190600101906111ed565b5050505090509450945094509450509193509193565b604080518082018252601a81527f496e7465726573742050726f746f636f6c20476f7665726e6f7200000000000060209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f75a838dcd8ee5903cc7f4a5799344d0080864f57a6e9911f8bdfb4c8ddce9b5481840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff8816610100808401919091528451808403909101815261012083019094528351939092019290922061190160f01b6101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561143c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661149f5760405162461bcd60e51b815260206004820181905260248201527f63617374566f746542795369673a20696e76616c6964207369676e61747572656044820152606401610c72565b88816001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a6114d7858e8e612c90565b6040805160ff90931683526001600160601b039091166020830152606090820181905260009082015260800160405180910390a3505050505050505050565b6000816007541015801561152b575060065482115b6115775760405162461bcd60e51b815260206004820152601a60248201527f73746174653a20696e76616c69642070726f706f73616c2069640000000000006044820152606401610c72565b600082815260096020908152604080832060018101546001600160a01b03168452600d90925290912054600c82015442919091109060ff16156115be575060029392505050565b816007015443116115d3575060009392505050565b816008015443116115e8575060019392505050565b8080156115fc575081600d015482600a0154115b80611618575080158015611618575081600a0154826009015411155b80611633575080158015611633575081600d01548260090154105b15611642575060039392505050565b6002820154611655575060049392505050565b600c820154610100900460ff1615611671575060079392505050565b6212750082600201546116849190613af3565b4210611694575060069392505050565b5060059392505050565b60076116a982611516565b60078111156116ba576116ba613671565b14156117085760405162461bcd60e51b815260206004820152601d60248201527f63616e742063616e63656c2065786563757465642070726f706f73616c0000006044820152606401610c72565b600081815260096020526040902060018101546001600160a01b0316336001600160a01b0316146119755760018101546001600160a01b03166000908152600d6020526040902054421015611878576005546008546001838101546001600160a01b039283169263782d6fe1929116906117829043613c07565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440160206040518083038186803b1580156117c657600080fd5b505afa1580156117da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fe9190613c1e565b6001600160601b03161080156118275750600e546001600160a01b0316336001600160a01b0316145b6118735760405162461bcd60e51b815260206004820152601c60248201527f63616e63656c3a2077686974656c69737465642070726f706f736572000000006044820152606401610c72565b611975565b6005546008546001838101546001600160a01b039283169263782d6fe1929116906118a39043613c07565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440160206040518083038186803b1580156118e757600080fd5b505afa1580156118fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191f9190613c1e565b6001600160601b0316106119755760405162461bcd60e51b815260206004820181905260248201527f63616e63656c3a2070726f706f7365722061626f7665207468726573686f6c646044820152606401610c72565b600c8101805460ff1916600117905560005b6003820154811015611b5057611b3e8260030182815481106119ab576119ab613c47565b6000918252602090912001546004840180546001600160a01b0390921691849081106119d9576119d9613c47565b90600052602060002001548460050184815481106119f9576119f9613c47565b906000526020600020018054611a0e90613bcc565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3a90613bcc565b8015611a875780601f10611a5c57610100808354040283529160200191611a87565b820191906000526020600020905b815481529060010190602001808311611a6a57829003601f168201915b5050505050856006018581548110611aa157611aa1613c47565b906000526020600020018054611ab690613bcc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae290613bcc565b8015611b2f5780601f10611b0457610100808354040283529160200191611b2f565b820191906000526020600020905b815481529060010190602001808311611b1257829003601f168201915b50505050508660020154612f12565b80611b4881613c5d565b915050611987565b5060405182907f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90600090a25050565b333014611b9f5760405162461bcd60e51b8152600401610c7290613b95565b42601554611bad9190613af3565b8110611bf45760405162461bcd60e51b81526020600482015260166024820152750caf0e0d2e4c2e8d2dedc40caf0c6cacac8e640dac2f60531b6044820152606401610c72565b6001600160a01b0382166000818152600d6020908152604091829020849055815192835282018390527f4e7b7545bc5744d0e30425959f4687475774b6c7edad77d24cb51c7d967d45159101610eba565b333014611c645760405162461bcd60e51b8152600401610c7290613b95565b601080549082905560408051828152602081018490527f2a61b867418a359864adca8bb250ea65ee8bd41dbfd0279198d8e7552d4a27c29101610eba565b81337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda483611cd1838583612c90565b6040805160ff90931683526001600160601b039091166020830152606090820181905260009082015260800160405180910390a35050565b83337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda485611d38838583612c90565b8686604051611d4a9493929190613c78565b60405180910390a350505050565b333014611d775760405162461bcd60e51b8152600401610c7290613b95565b601380549082905560408051828152602081018490527f8cb5451eee8feb516cec9cd600201bbc31a30886d70c841a085a3fa69a4294d19101610eba565b333014611dd45760405162461bcd60e51b8152600401610c7290613b95565b600180549082905560408051828152602081018490527fa74554b0f53da47d07ec571d712428b3720460f54f81375fbcf78f6b5f72e7ed9101610eba565b333014611e315760405162461bcd60e51b8152600401610c7290613b95565b600e80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f80a07e73e552148844a9c216d9724212d609cfa54e9c1a2e97203bdd2c4ad3419101610eba565b333014611eaa5760405162461bcd60e51b8152600401610c7290613b95565b600f80549082905560408051828152602081018490527f80a384652af83fc00bfd40ef94edda7ede83e7db39931b2c889821573f314e239101610eba565b60125460ff1615611f3b5760405162461bcd60e51b815260206004820152601860248201527f616c7265616479206265656e20696e697469616c697a656400000000000000006044820152606401610c72565b600880546001600160a01b0319166001600160a01b0392909216919091179055619d8060045561335460035569d3c21bcecceda10000006005556202a300600c5560006007556a084595161401484a00000060019081556a21165458500521280000006002556119aa600f5561a8c06010556a01a784379d99db420000006013556146506014556301e133806015556012805460ff19169091179055565b6004611fe482611516565b6007811115611ff557611ff5613671565b146120425760405162461bcd60e51b815260206004820152601f60248201527f63616e206f6e6c792062652071756575656420696620737563636565646564006044820152606401610c72565b6000818152600960205260408120600e8101549091906120629042613af3565b905060005b600383015481101561234d57600b600084600301838154811061208c5761208c613c47565b6000918252602090912001546004860180546001600160a01b0390921691859081106120ba576120ba613c47565b90600052602060002001548660050185815481106120da576120da613c47565b906000526020600020018760060186815481106120f9576120f9613c47565b9060005260206000200187604051602001612118959493929190613d62565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff161561218e5760405162461bcd60e51b815260206004820152601760248201527f70726f706f73616c20616c7265616479207175657565640000000000000000006044820152606401610c72565b61233a8360030182815481106121a6576121a6613c47565b6000918252602090912001546004850180546001600160a01b0390921691849081106121d4576121d4613c47565b90600052602060002001548560050184815481106121f4576121f4613c47565b90600052602060002001805461220990613bcc565b80601f016020809104026020016040519081016040528092919081815260200182805461223590613bcc565b80156122825780601f1061225757610100808354040283529160200191612282565b820191906000526020600020905b81548152906001019060200180831161226557829003601f168201915b505050505086600601858154811061229c5761229c613c47565b9060005260206000200180546122b190613bcc565b80601f01602080910402602001604051908101604052809291908181526020018280546122dd90613bcc565b801561232a5780601f106122ff5761010080835404028352916020019161232a565b820191906000526020600020905b81548152906001019060200180831161230d57829003601f168201915b50505050508688600e0154612fac565b508061234581613c5d565b915050612067565b506002820181905560405181815283907f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28929060200160405180910390a2505050565b3330146123ae5760405162461bcd60e51b8152600401610c7290613b95565b600280549082905560408051828152602081018490527fc2adf06da6765dba7faaccde4c0ce3f91c35dd3390e7f0b6bc2844202c9fa9529101610eba565b6000600154600014156124365760405162461bcd60e51b8152602060048201526012602482015271436861726c6965206e6f742061637469766560701b6044820152606401610c72565b6005546008546001600160a01b031663782d6fe133612456600143613c07565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440160206040518083038186803b15801561249a57600080fd5b505afa1580156124ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d29190613c1e565b6001600160601b03161015806124ec57506124ec3361069c565b6125385760405162461bcd60e51b815260206004820152601e60248201527f766f7465732062656c6f772070726f706f73616c207468726573686f6c6400006044820152606401610c72565b8551875114801561254a575084518751145b8015612557575083518751145b6125a35760405162461bcd60e51b815260206004820152601a60248201527f696e666f726d6174696f6e206172697479206d69736d617463680000000000006044820152606401610c72565b86516125e85760405162461bcd60e51b81526020600482015260146024820152736d7573742070726f7669646520616374696f6e7360601b6044820152606401610c72565b600a8751111561262d5760405162461bcd60e51b815260206004820152601060248201526f746f6f206d616e7920616374696f6e7360801b6044820152606401610c72565b336000908152600a6020526040902054801561271657600061264e82611516565b9050600181600781111561266457612664613671565b14156126b25760405162461bcd60e51b815260206004820152601e60248201527f6f6e65206c6976652070726f706f73616c207065722070726f706f73657200006044820152606401610c72565b60008160078111156126c6576126c6613671565b14156127145760405162461bcd60e51b815260206004820152601e60248201527f6f6e65206c6976652070726f706f73616c207065722070726f706f73657200006044820152606401610c72565b505b6007805490600061272683613c5d565b9190505550600060405180610220016040528060075481526020016127483390565b6001600160a01b03168152602001600081526020018a8152602001898152602001888152602001878152602001600354436127839190613af3565b8152602001600454600354436127999190613af3565b6127a39190613af3565b815260200160008152602001600081526020016000815260200160001515815260200160001515815260200185151581526020016001548152602001600c5481525090508380156127fa57506127f83361069c565b155b1561282c574360e08201819052600f5461281391613af3565b6101008201526002546101e08201526010546102008201525b6128353361069c565b15612876576013546101e08201526014546128509043613af3565b60e08201526004546014546128659043613af3565b61286f9190613af3565b6101008201525b805160009081526009602090815260409182902083518155818401516001820180546001600160a01b0319166001600160a01b03909216919091179055918301516002830155606083015180518493926128d792600385019291019061309d565b50608082015180516128f3916004840191602090910190613102565b5060a0820151805161290f91600584019160209091019061313d565b5060c0820151805161292b916006840191602090910190613196565b5060e08281015160078301556101008084015160088401556101208401516009840155610140840151600a80850191909155610160850151600b850155610180850151600c850180546101a08801516101c089015161ffff1990921693151561ff0019169390931792151585029290921762ff0000191662010000921515929092029190911790556101e0850151600d85015561020090940151600e9093019290925583516020808601516001600160a01b0316600090815294905260409384902055830151835191840151925190923392917f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e091612a33918f918f918f918f918f90613d9b565b60405180910390a45198975050505050505050565b333014612a675760405162461bcd60e51b8152600401610c7290613b95565b600c80549082905560408051828152602081018490527fed0229422af39d4d7d33f7a27d31d6f5cb20ec628293da58dd6e8a528ed466be9101610eba565b6005612ab082611516565b6007811115612ac157612ac1613671565b14612b0e5760405162461bcd60e51b815260206004820152601c60248201527f63616e206f6e6c792062652065786563276420696620717565756564000000006044820152606401610c72565b6000818152600960205260408120600c8101805461ff001916610100179055905b6003820154811015612c6057306001600160a01b0316630825f38f836004018381548110612b5f57612b5f613c47565b9060005260206000200154846003018481548110612b7f57612b7f613c47565b6000918252602090912001546004860180546001600160a01b039092169186908110612bad57612bad613c47565b9060005260206000200154866005018681548110612bcd57612bcd613c47565b90600052602060002001876006018781548110612bec57612bec613c47565b9060005260206000200188600201546040518763ffffffff1660e01b8152600401612c1b959493929190613d62565b6000604051808303818588803b158015612c3457600080fd5b505af1158015612c48573d6000803e3d6000fd5b50505050508080612c5890613c5d565b915050612b2f565b5060405182907f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90600090a25050565b60006001612c9d84611516565b6007811115612cae57612cae613671565b14612cee5760405162461bcd60e51b815260206004820152601060248201526f1d9bdd1a5b99c81a5cc818db1bdcd95960821b6044820152606401610c72565b60028260ff161115612d365760405162461bcd60e51b8152602060048201526011602482015270696e76616c696420766f7465207479706560781b6044820152606401610c72565b6000838152600960209081526040808320601183528184206001600160a01b0389168552909252909120805460ff1615612da85760405162461bcd60e51b81526020600482015260136024820152721d9bdd195c88185b1c9958591e481d9bdd1959606a1b6044820152606401610c72565b600854600783015460405163782d6fe160e01b81526000926001600160a01b03169163782d6fe191612df2918b916004016001600160a01b03929092168252602082015260400190565b60206040518083038186803b158015612e0a57600080fd5b505afa158015612e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e429190613c1e565b905060ff8516612e6f57806001600160601b031683600a0154612e659190613af3565b600a840155612ec9565b8460ff1660011415612e9e57806001600160601b03168360090154612e949190613af3565b6009840155612ec9565b8460ff1660021415612ec957806001600160601b031683600b0154612ec39190613af3565b600b8401555b81546001600160601b03821662010000026dffffffffffffffffffffffff00001960ff88166101000261ffff199093169290921760011791909116179091559150509392505050565b60008585858585604051602001612f2d959493929190613a91565b60408051601f1981840301815282825280516020918201206000818152600b909252919020805460ff1916905591506001600160a01b0387169082907f2fffc091a501fd91bfbff27141450d3acb40fb8e6d8382b243ec7a812a3aaf8790612f9c908990899089908990613b58565b60405180910390a3505050505050565b6000612fb88242613af3565b831015612ffd5760405162461bcd60e51b815260206004820152601360248201527236bab9ba1039b0ba34b9b33c903232b630bc9760691b6044820152606401610c72565b60008787878787604051602001613018959493929190613a91565b60408051601f1981840301815282825280516020918201206000818152600b909252919020805460ff1916600117905591506001600160a01b0389169082907f76e2796dc3a81d57b0e8504b647febcbeeb5f4af818e164f11eef8131a6a763f9061308a908b908b908b908b90613b58565b60405180910390a3979650505050505050565b8280548282559060005260206000209081019282156130f2579160200282015b828111156130f257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906130bd565b506130fe9291506131ef565b5090565b8280548282559060005260206000209081019282156130f2579160200282015b828111156130f2578251825591602001919060010190613122565b82805482825590600052602060002090810192821561318a579160200282015b8281111561318a578251805161317a918491602090910190613204565b509160200191906001019061315d565b506130fe929150613277565b8280548282559060005260206000209081019282156131e3579160200282015b828111156131e357825180516131d3918491602090910190613204565b50916020019190600101906131b6565b506130fe929150613294565b5b808211156130fe57600081556001016131f0565b82805461321090613bcc565b90600052602060002090601f01602090048101928261323257600085556130f2565b82601f1061324b57805160ff19168380011785556130f2565b828001600101855582156130f257918201828111156130f2578251825591602001919060010190613122565b808211156130fe57600061328b82826132b1565b50600101613277565b808211156130fe5760006132a882826132b1565b50600101613294565b5080546132bd90613bcc565b6000825580601f106132cd575050565b601f0160209004906000526020600020908101906132eb91906131ef565b50565b60006020828403121561330057600080fd5b5035919050565b60005b8381101561332257818101518382015260200161330a565b83811115613331576000848401525b50505050565b6000815180845261334f816020860160208601613307565b601f01601f19169290920160200192915050565b6020815260006133766020830184613337565b9392505050565b80356001600160a01b038116811461339457600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156133d8576133d8613399565b604052919050565b600082601f8301126133f157600080fd5b813567ffffffffffffffff81111561340b5761340b613399565b61341e601f8201601f19166020016133af565b81815284602083860101111561343357600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561346857600080fd5b6134718661337d565b945060208601359350604086013567ffffffffffffffff8082111561349557600080fd5b6134a189838a016133e0565b945060608801359150808211156134b757600080fd5b506134c4888289016133e0565b95989497509295608001359392505050565b6000602082840312156134e857600080fd5b6133768261337d565b600081518084526020808501945080840160005b8381101561352a5781516001600160a01b031687529582019590820190600101613505565b509495945050505050565b600081518084526020808501945080840160005b8381101561352a57815187529582019590820190600101613549565b600081518084526020808501808196508360051b8101915082860160005b858110156135ad57828403895261359b848351613337565b98850198935090840190600101613583565b5091979650505050505050565b6080815260006135cd60808301876134f1565b82810360208401526135df8187613535565b905082810360408401526135f38186613565565b905082810360608401526136078185613565565b979650505050505050565b803560ff8116811461339457600080fd5b600080600080600060a0868803121561363b57600080fd5b8535945061364b60208701613612565b935061365960408701613612565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b60208101600883106136a957634e487b7160e01b600052602160045260246000fd5b91905290565b600080604083850312156136c257600080fd5b6136cb8361337d565b946020939093013593505050565b600080604083850312156136ec57600080fd5b823591506136fc60208401613612565b90509250929050565b6000806040838503121561371857600080fd5b823591506136fc6020840161337d565b6000806000806060858703121561373e57600080fd5b8435935061374e60208601613612565b9250604085013567ffffffffffffffff8082111561376b57600080fd5b818701915087601f83011261377f57600080fd5b81358181111561378e57600080fd5b8860208285010111156137a057600080fd5b95989497505060200194505050565b600067ffffffffffffffff8211156137c9576137c9613399565b5060051b60200190565b600082601f8301126137e457600080fd5b813560206137f96137f4836137af565b6133af565b82815260059290921b8401810191818101908684111561381857600080fd5b8286015b8481101561383a5761382d8161337d565b835291830191830161381c565b509695505050505050565b600082601f83011261385657600080fd5b813560206138666137f4836137af565b82815260059290921b8401810191818101908684111561388557600080fd5b8286015b8481101561383a5780358352918301918301613889565b600082601f8301126138b157600080fd5b813560206138c16137f4836137af565b82815260059290921b840181019181810190868411156138e057600080fd5b8286015b8481101561383a57803567ffffffffffffffff8111156139045760008081fd5b6139128986838b01016133e0565b8452509183019183016138e4565b600082601f83011261393157600080fd5b813560206139416137f4836137af565b82815260059290921b8401810191818101908684111561396057600080fd5b8286015b8481101561383a57803567ffffffffffffffff8111156139845760008081fd5b6139928986838b01016133e0565b845250918301918301613964565b8035801515811461339457600080fd5b60008060008060008060c087890312156139c957600080fd5b863567ffffffffffffffff808211156139e157600080fd5b6139ed8a838b016137d3565b97506020890135915080821115613a0357600080fd5b613a0f8a838b01613845565b96506040890135915080821115613a2557600080fd5b613a318a838b016138a0565b95506060890135915080821115613a4757600080fd5b613a538a838b01613920565b94506080890135915080821115613a6957600080fd5b50613a7689828a016133e0565b925050613a8560a088016139a0565b90509295509295509295565b60018060a01b038616815284602082015260a060408201526000613ab860a0830186613337565b8281036060840152613aca8186613337565b9150508260808301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115613b0657613b06613add565b500190565b6001600160e01b0319831681528151600090613b2e816004850160208701613307565b919091016004019392505050565b60008251613b4e818460208701613307565b9190910192915050565b848152608060208201526000613b716080830186613337565b8281036040840152613b838186613337565b91505082606083015295945050505050565b60208082526017908201527f6d75737420636f6d652066726f6d2074686520676f762e000000000000000000604082015260600190565b600181811c90821680613be057607f821691505b60208210811415613c0157634e487b7160e01b600052602260045260246000fd5b50919050565b600082821015613c1957613c19613add565b500390565b600060208284031215613c3057600080fd5b81516001600160601b038116811461337657600080fd5b634e487b7160e01b600052603260045260246000fd5b6000600019821415613c7157613c71613add565b5060010190565b60ff851681526001600160601b038416602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b8054600090600181811c9080831680613cdb57607f831692505b6020808410821415613cfd57634e487b7160e01b600052602260045260246000fd5b838852818015613d145760018114613d2857613d56565b60ff19861689830152604089019650613d56565b876000528160002060005b86811015613d4e5781548b8201850152908501908301613d33565b8a0183019750505b50505050505092915050565b60018060a01b038616815284602082015260a060408201526000613d8960a0830186613cc1565b8281036060840152613aca8186613cc1565b60c081526000613dae60c08301896134f1565b8281036020840152613dc08189613535565b90508281036040840152613dd48188613565565b90508281036060840152613de88187613565565b905084608084015282810360a0840152613e028185613337565b999850505050505050505056fe", + ), + ( + "0xDb53f47aC61FE54F456A4eb3E09832D08Dd7BEec", + "PoolExercise", + "6101c06040523480156200001257600080fd5b50604051620030713803806200307183398101604081905262000035916200016a565b6001600160a01b038681166101005285811660805284811660a05283811660c052821660e052600f81900b61012052858585858585620000846000808062000101602090811b6200011917901c565b6101408181525050620000a660016000806200010160201b620001191760201c565b6101608181525050620000c860026000806200010160201b620001191760201c565b6101808181525050620000ea60036000806200010160201b620001191760201c565b6101a05250620002319a5050505050505050505050565b600081600f0b6080846001600160401b0316901b60f88660078111156200012c576200012c620001f4565b6200013992911b6200020a565b6200014591906200020a565b949350505050565b80516001600160a01b03811681146200016557600080fd5b919050565b60008060008060008060c087890312156200018457600080fd5b6200018f876200014d565b95506200019f602088016200014d565b9450620001af604088016200014d565b9350620001bf606088016200014d565b9250620001cf608088016200014d565b915060a087015180600f0b8114620001e657600080fd5b809150509295509295509295565b634e487b7160e01b600052602160045260246000fd5b600082198211156200022c57634e487b7160e01b600052601160045260246000fd5b500190565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051612d6f6200030260003960008181610e1c015261137b015260008181610e420152818161135101526113f4015260008181611327015281816114b801526122c90152600081816112fe015281816113cb0152818161148f015281816114e101526122ef0152600081816103a8015281816107ed0152610cda0152600050506000818161176601526117b201526000610485015260008181611964015261212c015260005050612d6f6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063477130981461003b578063b50e7ee314610050575b600080fd5b61004e610049366004612986565b610063565b005b61004e61005e3660046129c7565b610109565b336001600160a01b038416146100f9576001600160a01b03831660009081527f1799cf914cb0cb442ca7c7ac709ee40d0cb89e87351dc08d517fbda27d50c68c6020908152604080832033845290915290205460ff166100f95760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd08185c1c1c9bdd995960a21b60448201526064015b60405180910390fd5b61010483838361015f565b505050565b6101156000838361015f565b5050565b600081600f0b60808467ffffffffffffffff16901b60f8866007811115610142576101426129e9565b61014d92911b612a15565b6101579190612a15565b949350505050565b608082901c8260006001600160a01b0386161560f883901c600481600781111561018b5761018b6129e9565b14806101a8575060068160078111156101a6576101a66129e9565b145b6101e35760405162461bcd60e51b815260206004820152600c60248201526b696e76616c6964207479706560a01b60448201526064016100f0565b8115806101f95750428567ffffffffffffffff16105b6102335760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08195e1c1a5c995960aa1b60448201526064016100f0565b6004816007811115610247576102476129e9565b149250506000610262600080516020612d1a83398151915290565b9050600061026f826104c0565b9050428667ffffffffffffffff16101561029a576102978267ffffffffffffffff8816610526565b90505b82806102be5750836102b45784600f0b81600f0b126102be565b84600f0b81600f0b135b6102f45760405162461bcd60e51b81526020600482015260076024820152666e6f742049544d60c81b60448201526064016100f0565b6000841561033a5785600f0b82600f0b1315610335576103328861032984610320600f82900b8b61061e565b600f0b90610659565b600f0b906106b1565b90505b610367565b85600f0b82600f0b12156103675761036461035d89610329600f8a900b8661061e565b8490610719565b90505b6000841561038c5761037b89838c89610754565b6103859082612a15565b9050610454565b6103978b8b8b6108cb565b600082156103ff576103d58c6103d07f0000000000000000000000000000000000000000000000000000000000000000600f0b866106b1565b610a5d565b90506103e18183612a15565b91506103ff8c6103f089610a8c565b6103fa8487612a2d565b610ae1565b604080518c8152602081018c9052908101849052606081018290526001600160a01b038d16907f31939b125e073bbdbf69ac6eb0cb59489894a9bea509d658589af5917b53cca19060800160405180910390a2505b610474898361046e6104678a6000610bb1565b8c8c610119565b89610be4565b61047e9082612a15565b90506104b37f00000000000000000000000000000000000000000000000000000000000000006104ad88610e13565b83610e67565b5050505050505050505050565b60004282600c015414156104de576104d88242610e82565b92915050565b6104e782610eb0565b90506104f38242610e82565b600f0b61050557610505824283610fd3565b42600c830155610516826001611051565b610521826000611051565b919050565b600080610535610e1084612a5a565b600881901c6000818152601287016020526040812054929350909160ff84169190821b821c90610568620e100042612a5a565b90505b811580156105795750808411155b156105a65760128801600061058d86612a7c565b955085815260200190815260200160002054915061056b565b600060805b80156105d25783811c156105ca576105c38183612a15565b93811c9391505b60011c6105ab565b5060118901600060018360086105e88a84612a15565b6105f392911b612a2d565b6105fd9190612a2d565b8152602081019190915260400160002054600f0b9998505050505050505050565b6000600f82810b9084900b0360016001607f1b03198112801590610649575060016001607f1b038113155b61065257600080fd5b9392505050565b600081600f0b6000141561066c57600080fd5b600082600f0b604085600f0b901b8161068757610687612a44565b05905060016001607f1b03198112801590610649575060016001607f1b0381131561065257600080fd5b6000816106c0575060006104d8565b600083600f0b12156106d157600080fd5b600f83900b6001600160801b038316810260401c90608084901c026001600160c01b0381111561070057600080fd5b60401b811981111561071157600080fd5b019392505050565b600080610737838560030160149054906101000a900460ff166110e1565b9050610157818560030160159054906101000a900460ff166110f7565b60008281527fb31c2c74f86ca3ce94d901f5f5bbe66f7161eec2f7b5aa0b75a86371436424eb602052604081205b85156108c25760006107a9600161079884611112565b6107a29190612a2d565b839061111c565b905060006107b78287611128565b9050878111156107c45750865b600080881561084657896107d8848b612a97565b6107e29190612a5a565b9150610815846103d07f0000000000000000000000000000000000000000000000000000000000000000600f0b856106b1565b90506108218187612a15565b955061082d828a612a2d565b98506108468461083c89610a8c565b6103fa8486612a2d565b610850838b612a2d565b99506001600160a01b0384167f31939b125e073bbdbf69ac6eb0cb59489894a9bea509d658589af5917b53cca189856108898587612a2d565b604080519384526020840192909252908201526060810184905260800160405180910390a26108b98489856108cb565b50505050610782565b50949350505050565b6001600160a01b03831661092d5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016100f0565b61095b3384600061093d866111db565b610946866111db565b60405180602001604052806000815250611226565b60008281527f1799cf914cb0cb442ca7c7ac709ee40d0cb89e87351dc08d517fbda27d50c68b602090815260408083206001600160a01b038716845291829052909120548211156109fc5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015264616e63657360d81b60648201526084016100f0565b6001600160a01b03841660008181526020838152604080832080548790039055805187815291820186905291929133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a450505050565b600080610a6984611762565b9050612710610a788285612a97565b610a829190612a5a565b6101579084612a2d565b600081610ab157600080516020612d1a833981519152546001600160a01b03166104d8565b50507fbbd6af8edd89d04327b00c29df7f272b9b1ae01bf6d9c54a784f935706df52ec546001600160a01b031690565b80610aeb57505050565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820183905283169063a9059cbb90604401602060405180830381600087803b158015610b3557600080fd5b505af1158015610b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6d9190612ab6565b6101045760405162461bcd60e51b8152602060048201526015602482015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b60448201526064016100f0565b60008215610bcf5781610bc5576005610bc8565b60045b90506104d8565b81610bdb576007610652565b60069392505050565b60008281527fb31c2c74f86ca3ce94d901f5f5bbe66f7161eec2f7b5aa0b75a86371436424eb60205260408120835b8615610e09576000610c3a6001610c2985611112565b610c339190612a2d565b849061111c565b90506000610c488288611128565b905088811115610c555750875b600089610c62838b612a97565b610c6c9190612a5a565b9050610c78818a612a2d565b9850610c84828b612a2d565b9950600087610cc35781610cb4610c9f600f88900b866106b1565b600080516020612d1a83398151915290610719565b610cbe9190612a2d565b610ccd565b610ccd8284612a2d565b90506000610d02856103d07f0000000000000000000000000000000000000000000000000000000000000000600f0b856106b1565b9050610d0e8189612a15565b975082610d2a600080516020612d1a833981519152878c61182c565b15610d5457610d4386610d3d8486612a2d565b8c611869565b610d4d8282612a15565b9050610d7d565b610d7086610d618c610e13565b610d6b8587612a2d565b610e67565b610d7a8382612a15565b90505b610d97600080516020612d1a833981519152878c8461192c565b610da2868c876108cb565b6001600160a01b0386167f69a2ef6bf9e7ff92cbf1b71963ba1751b1abe8f99e3b3aae2ab99e416df614938c610dd88587612a2d565b60408051928352602083019190915281018890526060810185905260800160405180910390a2505050505050610c13565b5050949350505050565b600081610e40577f00000000000000000000000000000000000000000000000000000000000000006104d8565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b61010483838360405180602001604052806000815250611a6c565b60006011830181610e95610e1085612a5a565b8152602081019190915260400160002054600f0b9392505050565b6000808260030160009054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0357600080fd5b505afa158015610f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b9190612ad8565b905060008360020160009054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8f57600080fd5b505afa158015610fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc79190612ad8565b90506101578282611b93565b6000610fe1610e1084612a5a565b6000818152601186016020526040902080546001600160801b0319166001600160801b038516179055905061101a60ff80831690612a2d565b6001901b846012016000600884901c815260200190815260200160002060008282546110469190612a15565b909155505050505050565b80151560009081526013830160205260409020805415806110725750805442105b1561107c57505050565b60006110888484611c2e565b90506110c384826110bd6110b286600101546110ad898b611c9890919063ffffffff16565b6110e1565b600f86900b90611cc6565b86611cf9565b50501515600090815260139091016020526040812081815560010155565b6000610652836110f284600a612bd5565b611d76565b600061065261110783600a612bd5565b600f85900b906106b1565b60006104d8825490565b60006106528383611dad565b60006001600160a01b0383166111945760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016100f0565b7f1799cf914cb0cb442ca7c7ac709ee40d0cb89e87351dc08d517fbda27d50c68b6000928352602090815260408084206001600160a01b0395909516845293905250205490565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061121557611215612be4565b602090810291909101015292915050565b611234868686868686611e33565b600080516020612d1a83398151915260005b845181101561175857600085828151811061126357611263612be4565b60200260200101519050600085838151811061128157611281612be4565b60200260200101519050806000141561129b575050611746565b6001600160a01b0389166112b8576112b66015850183612011565b505b6001600160a01b0388161580156112e857506000828152600080516020612cfa8339815191526020526040902054155b156112fc576112fa601585018361201d565b505b7f000000000000000000000000000000000000000000000000000000000000000082148061134957507f000000000000000000000000000000000000000000000000000000000000000082145b8061137357507f000000000000000000000000000000000000000000000000000000000000000082145b8061139d57507f000000000000000000000000000000000000000000000000000000000000000082145b1561148d576001600160a01b038916158015906113c257506001600160a01b03881615155b1561148d5760007f000000000000000000000000000000000000000000000000000000000000000083148061141657507f000000000000000000000000000000000000000000000000000000000000000083145b6001600160a01b038b166000908152600d870160209081526040808320841515845290915290205490915042906114509062015180612a15565b1061148b5760405162461bcd60e51b815260206004820152600b60248201526a1b1a5c481b1bd8dac80c5960aa1b60448201526064016100f0565b505b7f00000000000000000000000000000000000000000000000000000000000000008214806114da57507f000000000000000000000000000000000000000000000000000000000000000082145b15611682577f00000000000000000000000000000000000000000000000000000000000000008214600061150e8683612029565b90506001600160a01b038b161561163857600061152b8c86611128565b9050818111801561154557506115418285612a15565b8111155b156115dd576001600160a01b038c166000908152601488016020908152604080832086151580855260138c01845282852054855290835281842090845290915290205484906115949083612a2d565b10156115d25760405162461bcd60e51b815260206004820152600d60248201526c496e7375662062616c616e636560981b60448201526064016100f0565b6115dd878d85612043565b6001600160a01b038b161561163657611611878d858c8a8151811061160457611604612be4565b602002602001015161192c565b611636878c858c8a8151811061162957611629612be4565b60200260200101516120f4565b505b6001600160a01b038a161561167f5760006116538b86611128565b905081811115801561166d57508161166b8583612a15565b115b1561167d5761167d878c85612218565b505b50505b60f882901c826001600160a01b038b16158015906116a857506001600160a01b038a1615155b80156116e0575060058260078111156116c3576116c36129e9565b14806116e0575060078260078111156116de576116de6129e9565b145b1561174157600060058360078111156116fb576116fb6129e9565b1490506000816117225761171d611716600f85900b876106b1565b8990610719565b611724565b845b9050611732888e848461192c565b61173e888d84846120f4565b50505b505050505b8061175081612a7c565b915050611246565b5050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615610521576040516303793c8d60e11b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906306f2791a9060240160206040518083038186803b1580156117f457600080fd5b505afa158015611808573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d89190612ad8565b6001600160a01b0382166000908152600e840160209081526040808320841515845290915281205480158061186057504281115b95945050505050565b600080516020612d1a83398151915261188b84611885846122c0565b85610e67565b60006101048061189b8142612a5a565b6118a59190612a97565b6118af9190612a15565b6001600160a01b03861660009081526014840160209081526040808320848452825280832087151584529091528120805492935086929091906118f3908490612a15565b90915550508215156000908152601383016020526040812060018101805491928792611920908490612a15565b90915550505550505050565b6001600160a01b03808416600090815260178601602090815260408083208615158452825280832054601889019092529091205490917f00000000000000000000000000000000000000000000000000000000000000001663edaf7d5b863087866119978982612a2d565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015290151560448401526064830152608482015260a4810184905260c401600060405180830381600087803b1580156119fa57600080fd5b505af1158015611a0e573d6000803e3d6000fd5b505050508282611a1e9190612a2d565b6001600160a01b038616600090815260178801602090815260408083208815158452909152902055611a508382612a2d565b9315156000908152601890960160205250506040909320555050565b6001600160a01b038416611acc5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016100f0565b611aeb33600086611adc876111db565b611ae5876111db565b86611226565b60008381527f1799cf914cb0cb442ca7c7ac709ee40d0cb89e87351dc08d517fbda27d50c68b602090815260408083206001600160a01b0388168452918290528220805491928592611b3e908490612a15565b909155505060408051858152602081018590526001600160a01b0387169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b600081611b9f57600080fd5b600080841215611bb457836000039350600190505b6000831215611bc65760009290920391155b6000611bd28585612314565b90508115611c00576001607f1b816001600160801b03161115611bf457600080fd5b60000391506104d89050565b60016001607f1b03816001600160801b03161115611c1d57600080fd5b91506104d89050565b505092915050565b600080611c4b83611c40576001611c43565b60005b600080610119565b831515600090815260138601602052604090206001015490915061015790600080516020612cfa83398151915260008481526020919091526040902054611c929190612a2d565b6110ad86865b600081611cb3576003830154600160a81b900460ff16610652565b505060030154600160a01b900460ff1690565b6000600f83810b9083900b0160016001607f1b03198112801590610649575060016001607f1b0381131561065257600080fd5b6000611d058583612476565b90506000611d16868387878761248f565b9050611d23868285612595565b60408051600f83810b825287810b602083015286900b818301529051841515917f4e23621c6f591f14bf9505cb8326b45af9dc6c5569fd608de2a7a2ddd6146b2e919081900360600190a2505050505050565b600081611d8257600080fd5b6000611d8e8484612314565b905060016001607f1b036001600160801b038216111561065257600080fd5b81546000908210611e0b5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016100f0565b826000018281548110611e2057611e20612be4565b9060005260206000200154905092915050565b836001600160a01b0316856001600160a01b031614612009576001600160a01b0385811660009081527fb31c2c74f86ca3ce94d901f5f5bbe66f7161eec2f7b5aa0b75a86371436424ec602052604080822092871682528120600080516020612cfa833981519152927fb31c2c74f86ca3ce94d901f5f5bbe66f7161eec2f7b5aa0b75a86371436424eb929091905b87518110156104b3576000878281518110611edf57611edf612be4565b602002602001015190506000811115611ff6576000898381518110611f0657611f06612be4565b6020026020010151905060006001600160a01b03168c6001600160a01b03161415611f545760008181526020889052604081208054849290611f49908490612a15565b90915550611f8a9050565b81611f5f8d83611128565b1415611f8a576000818152602087905260409020611f7d908d6125ec565b50611f88858261201d565b505b6001600160a01b038b16611fc15760008181526020889052604081208054849290611fb6908490612a2d565b90915550611ff49050565b611fcb8b82611128565b611ff4576000818152602087905260409020611fe7908c612601565b50611ff28482612011565b505b505b508061200181612a7c565b915050611ec2565b505050505050565b60006106528383612612565b60006106528383612661565b60008161203a578260040154610652565b50506005015490565b6001600160a01b03821661205657600080fd5b8015156000908152600f8401602090815260408083206010870190925290912061208184838361274c565b61208c575050505050565b6001600160a01b0393841660008181526020838152604080832080549683528184208054978a16808652838620805499909b166001600160a01b0319998a168117909b5599855295909252822080548616909717909655528054821690558254169091555050565b6001600160a01b03808416600090815260178601602090815260408083208615158452825280832054601889019092529091205490917f00000000000000000000000000000000000000000000000000000000000000001663edaf7d5b8630878661215f8982612a15565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015290151560448401526064830152608482015260a4810184905260c401600060405180830381600087803b1580156121c257600080fd5b505af11580156121d6573d6000803e3d6000fd5b5050505082826121e69190612a15565b6001600160a01b038616600090815260178801602090815260408083208815158452909152902055611a508382612a15565b6001600160a01b03821661222b57600080fd5b8015156000908152600f8401602090815260408083206010870190925290912061225684838361274c565b15612262575050505050565b60008080526020828152604080832080546001600160a01b0390811680865296845282852080546001600160a01b03199081169a909216998a1790558885529490925282208054841690941790935580528154169092179091555050565b6000816122ed577f00000000000000000000000000000000000000000000000000000000000000006104d8565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b60008161232057600080fd5b60006001600160c01b03841161234b5782604085901b8161234357612343612a44565b049050612462565b60c084811c6401000000008110612364576020918201911c5b620100008110612376576010918201911c5b6101008110612387576008918201911c5b60108110612397576004918201911c5b600481106123a7576002918201911c5b600281106123b6576001820191505b60bf820360018603901c6001018260ff0387901b816123d7576123d7612a44565b0492506001600160801b038311156123ee57600080fd5b608085901c83026001600160801b038616840260c088901c604089901b8281101561241a576001820391505b608084901b92900382811015612431576001820391505b829003608084901c821461244757612447612bfa565b88818161245657612456612a44565b04870196505050505050505b6001600160801b0381111561065257600080fd5b60006124828383612798565b90506106528382846127bf565b600080826124a4576019870154600f0b6124b4565b6019870154600160801b9004600f0b5b905080600f0b600014156124cc57506008860154600f0b5b60405163e101a89b60e01b8152600f87810b600483015286810b602483015285810b604483015282900b6064820152730f6e8ef18fb5bb61d545fee60f779d8aed60408f9063e101a89b9060840160206040518083038186803b15801561253257600080fd5b505af4158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a9190612c10565b915067b33333333333333382600f0b121561258b5767b33333333333333391505b5095945050505050565b80156125c5576009830180546001600160801b0384166001600160801b031990911617905542600b840155505050565b6008830180546001600160801b03808516600160801b02911617905542600a840155505050565b6000610652836001600160a01b038416612661565b6000610652836001600160a01b0384165b6000818152600183016020526040812054612659575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104d8565b5060006104d8565b60008181526001830160205260408120548015612742576000612685600183612a2d565b8554909150600090869061269b90600190612a2d565b815481106126ab576126ab612be4565b90600052602060002001549050808660000183815481106126ce576126ce612be4565b6000918252602090912001556126e5826001612a15565b6000828152600188016020526040902055855486908061270757612707612c33565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104d8565b60009150506104d8565b6001600160a01b0383811660009081526020849052604081205490911615158061015757506000808052602083905260409020546001600160a01b039081169085161490509392505050565b6000816127b3576008830154600160801b9004600f0b610652565b505060090154600f0b90565b600080826127d15784600a01546127d7565b84600b01545b6127e19042612a2d565b905061a8c0811115612800576127f961a8c082612a2d565b9050612809565b83915050610652565b600061281782613840611d76565b9050600061282a85611c40576001611c43565b851515600090815260188901602090815260408083205460138c01835281842060010154858552600080516020612cfa83398151915290935290832054939450926128889161287891612a2d565b6128829084612a2d565b83611d76565b6040805161012081018252600f87810b82528b810b602083015283900b8183015267b333333333333333606082015267e666666666666666608082018190526801000000000000000060a0830181905260c083015260e082015268056fc2a2c515da32ea6101008201529051634916d70d60e01b8152919250730f6e8ef18fb5bb61d545fee60f779d8aed60408f91634916d70d9161292991600401612c49565b60206040518083038186803b15801561294157600080fd5b505af4158015612955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129799190612c10565b9998505050505050505050565b60008060006060848603121561299b57600080fd5b83356001600160a01b03811681146129b257600080fd5b95602085013595506040909401359392505050565b600080604083850312156129da57600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115612a2857612a286129ff565b500190565b600082821015612a3f57612a3f6129ff565b500390565b634e487b7160e01b600052601260045260246000fd5b600082612a7757634e487b7160e01b600052601260045260246000fd5b500490565b6000600019821415612a9057612a906129ff565b5060010190565b6000816000190483118215151615612ab157612ab16129ff565b500290565b600060208284031215612ac857600080fd5b8151801515811461065257600080fd5b600060208284031215612aea57600080fd5b5051919050565b600181815b80851115612b2c578160001904821115612b1257612b126129ff565b80851615612b1f57918102915b93841c9390800290612af6565b509250929050565b600082612b43575060016104d8565b81612b50575060006104d8565b8160018114612b665760028114612b7057612b8c565b60019150506104d8565b60ff841115612b8157612b816129ff565b50506001821b6104d8565b5060208310610133831016604e8410600b8410161715612baf575081810a6104d8565b612bb98383612af1565b8060001904821115612bcd57612bcd6129ff565b029392505050565b600061065260ff841683612b34565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b600060208284031215612c2257600080fd5b815180600f0b811461065257600080fd5b634e487b7160e01b600052603160045260246000fd5b6000610120820190508251600f0b82526020830151600f0b60208301526040830151612c7a6040840182600f0b9052565b506060830151612c8f6060840182600f0b9052565b506080830151612ca46080840182600f0b9052565b5060a0830151612cb960a0840182600f0b9052565b5060c0830151612cce60c0840182600f0b9052565b5060e0830151612ce360e0840182600f0b9052565b5061010080840151611c2682850182600f0b905256feb31c2c74f86ca3ce94d901f5f5bbe66f7161eec2f7b5aa0b75a86371436424eabbd6af8edd89d04327b00c29df7f272b9b1ae01bf6d9c54a784f935706df52eb", + ), + ( + "0x71356E37e0368Bd10bFDbF41dC052fE5FA24cD05", + "MainchainGatewayV2", + "608060405234801561001057600080fd5b506000805460ff1916905561582e806200002b6000396000f3fe60806040526004361061032d5760003560e01c80639157921c116101a5578063b2975794116100ec578063d547741f11610095578063dafae4081161006f578063dafae4081461096e578063dff525e11461098e578063e400327c146109ae578063e75235b8146109ce5761033c565b8063d547741f14610901578063d55ed10314610921578063d64af2a61461094e5761033c565b8063cdb67444116100c6578063cdb674441461089c578063cdf64a76146108b4578063d19773d2146108d45761033c565b8063b29757941461082f578063b9c362091461085c578063ca15c8731461087c5761033c565b8063a3912ec81161014e578063affed0e011610128578063affed0e0146107cc578063b1a2567e146107e2578063b1d08a03146108025761033c565b8063a3912ec81461033a578063ab7965661461077f578063ac78dfe8146107ac5761033c565b8063994390891161017f57806399439089146107155780639dcc4da314610735578063a217fddf1461076a5761033c565b80639157921c1461068f57806391d14854146106af57806393c5678f146106f55761033c565b806336568abe116102745780635c975abb1161021d5780637de5dedd116101f75780637de5dedd146106115780638456cb59146106265780638f34e3471461063b5780639010d07c1461066f5761033c565b80635c975abb146105ac5780636932be98146105c45780636c1ce670146105f15761033c565b80634d0d66731161024e5780634d0d66731461052f5780634d493f4e1461054f57806359122f6b1461057f5761033c565b806336568abe146104e75780633f4ba83a146105075780634b14557e1461051c5761033c565b80631d4a7210116102d65780632f2ff15d116102b05780632f2ff15d1461049b578063302d12db146104bb5780633644e515146104d25761033c565b80631d4a721014610428578063248a9ca3146104555780632dfdf0b5146104855761033c565b8063180ff1e911610307578063180ff1e9146103d55780631a8e55b0146103e85780631b6e7594146104085761033c565b806301ffc9a71461034457806317ce2dd41461037957806317fcb39b1461039d5761033c565b3661033c5761033a6109e6565b005b61033a6109e6565b34801561035057600080fd5b5061036461035f366004614843565b610a69565b60405190151581526020015b60405180910390f35b34801561038557600080fd5b5061038f60755481565b604051908152602001610370565b3480156103a957600080fd5b506074546103bd906001600160a01b031681565b6040516001600160a01b039091168152602001610370565b61033a6103e33660046148f4565b610aad565b3480156103f457600080fd5b5061033a6104033660046149e6565b610dbd565b34801561041457600080fd5b5061033a610423366004614a52565b610e8f565b34801561043457600080fd5b5061038f610443366004614aec565b603e6020526000908152604090205481565b34801561046157600080fd5b5061038f610470366004614b09565b60009081526072602052604090206001015490565b34801561049157600080fd5b5061038f60765481565b3480156104a757600080fd5b5061033a6104b6366004614b22565b610f64565b3480156104c757600080fd5b5061038f620f424081565b3480156104de57600080fd5b5060775461038f565b3480156104f357600080fd5b5061033a610502366004614b22565b610f8f565b34801561051357600080fd5b5061033a61101b565b61033a61052a366004614b52565b611083565b34801561053b57600080fd5b5061036461054a366004614b7d565b6110e1565b34801561055b57600080fd5b5061036461056a366004614b09565b607a6020526000908152604090205460ff1681565b34801561058b57600080fd5b5061038f61059a366004614aec565b603a6020526000908152604090205481565b3480156105b857600080fd5b5060005460ff16610364565b3480156105d057600080fd5b5061038f6105df366004614b09565b60796020526000908152604090205481565b3480156105fd57600080fd5b5061036461060c366004614c06565b61118c565b34801561061d57600080fd5b5061038f61119f565b34801561063257600080fd5b5061033a611234565b34801561064757600080fd5b5061038f7f5e5712e902fff5e704bc4d506ad976718319e019e9d2a872528a01a85db433e481565b34801561067b57600080fd5b506103bd61068a366004614c32565b61129c565b34801561069b57600080fd5b5061033a6106aa366004614c54565b6112b4565b3480156106bb57600080fd5b506103646106ca366004614b22565b60009182526072602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561070157600080fd5b5061033a6107103660046149e6565b6115ca565b34801561072157600080fd5b506003546103bd906001600160a01b031681565b34801561074157600080fd5b50610755610750366004614c32565b611696565b60408051928352602083019190915201610370565b34801561077657600080fd5b5061038f600081565b34801561078b57600080fd5b5061038f61079a366004614aec565b603c6020526000908152604090205481565b3480156107b857600080fd5b506103646107c7366004614b09565b61172f565b3480156107d857600080fd5b5061038f60045481565b3480156107ee57600080fd5b5061033a6107fd3660046149e6565b6117ce565b34801561080e57600080fd5b5061038f61081d366004614aec565b60396020526000908152604090205481565b34801561083b57600080fd5b5061084f61084a366004614aec565b61189a565b6040516103709190614ca5565b34801561086857600080fd5b50610755610877366004614c32565b611992565b34801561088857600080fd5b5061038f610897366004614b09565b611a17565b3480156108a857600080fd5b50603754603854610755565b3480156108c057600080fd5b5061033a6108cf366004614aec565b611a2e565b3480156108e057600080fd5b5061038f6108ef366004614aec565b603b6020526000908152604090205481565b34801561090d57600080fd5b5061033a61091c366004614b22565b611a97565b34801561092d57600080fd5b5061038f61093c366004614aec565b603d6020526000908152604090205481565b34801561095a57600080fd5b5061033a610969366004614aec565b611abd565b34801561097a57600080fd5b50610364610989366004614b09565b611b26565b34801561099a57600080fd5b5061033a6109a9366004614cd2565b611bbd565b3480156109ba57600080fd5b5061033a6109c93660046149e6565b611cc7565b3480156109da57600080fd5b50600154600254610755565b60005460ff1615610a315760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b6074546001600160a01b03163314610a6757610a4b614802565b338152604080820151349101528051610a65908290611d93565b505b565b60006001600160e01b031982167f5a05180f000000000000000000000000000000000000000000000000000000001480610aa75750610aa78261210a565b92915050565b607154610100900460ff16610ac85760715460ff1615610acc565b303b155b610b3e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a28565b607154610100900460ff16158015610b60576071805461ffff19166101011790555b610b6b60008d612171565b6075899055610b798b61217b565b610b828a6121dd565b610c29604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f159f52c1e3a2b6a6aad3950adf713516211484e0516dad685ea662a094b7c43b918101919091527fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a560608201524660808201523060a082015260c00160408051601f198184030181529190528051602090910120607755565b610c338887612238565b5050610c3f87876122f8565b5050610c496123d3565b6000610c558680614da6565b90501115610d1657610c7e610c6a8680614da6565b610c776020890189614da6565b8787612467565b610ca4610c8b8680614da6565b8660005b602002810190610c9f9190614da6565b612666565b610cca610cb18680614da6565b8660015b602002810190610cc59190614da6565b612779565b610cf0610cd78680614da6565b8660025b602002810190610ceb9190614da6565b61288c565b610d16610cfd8680614da6565b8660035b602002810190610d119190614da6565b612a30565b60005b610d266040870187614da6565b9050811015610d9c57610d8a7f5e5712e902fff5e704bc4d506ad976718319e019e9d2a872528a01a85db433e4610d606040890189614da6565b84818110610d7057610d70614d90565b9050602002016020810190610d859190614aec565b612b43565b80610d9481614e06565b915050610d19565b508015610daf576071805461ff00191690555b505050505050505050505050565b6000805160206157b9833981519152546001600160a01b03163314610e1d5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b82610e7d5760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b610e8984848484612779565b50505050565b6000805160206157b9833981519152546001600160a01b03163314610eef5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b84610f4e5760405162461bcd60e51b815260206004820152602960248201527f4d61696e636861696e4761746577617956323a20717565727920666f7220656d60448201526870747920617272617960b81b6064820152608401610a28565b610f5c868686868686612467565b505050505050565b600082815260726020526040902060010154610f808133612b65565b610f8a8383612b43565b505050565b6001600160a01b038116331461100d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610a28565b6110178282612be5565b5050565b6000805160206157b9833981519152546001600160a01b0316331461107b5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b610a67612c07565b60005460ff16156110c95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a28565b610a656110db36839003830183614ec0565b33611d93565b6000805460ff16156111285760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a28565b611184848484808060200260200160405190810160405280939291908181526020016000905b8282101561117a5761116b60608302860136819003810190614f13565b8152602001906001019061114e565b5050505050612ca3565b949350505050565b600061119883836133bc565b9392505050565b600061122f600360009054906101000a90046001600160a01b03166001600160a01b031663926323d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156111f257600080fd5b505afa158015611206573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122a9190614f89565b613480565b905090565b6000805160206157b9833981519152546001600160a01b031633146112945760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b610a676134b6565b60008281526073602052604081206111989083613531565b7f5e5712e902fff5e704bc4d506ad976718319e019e9d2a872528a01a85db433e46112df8133612b65565b60006112f86112f336859003850185614ff0565b61353d565b905061130c6112f336859003850185614ff0565b8335600090815260796020526040902054146113765760405162461bcd60e51b815260206004820152602360248201527f4d61696e636861696e4761746577617956323a20696e76616c696420726563656044820152621a5c1d60ea1b6064820152608401610a28565b82356000908152607a602052604090205460ff166113fc5760405162461bcd60e51b815260206004820152603160248201527f4d61696e636861696e4761746577617956323a20717565727920666f7220617060448201527f70726f766564207769746864726177616c0000000000000000000000000000006064820152608401610a28565b82356000908152607a602052604090819020805460ff19169055517fd639511b37b3b002cca6cfe6bca0d833945a5af5a045578a0627fc43b79b26309061144690839086906150c4565b60405180910390a160006114606080850160608601614aec565b9050600061147661012086016101008701615151565b600181111561148757611487614c71565b141561154f5760006114a2368690038601610100870161516e565b6001600160a01b0383166000908152603b60205260409020549091506114ce90610140870135906135c6565b604082015260006114e8368790038701610100880161516e565b60408301519091506114ff9061014088013561518a565b604082015260745461151f908390339086906001600160a01b03166135e0565b6115486115326060880160408901614aec565b60745483919086906001600160a01b03166135e0565b505061158b565b61158b6115626060860160408701614aec565b60745483906001600160a01b03166115833689900389016101008a0161516e565b9291906135e0565b7f21e88e956aa3e086f6388e899965cef814688f99ad8bb29b08d396571016372d82856040516115bc9291906150c4565b60405180910390a150505050565b6000805160206157b9833981519152546001600160a01b0316331461162a5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b8261168a5760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b610e8984848484612666565b6000806116b86000805160206157b9833981519152546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146117115760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b61171b84846122f8565b90925090506117286123d3565b9250929050565b6003546040805163926323d560e01b815290516000926001600160a01b03169163926323d5916004808301926020929190829003018186803b15801561177457600080fd5b505afa158015611788573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ac9190614f89565b6037546117b991906151a1565b6038546117c690846151a1565b101592915050565b6000805160206157b9833981519152546001600160a01b0316331461182e5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b8261188e5760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b610e898484848461288c565b60408051808201909152600080825260208201526001600160a01b0382166000908152607860205260409081902081518083019092528054829060ff1660018111156118e8576118e8614c71565b60018111156118f9576118f9614c71565b815290546001600160a01b036101009091048116602092830152908201519192501661198d5760405162461bcd60e51b815260206004820152602560248201527f4d61696e636861696e4761746577617956323a20756e737570706f727465642060448201527f746f6b656e0000000000000000000000000000000000000000000000000000006064820152608401610a28565b919050565b6000806119b46000805160206157b9833981519152546001600160a01b031690565b6001600160a01b0316336001600160a01b031614611a0d5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b61171b8484612238565b6000818152607360205260408120610aa790613a13565b6000805160206157b9833981519152546001600160a01b03163314611a8e5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b610a65816121dd565b600082815260726020526040902060010154611ab38133612b65565b610f8a8383612be5565b6000805160206157b9833981519152546001600160a01b03163314611b1d5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b610a658161217b565b6003546040805163926323d560e01b815290516000926001600160a01b03169163926323d5916004808301926020929190829003018186803b158015611b6b57600080fd5b505afa158015611b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba39190614f89565b600154611bb091906151a1565b6002546117c690846151a1565b6000805160206157b9833981519152546001600160a01b03163314611c1d5760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b85611c7c5760405162461bcd60e51b815260206004820152602960248201527f4d61696e636861696e4761746577617956323a20717565727920666f7220656d60448201526870747920617272617960b81b6064820152608401610a28565b611c8a878787878787612467565b611c978787836000610c8f565b611ca48787836001610cb5565b611cb18787836002610cdb565b611cbe8787836003610d01565b50505050505050565b6000805160206157b9833981519152546001600160a01b03163314611d275760405162461bcd60e51b815260206004820152602260248201526000805160206157d983398151915260448201526132b960f11b6064820152608401610a28565b82611d875760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b610e8984848484612a30565b604080518082018252600080825260208201526074549184015190916001600160a01b031690611dc290613a1d565b60208401516001600160a01b0316611ee1573484604001516040015114611e375760405162461bcd60e51b815260206004820152602360248201527f4d61696e636861696e4761746577617956323a20696e76616c69642072657175604482015262195cdd60ea1b6064820152608401610a28565b611e408161189a565b6040850151519092506001811115611e5a57611e5a614c71565b82516001811115611e6d57611e6d614c71565b14611ecd5760405162461bcd60e51b815260206004820152602a60248201527f4d61696e636861696e4761746577617956323a20696e76616c696420746f6b656044820152691b881cdd185b99185c9960b21b6064820152608401610a28565b6001600160a01b0381166020850152612087565b3415611f3b5760405162461bcd60e51b815260206004820152602360248201527f4d61696e636861696e4761746577617956323a20696e76616c69642072657175604482015262195cdd60ea1b6064820152608401610a28565b611f48846020015161189a565b6040850151519092506001811115611f6257611f62614c71565b82516001811115611f7557611f75614c71565b14611fd55760405162461bcd60e51b815260206004820152602a60248201527f4d61696e636861696e4761746577617956323a20696e76616c696420746f6b656044820152691b881cdd185b99185c9960b21b6064820152608401610a28565b60208401516040850151611fec9185903090613ac7565b83602001516001600160a01b0316816001600160a01b031614156120875760408481015181015190517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b03821690632e1a7d4d90602401600060405180830381600087803b15801561206e57600080fd5b505af1158015612082573d6000803e3d6000fd5b505050505b607680546000918261209883614e06565b91905055905060006120bf858386602001516075548a613ce190949392919063ffffffff16565b90507fd7b25068d9dc8d00765254cfb7f5070f98d263c8d68931d937c7362fa738048b6120eb8261353d565b826040516120fa9291906151c0565b60405180910390a1505050505050565b60006001600160e01b031982167f7965db0b000000000000000000000000000000000000000000000000000000001480610aa757507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610aa7565b6110178282612b43565b6074805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f9d2334c23be647e994f27a72c5eee42a43d5bdcfe15bb88e939103c2b114cbaf906020015b60405180910390a150565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fef40dc07567635f84f5edbd2f8dbc16b40d9d282dd8e7e6f4ff58236b6836169906020016121d2565b6000808284111561228b5760405162461bcd60e51b815260206004820152601c60248201527f4761746577617956323a20696e76616c6964207468726573686f6c64000000006044820152606401610a28565b505060018054600280549285905583905560048054919291849186919060006122b383614e06565b9091555060408051868152602081018690527f976f8a9c5bdf8248dec172376d6e2b80a8e3df2f0328e381c6db8e1cf138c0f891015b60405180910390a49250929050565b600080828411156123715760405162461bcd60e51b815260206004820152602760248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c696420746860448201527f726573686f6c64000000000000000000000000000000000000000000000000006064820152608401610a28565b5050603780546038805492859055839055600480549192918491869190600061239983614e06565b9091555060408051868152602081018690527f31312c97b89cc751b832d98fd459b967a2c3eef3b49757d1cf5ebaa12bb6eee191016122e9565b6002546037546123e391906151a1565b6038546001546123f391906151a1565b1115610a675760405162461bcd60e51b815260206004820152602860248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c696420746860448201527f726573686f6c64730000000000000000000000000000000000000000000000006064820152608401610a28565b848314801561247557508481145b6124e75760405162461bcd60e51b815260206004820152602860248201527f4d61696e636861696e4761746577617956323a20696e76616c6964206172726160448201527f79206c656e6774680000000000000000000000000000000000000000000000006064820152608401610a28565b60005b8581101561262c5784848281811061250457612504614d90565b90506020020160208101906125199190614aec565b6078600089898581811061252f5761252f614d90565b90506020020160208101906125449190614aec565b6001600160a01b039081168252602082019290925260400160002080547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010093909216929092021790558282828181106125a3576125a3614d90565b90506020020160208101906125b89190615151565b607860008989858181106125ce576125ce614d90565b90506020020160208101906125e39190614aec565b6001600160a01b031681526020810191909152604001600020805460ff19166001838181111561261557612615614c71565b02179055508061262481614e06565b9150506124ea565b507fa4f03cc9c0e0aeb5b71b4ec800702753f65748c2cf3064695ba8e8b46be704448686868686866040516120fa969594939291906152c1565b8281146126c85760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b60005b83811015612743578282828181106126e5576126e5614d90565b905060200201356039600087878581811061270257612702614d90565b90506020020160208101906127179190614aec565b6001600160a01b031681526020810191909152604001600020558061273b81614e06565b9150506126cb565b507f80bc635c452ae67f12f9b6f12ad4daa6dbbc04eeb9ebb87d354ce10c0e210dc0848484846040516115bc9493929190615339565b8281146127db5760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b60005b83811015612856578282828181106127f8576127f8614d90565b90506020020135603a600087878581811061281557612815614d90565b905060200201602081019061282a9190614aec565b6001600160a01b031681526020810191909152604001600020558061284e81614e06565b9150506127de565b507f64557254143204d91ba2d95acb9fda1e5fea55f77efd028685765bc1e94dd4b5848484846040516115bc9493929190615339565b8281146128ee5760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b60005b838110156129fa57620f424083838381811061290f5761290f614d90565b90506020020135111561298a5760405162461bcd60e51b815260206004820152602860248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c696420706560448201527f7263656e746167650000000000000000000000000000000000000000000000006064820152608401610a28565b82828281811061299c5761299c614d90565b90506020020135603b60008787858181106129b9576129b9614d90565b90506020020160208101906129ce9190614aec565b6001600160a01b03168152602081019190915260400160002055806129f281614e06565b9150506128f1565b507fb05f5de88ae0294ebb6f67c5af2fcbbd593cc6bdfe543e2869794a4c8ce3ea50848484846040516115bc9493929190615339565b828114612a925760405162461bcd60e51b815260206004820152602a60248201527f5769746864726177616c4c696d69746174696f6e3a20696e76616c69642061726044820152690e4c2f240d8cadccee8d60b31b6064820152608401610a28565b60005b83811015612b0d57828282818110612aaf57612aaf614d90565b90506020020135603c6000878785818110612acc57612acc614d90565b9050602002016020810190612ae19190614aec565b6001600160a01b0316815260208101919091526040016000205580612b0581614e06565b915050612a95565b507fb5d2963614d72181b4df1f993d45b83edf42fa19710f0204217ba1b3e183bb73848484846040516115bc9493929190615339565b612b4d8282613db6565b6000828152607360205260409020610f8a9082613e58565b60008281526072602090815260408083206001600160a01b038516845290915290205460ff1661101757612ba3816001600160a01b03166014613e6d565b612bae836020613e6d565b604051602001612bbf9291906153d0565b60408051601f198184030181529082905262461bcd60e51b8252610a2891600401615451565b612bef828261404e565b6000828152607360205260409020610f8a90826140d1565b60005460ff16612c595760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a28565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000823561014084013582612cbe6080870160608801614aec565b9050612cdb612cd6368890038801610100890161516e565b613a1d565b6001612ced6040880160208901615151565b6001811115612cfe57612cfe614c71565b14612d715760405162461bcd60e51b815260206004820152602860248201527f4d61696e636861696e4761746577617956323a20696e76616c6964207265636560448201527f697074206b696e640000000000000000000000000000000000000000000000006064820152608401610a28565b60808601354614612de95760405162461bcd60e51b8152602060048201526024808201527f4d61696e636861696e4761746577617956323a20696e76616c6964206368616960448201527f6e206964000000000000000000000000000000000000000000000000000000006064820152608401610a28565b6000612dfe61084a6080890160608a01614aec565b9050612e1261012088016101008901615151565b6001811115612e2357612e23614c71565b81516001811115612e3657612e36614c71565b148015612e675750612e4e60e0880160c08901614aec565b6001600160a01b031681602001516001600160a01b0316145b612ebf5760405162461bcd60e51b815260206004820152602360248201527f4d61696e636861696e4761746577617956323a20696e76616c696420726563656044820152621a5c1d60ea1b6064820152608401610a28565b60008481526079602052604090205415612f415760405162461bcd60e51b815260206004820152603260248201527f4d61696e636861696e4761746577617956323a20717565727920666f7220707260448201527f6f636573736564207769746864726177616c00000000000000000000000000006064820152608401610a28565b6001612f5561012089016101008a01615151565b6001811115612f6657612f66614c71565b1480612f795750612f7782846133bc565b155b612feb5760405162461bcd60e51b815260206004820152603260248201527f4d61696e636861696e4761746577617956323a2072656163686564206461696c60448201527f79207769746864726177616c206c696d697400000000000000000000000000006064820152608401610a28565b6000612fff6112f3368a90038a018a614ff0565b9050600061300f607754836140e6565b6003549091506001600160a01b0316600061303d6130356101208d016101008e01615151565b878985614142565b60408051606081018252600080825260208201819052918101829052919b50919250819081906000805b8f5181101561323c578f818151811061308257613082614d90565b6020908102919091018101518051818301516040808401518151600081529586018083528f905260ff9093169085015260608401526080830152935060019060a0016020604051602081039080840390855afa1580156130e6573d6000803e3d6000fd5b505050602060405103519450846001600160a01b0316846001600160a01b0316106131795760405162461bcd60e51b815260206004820152602160248201527f4d61696e636861696e4761746577617956323a20696e76616c6964206f72646560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a28565b6040517f953865650000000000000000000000000000000000000000000000000000000081526001600160a01b03808716600483015286955089169063953865659060240160206040518083038186803b1580156131d657600080fd5b505afa1580156131ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061320e9190614f89565b6132189083615484565b915086821061322a576001955061323c565b8061323481614e06565b915050613067565b50846132b05760405162461bcd60e51b815260206004820152603660248201527f4d61696e636861696e4761746577617956323a20717565727920666f7220696e60448201527f73756666696369656e7420766f746520776569676874000000000000000000006064820152608401610a28565b50505060008a81526079602052604090208690555050881561332c576000888152607a602052604090819020805460ff19166001179055517f89e52969465b1f1866fc5d46fd62de953962e9cb33552443cd999eba05bd20dc906133179086908e906150c4565b60405180910390a15050505050505050610aa7565b6133368688614233565b61337561334960608d0160408e01614aec565b87607460009054906101000a90046001600160a01b03168e61010001803603810190611583919061516e565b7f21e88e956aa3e086f6388e899965cef814688f99ad8bb29b08d396571016372d848c6040516133a69291906150c4565b60405180910390a1505050505050505092915050565b6001600160a01b0382166000908152603a602052604081205482106133e357506000610aa7565b60006133f2620151804261549c565b6001600160a01b0385166000908152603e60205260409020549091508111156134385750506001600160a01b0382166000908152603c6020526040902054811015610aa7565b6001600160a01b0384166000908152603d602052604090205461345c908490615484565b6001600160a01b0385166000908152603c602052604090205411159150610aa79050565b600060025460016002548460015461349891906151a1565b6134a29190615484565b6134ac919061518a565b610aa7919061549c565b60005460ff16156134fc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a28565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612c863390565b600061119883836142c3565b60007fb9d1fe7c9deeec5dc90a2f47ff1684239519f2545b2228d3d91fb27df3189eea60001b8260000151836020015161357a85604001516142ed565b61358786606001516142ed565b6135948760800151614350565b6040516020016135a9969594939291906154be565b604051602081830303815290604052805190602001209050919050565b6000620f42406135d683856151a1565b611198919061549c565b6000816001600160a01b0316836001600160a01b031614156136905760408086015190516001600160a01b0386169180156108fc02916000818181858888f1935050505061368b57816001600160a01b031663d0e30db086604001516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561366757600080fd5b505af115801561367b573d6000803e3d6000fd5b505050505061368b858585614393565b613a0c565b6000855160018111156136a5576136a5614c71565b1415613866576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b15801561370657600080fd5b505afa15801561371a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373e9190614f89565b9050856040015181101561385557836001600160a01b03166340c10f193083896040015161376c919061518a565b6040516001600160a01b03909216602483015260448201526064016040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516137c091906154f8565b6000604051808303816000865af19150503d80600081146137fd576040519150601f19603f3d011682016040523d82523d6000602084013e613802565b606091505b505080925050816138555760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e3a204552433230206d696e74696e67206661696c656400000000006044820152606401610a28565b613860868686614393565b50613a0c565b60018551600181111561387b5761387b614c71565b141561399e5761389083858760200151614437565b61368b57602085810151604080516001600160a01b038881166024830152604480830194909452825180830390940184526064909101825292820180516001600160e01b03167f40c10f1900000000000000000000000000000000000000000000000000000000179052519185169161390991906154f8565b6000604051808303816000865af19150503d8060008114613946576040519150601f19603f3d011682016040523d82523d6000602084013e61394b565b606091505b5050809150508061368b5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e3a20455243373231206d696e74696e67206661696c6564000000006044820152606401610a28565b60405162461bcd60e51b815260206004820152602160248201527f546f6b656e3a20756e737570706f7274656420746f6b656e207374616e64617260448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a28565b5050505050565b6000610aa7825490565b600081516001811115613a3257613a32614c71565b148015613a43575060008160400151115b8015613a5157506020810151155b80613a7b5750600181516001811115613a6c57613a6c614c71565b148015613a7b57506040810151155b610a655760405162461bcd60e51b815260206004820152601360248201527f546f6b656e3a20696e76616c696420696e666f000000000000000000000000006044820152606401610a28565b600060608186516001811115613adf57613adf614c71565b1415613bbd5760408681015181516001600160a01b038881166024830152878116604483015260648083019390935283518083039093018352608490910183526020820180516001600160e01b03166323b872dd60e01b179052915191851691613b4991906154f8565b6000604051808303816000865af19150503d8060008114613b86576040519150601f19603f3d011682016040523d82523d6000602084013e613b8b565b606091505b509092509050818015613bb6575080511580613bb6575080806020019051810190613bb69190615514565b9150613c84565b600186516001811115613bd257613bd2614c71565b141561399e57602086810151604080516001600160a01b0389811660248301528881166044830152606480830194909452825180830390940184526084909101825292820180516001600160e01b03166323b872dd60e01b1790525191851691613c3c91906154f8565b6000604051808303816000865af19150503d8060008114613c79576040519150601f19603f3d011682016040523d82523d6000602084013e613c7e565b606091505b50909250505b81610f5c57613c92866144e2565b613ca6866001600160a01b03166014613e6d565b613cba866001600160a01b03166014613e6d565b613cce866001600160a01b03166014613e6d565b604051602001612bbf9493929190615536565b613d516040805160a08101825260008082526020808301829052835160608082018652838252818301849052818601849052848601919091528451808201865283815280830184905280860184905281850152845190810185528281529081018290529283015290608082015290565b83815260006020820181905250604080820180516001600160a01b039788169052602080890151825190891690820152905146908301528751606084018051918916909152805195909716940193909352935182015292909201516080820152919050565b60008281526072602090815260408083206001600160a01b038516845290915290205460ff166110175760008281526072602090815260408083206001600160a01b03851684529091529020805460ff19166001179055613e143390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000611198836001600160a01b03841661454f565b60606000613e7c8360026151a1565b613e87906002615484565b67ffffffffffffffff811115613e9f57613e9f614e21565b6040519080825280601f01601f191660200182016040528015613ec9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613f0057613f00614d90565b60200101906001600160f81b031916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613f4b57613f4b614d90565b60200101906001600160f81b031916908160001a9053506000613f6f8460026151a1565b613f7a906001615484565b90505b6001811115613fff577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110613fbb57613fbb614d90565b1a60f81b828281518110613fd157613fd1614d90565b60200101906001600160f81b031916908160001a90535060049490941c93613ff881615606565b9050613f7d565b5083156111985760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a28565b60008281526072602090815260408083206001600160a01b038516845290915290205460ff16156110175760008281526072602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000611198836001600160a01b03841661459e565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091526022820185905260428083018590528351808403909101815260629092019092528051910120600090611198565b6000806000836001600160a01b031663926323d56040518163ffffffff1660e01b815260040160206040518083038186803b15801561418057600080fd5b505afa158015614194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141b89190614f89565b90506141c381613480565b925060008760018111156141d9576141d9614c71565b1415614229576001600160a01b038616600090815260396020526040902054851061420a5761420781614691565b92505b6001600160a01b0386166000908152603a602052604090205485101591505b5094509492505050565b6000614242620151804261549c565b6001600160a01b0384166000908152603e6020526040902054909150811115614291576001600160a01b03929092166000908152603e6020908152604080832094909455603d90529190912055565b6001600160a01b0383166000908152603d6020526040812080548492906142b9908490615484565b9091555050505050565b60008260000182815481106142da576142da614d90565b9060005260206000200154905092915050565b805160208083015160408085015190516000946135a9947f353bdd8d69b9e3185b3972e08b03845c0c14a21a390215302776a7a34b0e87649491939192019384526001600160a01b03928316602085015291166040830152606082015260800190565b805160208083015160408085015190516000946135a9947f1e2b74b2a792d5c0f0b6e59b037fa9d43d84fbb759337f0112fcc15ca414fc8d94919391920161561d565b600080845160018111156143a9576143a9614c71565b14156143c5576143be828486604001516146a9565b90506143ef565b6001845160018111156143da576143da614c71565b141561399e576143be82848660200151614437565b80610e89576143fd846144e2565b614411846001600160a01b03166014613e6d565b614425846001600160a01b03166014613e6d565b604051602001612bbf93929190615648565b604080513060248201526001600160a01b038481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092861691614495916154f8565b6000604051808303816000865af19150503d80600081146144d2576040519150601f19603f3d011682016040523d82523d6000602084013e6144d7565b606091505b509095945050505050565b606061450d826000015160018111156144fd576144fd614c71565b6001600160a01b03166001613e6d565b61451a8360200151614795565b6145278460400151614795565b604051602001614539939291906156d9565b6040516020818303038152906040529050919050565b600081815260018301602052604081205461459657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610aa7565b506000610aa7565b600081815260018301602052604081205480156146875760006145c260018361518a565b85549091506000906145d69060019061518a565b905081811461463b5760008660000182815481106145f6576145f6614d90565b906000526020600020015490508087600001848154811061461957614619614d90565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061464c5761464c6157a2565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610aa7565b6000915050610aa7565b600060385460016038548460375461349891906151a1565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b03167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000926060929087169161471f91906154f8565b6000604051808303816000865af19150503d806000811461475c576040519150601f19603f3d011682016040523d82523d6000602084013e614761565b606091505b50909250905081801561478c57508051158061478c57508080602001905181019061478c9190615514565b95945050505050565b6060816147d557505060408051808201909152600481527f3078303000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156147f857806147e981614e06565b915050600882901c91506147d9565b6111848482613e6d565b604080516060810182526000808252602082015290810161483e6040805160608101909152806000815260200160008152602001600081525090565b905290565b60006020828403121561485557600080fd5b81356001600160e01b03198116811461119857600080fd5b6001600160a01b0381168114610a6557600080fd5b803561198d8161486d565b8060608101831015610aa757600080fd5b8060808101831015610aa757600080fd5b60008083601f8401126148c157600080fd5b50813567ffffffffffffffff8111156148d957600080fd5b6020830191508360208260051b850101111561172857600080fd5b60008060008060008060008060008060006101408c8e03121561491657600080fd5b61491f8c614882565b9a5061492d60208d01614882565b995061493b60408d01614882565b985060608c0135975060808c0135965060a08c0135955060c08c0135945067ffffffffffffffff8060e08e0135111561497357600080fd5b6149838e60e08f01358f0161488d565b9450806101008e0135111561499757600080fd5b6149a88e6101008f01358f0161489e565b9350806101208e013511156149bc57600080fd5b506149ce8d6101208e01358e016148af565b81935080925050509295989b509295989b9093969950565b600080600080604085870312156149fc57600080fd5b843567ffffffffffffffff80821115614a1457600080fd5b614a20888389016148af565b90965094506020870135915080821115614a3957600080fd5b50614a46878288016148af565b95989497509550505050565b60008060008060008060608789031215614a6b57600080fd5b863567ffffffffffffffff80821115614a8357600080fd5b614a8f8a838b016148af565b90985096506020890135915080821115614aa857600080fd5b614ab48a838b016148af565b90965094506040890135915080821115614acd57600080fd5b50614ada89828a016148af565b979a9699509497509295939492505050565b600060208284031215614afe57600080fd5b81356111988161486d565b600060208284031215614b1b57600080fd5b5035919050565b60008060408385031215614b3557600080fd5b823591506020830135614b478161486d565b809150509250929050565b600060a08284031215614b6457600080fd5b50919050565b60006101608284031215614b6457600080fd5b60008060006101808486031215614b9357600080fd5b614b9d8585614b6a565b925061016084013567ffffffffffffffff80821115614bbb57600080fd5b818601915086601f830112614bcf57600080fd5b813581811115614bde57600080fd5b876020606083028501011115614bf357600080fd5b6020830194508093505050509250925092565b60008060408385031215614c1957600080fd5b8235614c248161486d565b946020939093013593505050565b60008060408385031215614c4557600080fd5b50508035926020909101359150565b60006101608284031215614c6757600080fd5b6111988383614b6a565b634e487b7160e01b600052602160045260246000fd5b60028110610a6557634e487b7160e01b600052602160045260246000fd5b81516040820190614cb581614c87565b808352506001600160a01b03602084015116602083015292915050565b60008060008060008060006080888a031215614ced57600080fd5b873567ffffffffffffffff80821115614d0557600080fd5b614d118b838c016148af565b909950975060208a0135915080821115614d2a57600080fd5b614d368b838c016148af565b909750955060408a0135915080821115614d4f57600080fd5b614d5b8b838c016148af565b909550935060608a0135915080821115614d7457600080fd5b50614d818a828b0161489e565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112614dbd57600080fd5b83018035915067ffffffffffffffff821115614dd857600080fd5b6020019150600581901b360382131561172857600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415614e1a57614e1a614df0565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715614e6857634e487b7160e01b600052604160045260246000fd5b60405290565b60028110610a6557600080fd5b600060608284031215614e8d57600080fd5b614e95614e37565b90508135614ea281614e6e565b80825250602082013560208201526040820135604082015292915050565b600060a08284031215614ed257600080fd5b614eda614e37565b8235614ee58161486d565b81526020830135614ef58161486d565b6020820152614f078460408501614e7b565b60408201529392505050565b600060608284031215614f2557600080fd5b6040516060810181811067ffffffffffffffff82111715614f5657634e487b7160e01b600052604160045260246000fd5b604052823560ff81168114614f6a57600080fd5b8152602083810135908201526040928301359281019290925250919050565b600060208284031215614f9b57600080fd5b5051919050565b600060608284031215614fb457600080fd5b614fbc614e37565b90508135614fc98161486d565b81526020820135614fd98161486d565b806020830152506040820135604082015292915050565b6000610160828403121561500357600080fd5b60405160a0810181811067ffffffffffffffff8211171561503457634e487b7160e01b600052604160045260246000fd5b60405282358152602083013561504981614e6e565b602082015261505b8460408501614fa2565b604082015261506d8460a08501614fa2565b6060820152615080846101008501614e7b565b60808201529392505050565b80356150978161486d565b6001600160a01b0390811683526020820135906150b38261486d565b166020830152604090810135910152565b6000610180820190508382528235602083015260208301356150e581614e6e565b6150ee81614c87565b80604084015250615105606083016040850161508c565b61511560c0830160a0850161508c565b61012061010084013561512781614e6e565b61513081614c87565b81840152830135610140808401919091529092013561016090910152919050565b60006020828403121561516357600080fd5b813561119881614e6e565b60006060828403121561518057600080fd5b6111988383614e7b565b60008282101561519c5761519c614df0565b500390565b60008160001904831182151516156151bb576151bb614df0565b500290565b6000610180820190508382528251602083015260208301516151e181614c87565b6040838101919091528381015180516001600160a01b03908116606086015260208201511660808501529081015160a084015250606083015180516001600160a01b0390811660c085015260208201511660e08401526040810151610100840152506080830151805161525381614c87565b6101208401526020810151610140840152604001516101609092019190915292915050565b8183526000602080850194508260005b858110156152b657813561529b8161486d565b6001600160a01b031687529582019590820190600101615288565b509495945050505050565b6060815260006152d560608301888a615278565b6020838203818501526152e982888a615278565b8481036040860152858152869250810160005b8681101561532a57833561530f81614e6e565b61531881614c87565b825292820192908201906001016152fc565b509a9950505050505050505050565b60408152600061534d604083018688615278565b82810360208401528381527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84111561538557600080fd5b8360051b80866020840137600091016020019081529695505050505050565b60005b838110156153bf5781810151838201526020016153a7565b83811115610e895750506000910152565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516154088160178501602088016153a4565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516154458160288401602088016153a4565b01602801949350505050565b60208152600082518060208401526154708160408501602087016153a4565b601f01601f19169190910160400192915050565b6000821982111561549757615497614df0565b500190565b6000826154b957634e487b7160e01b600052601260045260246000fd5b500490565b8681526020810186905260c081016154d586614c87565b8560408301528460608301528360808301528260a0830152979650505050505050565b6000825161550a8184602087016153a4565b9190910192915050565b60006020828403121561552657600080fd5b8151801515811461119857600080fd5b7f546f6b656e3a20636f756c64206e6f74207472616e7366657220000000000000815260008551602061556f82601a8601838b016153a4565b7f2066726f6d200000000000000000000000000000000000000000000000000000601a9285019283015286516155aa81838501848b016153a4565b630103a37960e51b92018181019290925285516155cd81602485018985016153a4565b660103a37b5b2b7160cd1b6024939091019283015284516155f481602b85018489016153a4565b91909101602b01979650505050505050565b60008161561557615615614df0565b506000190190565b8481526080810161562d85614c87565b84602083015283604083015282606083015295945050505050565b7f546f6b656e3a20636f756c64206e6f74207472616e736665722000000000000081526000845161568081601a8501602089016153a4565b630103a37960e51b601a9184019182015284516156a481601e8401602089016153a4565b660103a37b5b2b7160cd1b601e929091019182015283516156cc8160258401602088016153a4565b0160250195945050505050565b7f546f6b656e496e666f280000000000000000000000000000000000000000000081526000845161571181600a8501602089016153a4565b80830190507f2c0000000000000000000000000000000000000000000000000000000000000080600a830152855161575081600b850160208a016153a4565b600b920191820152835161576b81600c8401602088016153a4565b7f2900000000000000000000000000000000000000000000000000000000000000600c9290910191820152600d0195945050505050565b634e487b7160e01b600052603160045260246000fdfeb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610348617350726f787941646d696e3a20756e617574686f72697a65642073656e64", + ), ]; } diff --git a/crates/forge/src/cmd/compiler.rs b/crates/forge/src/cmd/compiler.rs index 82e9bf14ecee0..b446152c7040d 100644 --- a/crates/forge/src/cmd/compiler.rs +++ b/crates/forge/src/cmd/compiler.rs @@ -1,8 +1,8 @@ use clap::{Parser, Subcommand, ValueHint}; use eyre::Result; use foundry_common::shell; -use foundry_compilers::{artifacts::EvmVersion, Graph}; -use foundry_config::{normalize_evm_version_vyper, Config}; +use foundry_compilers::{Graph, artifacts::EvmVersion}; +use foundry_config::{Config, normalize_evm_version_vyper}; use semver::Version; use serde::Serialize; use std::{collections::BTreeMap, path::PathBuf}; diff --git a/crates/forge/src/cmd/coverage.rs b/crates/forge/src/cmd/coverage.rs index 3b2e04eb88b26..9484c94e40010 100644 --- a/crates/forge/src/cmd/coverage.rs +++ b/crates/forge/src/cmd/coverage.rs @@ -1,24 +1,24 @@ use super::{install, test::TestArgs, watch::WatchArgs}; use crate::{ + MultiContractRunnerBuilder, coverage::{ - analysis::{SourceAnalysis, SourceFile, SourceFiles}, - anchors::find_anchors, BytecodeReporter, ContractId, CoverageReport, CoverageReporter, CoverageSummaryReporter, DebugReporter, ItemAnchor, LcovReporter, + analysis::{SourceAnalysis, SourceFile, SourceFiles}, + anchors::find_anchors, }, - MultiContractRunnerBuilder, }; -use alloy_primitives::{map::HashMap, Address, Bytes, U256}; +use alloy_primitives::{Address, Bytes, U256, map::HashMap}; use clap::{Parser, ValueEnum, ValueHint}; use eyre::{Context, Result}; use foundry_cli::utils::{LoadConfig, STATIC_FUZZ_SEED}; use foundry_common::compile::ProjectCompiler; use foundry_compilers::{ + Artifact, ArtifactId, Project, ProjectCompileOutput, ProjectPathsConfig, artifacts::{ - sourcemap::SourceMap, CompactBytecode, CompactDeployedBytecode, SolcLanguage, Source, + CompactBytecode, CompactDeployedBytecode, SolcLanguage, Source, sourcemap::SourceMap, }, compilers::multi::MultiCompiler, - Artifact, ArtifactId, Project, ProjectCompileOutput, ProjectPathsConfig, }; use foundry_config::Config; use foundry_evm::opts::EvmOpts; diff --git a/crates/forge/src/cmd/create.rs b/crates/forge/src/cmd/create.rs index 6768b43829836..00eacfc61c50f 100644 --- a/crates/forge/src/cmd/create.rs +++ b/crates/forge/src/cmd/create.rs @@ -3,7 +3,7 @@ use alloy_chains::Chain; use alloy_dyn_abi::{DynSolValue, JsonAbiExt, Specifier}; use alloy_json_abi::{Constructor, JsonAbi}; use alloy_network::{AnyNetwork, AnyTransactionReceipt, EthereumWallet, TransactionBuilder}; -use alloy_primitives::{hex, Address, Bytes}; +use alloy_primitives::{Address, Bytes, hex}; use alloy_provider::{PendingTransactionError, Provider, ProviderBuilder}; use alloy_rpc_types::TransactionRequest; use alloy_serde::WithOtherFields; @@ -14,7 +14,7 @@ use eyre::{Context, Result}; use forge_verify::{RetryArgs, VerifierArgs, VerifyArgs}; use foundry_cli::{ opts::{BuildOpts, EthereumOpts, EtherscanOpts, TransactionOpts}, - utils::{self, read_constructor_args_file, remove_contract, LoadConfig}, + utils::{self, LoadConfig, read_constructor_args_file, remove_contract}, }; use foundry_common::{ compile::{self}, @@ -22,15 +22,15 @@ use foundry_common::{ shell, }; use foundry_compilers::{ - artifacts::BytecodeObject, info::ContractInfo, utils::canonicalize, ArtifactId, + ArtifactId, artifacts::BytecodeObject, info::ContractInfo, utils::canonicalize, }; use foundry_config::{ + Config, figment::{ - self, + self, Metadata, Profile, value::{Dict, Map}, - Metadata, Profile, }, - merge_impl_figment_convert, Config, + merge_impl_figment_convert, }; use serde_json::json; use std::{borrow::Borrow, marker::PhantomData, path::PathBuf, sync::Arc, time::Duration}; @@ -135,7 +135,10 @@ impl CreateArgs { }) .collect::>() .join("\n"); - eyre::bail!("Dynamic linking not supported in `create` command - deploy the following library contracts first, then provide the address to link at compile time\n{}", link_refs) + eyre::bail!( + "Dynamic linking not supported in `create` command - deploy the following library contracts first, then provide the address to link at compile time\n{}", + link_refs + ) } }; @@ -364,7 +367,9 @@ impl CreateArgs { )?; sh_println!("ABI: {}\n", serde_json::to_string_pretty(&abi)?)?; - sh_warn!("To broadcast this transaction, add --broadcast to the previous command. See forge create --help for more.")?; + sh_warn!( + "To broadcast this transaction, add --broadcast to the previous command. See forge create --help for more." + )?; } else { let output = json!({ "contract": self.contract.name, @@ -401,11 +406,7 @@ impl CreateArgs { sh_println!("Starting contract verification...")?; let num_of_optimizations = if let Some(optimizer) = self.build.compiler.optimize { - if optimizer { - Some(self.build.compiler.optimizer_runs.unwrap_or(200)) - } else { - None - } + if optimizer { Some(self.build.compiler.optimizer_runs.unwrap_or(200)) } else { None } } else { self.build.compiler.optimizer_runs }; diff --git a/crates/forge/src/cmd/doc/mod.rs b/crates/forge/src/cmd/doc/mod.rs index 73b78618cbb0e..69a9321482ba1 100644 --- a/crates/forge/src/cmd/doc/mod.rs +++ b/crates/forge/src/cmd/doc/mod.rs @@ -6,7 +6,7 @@ use forge_doc::{ }; use foundry_cli::opts::GH_REPO_PREFIX_REGEX; use foundry_common::compile::ProjectCompiler; -use foundry_config::{load_config_with_root, Config}; +use foundry_config::{Config, load_config_with_root}; use std::{path::PathBuf, process::Command}; mod server; diff --git a/crates/forge/src/cmd/doc/server.rs b/crates/forge/src/cmd/doc/server.rs index 09662270a4514..798d10d5e66b0 100644 --- a/crates/forge/src/cmd/doc/server.rs +++ b/crates/forge/src/cmd/doc/server.rs @@ -1,5 +1,5 @@ -use axum::{routing::get_service, Router}; -use forge_doc::mdbook::{utils::fs::get_404_output_file, MDBook}; +use axum::{Router, routing::get_service}; +use forge_doc::mdbook::{MDBook, utils::fs::get_404_output_file}; use std::{ io, net::{SocketAddr, ToSocketAddrs}, diff --git a/crates/forge/src/cmd/eip712.rs b/crates/forge/src/cmd/eip712.rs index 4c7196ac5ddd5..4512dcbece332 100644 --- a/crates/forge/src/cmd/eip712.rs +++ b/crates/forge/src/cmd/eip712.rs @@ -1,14 +1,14 @@ -use alloy_primitives::{keccak256, B256}; +use alloy_primitives::{B256, keccak256}; use clap::{Parser, ValueHint}; use eyre::Result; -use foundry_cli::opts::{solar_pcx_from_build_opts, BuildOpts}; +use foundry_cli::opts::{BuildOpts, solar_pcx_from_build_opts}; use serde::Serialize; use solar_parse::interface::Session; use solar_sema::{ + GcxWrapper, Hir, hir::StructId, thread_local::ThreadLocal, ty::{Ty, TyKind}, - GcxWrapper, Hir, }; use std::{ collections::BTreeMap, diff --git a/crates/forge/src/cmd/geiger.rs b/crates/forge/src/cmd/geiger.rs index 68694a3688ecf..a29ff33ffdd4e 100644 --- a/crates/forge/src/cmd/geiger.rs +++ b/crates/forge/src/cmd/geiger.rs @@ -1,8 +1,8 @@ use clap::{Parser, ValueHint}; use eyre::{Result, WrapErr}; use foundry_cli::utils::LoadConfig; -use foundry_compilers::{resolver::parse::SolData, Graph}; -use foundry_config::{impl_figment_convert_basic, Config}; +use foundry_compilers::{Graph, resolver::parse::SolData}; +use foundry_config::{Config, impl_figment_convert_basic}; use itertools::Itertools; use solar_parse::{ast, ast::visit::Visit, interface::Session}; use std::{ diff --git a/crates/forge/src/cmd/inspect.rs b/crates/forge/src/cmd/inspect.rs index af0b10a66b5f0..0fb8f49730efd 100644 --- a/crates/forge/src/cmd/inspect.rs +++ b/crates/forge/src/cmd/inspect.rs @@ -1,8 +1,8 @@ use alloy_json_abi::{EventParam, InternalType, JsonAbi, Param}; use alloy_primitives::{hex, keccak256}; use clap::Parser; -use comfy_table::{modifiers::UTF8_ROUND_CORNERS, Cell, Table}; -use eyre::{eyre, Result}; +use comfy_table::{Cell, Table, modifiers::UTF8_ROUND_CORNERS}; +use eyre::{Result, eyre}; use foundry_cli::opts::{BuildOpts, CompilerOpts}; use foundry_common::{ compile::{PathOrContractInfo, ProjectCompiler}, @@ -10,11 +10,11 @@ use foundry_common::{ }; use foundry_compilers::{ artifacts::{ + StorageLayout, output_selection::{ BytecodeOutputSelection, ContractOutputSelection, DeployedBytecodeOutputSelection, EvmOutputSelection, EwasmOutputSelection, }, - StorageLayout, }, solc::SolcLanguage, }; @@ -585,10 +585,12 @@ mod tests { for &field in ContractArtifactField::ALL { if field == ContractArtifactField::StandardJson { let selection: Result = field.try_into(); - assert!(selection - .unwrap_err() - .to_string() - .eq("StandardJson is not supported for ContractOutputSelection")); + assert!( + selection + .unwrap_err() + .to_string() + .eq("StandardJson is not supported for ContractOutputSelection") + ); } else { let selection: ContractOutputSelection = field.try_into().unwrap(); assert_eq!(field, selection); diff --git a/crates/forge/src/cmd/install.rs b/crates/forge/src/cmd/install.rs index 0a88c6eca7ab1..03f58e92f54ed 100644 --- a/crates/forge/src/cmd/install.rs +++ b/crates/forge/src/cmd/install.rs @@ -5,7 +5,7 @@ use foundry_cli::{ utils::{CommandUtils, Git, LoadConfig}, }; use foundry_common::fs; -use foundry_config::{impl_figment_convert_basic, Config}; +use foundry_config::{Config, impl_figment_convert_basic}; use regex::Regex; use semver::Version; use std::{ @@ -365,11 +365,7 @@ impl Installer<'_> { return Err(e) } - if is_branch { - Ok(tag) - } else { - Ok(String::new()) - } + if is_branch { Ok(tag) } else { Ok(String::new()) } } /// disambiguate tag if it is a version tag diff --git a/crates/forge/src/cmd/lint.rs b/crates/forge/src/cmd/lint.rs index c429e37f3e72e..dd485715aadca 100644 --- a/crates/forge/src/cmd/lint.rs +++ b/crates/forge/src/cmd/lint.rs @@ -1,5 +1,5 @@ use clap::{Parser, ValueHint}; -use eyre::{eyre, Result}; +use eyre::{Result, eyre}; use forge_lint::{ linter::Linter, sol::{SolLint, SolLintError, SolidityLinter}, diff --git a/crates/forge/src/cmd/selectors.rs b/crates/forge/src/cmd/selectors.rs index e6ecdcbac7962..4aae390343634 100644 --- a/crates/forge/src/cmd/selectors.rs +++ b/crates/forge/src/cmd/selectors.rs @@ -1,14 +1,14 @@ use alloy_primitives::hex; use clap::Parser; -use comfy_table::{modifiers::UTF8_ROUND_CORNERS, Table}; +use comfy_table::{Table, modifiers::UTF8_ROUND_CORNERS}; use eyre::Result; use foundry_cli::{ opts::{BuildOpts, CompilerOpts, ProjectPathOpts}, - utils::{cache_local_signatures, FoundryPathExt}, + utils::{FoundryPathExt, cache_local_signatures}, }; use foundry_common::{ - compile::{compile_target, PathOrContractInfo, ProjectCompiler}, - selectors::{import_selectors, SelectorImportData}, + compile::{PathOrContractInfo, ProjectCompiler, compile_target}, + selectors::{SelectorImportData, import_selectors}, }; use foundry_compilers::{artifacts::output_selection::ContractOutputSelection, info::ContractInfo}; use std::fs::canonicalize; diff --git a/crates/forge/src/cmd/snapshot.rs b/crates/forge/src/cmd/snapshot.rs index da642bd1241be..69048820e0be9 100644 --- a/crates/forge/src/cmd/snapshot.rs +++ b/crates/forge/src/cmd/snapshot.rs @@ -1,7 +1,7 @@ use super::test; use crate::result::{SuiteTestResult, TestKindReport, TestOutcome}; -use alloy_primitives::{map::HashMap, U256}; -use clap::{builder::RangedU64ValueParser, Parser, ValueHint}; +use alloy_primitives::{U256, map::HashMap}; +use clap::{Parser, ValueHint, builder::RangedU64ValueParser}; use eyre::{Context, Result}; use foundry_cli::utils::STATIC_FUZZ_SEED; use regex::Regex; diff --git a/crates/forge/src/cmd/soldeer.rs b/crates/forge/src/cmd/soldeer.rs index 6ca70758ce7f6..fd7cf2d0505de 100644 --- a/crates/forge/src/cmd/soldeer.rs +++ b/crates/forge/src/cmd/soldeer.rs @@ -27,7 +27,7 @@ impl SoldeerArgs { #[cfg(test)] mod tests { - use soldeer_commands::{commands::Version, Command, Verbosity}; + use soldeer_commands::{Command, Verbosity, commands::Version}; #[tokio::test] async fn test_soldeer_version() { diff --git a/crates/forge/src/cmd/test/filter.rs b/crates/forge/src/cmd/test/filter.rs index ec2e9b01b50e8..9e4d3b3a599ef 100644 --- a/crates/forge/src/cmd/test/filter.rs +++ b/crates/forge/src/cmd/test/filter.rs @@ -1,7 +1,7 @@ use clap::Parser; use foundry_common::TestFilter; use foundry_compilers::{FileFilter, ProjectPathsConfig}; -use foundry_config::{filter::GlobMatcher, Config}; +use foundry_config::{Config, filter::GlobMatcher}; use std::{fmt, path::Path}; /// The filter to use during testing. diff --git a/crates/forge/src/cmd/test/mod.rs b/crates/forge/src/cmd/test/mod.rs index 9e8a4b2d26643..b6a5d55272509 100644 --- a/crates/forge/src/cmd/test/mod.rs +++ b/crates/forge/src/cmd/test/mod.rs @@ -1,44 +1,43 @@ use super::{install, test::filter::ProjectPathsAwareFilter, watch::WatchArgs}; use crate::{ + MultiContractRunner, MultiContractRunnerBuilder, TestFilter, decode::decode_console_logs, gas_report::GasReport, multi_runner::matches_contract, result::{SuiteResult, TestOutcome, TestStatus}, traces::{ + CallTraceDecoderBuilder, InternalTraceMode, TraceKind, debug::{ContractSources, DebugTraceIdentifier}, decode_trace_arena, folded_stack_trace, identifier::SignaturesIdentifier, - CallTraceDecoderBuilder, InternalTraceMode, TraceKind, }, - MultiContractRunner, MultiContractRunnerBuilder, TestFilter, }; use alloy_primitives::U256; use chrono::Utc; use clap::{Parser, ValueHint}; -use eyre::{bail, Context, OptionExt, Result}; +use eyre::{Context, OptionExt, Result, bail}; use foundry_block_explorers::EtherscanApiVersion; use foundry_cli::{ opts::{BuildOpts, GlobalArgs}, utils::{self, LoadConfig}, }; -use foundry_common::{compile::ProjectCompiler, evm::EvmArgs, fs, shell, TestFunctionExt}; +use foundry_common::{TestFunctionExt, compile::ProjectCompiler, evm::EvmArgs, fs, shell}; use foundry_compilers::{ + ProjectCompileOutput, artifacts::output_selection::OutputSelection, compilers::{ - multi::{MultiCompiler, MultiCompilerLanguage}, Language, + multi::{MultiCompiler, MultiCompilerLanguage}, }, utils::source_files_iter, - ProjectCompileOutput, }; use foundry_config::{ - figment, + Config, figment, figment::{ - value::{Dict, Map}, Metadata, Profile, Provider, + value::{Dict, Map}, }, filter::GlobMatcher, - Config, }; use foundry_debugger::Debugger; use foundry_evm::traces::identifier::TraceIdentifiers; @@ -47,7 +46,7 @@ use std::{ collections::{BTreeMap, BTreeSet}, fmt::Write, path::PathBuf, - sync::{mpsc::channel, Arc}, + sync::{Arc, mpsc::channel}, time::{Duration, Instant}, }; use yansi::Paint; @@ -57,7 +56,7 @@ mod summary; use crate::{result::TestKind, traces::render_trace_arena_inner}; pub use filter::FilterArgs; use quick_junit::{NonSuccessKind, Report, TestCase, TestCaseStatus, TestSuite}; -use summary::{format_invariant_metrics_table, TestSummaryReport}; +use summary::{TestSummaryReport, format_invariant_metrics_table}; // Loads project's figment and merges the build cli arguments into it foundry_config::merge_impl_figment_convert!(TestArgs, build, evm); diff --git a/crates/forge/src/cmd/test/summary.rs b/crates/forge/src/cmd/test/summary.rs index 68ab3f4590b05..5b29877a42495 100644 --- a/crates/forge/src/cmd/test/summary.rs +++ b/crates/forge/src/cmd/test/summary.rs @@ -1,6 +1,6 @@ use crate::cmd::test::TestOutcome; -use comfy_table::{modifiers::UTF8_ROUND_CORNERS, Cell, Color, Row, Table}; -use foundry_common::reports::{report_kind, ReportKind}; +use comfy_table::{Cell, Color, Row, Table, modifiers::UTF8_ROUND_CORNERS}; +use foundry_common::reports::{ReportKind, report_kind}; use foundry_evm::executors::invariant::InvariantMetrics; use itertools::Itertools; use serde_json::json; diff --git a/crates/forge/src/cmd/tree.rs b/crates/forge/src/cmd/tree.rs index b97d7c8d98654..30184af5d138e 100644 --- a/crates/forge/src/cmd/tree.rs +++ b/crates/forge/src/cmd/tree.rs @@ -2,8 +2,8 @@ use clap::Parser; use eyre::Result; use foundry_cli::{opts::ProjectPathOpts, utils::LoadConfig}; use foundry_compilers::{ - resolver::{parse::SolData, Charset, TreeOptions}, Graph, + resolver::{Charset, TreeOptions, parse::SolData}, }; /// CLI arguments for `forge tree`. diff --git a/crates/forge/src/cmd/update.rs b/crates/forge/src/cmd/update.rs index 5e965c34a9999..55c367d09db10 100644 --- a/crates/forge/src/cmd/update.rs +++ b/crates/forge/src/cmd/update.rs @@ -4,7 +4,7 @@ use foundry_cli::{ opts::Dependency, utils::{Git, LoadConfig}, }; -use foundry_config::{impl_figment_convert_basic, Config}; +use foundry_config::{Config, impl_figment_convert_basic}; use std::path::PathBuf; /// CLI arguments for `forge update`. diff --git a/crates/forge/src/cmd/watch.rs b/crates/forge/src/cmd/watch.rs index 3378d9b148cb0..abc06723909c0 100644 --- a/crates/forge/src/cmd/watch.rs +++ b/crates/forge/src/cmd/watch.rs @@ -11,22 +11,22 @@ use parking_lot::Mutex; use std::{ path::PathBuf, sync::{ - atomic::{AtomicU8, Ordering}, Arc, + atomic::{AtomicU8, Ordering}, }, time::Duration, }; use tokio::process::Command as TokioCommand; use watchexec::{ + Watchexec, action::ActionHandler, command::{Command, Program}, job::{CommandState, Job}, paths::summarise_events_to_env, - Watchexec, }; use watchexec_events::{ - filekind::{AccessKind, FileEventKind}, Event, Priority, ProcessEnd, Tag, + filekind::{AccessKind, FileEventKind}, }; use watchexec_signals::Signal; use yansi::{Color, Paint}; diff --git a/crates/forge/src/coverage.rs b/crates/forge/src/coverage.rs index b446fccc94b79..b75514cabe329 100644 --- a/crates/forge/src/coverage.rs +++ b/crates/forge/src/coverage.rs @@ -1,7 +1,7 @@ //! Coverage reports. use alloy_primitives::map::{HashMap, HashSet}; -use comfy_table::{modifiers::UTF8_ROUND_CORNERS, Attribute, Cell, Color, Row, Table}; +use comfy_table::{Attribute, Cell, Color, Row, Table, modifiers::UTF8_ROUND_CORNERS}; use evm_disassembler::disassemble_bytes; use foundry_common::fs; use semver::Version; diff --git a/crates/forge/src/gas_report.rs b/crates/forge/src/gas_report.rs index dc8527d5e3565..cab3f6bdec796 100644 --- a/crates/forge/src/gas_report.rs +++ b/crates/forge/src/gas_report.rs @@ -5,11 +5,10 @@ use crate::{ traces::{CallTraceArena, CallTraceDecoder, CallTraceNode, DecodedCallData}, }; use alloy_primitives::map::HashSet; -use comfy_table::{modifiers::UTF8_ROUND_CORNERS, Cell, Color, Table}; +use comfy_table::{Cell, Color, Table, modifiers::UTF8_ROUND_CORNERS}; use foundry_common::{ - calc, - reports::{report_kind, ReportKind}, - TestFunctionExt, + TestFunctionExt, calc, + reports::{ReportKind, report_kind}, }; use foundry_evm::traces::CallKind; diff --git a/crates/forge/src/multi_runner.rs b/crates/forge/src/multi_runner.rs index 7b10328d5908e..fcc616557f9f3 100644 --- a/crates/forge/src/multi_runner.rs +++ b/crates/forge/src/multi_runner.rs @@ -1,20 +1,21 @@ //! Forge test runner for multiple contracts. use crate::{ - progress::TestsProgress, result::SuiteResult, runner::LIBRARY_DEPLOYER, ContractRunner, - TestFilter, + ContractRunner, TestFilter, progress::TestsProgress, result::SuiteResult, + runner::LIBRARY_DEPLOYER, }; use alloy_json_abi::{Function, JsonAbi}; use alloy_primitives::{Address, Bytes, U256}; use eyre::Result; -use foundry_common::{get_contract_name, shell::verbosity, ContractsByArtifact, TestFunctionExt}; +use foundry_common::{ContractsByArtifact, TestFunctionExt, get_contract_name, shell::verbosity}; use foundry_compilers::{ + Artifact, ArtifactId, ProjectCompileOutput, artifacts::{Contract, Libraries}, compilers::Compiler, - Artifact, ArtifactId, ProjectCompileOutput, }; use foundry_config::{Config, InlineConfig}; use foundry_evm::{ + Env, backend::Backend, decode::RevertDecoder, executors::{Executor, ExecutorBuilder}, @@ -22,7 +23,6 @@ use foundry_evm::{ inspectors::CheatsConfig, opts::EvmOpts, traces::{InternalTraceMode, TraceMode}, - Env, }; use foundry_linking::{LinkOutput, Linker}; use rayon::prelude::*; @@ -32,7 +32,7 @@ use std::{ collections::BTreeMap, fmt::Debug, path::Path, - sync::{mpsc, Arc}, + sync::{Arc, mpsc}, time::Instant, }; diff --git a/crates/forge/src/result.rs b/crates/forge/src/result.rs index 90447fc26bfa0..e7e06ce8e7420 100644 --- a/crates/forge/src/result.rs +++ b/crates/forge/src/result.rs @@ -5,15 +5,15 @@ use crate::{ gas_report::GasReport, }; use alloy_primitives::{ - map::{AddressHashMap, HashMap}, Address, Log, + map::{AddressHashMap, HashMap}, }; use eyre::Report; use foundry_common::{evm::Breakpoints, get_contract_name, get_file_name, shell}; use foundry_evm::{ coverage::HitMaps, decode::SkipReason, - executors::{invariant::InvariantMetrics, RawCallResult}, + executors::{RawCallResult, invariant::InvariantMetrics}, fuzz::{CounterExample, FuzzCase, FuzzFixtures, FuzzTestResult}, traces::{CallTraceArena, CallTraceDecoder, TraceKind, Traces}, }; diff --git a/crates/forge/src/runner.rs b/crates/forge/src/runner.rs index 5384df363729f..36ea7b776cc3a 100644 --- a/crates/forge/src/runner.rs +++ b/crates/forge/src/runner.rs @@ -1,35 +1,34 @@ //! The Forge test runner. use crate::{ - fuzz::{invariant::BasicTxDetails, BaseCounterExample}, - multi_runner::{is_matching_test, TestContract, TestRunnerConfig}, - progress::{start_fuzz_progress, TestsProgress}, - result::{SuiteResult, TestResult, TestSetup}, MultiContractRunner, TestFilter, + fuzz::{BaseCounterExample, invariant::BasicTxDetails}, + multi_runner::{TestContract, TestRunnerConfig, is_matching_test}, + progress::{TestsProgress, start_fuzz_progress}, + result::{SuiteResult, TestResult, TestSetup}, }; use alloy_dyn_abi::{DynSolValue, JsonAbiExt}; use alloy_json_abi::Function; -use alloy_primitives::{address, map::HashMap, Address, Bytes, U256}; +use alloy_primitives::{Address, Bytes, U256, address, map::HashMap}; use eyre::Result; -use foundry_common::{contracts::ContractsByAddress, TestFunctionExt, TestFunctionKind}; +use foundry_common::{TestFunctionExt, TestFunctionKind, contracts::ContractsByAddress}; use foundry_compilers::utils::canonicalized; use foundry_config::{Config, InvariantConfig}; use foundry_evm::{ constants::CALLER, decode::RevertDecoder, executors::{ + CallResult, EvmError, Executor, ITest, RawCallResult, fuzz::FuzzedExecutor, invariant::{ - check_sequence, replay_error, replay_run, InvariantExecutor, InvariantFuzzError, + InvariantExecutor, InvariantFuzzError, check_sequence, replay_error, replay_run, }, - CallResult, EvmError, Executor, ITest, RawCallResult, }, fuzz::{ - fixture_name, + CounterExample, FuzzFixtures, fixture_name, invariant::{CallDetails, InvariantContract}, - CounterExample, FuzzFixtures, }, - traces::{load_contracts, TraceKind, TraceMode}, + traces::{TraceKind, TraceMode, load_contracts}, }; use itertools::Itertools; use proptest::test_runner::{ @@ -750,7 +749,8 @@ impl<'a> FunctionRunner<'a> { invariant_contract.call_after_invariant, ) { if !success { - let _= sh_warn!("\ + let _ = sh_warn!( + "\ Replayed invariant failure from {:?} file. \ Run `forge clean` or remove file to ignore failure and to continue invariant test campaign.", failure_file.as_path() diff --git a/crates/forge/tests/cli/cmd.rs b/crates/forge/tests/cli/cmd.rs index 5ab6f22ad8a26..710db4106082e 100644 --- a/crates/forge/tests/cli/cmd.rs +++ b/crates/forge/tests/cli/cmd.rs @@ -1,15 +1,15 @@ //! Contains various tests for checking forge's commands use crate::constants::*; -use foundry_compilers::artifacts::{remappings::Remapping, ConfigurableContractArtifact, Metadata}; +use foundry_compilers::artifacts::{ConfigurableContractArtifact, Metadata, remappings::Remapping}; use foundry_config::{ - parse_with_profile, BasicConfig, Chain, Config, FuzzConfig, InvariantConfig, SolidityErrorCode, + BasicConfig, Chain, Config, FuzzConfig, InvariantConfig, SolidityErrorCode, parse_with_profile, }; use foundry_test_utils::{ foundry_compilers::PathStyle, rpc::next_etherscan_api_key, snapbox::IntoData, - util::{pretty_err, read_string, OutputExt, TestCommand}, + util::{OutputExt, TestCommand, pretty_err, read_string}, }; use semver::Version; use std::{ @@ -3005,10 +3005,9 @@ Ran 1 test suite [ELAPSED]: 1 tests passed, 0 failed, 0 skipped (1 total tests) forgetest_init!(can_use_absolute_imports, |prj, cmd| { prj.update_config(|config| { let remapping = prj.paths().libraries[0].join("myDependency"); - config.remappings = - vec![Remapping::from_str(&format!("myDependency/={}", remapping.display())) - .unwrap() - .into()]; + config.remappings = vec![ + Remapping::from_str(&format!("myDependency/={}", remapping.display())).unwrap().into(), + ]; }); prj.add_lib( diff --git a/crates/forge/tests/cli/config.rs b/crates/forge/tests/cli/config.rs index 83a0a43bec8d4..44e1a49c400ef 100644 --- a/crates/forge/tests/cli/config.rs +++ b/crates/forge/tests/cli/config.rs @@ -7,16 +7,16 @@ use foundry_compilers::{ solc::Solc, }; use foundry_config::{ + CompilationRestrictions, Config, FsPermissions, FuzzConfig, InvariantConfig, SettingsOverrides, + SolcReq, cache::{CachedChains, CachedEndpoints, StorageCachingConfig}, filter::GlobMatcher, fs_permissions::{FsAccessPermission, PathPermission}, - CompilationRestrictions, Config, FsPermissions, FuzzConfig, InvariantConfig, SettingsOverrides, - SolcReq, }; use foundry_evm::opts::EvmOpts; use foundry_test_utils::{ - foundry_compilers::artifacts::{remappings::Remapping, EvmVersion}, - util::{pretty_err, OutputExt, TestCommand, OTHER_SOLC_VERSION}, + foundry_compilers::artifacts::{EvmVersion, remappings::Remapping}, + util::{OTHER_SOLC_VERSION, OutputExt, TestCommand, pretty_err}, }; use path_slash::PathBufExt; use semver::VersionReq; @@ -124,7 +124,7 @@ forgetest!(can_extract_config_values, |prj, cmd| { verbosity: 4, remappings: vec![Remapping::from_str("forge-std/=lib/forge-std/").unwrap().into()], libraries: vec![ - "src/DssSpell.sol:DssExecLib:0x8De6DDbCd5053d32292AAA0D2105A32d108484a6".to_string() + "src/DssSpell.sol:DssExecLib:0x8De6DDbCd5053d32292AAA0D2105A32d108484a6".to_string(), ], ignored_error_codes: vec![], ignored_file_paths: vec![], @@ -343,11 +343,15 @@ forgetest_init!(can_get_evm_opts, |prj, _cmd| { assert_eq!(config.eth_rpc_url, Some(url.to_string())); assert!(config.ffi); - unsafe { std::env::set_var("FOUNDRY_ETH_RPC_URL", url); } + unsafe { + std::env::set_var("FOUNDRY_ETH_RPC_URL", url); + } let figment = Config::figment_with_root(prj.root()).merge(("debug", false)); let evm_opts: EvmOpts = figment.extract().unwrap(); assert_eq!(evm_opts.fork_url, Some(url.to_string())); - unsafe { std::env::remove_var("FOUNDRY_ETH_RPC_URL"); } + unsafe { + std::env::remove_var("FOUNDRY_ETH_RPC_URL"); + } }); // checks that we can set various config values diff --git a/crates/forge/tests/cli/coverage.rs b/crates/forge/tests/cli/coverage.rs index 43896c7c3623b..d1e6c9f4751d2 100644 --- a/crates/forge/tests/cli/coverage.rs +++ b/crates/forge/tests/cli/coverage.rs @@ -1,7 +1,7 @@ use foundry_common::fs::{self, files_with_ext}; use foundry_test_utils::{ - snapbox::{Data, IntoData}, TestCommand, TestProject, + snapbox::{Data, IntoData}, }; use std::path::Path; diff --git a/crates/forge/tests/cli/create.rs b/crates/forge/tests/cli/create.rs index 01bb1f01b31a0..dd66694072134 100644 --- a/crates/forge/tests/cli/create.rs +++ b/crates/forge/tests/cli/create.rs @@ -4,9 +4,9 @@ use crate::{ constants::*, utils::{self, EnvExternalities}, }; -use alloy_primitives::{hex, Address}; -use anvil::{spawn, NodeConfig}; -use foundry_compilers::artifacts::{remappings::Remapping, BytecodeHash}; +use alloy_primitives::{Address, hex}; +use anvil::{NodeConfig, spawn}; +use foundry_compilers::artifacts::{BytecodeHash, remappings::Remapping}; use foundry_test_utils::{ forgetest, forgetest_async, snapbox::IntoData, diff --git a/crates/forge/tests/cli/doc.rs b/crates/forge/tests/cli/doc.rs index 699b023d0b26e..758ba80eada0d 100644 --- a/crates/forge/tests/cli/doc.rs +++ b/crates/forge/tests/cli/doc.rs @@ -1,4 +1,4 @@ -use foundry_test_utils::util::{setup_forge_remote, RemoteProject}; +use foundry_test_utils::util::{RemoteProject, setup_forge_remote}; #[test] fn can_generate_solmate_docs() { diff --git a/crates/forge/tests/cli/multi_script.rs b/crates/forge/tests/cli/multi_script.rs index d6f7628da1694..22c35282c5a08 100644 --- a/crates/forge/tests/cli/multi_script.rs +++ b/crates/forge/tests/cli/multi_script.rs @@ -1,5 +1,5 @@ //! Contains various tests related to forge script -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; use foundry_test_utils::{ScriptOutcome, ScriptTester}; diff --git a/crates/forge/tests/cli/script.rs b/crates/forge/tests/cli/script.rs index 64af01bdb1566..410f6a6412fbe 100644 --- a/crates/forge/tests/cli/script.rs +++ b/crates/forge/tests/cli/script.rs @@ -2,14 +2,14 @@ use crate::constants::TEMPLATE_CONTRACT; use alloy_hardforks::EthereumHardfork; -use alloy_primitives::{address, hex, Address, Bytes}; -use anvil::{spawn, NodeConfig}; +use alloy_primitives::{Address, Bytes, address, hex}; +use anvil::{NodeConfig, spawn}; use forge_script_sequence::ScriptSequence; use foundry_test_utils::{ + ScriptOutcome, ScriptTester, rpc::{self, next_http_archive_rpc_url}, snapbox::IntoData, util::{OTHER_SOLC_VERSION, SOLC_VERSION}, - ScriptOutcome, ScriptTester, }; use regex::Regex; use serde_json::Value; @@ -2245,11 +2245,12 @@ ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. "#]]); - assert!(!api - .get_code(address!("0x4e59b44847b379578588920cA78FbF26c0B4956C"), Default::default()) - .await - .unwrap() - .is_empty()); + assert!( + !api.get_code(address!("0x4e59b44847b379578588920cA78FbF26c0B4956C"), Default::default()) + .await + .unwrap() + .is_empty() + ); }); forgetest_init!(can_get_script_wallets, |prj, cmd| { diff --git a/crates/forge/tests/cli/test_cmd.rs b/crates/forge/tests/cli/test_cmd.rs index 6a6f067722cad..1c80b15bbc62a 100644 --- a/crates/forge/tests/cli/test_cmd.rs +++ b/crates/forge/tests/cli/test_cmd.rs @@ -1,10 +1,10 @@ //! Contains various tests for `forge test`. use alloy_primitives::U256; -use anvil::{spawn, NodeConfig}; +use anvil::{NodeConfig, spawn}; use foundry_test_utils::{ rpc, str, - util::{OutputExt, OTHER_SOLC_VERSION, SOLC_VERSION}, + util::{OTHER_SOLC_VERSION, OutputExt, SOLC_VERSION}, }; use similar_asserts::assert_eq; use std::{path::PathBuf, str::FromStr}; diff --git a/crates/forge/tests/cli/verify_bytecode.rs b/crates/forge/tests/cli/verify_bytecode.rs index 9ef4d6ddf4606..a0446d1588f50 100644 --- a/crates/forge/tests/cli/verify_bytecode.rs +++ b/crates/forge/tests/cli/verify_bytecode.rs @@ -1,10 +1,9 @@ use foundry_compilers::artifacts::{BytecodeHash, EvmVersion}; use foundry_config::Config; use foundry_test_utils::{ - forgetest_async, + TestCommand, TestProject, forgetest_async, rpc::{next_etherscan_api_key, next_http_archive_rpc_url}, util::OutputExt, - TestCommand, TestProject, }; #[expect(clippy::too_many_arguments)] @@ -55,10 +54,14 @@ fn test_verify_bytecode( let output = cmd.forge_fuse().args(args).assert_success().get_output().stdout_lossy(); - assert!(output - .contains(format!("Creation code matched with status {}", expected_matches.0).as_str())); - assert!(output - .contains(format!("Runtime code matched with status {}", expected_matches.1).as_str())); + assert!( + output + .contains(format!("Creation code matched with status {}", expected_matches.0).as_str()) + ); + assert!( + output + .contains(format!("Runtime code matched with status {}", expected_matches.1).as_str()) + ); } #[expect(clippy::too_many_arguments)] @@ -128,11 +131,17 @@ fn test_verify_bytecode_with_ignore( } if ignore == "runtime" { - assert!(!output - .contains(format!("Runtime code matched with status {}", expected_matches.1).as_str())); + assert!( + !output.contains( + format!("Runtime code matched with status {}", expected_matches.1).as_str() + ) + ); } else { - assert!(output - .contains(format!("Runtime code matched with status {}", expected_matches.1).as_str())); + assert!( + output.contains( + format!("Runtime code matched with status {}", expected_matches.1).as_str() + ) + ); } } forgetest_async!(can_verify_bytecode_no_metadata, |prj, cmd| { diff --git a/crates/forge/tests/it/cheats.rs b/crates/forge/tests/it/cheats.rs index 11fcdbcfd5c1b..5e2764c603fd0 100644 --- a/crates/forge/tests/it/cheats.rs +++ b/crates/forge/tests/it/cheats.rs @@ -8,7 +8,7 @@ use crate::{ }, }; use alloy_primitives::U256; -use foundry_config::{fs_permissions::PathPermission, FsPermissions}; +use foundry_config::{FsPermissions, fs_permissions::PathPermission}; use foundry_test_utils::Filter; /// Executes all cheat code tests but not fork cheat codes or tests that require isolation mode or diff --git a/crates/forge/tests/it/config.rs b/crates/forge/tests/it/config.rs index b0f9d8da20a80..1520e0cd27792 100644 --- a/crates/forge/tests/it/config.rs +++ b/crates/forge/tests/it/config.rs @@ -1,14 +1,14 @@ //! Test config. use forge::{ - result::{SuiteResult, TestStatus}, MultiContractRunner, + result::{SuiteResult, TestStatus}, }; use foundry_evm::{ decode::decode_console_logs, - traces::{decode_trace_arena, render_trace_arena, CallTraceDecoderBuilder}, + traces::{CallTraceDecoderBuilder, decode_trace_arena, render_trace_arena}, }; -use foundry_test_utils::{init_tracing, Filter}; +use foundry_test_utils::{Filter, init_tracing}; use futures::future::join_all; use itertools::Itertools; use revm::primitives::hardfork::SpecId; diff --git a/crates/forge/tests/it/core.rs b/crates/forge/tests/it/core.rs index 23756e33f8246..f05c27d368cf0 100644 --- a/crates/forge/tests/it/core.rs +++ b/crates/forge/tests/it/core.rs @@ -709,7 +709,9 @@ async fn test_logs() { async fn test_env_vars() { let env_var_key = "_foundryCheatcodeSetEnvTestKey"; let env_var_val = "_foundryCheatcodeSetEnvTestVal"; - unsafe { env::remove_var(env_var_key); } + unsafe { + env::remove_var(env_var_key); + } let filter = Filter::new("testSetEnv", ".*", ".*"); let mut runner = TEST_DATA_DEFAULT.runner(); diff --git a/crates/forge/tests/it/fork.rs b/crates/forge/tests/it/fork.rs index f03b51b477b73..92038ead6df9f 100644 --- a/crates/forge/tests/it/fork.rs +++ b/crates/forge/tests/it/fork.rs @@ -6,7 +6,7 @@ use crate::{ }; use alloy_chains::Chain; use forge::result::SuiteResult; -use foundry_config::{fs_permissions::PathPermission, Config, FsPermissions}; +use foundry_config::{Config, FsPermissions, fs_permissions::PathPermission}; use foundry_test_utils::Filter; use std::fs; diff --git a/crates/forge/tests/it/fs.rs b/crates/forge/tests/it/fs.rs index 5733ec5849b99..3e9fb1f4dad82 100644 --- a/crates/forge/tests/it/fs.rs +++ b/crates/forge/tests/it/fs.rs @@ -1,7 +1,7 @@ //! Filesystem tests. use crate::{config::*, test_helpers::TEST_DATA_DEFAULT}; -use foundry_config::{fs_permissions::PathPermission, FsPermissions}; +use foundry_config::{FsPermissions, fs_permissions::PathPermission}; use foundry_test_utils::Filter; #[tokio::test(flavor = "multi_thread")] diff --git a/crates/forge/tests/it/fuzz.rs b/crates/forge/tests/it/fuzz.rs index 756c9b88fa0a9..26c8b948c82e9 100644 --- a/crates/forge/tests/it/fuzz.rs +++ b/crates/forge/tests/it/fuzz.rs @@ -7,7 +7,7 @@ use forge::{ fuzz::CounterExample, result::{SuiteResult, TestStatus}, }; -use foundry_test_utils::{forgetest_init, str, Filter}; +use foundry_test_utils::{Filter, forgetest_init, str}; use std::collections::BTreeMap; #[tokio::test(flavor = "multi_thread")] diff --git a/crates/forge/tests/it/invariant.rs b/crates/forge/tests/it/invariant.rs index f947a4d0d6497..ed7ee6c779d3e 100644 --- a/crates/forge/tests/it/invariant.rs +++ b/crates/forge/tests/it/invariant.rs @@ -3,7 +3,7 @@ use crate::{config::*, test_helpers::TEST_DATA_DEFAULT}; use alloy_primitives::U256; use forge::fuzz::CounterExample; -use foundry_test_utils::{forgetest_init, str, Filter}; +use foundry_test_utils::{Filter, forgetest_init, str}; use std::collections::BTreeMap; macro_rules! get_counterexample { @@ -671,13 +671,7 @@ async fn test_invariant_after_invariant() { None, None, ), - ( - "invariant_failure()", - false, - Some("invariant failure".into()), - None, - None, - ), + ("invariant_failure()", false, Some("invariant failure".into()), None, None), ("invariant_success()", true, None, None, None), ], )]), diff --git a/crates/forge/tests/it/repros.rs b/crates/forge/tests/it/repros.rs index aa9171315a401..d1f839972d7e8 100644 --- a/crates/forge/tests/it/repros.rs +++ b/crates/forge/tests/it/repros.rs @@ -3,12 +3,12 @@ use crate::{config::*, test_helpers::TEST_DATA_DEFAULT}; use alloy_dyn_abi::{DecodedEvent, DynSolValue, EventExt}; use alloy_json_abi::Event; -use alloy_primitives::{address, b256, Address, U256}; +use alloy_primitives::{Address, U256, address, b256}; use forge::{ decode::decode_console_logs, result::{TestKind, TestStatus}, }; -use foundry_config::{fs_permissions::PathPermission, Config, FsPermissions}; +use foundry_config::{Config, FsPermissions, fs_permissions::PathPermission}; use foundry_evm::{ constants::HARDHAT_CONSOLE_ADDRESS, traces::{CallKind, CallTraceDecoder, DecodedCallData, TraceKind}, diff --git a/crates/forge/tests/it/test_helpers.rs b/crates/forge/tests/it/test_helpers.rs index 877be09c1d016..81a029bc6f807 100644 --- a/crates/forge/tests/it/test_helpers.rs +++ b/crates/forge/tests/it/test_helpers.rs @@ -5,14 +5,14 @@ use alloy_primitives::U256; use forge::{MultiContractRunner, MultiContractRunnerBuilder}; use foundry_cli::utils::install_crypto_provider; use foundry_compilers::{ + Project, ProjectCompileOutput, SolcConfig, Vyper, artifacts::{EvmVersion, Libraries, Settings}, compilers::multi::MultiCompiler, utils::RuntimeOrHandle, - Project, ProjectCompileOutput, SolcConfig, Vyper, }; use foundry_config::{ - fs_permissions::PathPermission, Config, FsPermissions, FuzzConfig, FuzzDictionaryConfig, - InvariantConfig, RpcEndpointUrl, RpcEndpoints, + Config, FsPermissions, FuzzConfig, FuzzDictionaryConfig, InvariantConfig, RpcEndpointUrl, + RpcEndpoints, fs_permissions::PathPermission, }; use foundry_evm::{constants::CALLER, opts::EvmOpts}; use foundry_test_utils::{ diff --git a/crates/linking/src/lib.rs b/crates/linking/src/lib.rs index 18cb47e764bf2..22de9d0be496c 100644 --- a/crates/linking/src/lib.rs +++ b/crates/linking/src/lib.rs @@ -5,11 +5,11 @@ #![cfg_attr(not(test), warn(unused_crate_dependencies))] #![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] -use alloy_primitives::{Address, Bytes, B256}; +use alloy_primitives::{Address, B256, Bytes}; use foundry_compilers::{ + Artifact, ArtifactId, artifacts::{CompactContractBytecodeCow, Libraries}, contracts::ArtifactContracts, - Artifact, ArtifactId, }; use semver::Version; use std::{ @@ -285,9 +285,9 @@ mod tests { use super::*; use alloy_primitives::{address, fixed_bytes, map::HashMap}; use foundry_compilers::{ + Project, ProjectCompileOutput, ProjectPathsConfig, multi::MultiCompiler, solc::{Solc, SolcCompiler}, - Project, ProjectCompileOutput, ProjectPathsConfig, }; struct LinkerTest { diff --git a/crates/lint/src/linter.rs b/crates/lint/src/linter.rs index 2c11e0222a286..832611b01e337 100644 --- a/crates/lint/src/linter.rs +++ b/crates/lint/src/linter.rs @@ -1,10 +1,10 @@ use foundry_compilers::Language; use foundry_config::lint::Severity; -use solar_ast::{visit::Visit, Expr, ItemFunction, ItemStruct, VariableDefinition}; +use solar_ast::{Expr, ItemFunction, ItemStruct, VariableDefinition, visit::Visit}; use solar_interface::{ + Session, Span, data_structures::Never, diagnostics::{DiagBuilder, DiagId, MultiSpan}, - Session, Span, }; use std::{ops::ControlFlow, path::PathBuf}; diff --git a/crates/lint/src/sol/med/div_mul.rs b/crates/lint/src/sol/med/div_mul.rs index b154971e55434..7f50738112b44 100644 --- a/crates/lint/src/sol/med/div_mul.rs +++ b/crates/lint/src/sol/med/div_mul.rs @@ -27,11 +27,7 @@ fn contains_division<'ast>(expr: &'ast Expr<'ast>) -> bool { match &expr.kind { ExprKind::Binary(_, BinOp { kind: BinOpKind::Div, .. }, _) => true, ExprKind::Tuple(inner_exprs) => inner_exprs.iter().any(|opt_expr| { - if let Some(inner_expr) = opt_expr { - contains_division(inner_expr) - } else { - false - } + if let Some(inner_expr) = opt_expr { contains_division(inner_expr) } else { false } }), _ => false, } diff --git a/crates/lint/src/sol/mod.rs b/crates/lint/src/sol/mod.rs index 47e08296c1eee..edc95c73f3e1f 100644 --- a/crates/lint/src/sol/mod.rs +++ b/crates/lint/src/sol/mod.rs @@ -1,11 +1,11 @@ use crate::linter::{EarlyLintPass, EarlyLintVisitor, Lint, LintContext, Linter}; -use foundry_compilers::{solc::SolcLanguage, ProjectPathsConfig}; +use foundry_compilers::{ProjectPathsConfig, solc::SolcLanguage}; use foundry_config::lint::Severity; use rayon::iter::{IntoParallelIterator, ParallelIterator}; -use solar_ast::{visit::Visit, Arena}; +use solar_ast::{Arena, visit::Visit}; use solar_interface::{ - diagnostics::{self, DiagCtxt, JsonEmitter}, Session, SourceMap, + diagnostics::{self, DiagCtxt, JsonEmitter}, }; use std::{ path::{Path, PathBuf}, diff --git a/crates/macros/src/console_fmt.rs b/crates/macros/src/console_fmt.rs index b8cdbc54db340..2372756c2efc7 100644 --- a/crates/macros/src/console_fmt.rs +++ b/crates/macros/src/console_fmt.rs @@ -1,7 +1,7 @@ use proc_macro2::{Delimiter, Group, Ident, TokenStream}; use quote::{format_ident, quote}; use syn::{ - punctuated::Punctuated, Data, DataEnum, DataStruct, DeriveInput, Fields, Member, Token, Type, + Data, DataEnum, DataStruct, DeriveInput, Fields, Member, Token, Type, punctuated::Punctuated, }; pub fn console_fmt(input: &DeriveInput) -> TokenStream { diff --git a/crates/macros/src/lib.rs b/crates/macros/src/lib.rs index 375434f82d246..bbe24e6f1f049 100644 --- a/crates/macros/src/lib.rs +++ b/crates/macros/src/lib.rs @@ -9,7 +9,7 @@ extern crate proc_macro_error2; use proc_macro::TokenStream; -use syn::{parse_macro_input, DeriveInput, Error}; +use syn::{DeriveInput, Error, parse_macro_input}; mod cheatcodes; mod console_fmt; diff --git a/crates/script-sequence/src/reader.rs b/crates/script-sequence/src/reader.rs index abed5f69dd211..c73fd9161c916 100644 --- a/crates/script-sequence/src/reader.rs +++ b/crates/script-sequence/src/reader.rs @@ -1,6 +1,6 @@ use crate::{ScriptSequence, TransactionWithMetadata}; use alloy_network::AnyTransactionReceipt; -use eyre::{bail, Result}; +use eyre::{Result, bail}; use foundry_common::fs; use revm_inspectors::tracing::types::CallKind; use std::path::{Component, Path, PathBuf}; diff --git a/crates/script-sequence/src/sequence.rs b/crates/script-sequence/src/sequence.rs index 547938cd4ad2f..5555c17696c5e 100644 --- a/crates/script-sequence/src/sequence.rs +++ b/crates/script-sequence/src/sequence.rs @@ -1,8 +1,8 @@ use crate::transaction::TransactionWithMetadata; use alloy_network::AnyTransactionReceipt; -use alloy_primitives::{hex, map::HashMap, TxHash}; +use alloy_primitives::{TxHash, hex, map::HashMap}; use eyre::{ContextCompat, Result, WrapErr}; -use foundry_common::{fs, shell, TransactionMaybeSigned, SELECTOR_LEN}; +use foundry_common::{SELECTOR_LEN, TransactionMaybeSigned, fs, shell}; use foundry_compilers::ArtifactId; use foundry_config::Config; use serde::{Deserialize, Serialize}; diff --git a/crates/script-sequence/src/transaction.rs b/crates/script-sequence/src/transaction.rs index 7f72a4d30980c..e27b16e5ed6a4 100644 --- a/crates/script-sequence/src/transaction.rs +++ b/crates/script-sequence/src/transaction.rs @@ -1,4 +1,4 @@ -use alloy_primitives::{Address, Bytes, B256}; +use alloy_primitives::{Address, B256, Bytes}; use foundry_common::TransactionMaybeSigned; use revm_inspectors::tracing::types::CallKind; use serde::{Deserialize, Serialize}; diff --git a/crates/script/src/broadcast.rs b/crates/script/src/broadcast.rs index 6c8e3de6d228c..f3bcba38419ff 100644 --- a/crates/script/src/broadcast.rs +++ b/crates/script/src/broadcast.rs @@ -1,29 +1,30 @@ use crate::{ - build::LinkedBuildData, progress::ScriptProgress, sequence::ScriptSequenceKind, - verify::BroadcastedState, ScriptArgs, ScriptConfig, + ScriptArgs, ScriptConfig, build::LinkedBuildData, progress::ScriptProgress, + sequence::ScriptSequenceKind, verify::BroadcastedState, }; use alloy_chains::{Chain, NamedChain}; use alloy_consensus::TxEnvelope; -use alloy_eips::{eip2718::Encodable2718, BlockId}; +use alloy_eips::{BlockId, eip2718::Encodable2718}; use alloy_network::{AnyNetwork, EthereumWallet, TransactionBuilder}; use alloy_primitives::{ + Address, TxHash, map::{AddressHashMap, AddressHashSet}, utils::format_units, - Address, TxHash, }; -use alloy_provider::{utils::Eip1559Estimation, Provider}; +use alloy_provider::{Provider, utils::Eip1559Estimation}; use alloy_rpc_types::TransactionRequest; use alloy_serde::WithOtherFields; -use eyre::{bail, Context, Result}; +use eyre::{Context, Result, bail}; use forge_verify::provider::VerificationProviderType; use foundry_cheatcodes::Wallets; use foundry_cli::utils::{has_batch_support, has_different_gas_calc}; use foundry_common::{ - provider::{get_http_provider, try_get_http_provider, RetryProvider}, - shell, TransactionMaybeSigned, + TransactionMaybeSigned, + provider::{RetryProvider, get_http_provider, try_get_http_provider}, + shell, }; use foundry_config::Config; -use futures::{future::join_all, StreamExt}; +use futures::{StreamExt, future::join_all}; use itertools::Itertools; use std::{cmp::Ordering, sync::Arc}; @@ -73,13 +74,19 @@ pub async fn send_transaction( let nonce = provider.get_transaction_count(from).await?; match nonce.cmp(&tx_nonce) { Ordering::Greater => { - bail!("EOA nonce changed unexpectedly while sending transactions. Expected {tx_nonce} got {nonce} from provider.") + bail!( + "EOA nonce changed unexpectedly while sending transactions. Expected {tx_nonce} got {nonce} from provider." + ) } Ordering::Less => { if attempt == 4 { - bail!("After 5 attempts, provider nonce ({nonce}) is still behind expected nonce ({tx_nonce}).") + bail!( + "After 5 attempts, provider nonce ({nonce}) is still behind expected nonce ({tx_nonce})." + ) } - warn!("Expected nonce ({tx_nonce}) is ahead of provider nonce ({nonce}). Retrying in 1 second..."); + warn!( + "Expected nonce ({tx_nonce}) is ahead of provider nonce ({nonce}). Retrying in 1 second..." + ); tokio::time::sleep(std::time::Duration::from_millis(1000)).await; } Ordering::Equal => { diff --git a/crates/script/src/build.rs b/crates/script/src/build.rs index 885e7ca5879be..de742a287d333 100644 --- a/crates/script/src/build.rs +++ b/crates/script/src/build.rs @@ -1,21 +1,21 @@ use crate::{ - broadcast::BundledState, execute::LinkedState, multi_sequence::MultiChainSequence, - sequence::ScriptSequenceKind, ScriptArgs, ScriptConfig, + ScriptArgs, ScriptConfig, broadcast::BundledState, execute::LinkedState, + multi_sequence::MultiChainSequence, sequence::ScriptSequenceKind, }; -use alloy_primitives::{Bytes, B256}; +use alloy_primitives::{B256, Bytes}; use alloy_provider::Provider; use eyre::{OptionExt, Result}; use forge_script_sequence::ScriptSequence; use foundry_cheatcodes::Wallets; use foundry_common::{ - compile::ProjectCompiler, provider::try_get_http_provider, ContractData, ContractsByArtifact, + ContractData, ContractsByArtifact, compile::ProjectCompiler, provider::try_get_http_provider, }; use foundry_compilers::{ + ArtifactId, ProjectCompileOutput, artifacts::{BytecodeObject, Libraries}, - compilers::{multi::MultiCompilerLanguage, Language}, + compilers::{Language, multi::MultiCompilerLanguage}, info::ContractInfo, utils::source_files_iter, - ArtifactId, ProjectCompileOutput, }; use foundry_evm::traces::debug::ContractSources; use foundry_linking::Linker; @@ -217,7 +217,9 @@ impl PreprocessedState { let target_name = target.name.split('.').next().unwrap(); let id_name = id.name.split('.').next().unwrap(); if target_name != id_name { - eyre::bail!("Multiple contracts in the target path. Please specify the contract name with `--tc ContractName`") + eyre::bail!( + "Multiple contracts in the target path. Please specify the contract name with `--tc ContractName`" + ) } } target_id = Some(id); diff --git a/crates/script/src/execute.rs b/crates/script/src/execute.rs index ff9ed1ed6aab5..2344045d9ab36 100644 --- a/crates/script/src/execute.rs +++ b/crates/script/src/execute.rs @@ -1,14 +1,14 @@ -use super::{runner::ScriptRunner, JsonResult, NestedValue, ScriptResult}; +use super::{JsonResult, NestedValue, ScriptResult, runner::ScriptRunner}; use crate::{ + ScriptArgs, ScriptConfig, build::{CompiledState, LinkedBuildData}, simulate::PreSimulationState, - ScriptArgs, ScriptConfig, }; use alloy_dyn_abi::FunctionExt; use alloy_json_abi::{Function, InternalType, JsonAbi}; use alloy_primitives::{ - map::{HashMap, HashSet}, Address, Bytes, + map::{HashMap, HashSet}, }; use alloy_provider::Provider; use alloy_rpc_types::TransactionInput; @@ -16,9 +16,9 @@ use eyre::{OptionExt, Result}; use foundry_cheatcodes::Wallets; use foundry_cli::utils::{ensure_clean_constructor, needs_setup}; use foundry_common::{ + ContractsByArtifact, fmt::{format_token, format_token_raw}, provider::get_http_provider, - ContractsByArtifact, }; use foundry_config::NamedChain; use foundry_debugger::Debugger; @@ -26,9 +26,9 @@ use foundry_evm::{ decode::decode_console_logs, inspectors::cheatcodes::BroadcastableTransactions, traces::{ - decode_trace_arena, + CallTraceDecoder, CallTraceDecoderBuilder, TraceKind, decode_trace_arena, identifier::{SignaturesIdentifier, TraceIdentifiers}, - render_trace_arena, CallTraceDecoder, CallTraceDecoderBuilder, TraceKind, + render_trace_arena, }, }; use futures::future::join_all; @@ -193,7 +193,9 @@ impl PreExecutionState { let sender = tx.transaction.from().expect("no sender"); if let Some(ns) = new_sender { if sender != ns { - sh_warn!("You have more than one deployer who could predeploy libraries. Using `--sender` instead.")?; + sh_warn!( + "You have more than one deployer who could predeploy libraries. Using `--sender` instead." + )?; return Ok(None); } } else if sender != self.script_config.evm_opts.sender { diff --git a/crates/script/src/lib.rs b/crates/script/src/lib.rs index 2d53d805db285..f3f951e98a8c1 100644 --- a/crates/script/src/lib.rs +++ b/crates/script/src/lib.rs @@ -14,9 +14,8 @@ extern crate tracing; use crate::runner::ScriptRunner; use alloy_json_abi::{Function, JsonAbi}; use alloy_primitives::{ - hex, + Address, Bytes, Log, TxKind, U256, hex, map::{AddressHashMap, HashMap}, - Address, Bytes, Log, TxKind, U256, }; use alloy_signer::Signer; use broadcast::next_nonce; @@ -32,25 +31,25 @@ use foundry_cli::{ utils::LoadConfig, }; use foundry_common::{ + CONTRACT_MAX_SIZE, ContractsByArtifact, SELECTOR_LEN, abi::{encode_function_args, get_func}, evm::{Breakpoints, EvmArgs}, - shell, ContractsByArtifact, CONTRACT_MAX_SIZE, SELECTOR_LEN, + shell, }; use foundry_compilers::ArtifactId; use foundry_config::{ - figment, + Config, figment, figment::{ - value::{Dict, Map}, Metadata, Profile, Provider, + value::{Dict, Map}, }, - Config, }; use foundry_evm::{ backend::Backend, executors::ExecutorBuilder, inspectors::{ - cheatcodes::{BroadcastableTransactions, Wallets}, CheatsConfig, + cheatcodes::{BroadcastableTransactions, Wallets}, }, opts::EvmOpts, traces::{TraceMode, Traces}, @@ -321,7 +320,9 @@ impl ScriptArgs { bundled.sequence.show_transactions()?; } - sh_println!("\nSIMULATION COMPLETE. To broadcast these transactions, add --broadcast and wallet configuration(s) to the previous command. See forge script --help for more.")?; + sh_println!( + "\nSIMULATION COMPLETE. To broadcast these transactions, add --broadcast and wallet configuration(s) to the previous command. See forge script --help for more." + )?; } return Ok(()); } @@ -823,7 +824,9 @@ mod tests { assert!(err.downcast::().is_ok()); - unsafe { std::env::set_var("_CAN_EXTRACT_RPC_ALIAS", "123456"); } + unsafe { + std::env::set_var("_CAN_EXTRACT_RPC_ALIAS", "123456"); + } let (config, evm_opts) = args.load_config_and_evm_opts().unwrap(); assert_eq!(config.eth_rpc_url, Some("polygonMumbai".to_string())); assert_eq!( @@ -863,8 +866,12 @@ mod tests { assert!(err.downcast::().is_ok()); - unsafe { std::env::set_var("_EXTRACT_RPC_ALIAS", "123456"); } - unsafe { std::env::set_var("_POLYSCAN_API_KEY", "polygonkey"); } + unsafe { + std::env::set_var("_EXTRACT_RPC_ALIAS", "123456"); + } + unsafe { + std::env::set_var("_POLYSCAN_API_KEY", "polygonkey"); + } let (config, evm_opts) = args.load_config_and_evm_opts().unwrap(); assert_eq!(config.eth_rpc_url, Some("mumbai".to_string())); assert_eq!( @@ -906,8 +913,12 @@ mod tests { assert!(err.downcast::().is_ok()); - unsafe { std::env::set_var("_SOLE_EXTRACT_RPC_ALIAS", "123456"); } - unsafe { std::env::set_var("_SOLE_POLYSCAN_API_KEY", "polygonkey"); } + unsafe { + std::env::set_var("_SOLE_EXTRACT_RPC_ALIAS", "123456"); + } + unsafe { + std::env::set_var("_SOLE_POLYSCAN_API_KEY", "polygonkey"); + } let (config, evm_opts) = args.load_config_and_evm_opts().unwrap(); assert_eq!( evm_opts.fork_url, diff --git a/crates/script/src/multi_sequence.rs b/crates/script/src/multi_sequence.rs index c132ae22531c9..56b9bfd73a08b 100644 --- a/crates/script/src/multi_sequence.rs +++ b/crates/script/src/multi_sequence.rs @@ -1,6 +1,6 @@ use eyre::{ContextCompat, Result, WrapErr}; use forge_script_sequence::{ - now, sig_to_file_name, ScriptSequence, SensitiveScriptSequence, DRY_RUN_DIR, + DRY_RUN_DIR, ScriptSequence, SensitiveScriptSequence, now, sig_to_file_name, }; use foundry_common::{fs, shell}; use foundry_compilers::ArtifactId; diff --git a/crates/script/src/progress.rs b/crates/script/src/progress.rs index a0a5ba5609030..fea38ea243ecb 100644 --- a/crates/script/src/progress.rs +++ b/crates/script/src/progress.rs @@ -1,8 +1,8 @@ -use crate::receipts::{check_tx_status, format_receipt, TxStatus}; +use crate::receipts::{TxStatus, check_tx_status, format_receipt}; use alloy_chains::Chain; use alloy_primitives::{ - map::{B256HashMap, HashMap}, B256, + map::{B256HashMap, HashMap}, }; use eyre::Result; use forge_script_sequence::ScriptSequence; diff --git a/crates/script/src/providers.rs b/crates/script/src/providers.rs index 6fb3ca81d82fa..2252010f43d3d 100644 --- a/crates/script/src/providers.rs +++ b/crates/script/src/providers.rs @@ -1,7 +1,7 @@ -use alloy_primitives::map::{hash_map::Entry, HashMap}; -use alloy_provider::{utils::Eip1559Estimation, Provider}; +use alloy_primitives::map::{HashMap, hash_map::Entry}; +use alloy_provider::{Provider, utils::Eip1559Estimation}; use eyre::{Result, WrapErr}; -use foundry_common::provider::{get_http_provider, RetryProvider}; +use foundry_common::provider::{RetryProvider, get_http_provider}; use foundry_config::Chain; use std::{ops::Deref, sync::Arc}; diff --git a/crates/script/src/receipts.rs b/crates/script/src/receipts.rs index afdd57fc7e940..4ef87b2af4e12 100644 --- a/crates/script/src/receipts.rs +++ b/crates/script/src/receipts.rs @@ -1,8 +1,8 @@ use alloy_chains::{Chain, NamedChain}; use alloy_network::AnyTransactionReceipt; -use alloy_primitives::{utils::format_units, TxHash, U256}; +use alloy_primitives::{TxHash, U256, utils::format_units}; use alloy_provider::{PendingTransactionBuilder, PendingTransactionError, Provider, WatchTxError}; -use eyre::{eyre, Result}; +use eyre::{Result, eyre}; use foundry_common::{provider::RetryProvider, retry, retry::RetryError, shell}; use std::time::Duration; diff --git a/crates/script/src/runner.rs b/crates/script/src/runner.rs index b568cbce28632..a5d9f7cda5a8a 100644 --- a/crates/script/src/runner.rs +++ b/crates/script/src/runner.rs @@ -10,7 +10,7 @@ use foundry_evm::{ constants::CALLER, executors::{DeployResult, EvmError, ExecutionErr, Executor, RawCallResult}, opts::EvmOpts, - revm::interpreter::{return_ok, InstructionResult}, + revm::interpreter::{InstructionResult, return_ok}, traces::{TraceKind, Traces}, }; use std::collections::VecDeque; diff --git a/crates/script/src/simulate.rs b/crates/script/src/simulate.rs index 9c56cd0ee5d73..31c47116e2cbe 100644 --- a/crates/script/src/simulate.rs +++ b/crates/script/src/simulate.rs @@ -3,21 +3,21 @@ use super::{ sequence::ScriptSequenceKind, transaction::ScriptTransactionBuilder, }; use crate::{ - broadcast::{estimate_gas, BundledState}, + ScriptArgs, ScriptConfig, ScriptResult, + broadcast::{BundledState, estimate_gas}, build::LinkedBuildData, execute::{ExecutionArtifacts, ExecutionData}, sequence::get_commit_hash, - ScriptArgs, ScriptConfig, ScriptResult, }; use alloy_chains::NamedChain; use alloy_network::TransactionBuilder; -use alloy_primitives::{map::HashMap, utils::format_units, Address, Bytes, TxKind}; +use alloy_primitives::{Address, Bytes, TxKind, map::HashMap, utils::format_units}; use dialoguer::Confirm; use eyre::{Context, Result}; use forge_script_sequence::{ScriptSequence, TransactionWithMetadata}; use foundry_cheatcodes::Wallets; use foundry_cli::utils::{has_different_gas_calc, now}; -use foundry_common::{shell, ContractData}; +use foundry_common::{ContractData, shell}; use foundry_evm::traces::{decode_trace_arena, render_trace_arena}; use futures::future::{join_all, try_join_all}; use parking_lot::RwLock; diff --git a/crates/script/src/transaction.rs b/crates/script/src/transaction.rs index f72ce9697b13f..0e9e6c786c364 100644 --- a/crates/script/src/transaction.rs +++ b/crates/script/src/transaction.rs @@ -1,9 +1,9 @@ use super::ScriptResult; use alloy_dyn_abi::JsonAbiExt; -use alloy_primitives::{hex, Address, TxKind, B256}; +use alloy_primitives::{Address, B256, TxKind, hex}; use eyre::Result; use forge_script_sequence::TransactionWithMetadata; -use foundry_common::{fmt::format_token_raw, ContractData, TransactionMaybeSigned, SELECTOR_LEN}; +use foundry_common::{ContractData, SELECTOR_LEN, TransactionMaybeSigned, fmt::format_token_raw}; use foundry_evm::traces::CallTraceDecoder; use itertools::Itertools; use revm_inspectors::tracing::types::CallKind; diff --git a/crates/script/src/verify.rs b/crates/script/src/verify.rs index c6a6bd14dca35..3ced6f7c1f984 100644 --- a/crates/script/src/verify.rs +++ b/crates/script/src/verify.rs @@ -1,15 +1,15 @@ use crate::{ - build::LinkedBuildData, - sequence::{get_commit_hash, ScriptSequenceKind}, ScriptArgs, ScriptConfig, + build::LinkedBuildData, + sequence::{ScriptSequenceKind, get_commit_hash}, }; -use alloy_primitives::{hex, Address}; -use eyre::{eyre, Result}; +use alloy_primitives::{Address, hex}; +use eyre::{Result, eyre}; use forge_script_sequence::{AdditionalContract, ScriptSequence}; -use forge_verify::{provider::VerificationProviderType, RetryArgs, VerifierArgs, VerifyArgs}; +use forge_verify::{RetryArgs, VerifierArgs, VerifyArgs, provider::VerificationProviderType}; use foundry_cli::opts::{EtherscanOpts, ProjectPathOpts}; use foundry_common::ContractsByArtifact; -use foundry_compilers::{artifacts::EvmVersion, info::ContractInfo, Project}; +use foundry_compilers::{Project, artifacts::EvmVersion, info::ContractInfo}; use foundry_config::{Chain, Config}; use semver::Version; @@ -249,7 +249,9 @@ async fn verify_contracts( } if num_of_successful_verifications < num_verifications { - return Err(eyre!("Not all ({num_of_successful_verifications} / {num_verifications}) contracts were verified!")) + return Err(eyre!( + "Not all ({num_of_successful_verifications} / {num_verifications}) contracts were verified!" + )) } sh_println!("All ({num_verifications}) contracts were verified!")?; diff --git a/crates/test-utils/src/rpc.rs b/crates/test-utils/src/rpc.rs index 8547cc7006b96..ac24136c91e59 100644 --- a/crates/test-utils/src/rpc.rs +++ b/crates/test-utils/src/rpc.rs @@ -6,8 +6,8 @@ use foundry_config::{ }; use rand::seq::SliceRandom; use std::sync::{ - atomic::{AtomicUsize, Ordering}, LazyLock, + atomic::{AtomicUsize, Ordering}, }; fn shuffled(mut vec: Vec) -> Vec { @@ -128,11 +128,7 @@ fn archive_urls(is_ws: bool) -> &'static [String] { urls } - if is_ws { - &WS - } else { - &HTTP - } + if is_ws { &WS } else { &HTTP } } /// Returns the next etherscan api key. @@ -159,11 +155,7 @@ fn next_url(is_ws: bool, chain: NamedChain) -> String { // For Mainnet pick one of Reth nodes. let idx = next_idx() % RETH_HOSTS.len(); let host = RETH_HOSTS[idx]; - if is_ws { - format!("{host}/ws") - } else { - format!("{host}/rpc") - } + if is_ws { format!("{host}/ws") } else { format!("{host}/rpc") } } else { // DRPC for other networks used in tests. let idx = next_idx() % DRPC_KEYS.len(); diff --git a/crates/test-utils/src/script.rs b/crates/test-utils/src/script.rs index a872d1ecca92a..2e76cca59829b 100644 --- a/crates/test-utils/src/script.rs +++ b/crates/test-utils/src/script.rs @@ -1,8 +1,8 @@ -use crate::{init_tracing, util::lossy_string, TestCommand}; -use alloy_primitives::{address, Address}; +use crate::{TestCommand, init_tracing, util::lossy_string}; +use alloy_primitives::{Address, address}; use alloy_provider::Provider; use eyre::Result; -use foundry_common::provider::{get_http_provider, RetryProvider}; +use foundry_common::provider::{RetryProvider, get_http_provider}; use std::{ collections::BTreeMap, fs, @@ -287,12 +287,20 @@ impl ScriptOutcome { Self::OkNoEndpoint => "If you wish to simulate on-chain transactions pass a RPC URL.", Self::OkSimulation => "SIMULATION COMPLETE. To broadcast these", Self::OkBroadcast => "ONCHAIN EXECUTION COMPLETE & SUCCESSFUL", - Self::WarnSpecifyDeployer => "Warning: You have more than one deployer who could predeploy libraries. Using `--sender` instead.", - Self::MissingSender => "You seem to be using Foundry's default sender. Be sure to set your own --sender", + Self::WarnSpecifyDeployer => { + "Warning: You have more than one deployer who could predeploy libraries. Using `--sender` instead." + } + Self::MissingSender => { + "You seem to be using Foundry's default sender. Be sure to set your own --sender" + } Self::MissingWallet => "No associated wallet", - Self::StaticCallNotAllowed => "staticcall`s are not allowed after `broadcast`; use `startBroadcast` instead", + Self::StaticCallNotAllowed => { + "staticcall`s are not allowed after `broadcast`; use `startBroadcast` instead" + } Self::ScriptFailed => "script failed: ", - Self::UnsupportedLibraries => "Multi chain deployment does not support library linking at the moment.", + Self::UnsupportedLibraries => { + "Multi chain deployment does not support library linking at the moment." + } Self::ErrorSelectForkOnBroadcast => "cannot select forks during a broadcast", Self::OkRun => "Script ran successfully", } diff --git a/crates/test-utils/src/util.rs b/crates/test-utils/src/util.rs index 9b59f50d1e848..b3ecb8844295d 100644 --- a/crates/test-utils/src/util.rs +++ b/crates/test-utils/src/util.rs @@ -1,18 +1,18 @@ use crate::init_tracing; use eyre::{Result, WrapErr}; use foundry_compilers::{ + ArtifactOutput, ConfigurableArtifacts, PathStyle, ProjectPathsConfig, artifacts::Contract, cache::CompilerCache, compilers::multi::MultiCompiler, error::Result as SolcResult, - project_util::{copy_dir, TempProject}, + project_util::{TempProject, copy_dir}, solc::SolcSettings, - ArtifactOutput, ConfigurableArtifacts, PathStyle, ProjectPathsConfig, }; use foundry_config::Config; use parking_lot::Mutex; use regex::Regex; -use snapbox::{assert_data_eq, cmd::OutputAssert, Data, IntoData}; +use snapbox::{Data, IntoData, assert_data_eq, cmd::OutputAssert}; use std::{ env, ffi::OsStr, @@ -21,8 +21,8 @@ use std::{ path::{Path, PathBuf}, process::{ChildStdin, Command, Output, Stdio}, sync::{ - atomic::{AtomicUsize, Ordering}, Arc, LazyLock, + atomic::{AtomicUsize, Ordering}, }, }; diff --git a/crates/verify/src/bytecode.rs b/crates/verify/src/bytecode.rs index 191e7b73f90b0..6c2bdbac058c0 100644 --- a/crates/verify/src/bytecode.rs +++ b/crates/verify/src/bytecode.rs @@ -2,30 +2,30 @@ use crate::{ etherscan::EtherscanVerificationProvider, utils::{ - check_and_encode_args, check_explorer_args, configure_env_block, maybe_predeploy_contract, - BytecodeType, JsonResult, + BytecodeType, JsonResult, check_and_encode_args, check_explorer_args, configure_env_block, + maybe_predeploy_contract, }, verify::VerifierArgs, }; -use alloy_primitives::{hex, Address, Bytes, TxKind, U256}; +use alloy_primitives::{Address, Bytes, TxKind, U256, hex}; use alloy_provider::{ + Provider, ext::TraceApi, network::{AnyTxEnvelope, TransactionBuilder}, - Provider, }; use alloy_rpc_types::{ - trace::parity::{Action, CreateAction, CreateOutput, TraceOutput}, BlockId, BlockNumberOrTag, TransactionInput, TransactionRequest, + trace::parity::{Action, CreateAction, CreateOutput, TraceOutput}, }; use clap::{Parser, ValueHint}; use eyre::{Context, OptionExt, Result}; use foundry_cli::{ opts::EtherscanOpts, - utils::{self, read_constructor_args_file, LoadConfig}, + utils::{self, LoadConfig, read_constructor_args_file}, }; use foundry_common::shell; use foundry_compilers::{artifacts::EvmVersion, info::ContractInfo}; -use foundry_config::{figment, impl_figment_convert, Config}; +use foundry_config::{Config, figment, impl_figment_convert}; use foundry_evm::{constants::DEFAULT_CREATE2_DEPLOYER, utils::configure_tx_req_env}; use foundry_evm_core::AsEnvMut; use revm::state::AccountInfo; diff --git a/crates/verify/src/etherscan/flatten.rs b/crates/verify/src/etherscan/flatten.rs index a0b3defd7f90e..86ed596561d7f 100644 --- a/crates/verify/src/etherscan/flatten.rs +++ b/crates/verify/src/etherscan/flatten.rs @@ -3,14 +3,14 @@ use crate::provider::VerificationContext; use eyre::{Context, Result}; use foundry_block_explorers::verify::CodeFormat; use foundry_compilers::{ + AggregatedCompilerOutput, artifacts::{BytecodeHash, Source, Sources}, buildinfo::RawBuildInfo, compilers::{ - solc::{SolcCompiler, SolcLanguage, SolcVersionedInput}, Compiler, CompilerInput, + solc::{SolcCompiler, SolcLanguage, SolcVersionedInput}, }, solc::Solc, - AggregatedCompilerOutput, }; use semver::{BuildMetadata, Version}; use std::path::Path; diff --git a/crates/verify/src/etherscan/mod.rs b/crates/verify/src/etherscan/mod.rs index fd0e08e355a14..dd3005f1949d5 100644 --- a/crates/verify/src/etherscan/mod.rs +++ b/crates/verify/src/etherscan/mod.rs @@ -1,26 +1,26 @@ use crate::{ + VerifierArgs, provider::{VerificationContext, VerificationProvider}, retry::RETRY_CHECK_ON_VERIFY, verify::{VerifyArgs, VerifyCheckArgs}, - VerifierArgs, }; use alloy_json_abi::Function; use alloy_primitives::hex; use alloy_provider::Provider; use alloy_rpc_types::TransactionTrait; -use eyre::{eyre, Context, OptionExt, Result}; +use eyre::{Context, OptionExt, Result, eyre}; use foundry_block_explorers::{ + Client, EtherscanApiVersion, errors::EtherscanError, utils::lookup_compiler_version, verify::{CodeFormat, VerifyContract}, - Client, EtherscanApiVersion, }; use foundry_cli::{ opts::EtherscanOpts, - utils::{get_provider, read_constructor_args_file, LoadConfig}, + utils::{LoadConfig, get_provider, read_constructor_args_file}, }; use foundry_common::{abi::encode_function_args, retry::RetryError}; -use foundry_compilers::{artifacts::BytecodeObject, Artifact}; +use foundry_compilers::{Artifact, artifacts::BytecodeObject}; use foundry_config::Config; use foundry_evm::constants::DEFAULT_CREATE2_DEPLOYER; use regex::Regex; @@ -416,7 +416,9 @@ impl EtherscanVerificationProvider { } else if transaction.to() == Some(DEFAULT_CREATE2_DEPLOYER) { &transaction.inner.inner.input()[32..] } else { - eyre::bail!("Fetching of constructor arguments is not supported for contracts created by contracts") + eyre::bail!( + "Fetching of constructor arguments is not supported for contracts created by contracts" + ) }; let output = context.project.compile_file(&context.target_path)?; diff --git a/crates/verify/src/provider.rs b/crates/verify/src/provider.rs index 74d2094c41b83..95546011aa4a8 100644 --- a/crates/verify/src/provider.rs +++ b/crates/verify/src/provider.rs @@ -8,11 +8,11 @@ use async_trait::async_trait; use eyre::{OptionExt, Result}; use foundry_common::compile::ProjectCompiler; use foundry_compilers::{ - artifacts::{output_selection::OutputSelection, Metadata, Source}, + Graph, Project, + artifacts::{Metadata, Source, output_selection::OutputSelection}, compilers::{multi::MultiCompilerParsedSource, solc::SolcCompiler}, multi::MultiCompilerSettings, solc::Solc, - Graph, Project, }; use foundry_config::Config; use semver::Version; @@ -174,9 +174,9 @@ impl VerificationProviderType { // 1. If no verifier or `--verifier sourcify` is set and no API key provided, use Sourcify. if !has_key && self.is_sourcify() { sh_println!( - "Attempting to verify on Sourcify. Pass the --etherscan-api-key to verify on Etherscan, \ + "Attempting to verify on Sourcify. Pass the --etherscan-api-key to verify on Etherscan, \ or use the --verifier flag to verify on another provider." - )?; + )?; return Ok(Box::::default()); } @@ -200,7 +200,9 @@ impl VerificationProviderType { } // 5. If no valid provider is specified, bail. - eyre::bail!("No valid verification provider specified. Pass the --verifier flag to specify a provider or set the ETHERSCAN_API_KEY environment variable to use Etherscan as a verifier.") + eyre::bail!( + "No valid verification provider specified. Pass the --verifier flag to specify a provider or set the ETHERSCAN_API_KEY environment variable to use Etherscan as a verifier." + ) } pub fn is_sourcify(&self) -> bool { diff --git a/crates/verify/src/retry.rs b/crates/verify/src/retry.rs index a01b1c94522aa..4bc934149175f 100644 --- a/crates/verify/src/retry.rs +++ b/crates/verify/src/retry.rs @@ -1,4 +1,4 @@ -use clap::{builder::RangedU64ValueParser, Parser}; +use clap::{Parser, builder::RangedU64ValueParser}; use foundry_common::retry::Retry; use std::time::Duration; diff --git a/crates/verify/src/utils.rs b/crates/verify/src/utils.rs index 03eef1ff789ae..9d9e13341aa03 100644 --- a/crates/verify/src/utils.rs +++ b/crates/verify/src/utils.rs @@ -1,7 +1,7 @@ use crate::{bytecode::VerifyBytecodeArgs, types::VerificationType}; use alloy_dyn_abi::DynSolValue; use alloy_primitives::{Address, Bytes, TxKind}; -use alloy_provider::{network::AnyRpcBlock, Provider}; +use alloy_provider::{Provider, network::AnyRpcBlock}; use alloy_rpc_types::BlockId; use clap::ValueEnum; use eyre::{OptionExt, Result}; @@ -16,8 +16,8 @@ use foundry_common::{ use foundry_compilers::artifacts::{BytecodeHash, CompactContractBytecode, EvmVersion}; use foundry_config::Config; use foundry_evm::{ - constants::DEFAULT_CREATE2_DEPLOYER, executors::TracingExecutor, opts::EvmOpts, - traces::TraceMode, Env, EnvMut, + Env, EnvMut, constants::DEFAULT_CREATE2_DEPLOYER, executors::TracingExecutor, opts::EvmOpts, + traces::TraceMode, }; use reqwest::Url; use revm::{bytecode::Bytecode, database::Database, primitives::hardfork::SpecId}; @@ -351,7 +351,9 @@ pub fn deploy_contract( if to.is_some_and(|to| to.is_call()) { let TxKind::Call(to) = to.unwrap() else { unreachable!() }; if to != DEFAULT_CREATE2_DEPLOYER { - eyre::bail!("Transaction `to` address is not the default create2 deployer i.e the tx is not a contract creation tx."); + eyre::bail!( + "Transaction `to` address is not the default create2 deployer i.e the tx is not a contract creation tx." + ); } let result = executor.transact_with_env(env)?; diff --git a/crates/verify/src/verify.rs b/crates/verify/src/verify.rs index 804813c7a96e7..6ed9ff8a95cf1 100644 --- a/crates/verify/src/verify.rs +++ b/crates/verify/src/verify.rs @@ -1,12 +1,12 @@ //! The `forge verify-bytecode` command. use crate::{ + RetryArgs, etherscan::EtherscanVerificationProvider, provider::{VerificationContext, VerificationProvider, VerificationProviderType}, utils::is_host_only, - RetryArgs, }; -use alloy_primitives::{map::HashSet, Address}; +use alloy_primitives::{Address, map::HashSet}; use alloy_provider::Provider; use clap::{Parser, ValueHint}; use eyre::Result; @@ -15,9 +15,9 @@ use foundry_cli::{ opts::{EtherscanOpts, RpcOpts}, utils::{self, LoadConfig}, }; -use foundry_common::{compile::ProjectCompiler, ContractsByArtifact}; +use foundry_common::{ContractsByArtifact, compile::ProjectCompiler}; use foundry_compilers::{artifacts::EvmVersion, compilers::solc::Solc, info::ContractInfo}; -use foundry_config::{figment, impl_figment_convert, impl_figment_convert_cast, Config, SolcReq}; +use foundry_config::{Config, SolcReq, figment, impl_figment_convert, impl_figment_convert_cast}; use itertools::Itertools; use reqwest::Url; use semver::BuildMetadata; @@ -309,12 +309,16 @@ impl VerifyArgs { "Ambiguous compiler versions found in cache: {}", unique_versions.iter().join(", ") ); - eyre::bail!("Compiler version has to be set in `foundry.toml`. If the project was not deployed with foundry, specify the version through `--compiler-version` flag.") + eyre::bail!( + "Compiler version has to be set in `foundry.toml`. If the project was not deployed with foundry, specify the version through `--compiler-version` flag." + ) } unique_versions.into_iter().next().unwrap().to_owned() } else { - eyre::bail!("If cache is disabled, compiler version must be either provided with `--compiler-version` option or set in foundry.toml") + eyre::bail!( + "If cache is disabled, compiler version must be either provided with `--compiler-version` option or set in foundry.toml" + ) }; let settings = if let Some(profile) = &self.compilation_profile { @@ -353,17 +357,20 @@ impl VerifyArgs { if profiles.is_empty() { eyre::bail!("No matching artifact found for {}", contract.name); } else if profiles.len() > 1 { - eyre::bail!("Ambiguous compilation profiles found in cache: {}, please specify the profile through `--compilation-profile` flag", profiles.iter().join(", ")) + eyre::bail!( + "Ambiguous compilation profiles found in cache: {}, please specify the profile through `--compilation-profile` flag", + profiles.iter().join(", ") + ) } let profile = profiles.into_iter().next().unwrap().to_owned(); - let settings = cache.profiles.get(&profile).expect("must be present"); - - settings + cache.profiles.get(&profile).expect("must be present") } else if project.additional_settings.is_empty() { &project.settings } else { - eyre::bail!("If cache is disabled, compilation profile must be provided with `--compiler-version` option or set in foundry.toml") + eyre::bail!( + "If cache is disabled, compilation profile must be provided with `--compiler-version` option or set in foundry.toml" + ) }; VerificationContext::new( diff --git a/crates/wallets/src/error.rs b/crates/wallets/src/error.rs index 9deb037b71fb8..b322ef9797f07 100644 --- a/crates/wallets/src/error.rs +++ b/crates/wallets/src/error.rs @@ -14,7 +14,9 @@ use alloy_signer_gcp::GcpSignerError; pub enum PrivateKeyError { #[error("Failed to create wallet from private key. Private key is invalid hex: {0}")] InvalidHex(#[from] FromHexError), - #[error("Failed to create wallet from private key. Invalid private key. But env var {0} exists. Is the `$` anchor missing?")] + #[error( + "Failed to create wallet from private key. Invalid private key. But env var {0} exists. Is the `$` anchor missing?" + )] ExistsAsEnvVar(String), } diff --git a/crates/wallets/src/multi_wallet.rs b/crates/wallets/src/multi_wallet.rs index d5ef1bb19e904..c58915a8e2f0f 100644 --- a/crates/wallets/src/multi_wallet.rs +++ b/crates/wallets/src/multi_wallet.rs @@ -2,7 +2,7 @@ use crate::{ utils, wallet_signer::{PendingSigner, WalletSigner}, }; -use alloy_primitives::{map::AddressHashMap, Address}; +use alloy_primitives::{Address, map::AddressHashMap}; use alloy_signer::Signer; use clap::Parser; use derive_builder::Builder; @@ -455,11 +455,15 @@ mod tests { MultiWalletOpts::parse_from(["foundry-cli", "--keystores", "my/keystore/path"]); assert_eq!(args.keystore_paths, Some(vec!["my/keystore/path".to_string()])); - unsafe { std::env::set_var("ETH_KEYSTORE", "MY_KEYSTORE"); } + unsafe { + std::env::set_var("ETH_KEYSTORE", "MY_KEYSTORE"); + } let args: MultiWalletOpts = MultiWalletOpts::parse_from(["foundry-cli"]); assert_eq!(args.keystore_paths, Some(vec!["MY_KEYSTORE".to_string()])); - unsafe { std::env::remove_var("ETH_KEYSTORE"); } + unsafe { + std::env::remove_var("ETH_KEYSTORE"); + } } #[test] diff --git a/crates/wallets/src/raw_wallet.rs b/crates/wallets/src/raw_wallet.rs index 3a5169cad9774..c13076dafaf51 100644 --- a/crates/wallets/src/raw_wallet.rs +++ b/crates/wallets/src/raw_wallet.rs @@ -1,4 +1,4 @@ -use crate::{utils, PendingSigner, WalletSigner}; +use crate::{PendingSigner, WalletSigner, utils}; use clap::Parser; use eyre::Result; use serde::Serialize; diff --git a/crates/wallets/src/utils.rs b/crates/wallets/src/utils.rs index ab1871d6b90b0..52125c60521df 100644 --- a/crates/wallets/src/utils.rs +++ b/crates/wallets/src/utils.rs @@ -1,5 +1,5 @@ -use crate::{error::PrivateKeyError, PendingSigner, WalletSigner}; -use alloy_primitives::{hex::FromHex, B256}; +use crate::{PendingSigner, WalletSigner, error::PrivateKeyError}; +use alloy_primitives::{B256, hex::FromHex}; use alloy_signer_ledger::HDPath as LedgerHDPath; use alloy_signer_local::PrivateKeySigner; use alloy_signer_trezor::HDPath as TrezorHDPath; diff --git a/crates/wallets/src/wallet_signer.rs b/crates/wallets/src/wallet_signer.rs index a5d5b70843e5f..512d921a7409e 100644 --- a/crates/wallets/src/wallet_signer.rs +++ b/crates/wallets/src/wallet_signer.rs @@ -2,10 +2,10 @@ use crate::error::WalletSignerError; use alloy_consensus::SignableTransaction; use alloy_dyn_abi::TypedData; use alloy_network::TxSigner; -use alloy_primitives::{hex, Address, ChainId, Signature, B256}; +use alloy_primitives::{Address, B256, ChainId, Signature, hex}; use alloy_signer::Signer; use alloy_signer_ledger::{HDPath as LedgerHDPath, LedgerSigner}; -use alloy_signer_local::{coins_bip39::English, MnemonicBuilder, PrivateKeySigner}; +use alloy_signer_local::{MnemonicBuilder, PrivateKeySigner, coins_bip39::English}; use alloy_signer_trezor::{HDPath as TrezorHDPath, TrezorSigner}; use alloy_sol_types::{Eip712Domain, SolStruct}; use async_trait::async_trait; @@ -18,8 +18,8 @@ use {alloy_signer_aws::AwsSigner, aws_config::BehaviorVersion, aws_sdk_kms::Clie use { alloy_signer_gcp::{GcpKeyRingRef, GcpSigner, GcpSignerError, KeySpecifier}, gcloud_sdk::{ - google::cloud::kms::v1::key_management_service_client::KeyManagementServiceClient, GoogleApi, + google::cloud::kms::v1::key_management_service_client::KeyManagementServiceClient, }, };