diff --git a/Cargo.toml b/Cargo.toml index 4868995e..789513bd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,5 @@ [workspace] -members = [ - "contracts/*", - "packages/router", - "packages/ownable", - "packages/interface", - "integration-test", -] +members = ["contracts/*", "packages/*", "integration-test"] resolver = "2" [profile.test] @@ -67,6 +61,8 @@ k256 = { version = "0.13.1", default-features = false, features = ["ecdsa"] } anyhow = { version = "1.0.71", features = ["backtrace"] } digest = { version = "0.10.7" } hex-literal = { version = "0.4.1" } + +test-tube = { version = "0.1.7" } osmosis-test-tube = { version = "19.2.0" } tokio = { version = "1", features = ["full"] } diff --git a/Makefile b/Makefile index 870f2841..6a2ec1a3 100644 --- a/Makefile +++ b/Makefile @@ -5,5 +5,8 @@ schema: build: cargo wasm +build-dev: + cargo cw-optimizoor + check: - ls artifacts | grep .wasm | xargs -n 1 -I x -t cosmwasm-check ./artifacts/x + ls -d ./artifacts/*.wasm | xargs -I x cosmwasm-check x diff --git a/contracts/default-hook/Cargo.toml b/contracts/default-hook/Cargo.toml index fb5f2a26..474c7256 100644 --- a/contracts/default-hook/Cargo.toml +++ b/contracts/default-hook/Cargo.toml @@ -25,7 +25,6 @@ cw-storage-plus = { workspace = true } cw2 = { workspace = true } cw-utils = { workspace = true } schemars = { workspace = true } -serde = { workspace = true } thiserror = { workspace = true } cosmwasm-schema = { workspace = true } serde-json-wasm = { workspace = true } diff --git a/contracts/default-hook/src/contract.rs b/contracts/default-hook/src/contract.rs index 32271bff..edb22189 100644 --- a/contracts/default-hook/src/contract.rs +++ b/contracts/default-hook/src/contract.rs @@ -1,11 +1,8 @@ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; -use cosmwasm_std::{Binary, Deps, DepsMut, Env, MessageInfo, Response}; +use cosmwasm_std::{Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response}; use cw2::set_contract_version; -use hpl_interface::default_hook::ExecuteMsg; -use hpl_interface::domain_routing_hook::{ - ExecuteMsg as DomainRoutingExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg, -}; +use hpl_interface::default_hook::{ExecuteMsg, InstantiateMsg, QueryMsg}; use crate::{ event::emit_instantiated, @@ -33,7 +30,7 @@ pub fn instantiate( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(_deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result { +pub fn migrate(_deps: DepsMut, _env: Env, _msg: Empty) -> Result { Ok(Response::default()) } @@ -47,23 +44,15 @@ pub fn execute( use crate::execute::{dispatch, gov, hook}; match msg { - ExecuteMsg::DomainRoutingHookMsg(msg) => match msg { - DomainRoutingExecuteMsg::Ownership(msg) => { - Ok(hpl_ownable::handle(deps, env, info, msg)?) - } - DomainRoutingExecuteMsg::Pause {} => gov::pause(deps, info), - DomainRoutingExecuteMsg::Unpause {} => gov::unpause(deps, info), - DomainRoutingExecuteMsg::UpdateMailbox { mailbox } => { - gov::update_mailbox(deps, info, mailbox) - } - DomainRoutingExecuteMsg::SetHook { destination, hook } => { - hook::set_hook(deps, info, destination, hook) - } - DomainRoutingExecuteMsg::SetHooks { hooks } => hook::set_hooks(deps, info, hooks), - DomainRoutingExecuteMsg::PostDispatch { metadata, message } => { - dispatch::dispatch(deps, metadata, message) - } - }, + ExecuteMsg::Ownership(msg) => Ok(hpl_ownable::handle(deps, env, info, msg)?), + ExecuteMsg::Pause {} => gov::pause(deps, info), + ExecuteMsg::Unpause {} => gov::unpause(deps, info), + ExecuteMsg::UpdateMailbox { mailbox } => gov::update_mailbox(deps, info, mailbox), + ExecuteMsg::SetHook { destination, hook } => hook::set_hook(deps, info, destination, hook), + ExecuteMsg::SetHooks { hooks } => hook::set_hooks(deps, info, hooks), + ExecuteMsg::PostDispatch { metadata, message } => { + dispatch::dispatch(deps, metadata, message) + } ExecuteMsg::ConfigCustomHook { destination_domain, recipient, diff --git a/contracts/default-hook/src/event.rs b/contracts/default-hook/src/event.rs index 260b447b..c8329c2b 100644 --- a/contracts/default-hook/src/event.rs +++ b/contracts/default-hook/src/event.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{Addr, Event, HexBinary}; -use hpl_interface::domain_routing_hook::HookConfig; +use hpl_interface::hook::HookConfig; pub fn emit_instantiated(owner: Addr, mailbox: Addr) -> Event { Event::new("domain_routing_hook_instantiated") @@ -21,7 +21,14 @@ pub fn emit_set_hooks(hooks: Vec) -> Event { pub fn emit_post_dispatch(addr: Addr, metadata: HexBinary, message: HexBinary) -> Event { Event::new("domain_routing_hook_post_dispatch") .add_attribute("addr", addr.to_string()) - .add_attribute("metadata", metadata.to_string()) + .add_attribute( + "metadata", + if metadata.is_empty() { + "0x".to_string() + } else { + metadata.to_string() + }, + ) .add_attribute("message", message.to_string()) } diff --git a/contracts/default-hook/src/execute/dispatch.rs b/contracts/default-hook/src/execute/dispatch.rs index 31b73d5a..d88f83db 100644 --- a/contracts/default-hook/src/execute/dispatch.rs +++ b/contracts/default-hook/src/execute/dispatch.rs @@ -41,7 +41,7 @@ pub fn dispatch( #[cfg(test)] mod test { use cosmwasm_std::{testing::mock_dependencies, Addr}; - use hpl_interface::{domain_routing_hook::HookConfig, post_dispatch_hook::PostDispatchMsg}; + use hpl_interface::{hook::HookConfig, post_dispatch_hook::PostDispatchMsg}; use super::*; const HOOK_ADDR: &str = "osmoaddress"; diff --git a/contracts/default-hook/src/execute/hook.rs b/contracts/default-hook/src/execute/hook.rs index b747cc10..b0290912 100644 --- a/contracts/default-hook/src/execute/hook.rs +++ b/contracts/default-hook/src/execute/hook.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ensure, ensure_eq, DepsMut, HexBinary, MessageInfo, Response}; -use hpl_interface::{domain_routing_hook::HookConfig, types::keccak256_hash}; +use hpl_interface::{hook::HookConfig, types::keccak256_hash}; use crate::{ event::{emit_config_custom_hook, emit_set_hook, emit_set_hooks}, diff --git a/contracts/default-hook/src/query.rs b/contracts/default-hook/src/query.rs index 43c2d762..c7b5528c 100644 --- a/contracts/default-hook/src/query.rs +++ b/contracts/default-hook/src/query.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{to_binary, Deps, Env, QueryResponse}; use hpl_interface::{ - domain_routing_hook::{OwnerResponse, PauseInfoResponse}, + hook::{OwnerResponse, PauseInfoResponse}, igp_core::QuoteGasPaymentResponse, post_dispatch_hook::PostDispatchQueryMsg, types::message::Message, @@ -55,7 +55,7 @@ mod test { testing::{mock_dependencies, mock_env}, Addr, HexBinary, Uint256, }; - use hpl_interface::domain_routing_hook::HookConfig; + use hpl_interface::hook::HookConfig; use super::*; diff --git a/contracts/default-hook/src/state.rs b/contracts/default-hook/src/state.rs index a089d03d..037a0b12 100644 --- a/contracts/default-hook/src/state.rs +++ b/contracts/default-hook/src/state.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{Addr, Binary}; use cw_storage_plus::{Item, Map}; -use hpl_interface::{domain_routing_hook::HookConfig, types::keccak256_hash}; +use hpl_interface::{hook::HookConfig, types::keccak256_hash}; pub const MAILBOX_KEY: &str = "mailbox"; pub const MAILBOX: Item = Item::new(MAILBOX_KEY); diff --git a/contracts/domain-routing-hook/src/event.rs b/contracts/domain-routing-hook/src/event.rs index 4b4a03a5..dbce5f54 100644 --- a/contracts/domain-routing-hook/src/event.rs +++ b/contracts/domain-routing-hook/src/event.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{Addr, Event, HexBinary}; -use hpl_interface::domain_routing_hook::HookConfig; +use hpl_interface::hook::HookConfig; pub fn emit_set_hook(destination: u32, hook: Addr) -> Event { Event::new("domain-routing-hook-set-hook") @@ -15,6 +15,13 @@ pub fn emit_set_hooks(hooks: Vec) -> Event { pub fn emit_post_dispatch(addr: Addr, metadata: HexBinary, message: HexBinary) -> Event { Event::new("domain-routing-hook-post-dispatch") .add_attribute("addr", addr.to_string()) - .add_attribute("metadata", metadata.to_string()) + .add_attribute( + "metadata", + if metadata.is_empty() { + "0x".to_string() + } else { + metadata.to_string() + }, + ) .add_attribute("message", message.to_string()) } diff --git a/contracts/domain-routing-hook/src/execute/dispatch.rs b/contracts/domain-routing-hook/src/execute/dispatch.rs index 0718f21d..31d8ba3c 100644 --- a/contracts/domain-routing-hook/src/execute/dispatch.rs +++ b/contracts/domain-routing-hook/src/execute/dispatch.rs @@ -32,7 +32,7 @@ pub fn dispatch( #[cfg(test)] mod test { use cosmwasm_std::{testing::mock_dependencies, Addr}; - use hpl_interface::{domain_routing_hook::HookConfig, post_dispatch_hook::PostDispatchMsg}; + use hpl_interface::{hook::HookConfig, post_dispatch_hook::PostDispatchMsg}; use super::*; const HOOK_ADDR: &str = "osmoaddress"; diff --git a/contracts/domain-routing-hook/src/execute/hook.rs b/contracts/domain-routing-hook/src/execute/hook.rs index ec21365b..e11b1366 100644 --- a/contracts/domain-routing-hook/src/execute/hook.rs +++ b/contracts/domain-routing-hook/src/execute/hook.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ensure, ensure_eq, DepsMut, Env, MessageInfo, Response}; -use hpl_interface::domain_routing_hook::HookConfig; +use hpl_interface::hook::HookConfig; use crate::{ event::{emit_set_hook, emit_set_hooks}, diff --git a/contracts/domain-routing-hook/src/query.rs b/contracts/domain-routing-hook/src/query.rs index 43c2d762..c7b5528c 100644 --- a/contracts/domain-routing-hook/src/query.rs +++ b/contracts/domain-routing-hook/src/query.rs @@ -1,6 +1,6 @@ use cosmwasm_std::{to_binary, Deps, Env, QueryResponse}; use hpl_interface::{ - domain_routing_hook::{OwnerResponse, PauseInfoResponse}, + hook::{OwnerResponse, PauseInfoResponse}, igp_core::QuoteGasPaymentResponse, post_dispatch_hook::PostDispatchQueryMsg, types::message::Message, @@ -55,7 +55,7 @@ mod test { testing::{mock_dependencies, mock_env}, Addr, HexBinary, Uint256, }; - use hpl_interface::domain_routing_hook::HookConfig; + use hpl_interface::hook::HookConfig; use super::*; diff --git a/contracts/domain-routing-hook/src/state.rs b/contracts/domain-routing-hook/src/state.rs index 9b7a1692..aae75dd7 100644 --- a/contracts/domain-routing-hook/src/state.rs +++ b/contracts/domain-routing-hook/src/state.rs @@ -1,6 +1,6 @@ use cosmwasm_std::Addr; use cw_storage_plus::{Item, Map}; -use hpl_interface::domain_routing_hook::HookConfig; +use hpl_interface::hook::HookConfig; pub const MAILBOX_KEY: &str = "mailbox"; pub const MAILBOX: Item = Item::new(MAILBOX_KEY); diff --git a/contracts/igp-core/src/event.rs b/contracts/igp-core/src/event.rs index a04e044f..4d2428ee 100644 --- a/contracts/igp-core/src/event.rs +++ b/contracts/igp-core/src/event.rs @@ -20,7 +20,14 @@ pub fn emit_claim(beneficiary: Addr, balance: Coin) -> Event { pub fn emit_post_dispatch(metadata: Binary, message: Binary) -> Event { Event::new("igp-core-post-dispatch") - .add_attribute("metadata", metadata.to_string()) + .add_attribute( + "metadata", + if metadata.is_empty() { + "0x".to_string() + } else { + metadata.to_string() + }, + ) .add_attribute("message", message.to_string()) } @@ -39,4 +46,4 @@ pub fn emit_pay_for_gas( .add_attribute("gas_refunded", gas_refunded) .add_attribute("gas_required", gas_required) .add_attribute("payment", payment) -} \ No newline at end of file +} diff --git a/contracts/mailbox/src/core.rs b/contracts/mailbox/src/core.rs index 3e88649a..0600f37c 100644 --- a/contracts/mailbox/src/core.rs +++ b/contracts/mailbox/src/core.rs @@ -127,6 +127,8 @@ pub fn process( mod tests { use cosmwasm_std::testing::{mock_dependencies, mock_info}; + use crate::state::Config; + use super::*; const DEST_DOMAIN: u32 = 11155111; @@ -168,7 +170,7 @@ mod tests { // Invalid message version let wrong_version_message: HexBinary = HexBinary::from(Message { - version: 0, + version: 99, nonce: 2, origin_domain: 3, sender: hex("000000000000000000000000477d860f8f41bc69ddd32821f2bf2c2af0243f16"), diff --git a/contracts/mailbox/src/lib.rs b/contracts/mailbox/src/lib.rs index 7b566a3d..8e182eeb 100644 --- a/contracts/mailbox/src/lib.rs +++ b/contracts/mailbox/src/lib.rs @@ -11,7 +11,7 @@ pub mod verify; pub use crate::error::ContractError; -pub const MAILBOX_VERSION: u8 = 3; +pub const MAILBOX_VERSION: u8 = 0; // version info for migration info pub const CONTRACT_NAME: &str = env!("CARGO_PKG_NAME"); diff --git a/contracts/mock-hook/Cargo.toml b/contracts/mock-hook/Cargo.toml new file mode 100644 index 00000000..022b9a44 --- /dev/null +++ b/contracts/mock-hook/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "hpl-test-mock-hook" +version = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } +keywords = { workspace = true } + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +# for more explicit tests, cargo test --features=backtraces +backtraces = ["cosmwasm-std/backtraces"] +# use library feature to disable all instantiate/execute/query exports +library = [] + +[dependencies] +cosmwasm-std = { workspace = true } +cosmwasm-storage = { workspace = true } +cosmwasm-schema = { workspace = true } + +cw2 = { workspace = true } +cw-storage-plus = { workspace = true } + +hpl-interface = { workspace = true } + +[dev-dependencies] +cw-multi-test = { workspace = true } diff --git a/contracts/mock-hook/src/contract.rs b/contracts/mock-hook/src/contract.rs new file mode 100644 index 00000000..59e55e07 --- /dev/null +++ b/contracts/mock-hook/src/contract.rs @@ -0,0 +1,97 @@ +use cosmwasm_schema::{cw_serde, QueryResponses}; +#[cfg(not(feature = "library"))] +use cosmwasm_std::entry_point; +use cosmwasm_std::{ + to_binary, Deps, DepsMut, Empty, Env, Event, HexBinary, MessageInfo, QueryResponse, Response, + StdResult, Uint256, +}; +use cw2::set_contract_version; +use cw_storage_plus::Item; +use hpl_interface::post_dispatch_hook::{PostDispatchQueryMsg, QuoteDispatchResponse}; + +use crate::{CONTRACT_NAME, CONTRACT_VERSION}; + +const DEFAULT_GAS: u128 = 500_000; +const GAS_KEY: &str = "gas"; +const GAS: Item = Item::new(GAS_KEY); + +#[cw_serde] +pub struct InstantiateMsg {} + +#[cw_serde] +pub enum ExecuteMsg { + SetGasAmount { + gas: Uint256, + }, + PostDispatch { + metadata: HexBinary, + message: HexBinary, + }, +} + +#[cw_serde] +#[derive(QueryResponses)] +pub enum QueryMsg { + #[returns(QuoteDispatchResponse)] + QuoteDispatch(PostDispatchQueryMsg), +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn instantiate( + deps: DepsMut, + _env: Env, + _info: MessageInfo, + _msg: InstantiateMsg, +) -> StdResult { + set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; + + GAS.save(deps.storage, &Uint256::from_u128(DEFAULT_GAS))?; + + Ok(Response::new().add_attribute("method", "instantiate")) +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn migrate(_deps: DepsMut, _env: Env, _msg: Empty) -> StdResult { + Ok(Response::default()) +} + +/// Handling contract execution +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn execute( + deps: DepsMut, + _env: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> StdResult { + match msg { + ExecuteMsg::PostDispatch { metadata, message } => Ok(Response::new() + .add_event(Event::new("test-hook-post-dispatch")) + .add_attribute("gas", GAS.load(deps.storage)?) + .add_attribute("sender", info.sender) + .add_attribute("message", message.to_string()) + .add_attribute( + "metadata", + if metadata.is_empty() { + "0x".to_string() + } else { + metadata.to_string() + }, + )), + ExecuteMsg::SetGasAmount { gas } => { + GAS.save(deps.storage, &gas)?; + + Ok(Response::new()) + } + } +} + +/// Handling contract query +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn query(_deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { + match msg { + QueryMsg::QuoteDispatch(_) => { + let gas = GAS.load(_deps.storage)?; + Ok(to_binary(&QuoteDispatchResponse { gas_amount: gas })?) + } + } +} diff --git a/contracts/mock-hook/src/lib.rs b/contracts/mock-hook/src/lib.rs new file mode 100644 index 00000000..58557290 --- /dev/null +++ b/contracts/mock-hook/src/lib.rs @@ -0,0 +1,5 @@ +pub mod contract; + +// version info for migration info +pub const CONTRACT_NAME: &str = env!("CARGO_PKG_NAME"); +pub const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); diff --git a/integration-test/.gitignore b/integration-test/.gitignore index 25c8aac2..c4790d86 100644 --- a/integration-test/.gitignore +++ b/integration-test/.gitignore @@ -1,2 +1,2 @@ -tests/contracts/*.rs -!tests/contracts/mod.rs +tests/contracts/eth/bind/*.rs +!tests/contracts/eth/bind/mod.rs diff --git a/integration-test/Cargo.toml b/integration-test/Cargo.toml index a5ad62ee..e9cad0f2 100644 --- a/integration-test/Cargo.toml +++ b/integration-test/Cargo.toml @@ -23,6 +23,7 @@ cosmwasm-std = { workspace = true } [dev_dependencies] ethers = { workspace = true } +test-tube = { workspace = true } osmosis-test-tube = { workspace = true } serde_json = { workspace = true } serde-json-wasm = { workspace = true } @@ -37,6 +38,7 @@ sha3 = { workspace = true } ripemd = { workspace = true } hex-literal = { workspace = true } +hpl-ism-multisig = { workspace = true } hpl-interface = { workspace = true } [build-dependencies] diff --git a/integration-test/abis/FastHypERC20.json b/integration-test/abis/FastHypERC20.json new file mode 100644 index 00000000..883fd9a7 --- /dev/null +++ b/integration-test/abis/FastHypERC20.json @@ -0,0 +1,858 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "FastHypERC20", + "sourceName": "contracts/FastHypERC20.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint8", + "name": "__decimals", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "domain", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "gas", + "type": "uint256" + } + ], + "name": "DestinationGasSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "interchainGasPaymaster", + "type": "address" + } + ], + "name": "InterchainGasPaymasterSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "InterchainSecurityModuleSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "mailbox", + "type": "address" + } + ], + "name": "MailboxSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "origin", + "type": "uint32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "recipient", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ReceivedTransferRemote", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "domain", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "router", + "type": "bytes32" + } + ], + "name": "RemoteRouterEnrolled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "destination", + "type": "uint32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "recipient", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "SentTransferRemote", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "name": "destinationGas", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "domains", + "outputs": [ + { + "internalType": "uint32[]", + "name": "", + "type": "uint32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_domain", + "type": "uint32" + }, + { + "internalType": "bytes32", + "name": "_router", + "type": "bytes32" + } + ], + "name": "enrollRemoteRouter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32[]", + "name": "_domains", + "type": "uint32[]" + }, + { + "internalType": "bytes32[]", + "name": "_addresses", + "type": "bytes32[]" + } + ], + "name": "enrollRemoteRouters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "fastTransferId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_destination", + "type": "uint32" + }, + { + "internalType": "bytes32", + "name": "_recipient", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amountOrId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_fastFee", + "type": "uint256" + } + ], + "name": "fastTransferRemote", + "outputs": [ + { + "internalType": "bytes32", + "name": "messageId", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_fastFee", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "_origin", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "_fastTransferId", + "type": "uint256" + } + ], + "name": "fillFastTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_origin", + "type": "uint32" + }, + { + "internalType": "bytes32", + "name": "_sender", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_message", + "type": "bytes" + } + ], + "name": "handle", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_mailbox", + "type": "address" + }, + { + "internalType": "address", + "name": "_interchainGasPaymaster", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_totalSupply", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "interchainGasPaymaster", + "outputs": [ + { + "internalType": "contract IInterchainGasPaymaster", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "interchainSecurityModule", + "outputs": [ + { + "internalType": "contract IInterchainSecurityModule", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mailbox", + "outputs": [ + { + "internalType": "contract IMailbox", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_destinationDomain", + "type": "uint32" + } + ], + "name": "quoteGasPayment", + "outputs": [ + { + "internalType": "uint256", + "name": "_gasPayment", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_domain", + "type": "uint32" + } + ], + "name": "routers", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "domain", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "gas", + "type": "uint256" + } + ], + "internalType": "struct GasRouter.GasRouterConfig[]", + "name": "gasConfigs", + "type": "tuple[]" + } + ], + "name": "setDestinationGas", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_interchainGasPaymaster", + "type": "address" + } + ], + "name": "setInterchainGasPaymaster", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_module", + "type": "address" + } + ], + "name": "setInterchainSecurityModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_mailbox", + "type": "address" + } + ], + "name": "setMailbox", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_destination", + "type": "uint32" + }, + { + "internalType": "bytes32", + "name": "_recipient", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amountOrId", + "type": "uint256" + } + ], + "name": "transferRemote", + "outputs": [ + { + "internalType": "bytes32", + "name": "messageId", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162004ae238038062004ae2833981810160405281019062000037919062000091565b808060ff1660808160ff16815250505050620000c3565b600080fd5b600060ff82169050919050565b6200006b8162000053565b81146200007757600080fd5b50565b6000815190506200008b8162000060565b92915050565b600060208284031215620000aa57620000a96200004e565b5b6000620000ba848285016200007a565b91505092915050565b608051614a03620000df6000396000610a7c0152614a036000f3fe6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063d5438eae116100a0578063f1bd6f0a1161006f578063f1bd6f0a1461072c578063f2ed8c5314610755578063f2fde38b14610792578063f3c61d6b146107bb578063f5f09f2e146107e4576101ee565b8063d5438eae14610670578063dd62ed3e1461069b578063de523cf3146106d8578063e9198bf914610703576101ee565b8063a478333b116100dc578063a478333b146105b6578063a9059cbb146105e1578063b1bd64361461061e578063b49c53a714610647576101ee565b80638da5cb5b146104fa57806395d89b41146105255780639ab8367e14610550578063a457c2d714610579576101ee565b8063395093511161018557806370a082311161015457806370a0823114610439578063715018a614610476578063775313a11461048d57806381b4e8b4146104ca576101ee565b8063395093511461037d57806339bb4ad9146103ba578063440df4f4146103e557806356d5d47514610410576101ee565b80631b177491116101c15780631b177491146102af57806323b872dd146102d85780632ead72f614610315578063313ce56714610352576101ee565b806306fdde03146101f3578063095ea7b31461021e5780630e72cc061461025b57806318160ddd14610284575b600080fd5b3480156101ff57600080fd5b50610208610814565b6040516102159190612cb1565b60405180910390f35b34801561022a57600080fd5b5061024560048036038101906102409190612d7b565b6108a6565b6040516102529190612dd6565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612df1565b6108c9565b005b34801561029057600080fd5b506102996108dd565b6040516102a69190612e2d565b60405180910390f35b3480156102bb57600080fd5b506102d660048036038101906102d19190612e84565b6108e7565b005b3480156102e457600080fd5b506102ff60048036038101906102fa9190612eff565b610a20565b60405161030c9190612dd6565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190612f52565b610a4f565b6040516103499190612f98565b60405180910390f35b34801561035e57600080fd5b50610367610a78565b6040516103749190612fcf565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f9190612d7b565b610aa0565b6040516103b19190612dd6565b60405180910390f35b3480156103c657600080fd5b506103cf610ad7565b6040516103dc9190613049565b60405180910390f35b3480156103f157600080fd5b506103fa610afd565b6040516104079190613122565b60405180910390f35b34801561041c57600080fd5b50610437600480360381019061043291906131d5565b610b0e565b005b34801561044557600080fd5b50610460600480360381019061045b9190612df1565b610c19565b60405161046d9190612e2d565b60405180910390f35b34801561048257600080fd5b5061048b610c62565b005b34801561049957600080fd5b506104b460048036038101906104af9190612f52565b610c76565b6040516104c19190612e2d565b60405180910390f35b6104e460048036038101906104df9190613249565b610c8e565b6040516104f19190612f98565b60405180910390f35b34801561050657600080fd5b5061050f610ca5565b60405161051c91906132ab565b60405180910390f35b34801561053157600080fd5b5061053a610ccf565b6040516105479190612cb1565b60405180910390f35b34801561055c57600080fd5b50610577600480360381019061057291906133f6565b610d61565b005b34801561058557600080fd5b506105a0600480360381019061059b9190612d7b565b610eba565b6040516105ad9190612dd6565b60405180910390f35b3480156105c257600080fd5b506105cb610f31565b6040516105d89190612e2d565b60405180910390f35b3480156105ed57600080fd5b5061060860048036038101906106039190612d7b565b610f37565b6040516106159190612dd6565b60405180910390f35b34801561062a57600080fd5b50610645600480360381019061064091906134ff565b610f5a565b005b34801561065357600080fd5b5061066e6004803603810190610669919061354c565b610fd9565b005b34801561067c57600080fd5b50610685610fef565b60405161069291906135ad565b60405180910390f35b3480156106a757600080fd5b506106c260048036038101906106bd91906135c8565b611015565b6040516106cf9190612e2d565b60405180910390f35b3480156106e457600080fd5b506106ed61109c565b6040516106fa9190613629565b60405180910390f35b34801561070f57600080fd5b5061072a600480360381019061072591906136f0565b6110c2565b005b34801561073857600080fd5b50610753600480360381019061074e9190612df1565b61118b565b005b34801561076157600080fd5b5061077c60048036038101906107779190612f52565b61119f565b6040516107899190612e2d565b60405180910390f35b34801561079e57600080fd5b506107b960048036038101906107b49190612df1565b611265565b005b3480156107c757600080fd5b506107e260048036038101906107dd9190612df1565b6112e8565b005b6107fe60048036038101906107f99190613771565b6112fc565b60405161080b9190612f98565b60405180910390f35b60606036805461082390613807565b80601f016020809104026020016040519081016040528092919081815260200182805461084f90613807565b801561089c5780601f106108715761010080835404028352916020019161089c565b820191906000526020600020905b81548152906001019060200180831161087f57829003601f168201915b5050505050905090565b6000806108b1611393565b90506108be81858561139b565b600191505092915050565b6108d1611564565b6108da816115e2565b50565b6000603554905090565b60006108f6838387878a6116e8565b9050600073ffffffffffffffffffffffffffffffffffffffff16610100600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461099b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099290613884565b60405180910390fd5b33610100600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610a033385876109fe91906138d3565b611724565b610a18868587610a1391906138d3565b611732565b505050505050565b600080610a2b611393565b9050610a38858285611740565b610a438585856117cc565b60019150509392505050565b600080610a6c8363ffffffff1660ca611a4590919063ffffffff16565b91505080915050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b600080610aab611393565b9050610acc818585610abd8589611015565b610ac79190613907565b61139b565b600191505092915050565b609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060610b0960ca611a6c565b905090565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9590613987565b60405180910390fd5b8383610baa8282611b35565b60405180608001604052806043815260200161498b6043913990610c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfb9190612cb1565b60405180910390fd5b50610c1186868686611b4a565b505050505050565b6000603360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c6a611564565b610c746000611b5c565b565b60fe6020528060005260406000206000915090505481565b6000610c9c84848434611c22565b90509392505050565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060378054610cde90613807565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0a90613807565b8015610d575780601f10610d2c57610100808354040283529160200191610d57565b820191906000526020600020905b815481529060010190602001808311610d3a57829003601f168201915b5050505050905090565b60008060019054906101000a900460ff16159050808015610d925750600160008054906101000a900460ff1660ff16105b80610dbf5750610da130611c90565b158015610dbe5750600160008054906101000a900460ff1660ff16145b5b610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590613a19565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610e3b576001600060016101000a81548160ff0219169083151502179055505b610e458686611cb3565b610e4f8383611d18565b610e593385611d75565b8015610eb25760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610ea99190613a74565b60405180910390a15b505050505050565b600080610ec5611393565b90506000610ed38286611015565b905083811015610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90613b01565b60405180910390fd5b610f25828686840361139b565b60019250505092915050565b60ff5481565b600080610f42611393565b9050610f4f8185856117cc565b600191505092915050565b610f62611564565b60005b82829050811015610fd457610fc0838383818110610f8657610f85613b21565b5b9050604002016000016020810190610f9e9190612f52565b848484818110610fb157610fb0613b21565b5b90506040020160200135611ecc565b600181610fcd9190613907565b9050610f65565b505050565b610fe1611564565b610feb8282611f32565b5050565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000603460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110ca611564565b818190508484905014611112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110990613b9c565b60405180910390fd5b600084849050905060005b818110156111835761116f86868381811061113b5761113a613b21565b5b90506020020160208101906111509190612f52565b85858481811061116357611162613b21565b5b90506020020135611f32565b60018161117c9190613907565b905061111d565b505050505050565b611193611564565b61119c81611f90565b50565b6000609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a69297938360fe60008663ffffffff1663ffffffff168152602001908152602001600020546040518363ffffffff1660e01b815260040161121d929190613bcb565b602060405180830381865afa15801561123a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125e9190613c09565b9050919050565b61126d611564565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390613ca8565b60405180910390fd5b6112e581611b5c565b50565b6112f0611564565b6112f981612061565b50565b60008060ff5490506001816113119190613907565b60ff819055506000611330858560018561132b9190613907565b612132565b905061134887611341888885612169565b3433612198565b9250858763ffffffff167fd229aacb94204188fe8042965fa6b269c62dc5818b21238779ab64bdd17efeec876040516113819190612e2d565b60405180910390a35050949350505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140190613d3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147090613dcc565b60405180910390fd5b80603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115579190612e2d565b60405180910390a3505050565b61156c611393565b73ffffffffffffffffffffffffffffffffffffffff1661158a610ca5565b73ffffffffffffffffffffffffffffffffffffffff16146115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d790613e38565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806116225750611621816121d0565b5b611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165890613ea4565b60405180910390fd5b80609960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167ffec811ed4e60aebdaf7a79cad8a97196bf56e35362f039705598226d30c9d24860405160405180910390a250565b60008585858585604051602001611703959493929190613f63565b60405160208183030381529060405280519060200120905095945050505050565b61172e82826121f3565b5050565b61173c8282611d75565b5050565b600061174c8484611015565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117c657818110156117b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117af9061400e565b60405180910390fd5b6117c5848484840361139b565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361183b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611832906140a0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190614132565b60405180910390fd5b6118b58383836123c2565b6000603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561193c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611933906141c4565b60405180910390fd5b818103603360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a2c9190612e2d565b60405180910390a3611a3f8484846123c7565b50505050565b600080611a618360001b856000016123cc90919063ffffffff16565b915091509250929050565b60606000611a798361241b565b9050805167ffffffffffffffff811115611a9657611a956132cb565b5b604051908082528060200260200182016040528015611ac45781602001602082028036833780820191505090505b50915060005b8151811015611b2e57818181518110611ae657611ae5613b21565b5b6020026020010151838281518110611b0157611b00613b21565b5b602002602001019063ffffffff16908163ffffffff16815250508080611b26906141e4565b915050611aca565b5050919050565b600081611b4184610a4f565b14905092915050565b611b56848484846124d8565b50505050565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080611c2e84612563565b9050611c4686611c3f878785612169565b8533612198565b9150848663ffffffff167fd229aacb94204188fe8042965fa6b269c62dc5818b21238779ab64bdd17efeec86604051611c7f9190612e2d565b60405180910390a350949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf99061429e565b60405180910390fd5b611d0b81611f90565b611d1482612586565b5050565b600060019054906101000a900460ff16611d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5e9061429e565b60405180910390fd5b611d7182826125e9565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb9061430a565b60405180910390fd5b611df0600083836123c2565b8060356000828254611e029190613907565b9250508190555080603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611eb49190612e2d565b60405180910390a3611ec8600083836123c7565b5050565b8060fe60008463ffffffff1663ffffffff168152602001908152602001600020819055508163ffffffff167f90563f253ecb04527a6a7ae1a8cbe2bdc6caefb39d5f7b06a973cf5e7f8035a482604051611f269190612e2d565b60405180910390a25050565b611f4e8263ffffffff168260ca61265c9092919063ffffffff16565b8163ffffffff167f97fd51fef1f80c854cbd0150c248e8b2ac4ecdc97cc05e742b5f61c9f4dc645882604051611f849190612f98565b60405180910390a25050565b80611f9a816121d0565b611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd090613ea4565b60405180910390fd5b81609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167fb87f5a0bface22cde699143559fb99f990ae54eea236995fc54178af91af859f60405160405180910390a25050565b8061206b816121d0565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190613ea4565b60405180910390fd5b81609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f7a61e573722ff8b205c8962b59d37e7d30573f368965597a844a94872204ebd760405160405180910390a25050565b606061213e3385611724565b828260405160200161215192919061432a565b60405160208183030381529060405290509392505050565b6060838383604051602001612180939291906143bb565b60405160208183030381529060405290509392505050565b60006121c6858560fe60008963ffffffff1663ffffffff16815260200190815260200160002054868661267d565b9050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225990614466565b60405180910390fd5b61226e826000836123c2565b6000603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156122f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ec906144f8565b60405180910390fd5b818103603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603560008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516123a99190612e2d565b60405180910390a36123bd836000846123c7565b505050565b505050565b505050565b60008060008460020160008581526020019081526020016000205490506000801b810361240b576123fd8585612728565b6000801b9250925050612414565b60018192509250505b9250929050565b6060600061242b83600001612748565b90508067ffffffffffffffff811115612447576124466132cb565b5b6040519080825280602002602001820160405280156124755781602001602082028036833780820191505090505b50915060005b818110156124d15761249c818560000160000161275d90919063ffffffff16565b60001c8382815181106124b2576124b1613b21565b5b60200260200101818152505080806124c9906141e4565b91505061247b565b5050919050565b60006124e48383612774565b905060006124f2848461279d565b905036600061250186866127c9565b9150915061251a612511856127ea565b848a85856127f7565b838863ffffffff167fba20947a325f450d232530e5f5fce293e7963499d5309a07cee84a269f2f15a6856040516125519190612e2d565b60405180910390a35050505050505050565b606061256f33836121f3565b604051806020016040528060008152509050919050565b600060019054906101000a900460ff166125d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cc9061429e565b60405180910390fd5b6125de81612061565b6125e661281a565b50565b600060019054906101000a900460ff16612638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262f9061429e565b60405180910390fd5b816036908161264791906146ba565b50806037908161265791906146ba565b505050565b6126778260001b82856000016128739092919063ffffffff16565b50505050565b600061268986866128ae565b9050609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166311bf2c1884838988876040518663ffffffff1660e01b81526004016126ed949392919061478c565b6000604051808303818588803b15801561270657600080fd5b505af115801561271a573d6000803e3d6000fd5b505050505095945050505050565b6000612740828460000161296790919063ffffffff16565b905092915050565b60006127568260000161297e565b9050919050565b600061276c8360000183612993565b905092915050565b6000828260009060209261278a939291906147db565b906127959190614821565b905092915050565b600082826020906040926127b3939291906147db565b906127be9190614821565b60001c905092915050565b366000838360409080926127df939291906147db565b915091509250929050565b60008160001c9050919050565b600061280686868686866129be565b90506128128186611732565b505050505050565b600060019054906101000a900460ff16612869576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128609061429e565b60405180910390fd5b612871612a7c565b565b600081846002016000858152602001908152602001600020819055506128a58385600001612add90919063ffffffff16565b90509392505050565b6000806128ba84612af4565b9050609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa31de018583866040518463ffffffff1660e01b815260040161291b939291906148ca565b6020604051808303816000875af115801561293a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295e919061491d565b91505092915050565b60006129768360000183612b7d565b905092915050565b600061298c82600001612ba0565b9050919050565b60008260000182815481106129ab576129aa613b21565b5b9060005260206000200154905092915050565b60008083839050036129d257859050612a73565b60008084848101906129e4919061494a565b91509150600061010060006129fc89858c888f6116e8565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612a6c57809350505050612a73565b8893505050505b95945050505050565b600060019054906101000a900460ff16612acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac29061429e565b60405180910390fd5b612adb612ad6611393565b611b5c565b565b6000612aec8360000183612bb1565b905092915050565b6000806000612b138463ffffffff1660ca611a4590919063ffffffff16565b915091508160405180608001604052806043815260200161498b6043913990612b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b699190612cb1565b60405180910390fd5b508092505050919050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b6000612bbd8383612b7d565b612c16578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612c1b565b600090505b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c5b578082015181840152602081019050612c40565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c8382612c21565b612c8d8185612c2c565b9350612c9d818560208601612c3d565b612ca681612c67565b840191505092915050565b60006020820190508181036000830152612ccb8184612c78565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d1282612ce7565b9050919050565b612d2281612d07565b8114612d2d57600080fd5b50565b600081359050612d3f81612d19565b92915050565b6000819050919050565b612d5881612d45565b8114612d6357600080fd5b50565b600081359050612d7581612d4f565b92915050565b60008060408385031215612d9257612d91612cdd565b5b6000612da085828601612d30565b9250506020612db185828601612d66565b9150509250929050565b60008115159050919050565b612dd081612dbb565b82525050565b6000602082019050612deb6000830184612dc7565b92915050565b600060208284031215612e0757612e06612cdd565b5b6000612e1584828501612d30565b91505092915050565b612e2781612d45565b82525050565b6000602082019050612e426000830184612e1e565b92915050565b600063ffffffff82169050919050565b612e6181612e48565b8114612e6c57600080fd5b50565b600081359050612e7e81612e58565b92915050565b600080600080600060a08688031215612ea057612e9f612cdd565b5b6000612eae88828901612d30565b9550506020612ebf88828901612d66565b9450506040612ed088828901612d66565b9350506060612ee188828901612e6f565b9250506080612ef288828901612d66565b9150509295509295909350565b600080600060608486031215612f1857612f17612cdd565b5b6000612f2686828701612d30565b9350506020612f3786828701612d30565b9250506040612f4886828701612d66565b9150509250925092565b600060208284031215612f6857612f67612cdd565b5b6000612f7684828501612e6f565b91505092915050565b6000819050919050565b612f9281612f7f565b82525050565b6000602082019050612fad6000830184612f89565b92915050565b600060ff82169050919050565b612fc981612fb3565b82525050565b6000602082019050612fe46000830184612fc0565b92915050565b6000819050919050565b600061300f61300a61300584612ce7565b612fea565b612ce7565b9050919050565b600061302182612ff4565b9050919050565b600061303382613016565b9050919050565b61304381613028565b82525050565b600060208201905061305e600083018461303a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61309981612e48565b82525050565b60006130ab8383613090565b60208301905092915050565b6000602082019050919050565b60006130cf82613064565b6130d9818561306f565b93506130e483613080565b8060005b838110156131155781516130fc888261309f565b9750613107836130b7565b9250506001810190506130e8565b5085935050505092915050565b6000602082019050818103600083015261313c81846130c4565b905092915050565b61314d81612f7f565b811461315857600080fd5b50565b60008135905061316a81613144565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261319557613194613170565b5b8235905067ffffffffffffffff8111156131b2576131b1613175565b5b6020830191508360018202830111156131ce576131cd61317a565b5b9250929050565b600080600080606085870312156131ef576131ee612cdd565b5b60006131fd87828801612e6f565b945050602061320e8782880161315b565b935050604085013567ffffffffffffffff81111561322f5761322e612ce2565b5b61323b8782880161317f565b925092505092959194509250565b60008060006060848603121561326257613261612cdd565b5b600061327086828701612e6f565b93505060206132818682870161315b565b925050604061329286828701612d66565b9150509250925092565b6132a581612d07565b82525050565b60006020820190506132c0600083018461329c565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61330382612c67565b810181811067ffffffffffffffff82111715613322576133216132cb565b5b80604052505050565b6000613335612cd3565b905061334182826132fa565b919050565b600067ffffffffffffffff821115613361576133606132cb565b5b61336a82612c67565b9050602081019050919050565b82818337600083830152505050565b600061339961339484613346565b61332b565b9050828152602081018484840111156133b5576133b46132c6565b5b6133c0848285613377565b509392505050565b600082601f8301126133dd576133dc613170565b5b81356133ed848260208601613386565b91505092915050565b600080600080600060a0868803121561341257613411612cdd565b5b600061342088828901612d30565b955050602061343188828901612d30565b945050604061344288828901612d66565b935050606086013567ffffffffffffffff81111561346357613462612ce2565b5b61346f888289016133c8565b925050608086013567ffffffffffffffff8111156134905761348f612ce2565b5b61349c888289016133c8565b9150509295509295909350565b60008083601f8401126134bf576134be613170565b5b8235905067ffffffffffffffff8111156134dc576134db613175565b5b6020830191508360408202830111156134f8576134f761317a565b5b9250929050565b6000806020838503121561351657613515612cdd565b5b600083013567ffffffffffffffff81111561353457613533612ce2565b5b613540858286016134a9565b92509250509250929050565b6000806040838503121561356357613562612cdd565b5b600061357185828601612e6f565b92505060206135828582860161315b565b9150509250929050565b600061359782613016565b9050919050565b6135a78161358c565b82525050565b60006020820190506135c2600083018461359e565b92915050565b600080604083850312156135df576135de612cdd565b5b60006135ed85828601612d30565b92505060206135fe85828601612d30565b9150509250929050565b600061361382613016565b9050919050565b61362381613608565b82525050565b600060208201905061363e600083018461361a565b92915050565b60008083601f84011261365a57613659613170565b5b8235905067ffffffffffffffff81111561367757613676613175565b5b6020830191508360208202830111156136935761369261317a565b5b9250929050565b60008083601f8401126136b0576136af613170565b5b8235905067ffffffffffffffff8111156136cd576136cc613175565b5b6020830191508360208202830111156136e9576136e861317a565b5b9250929050565b6000806000806040858703121561370a57613709612cdd565b5b600085013567ffffffffffffffff81111561372857613727612ce2565b5b61373487828801613644565b9450945050602085013567ffffffffffffffff81111561375757613756612ce2565b5b6137638782880161369a565b925092505092959194509250565b6000806000806080858703121561378b5761378a612cdd565b5b600061379987828801612e6f565b94505060206137aa8782880161315b565b93505060406137bb87828801612d66565b92505060606137cc87828801612d66565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061381f57607f821691505b602082108103613832576138316137d8565b5b50919050565b7f7265717565737420616c72656164792066696c6c656400000000000000000000600082015250565b600061386e601683612c2c565b915061387982613838565b602082019050919050565b6000602082019050818103600083015261389d81613861565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138de82612d45565b91506138e983612d45565b9250828203905081811115613901576139006138a4565b5b92915050565b600061391282612d45565b915061391d83612d45565b9250828201905080821115613935576139346138a4565b5b92915050565b7f216d61696c626f78000000000000000000000000000000000000000000000000600082015250565b6000613971600883612c2c565b915061397c8261393b565b602082019050919050565b600060208201905081810360008301526139a081613964565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000613a03602e83612c2c565b9150613a0e826139a7565b604082019050919050565b60006020820190508181036000830152613a32816139f6565b9050919050565b6000819050919050565b6000613a5e613a59613a5484613a39565b612fea565b612fb3565b9050919050565b613a6e81613a43565b82525050565b6000602082019050613a896000830184613a65565b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613aeb602583612c2c565b9150613af682613a8f565b604082019050919050565b60006020820190508181036000830152613b1a81613ade565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f216c656e67746800000000000000000000000000000000000000000000000000600082015250565b6000613b86600783612c2c565b9150613b9182613b50565b602082019050919050565b60006020820190508181036000830152613bb581613b79565b9050919050565b613bc581612e48565b82525050565b6000604082019050613be06000830185613bbc565b613bed6020830184612e1e565b9392505050565b600081519050613c0381612d4f565b92915050565b600060208284031215613c1f57613c1e612cdd565b5b6000613c2d84828501613bf4565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c92602683612c2c565b9150613c9d82613c36565b604082019050919050565b60006020820190508181036000830152613cc181613c85565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d24602483612c2c565b9150613d2f82613cc8565b604082019050919050565b60006020820190508181036000830152613d5381613d17565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613db6602283612c2c565b9150613dc182613d5a565b604082019050919050565b60006020820190508181036000830152613de581613da9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e22602083612c2c565b9150613e2d82613dec565b602082019050919050565b60006020820190508181036000830152613e5181613e15565b9050919050565b7f21636f6e74726163740000000000000000000000000000000000000000000000600082015250565b6000613e8e600983612c2c565b9150613e9982613e58565b602082019050919050565b60006020820190508181036000830152613ebd81613e81565b9050919050565b60008160e01b9050919050565b6000613edc82613ec4565b9050919050565b613ef4613eef82612e48565b613ed1565b82525050565b6000819050919050565b613f15613f1082612d45565b613efa565b82525050565b60008160601b9050919050565b6000613f3382613f1b565b9050919050565b6000613f4582613f28565b9050919050565b613f5d613f5882612d07565b613f3a565b82525050565b6000613f6f8288613ee3565b600482019150613f7f8287613f04565b602082019150613f8f8286613f04565b602082019150613f9f8285613f04565b602082019150613faf8284613f4c565b6014820191508190509695505050505050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613ff8601d83612c2c565b915061400382613fc2565b602082019050919050565b6000602082019050818103600083015261402781613feb565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061408a602583612c2c565b91506140958261402e565b604082019050919050565b600060208201905081810360008301526140b98161407d565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061411c602383612c2c565b9150614127826140c0565b604082019050919050565b6000602082019050818103600083015261414b8161410f565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006141ae602683612c2c565b91506141b982614152565b604082019050919050565b600060208201905081810360008301526141dd816141a1565b9050919050565b60006141ef82612d45565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614221576142206138a4565b5b600182019050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b6000614288602b83612c2c565b91506142938261422c565b604082019050919050565b600060208201905081810360008301526142b78161427b565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006142f4601f83612c2c565b91506142ff826142be565b602082019050919050565b60006020820190508181036000830152614323816142e7565b9050919050565b600060408201905061433f6000830185612e1e565b61434c6020830184612e1e565b9392505050565b6000819050919050565b61436e61436982612f7f565b614353565b82525050565b600081519050919050565b600081905092915050565b600061439582614374565b61439f818561437f565b93506143af818560208601612c3d565b80840191505092915050565b60006143c7828661435d565b6020820191506143d78285613f04565b6020820191506143e7828461438a565b9150819050949350505050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614450602183612c2c565b915061445b826143f4565b604082019050919050565b6000602082019050818103600083015261447f81614443565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006144e2602283612c2c565b91506144ed82614486565b604082019050919050565b60006020820190508181036000830152614511816144d5565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261457a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261453d565b614584868361453d565b95508019841693508086168417925050509392505050565b60006145b76145b26145ad84612d45565b612fea565b612d45565b9050919050565b6000819050919050565b6145d18361459c565b6145e56145dd826145be565b84845461454a565b825550505050565b600090565b6145fa6145ed565b6146058184846145c8565b505050565b5b818110156146295761461e6000826145f2565b60018101905061460b565b5050565b601f82111561466e5761463f81614518565b6146488461452d565b81016020851015614657578190505b61466b6146638561452d565b83018261460a565b50505b505050565b600082821c905092915050565b600061469160001984600802614673565b1980831691505092915050565b60006146aa8383614680565b9150826002028217905092915050565b6146c382612c21565b67ffffffffffffffff8111156146dc576146db6132cb565b5b6146e68254613807565b6146f182828561462d565b600060209050601f8311600181146147245760008415614712578287015190505b61471c858261469e565b865550614784565b601f19841661473286614518565b60005b8281101561475a57848901518255600182019150602085019450602081019050614735565b868310156147775784890151614773601f891682614680565b8355505b6001600288020188555050505b505050505050565b60006080820190506147a16000830187612f89565b6147ae6020830186613bbc565b6147bb6040830185612e1e565b6147c8606083018461329c565b95945050505050565b600080fd5b600080fd5b600080858511156147ef576147ee6147d1565b5b83861115614800576147ff6147d6565b5b6001850283019150848603905094509492505050565b600082905092915050565b600061482d8383614816565b826148388135612f7f565b92506020821015614878576148737fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080261453d565b831692505b505092915050565b600082825260208201905092915050565b600061489c82614374565b6148a68185614880565b93506148b6818560208601612c3d565b6148bf81612c67565b840191505092915050565b60006060820190506148df6000830186613bbc565b6148ec6020830185612f89565b81810360408301526148fe8184614891565b9050949350505050565b60008151905061491781613144565b92915050565b60006020828403121561493357614932612cdd565b5b600061494184828501614908565b91505092915050565b6000806040838503121561496157614960612cdd565b5b600061496f85828601612d66565b925050602061498085828601612d66565b915050925092905056fe4e6f20726f7574657220656e726f6c6c656420666f7220646f6d61696e2e2044696420796f7520737065636966792074686520726967687420646f6d61696e2049443fa2646970667358221220c14552771ae4c287924c40d77542afb6211048c2150985141d46033b488eefb664736f6c63430008100033", + "deployedBytecode": "0x6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063d5438eae116100a0578063f1bd6f0a1161006f578063f1bd6f0a1461072c578063f2ed8c5314610755578063f2fde38b14610792578063f3c61d6b146107bb578063f5f09f2e146107e4576101ee565b8063d5438eae14610670578063dd62ed3e1461069b578063de523cf3146106d8578063e9198bf914610703576101ee565b8063a478333b116100dc578063a478333b146105b6578063a9059cbb146105e1578063b1bd64361461061e578063b49c53a714610647576101ee565b80638da5cb5b146104fa57806395d89b41146105255780639ab8367e14610550578063a457c2d714610579576101ee565b8063395093511161018557806370a082311161015457806370a0823114610439578063715018a614610476578063775313a11461048d57806381b4e8b4146104ca576101ee565b8063395093511461037d57806339bb4ad9146103ba578063440df4f4146103e557806356d5d47514610410576101ee565b80631b177491116101c15780631b177491146102af57806323b872dd146102d85780632ead72f614610315578063313ce56714610352576101ee565b806306fdde03146101f3578063095ea7b31461021e5780630e72cc061461025b57806318160ddd14610284575b600080fd5b3480156101ff57600080fd5b50610208610814565b6040516102159190612cb1565b60405180910390f35b34801561022a57600080fd5b5061024560048036038101906102409190612d7b565b6108a6565b6040516102529190612dd6565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612df1565b6108c9565b005b34801561029057600080fd5b506102996108dd565b6040516102a69190612e2d565b60405180910390f35b3480156102bb57600080fd5b506102d660048036038101906102d19190612e84565b6108e7565b005b3480156102e457600080fd5b506102ff60048036038101906102fa9190612eff565b610a20565b60405161030c9190612dd6565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190612f52565b610a4f565b6040516103499190612f98565b60405180910390f35b34801561035e57600080fd5b50610367610a78565b6040516103749190612fcf565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f9190612d7b565b610aa0565b6040516103b19190612dd6565b60405180910390f35b3480156103c657600080fd5b506103cf610ad7565b6040516103dc9190613049565b60405180910390f35b3480156103f157600080fd5b506103fa610afd565b6040516104079190613122565b60405180910390f35b34801561041c57600080fd5b50610437600480360381019061043291906131d5565b610b0e565b005b34801561044557600080fd5b50610460600480360381019061045b9190612df1565b610c19565b60405161046d9190612e2d565b60405180910390f35b34801561048257600080fd5b5061048b610c62565b005b34801561049957600080fd5b506104b460048036038101906104af9190612f52565b610c76565b6040516104c19190612e2d565b60405180910390f35b6104e460048036038101906104df9190613249565b610c8e565b6040516104f19190612f98565b60405180910390f35b34801561050657600080fd5b5061050f610ca5565b60405161051c91906132ab565b60405180910390f35b34801561053157600080fd5b5061053a610ccf565b6040516105479190612cb1565b60405180910390f35b34801561055c57600080fd5b50610577600480360381019061057291906133f6565b610d61565b005b34801561058557600080fd5b506105a0600480360381019061059b9190612d7b565b610eba565b6040516105ad9190612dd6565b60405180910390f35b3480156105c257600080fd5b506105cb610f31565b6040516105d89190612e2d565b60405180910390f35b3480156105ed57600080fd5b5061060860048036038101906106039190612d7b565b610f37565b6040516106159190612dd6565b60405180910390f35b34801561062a57600080fd5b50610645600480360381019061064091906134ff565b610f5a565b005b34801561065357600080fd5b5061066e6004803603810190610669919061354c565b610fd9565b005b34801561067c57600080fd5b50610685610fef565b60405161069291906135ad565b60405180910390f35b3480156106a757600080fd5b506106c260048036038101906106bd91906135c8565b611015565b6040516106cf9190612e2d565b60405180910390f35b3480156106e457600080fd5b506106ed61109c565b6040516106fa9190613629565b60405180910390f35b34801561070f57600080fd5b5061072a600480360381019061072591906136f0565b6110c2565b005b34801561073857600080fd5b50610753600480360381019061074e9190612df1565b61118b565b005b34801561076157600080fd5b5061077c60048036038101906107779190612f52565b61119f565b6040516107899190612e2d565b60405180910390f35b34801561079e57600080fd5b506107b960048036038101906107b49190612df1565b611265565b005b3480156107c757600080fd5b506107e260048036038101906107dd9190612df1565b6112e8565b005b6107fe60048036038101906107f99190613771565b6112fc565b60405161080b9190612f98565b60405180910390f35b60606036805461082390613807565b80601f016020809104026020016040519081016040528092919081815260200182805461084f90613807565b801561089c5780601f106108715761010080835404028352916020019161089c565b820191906000526020600020905b81548152906001019060200180831161087f57829003601f168201915b5050505050905090565b6000806108b1611393565b90506108be81858561139b565b600191505092915050565b6108d1611564565b6108da816115e2565b50565b6000603554905090565b60006108f6838387878a6116e8565b9050600073ffffffffffffffffffffffffffffffffffffffff16610100600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461099b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099290613884565b60405180910390fd5b33610100600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610a033385876109fe91906138d3565b611724565b610a18868587610a1391906138d3565b611732565b505050505050565b600080610a2b611393565b9050610a38858285611740565b610a438585856117cc565b60019150509392505050565b600080610a6c8363ffffffff1660ca611a4590919063ffffffff16565b91505080915050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b600080610aab611393565b9050610acc818585610abd8589611015565b610ac79190613907565b61139b565b600191505092915050565b609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060610b0960ca611a6c565b905090565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9590613987565b60405180910390fd5b8383610baa8282611b35565b60405180608001604052806043815260200161498b6043913990610c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfb9190612cb1565b60405180910390fd5b50610c1186868686611b4a565b505050505050565b6000603360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c6a611564565b610c746000611b5c565b565b60fe6020528060005260406000206000915090505481565b6000610c9c84848434611c22565b90509392505050565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060378054610cde90613807565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0a90613807565b8015610d575780601f10610d2c57610100808354040283529160200191610d57565b820191906000526020600020905b815481529060010190602001808311610d3a57829003601f168201915b5050505050905090565b60008060019054906101000a900460ff16159050808015610d925750600160008054906101000a900460ff1660ff16105b80610dbf5750610da130611c90565b158015610dbe5750600160008054906101000a900460ff1660ff16145b5b610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590613a19565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610e3b576001600060016101000a81548160ff0219169083151502179055505b610e458686611cb3565b610e4f8383611d18565b610e593385611d75565b8015610eb25760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610ea99190613a74565b60405180910390a15b505050505050565b600080610ec5611393565b90506000610ed38286611015565b905083811015610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90613b01565b60405180910390fd5b610f25828686840361139b565b60019250505092915050565b60ff5481565b600080610f42611393565b9050610f4f8185856117cc565b600191505092915050565b610f62611564565b60005b82829050811015610fd457610fc0838383818110610f8657610f85613b21565b5b9050604002016000016020810190610f9e9190612f52565b848484818110610fb157610fb0613b21565b5b90506040020160200135611ecc565b600181610fcd9190613907565b9050610f65565b505050565b610fe1611564565b610feb8282611f32565b5050565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000603460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110ca611564565b818190508484905014611112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110990613b9c565b60405180910390fd5b600084849050905060005b818110156111835761116f86868381811061113b5761113a613b21565b5b90506020020160208101906111509190612f52565b85858481811061116357611162613b21565b5b90506020020135611f32565b60018161117c9190613907565b905061111d565b505050505050565b611193611564565b61119c81611f90565b50565b6000609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a69297938360fe60008663ffffffff1663ffffffff168152602001908152602001600020546040518363ffffffff1660e01b815260040161121d929190613bcb565b602060405180830381865afa15801561123a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125e9190613c09565b9050919050565b61126d611564565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390613ca8565b60405180910390fd5b6112e581611b5c565b50565b6112f0611564565b6112f981612061565b50565b60008060ff5490506001816113119190613907565b60ff819055506000611330858560018561132b9190613907565b612132565b905061134887611341888885612169565b3433612198565b9250858763ffffffff167fd229aacb94204188fe8042965fa6b269c62dc5818b21238779ab64bdd17efeec876040516113819190612e2d565b60405180910390a35050949350505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140190613d3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147090613dcc565b60405180910390fd5b80603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115579190612e2d565b60405180910390a3505050565b61156c611393565b73ffffffffffffffffffffffffffffffffffffffff1661158a610ca5565b73ffffffffffffffffffffffffffffffffffffffff16146115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d790613e38565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806116225750611621816121d0565b5b611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165890613ea4565b60405180910390fd5b80609960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167ffec811ed4e60aebdaf7a79cad8a97196bf56e35362f039705598226d30c9d24860405160405180910390a250565b60008585858585604051602001611703959493929190613f63565b60405160208183030381529060405280519060200120905095945050505050565b61172e82826121f3565b5050565b61173c8282611d75565b5050565b600061174c8484611015565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117c657818110156117b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117af9061400e565b60405180910390fd5b6117c5848484840361139b565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361183b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611832906140a0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190614132565b60405180910390fd5b6118b58383836123c2565b6000603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561193c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611933906141c4565b60405180910390fd5b818103603360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a2c9190612e2d565b60405180910390a3611a3f8484846123c7565b50505050565b600080611a618360001b856000016123cc90919063ffffffff16565b915091509250929050565b60606000611a798361241b565b9050805167ffffffffffffffff811115611a9657611a956132cb565b5b604051908082528060200260200182016040528015611ac45781602001602082028036833780820191505090505b50915060005b8151811015611b2e57818181518110611ae657611ae5613b21565b5b6020026020010151838281518110611b0157611b00613b21565b5b602002602001019063ffffffff16908163ffffffff16815250508080611b26906141e4565b915050611aca565b5050919050565b600081611b4184610a4f565b14905092915050565b611b56848484846124d8565b50505050565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080611c2e84612563565b9050611c4686611c3f878785612169565b8533612198565b9150848663ffffffff167fd229aacb94204188fe8042965fa6b269c62dc5818b21238779ab64bdd17efeec86604051611c7f9190612e2d565b60405180910390a350949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf99061429e565b60405180910390fd5b611d0b81611f90565b611d1482612586565b5050565b600060019054906101000a900460ff16611d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5e9061429e565b60405180910390fd5b611d7182826125e9565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb9061430a565b60405180910390fd5b611df0600083836123c2565b8060356000828254611e029190613907565b9250508190555080603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611eb49190612e2d565b60405180910390a3611ec8600083836123c7565b5050565b8060fe60008463ffffffff1663ffffffff168152602001908152602001600020819055508163ffffffff167f90563f253ecb04527a6a7ae1a8cbe2bdc6caefb39d5f7b06a973cf5e7f8035a482604051611f269190612e2d565b60405180910390a25050565b611f4e8263ffffffff168260ca61265c9092919063ffffffff16565b8163ffffffff167f97fd51fef1f80c854cbd0150c248e8b2ac4ecdc97cc05e742b5f61c9f4dc645882604051611f849190612f98565b60405180910390a25050565b80611f9a816121d0565b611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd090613ea4565b60405180910390fd5b81609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167fb87f5a0bface22cde699143559fb99f990ae54eea236995fc54178af91af859f60405160405180910390a25050565b8061206b816121d0565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190613ea4565b60405180910390fd5b81609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f7a61e573722ff8b205c8962b59d37e7d30573f368965597a844a94872204ebd760405160405180910390a25050565b606061213e3385611724565b828260405160200161215192919061432a565b60405160208183030381529060405290509392505050565b6060838383604051602001612180939291906143bb565b60405160208183030381529060405290509392505050565b60006121c6858560fe60008963ffffffff1663ffffffff16815260200190815260200160002054868661267d565b9050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225990614466565b60405180910390fd5b61226e826000836123c2565b6000603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156122f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ec906144f8565b60405180910390fd5b818103603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603560008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516123a99190612e2d565b60405180910390a36123bd836000846123c7565b505050565b505050565b505050565b60008060008460020160008581526020019081526020016000205490506000801b810361240b576123fd8585612728565b6000801b9250925050612414565b60018192509250505b9250929050565b6060600061242b83600001612748565b90508067ffffffffffffffff811115612447576124466132cb565b5b6040519080825280602002602001820160405280156124755781602001602082028036833780820191505090505b50915060005b818110156124d15761249c818560000160000161275d90919063ffffffff16565b60001c8382815181106124b2576124b1613b21565b5b60200260200101818152505080806124c9906141e4565b91505061247b565b5050919050565b60006124e48383612774565b905060006124f2848461279d565b905036600061250186866127c9565b9150915061251a612511856127ea565b848a85856127f7565b838863ffffffff167fba20947a325f450d232530e5f5fce293e7963499d5309a07cee84a269f2f15a6856040516125519190612e2d565b60405180910390a35050505050505050565b606061256f33836121f3565b604051806020016040528060008152509050919050565b600060019054906101000a900460ff166125d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cc9061429e565b60405180910390fd5b6125de81612061565b6125e661281a565b50565b600060019054906101000a900460ff16612638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262f9061429e565b60405180910390fd5b816036908161264791906146ba565b50806037908161265791906146ba565b505050565b6126778260001b82856000016128739092919063ffffffff16565b50505050565b600061268986866128ae565b9050609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166311bf2c1884838988876040518663ffffffff1660e01b81526004016126ed949392919061478c565b6000604051808303818588803b15801561270657600080fd5b505af115801561271a573d6000803e3d6000fd5b505050505095945050505050565b6000612740828460000161296790919063ffffffff16565b905092915050565b60006127568260000161297e565b9050919050565b600061276c8360000183612993565b905092915050565b6000828260009060209261278a939291906147db565b906127959190614821565b905092915050565b600082826020906040926127b3939291906147db565b906127be9190614821565b60001c905092915050565b366000838360409080926127df939291906147db565b915091509250929050565b60008160001c9050919050565b600061280686868686866129be565b90506128128186611732565b505050505050565b600060019054906101000a900460ff16612869576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128609061429e565b60405180910390fd5b612871612a7c565b565b600081846002016000858152602001908152602001600020819055506128a58385600001612add90919063ffffffff16565b90509392505050565b6000806128ba84612af4565b9050609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa31de018583866040518463ffffffff1660e01b815260040161291b939291906148ca565b6020604051808303816000875af115801561293a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295e919061491d565b91505092915050565b60006129768360000183612b7d565b905092915050565b600061298c82600001612ba0565b9050919050565b60008260000182815481106129ab576129aa613b21565b5b9060005260206000200154905092915050565b60008083839050036129d257859050612a73565b60008084848101906129e4919061494a565b91509150600061010060006129fc89858c888f6116e8565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612a6c57809350505050612a73565b8893505050505b95945050505050565b600060019054906101000a900460ff16612acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac29061429e565b60405180910390fd5b612adb612ad6611393565b611b5c565b565b6000612aec8360000183612bb1565b905092915050565b6000806000612b138463ffffffff1660ca611a4590919063ffffffff16565b915091508160405180608001604052806043815260200161498b6043913990612b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b699190612cb1565b60405180910390fd5b508092505050919050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b6000612bbd8383612b7d565b612c16578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612c1b565b600090505b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c5b578082015181840152602081019050612c40565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c8382612c21565b612c8d8185612c2c565b9350612c9d818560208601612c3d565b612ca681612c67565b840191505092915050565b60006020820190508181036000830152612ccb8184612c78565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d1282612ce7565b9050919050565b612d2281612d07565b8114612d2d57600080fd5b50565b600081359050612d3f81612d19565b92915050565b6000819050919050565b612d5881612d45565b8114612d6357600080fd5b50565b600081359050612d7581612d4f565b92915050565b60008060408385031215612d9257612d91612cdd565b5b6000612da085828601612d30565b9250506020612db185828601612d66565b9150509250929050565b60008115159050919050565b612dd081612dbb565b82525050565b6000602082019050612deb6000830184612dc7565b92915050565b600060208284031215612e0757612e06612cdd565b5b6000612e1584828501612d30565b91505092915050565b612e2781612d45565b82525050565b6000602082019050612e426000830184612e1e565b92915050565b600063ffffffff82169050919050565b612e6181612e48565b8114612e6c57600080fd5b50565b600081359050612e7e81612e58565b92915050565b600080600080600060a08688031215612ea057612e9f612cdd565b5b6000612eae88828901612d30565b9550506020612ebf88828901612d66565b9450506040612ed088828901612d66565b9350506060612ee188828901612e6f565b9250506080612ef288828901612d66565b9150509295509295909350565b600080600060608486031215612f1857612f17612cdd565b5b6000612f2686828701612d30565b9350506020612f3786828701612d30565b9250506040612f4886828701612d66565b9150509250925092565b600060208284031215612f6857612f67612cdd565b5b6000612f7684828501612e6f565b91505092915050565b6000819050919050565b612f9281612f7f565b82525050565b6000602082019050612fad6000830184612f89565b92915050565b600060ff82169050919050565b612fc981612fb3565b82525050565b6000602082019050612fe46000830184612fc0565b92915050565b6000819050919050565b600061300f61300a61300584612ce7565b612fea565b612ce7565b9050919050565b600061302182612ff4565b9050919050565b600061303382613016565b9050919050565b61304381613028565b82525050565b600060208201905061305e600083018461303a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61309981612e48565b82525050565b60006130ab8383613090565b60208301905092915050565b6000602082019050919050565b60006130cf82613064565b6130d9818561306f565b93506130e483613080565b8060005b838110156131155781516130fc888261309f565b9750613107836130b7565b9250506001810190506130e8565b5085935050505092915050565b6000602082019050818103600083015261313c81846130c4565b905092915050565b61314d81612f7f565b811461315857600080fd5b50565b60008135905061316a81613144565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261319557613194613170565b5b8235905067ffffffffffffffff8111156131b2576131b1613175565b5b6020830191508360018202830111156131ce576131cd61317a565b5b9250929050565b600080600080606085870312156131ef576131ee612cdd565b5b60006131fd87828801612e6f565b945050602061320e8782880161315b565b935050604085013567ffffffffffffffff81111561322f5761322e612ce2565b5b61323b8782880161317f565b925092505092959194509250565b60008060006060848603121561326257613261612cdd565b5b600061327086828701612e6f565b93505060206132818682870161315b565b925050604061329286828701612d66565b9150509250925092565b6132a581612d07565b82525050565b60006020820190506132c0600083018461329c565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61330382612c67565b810181811067ffffffffffffffff82111715613322576133216132cb565b5b80604052505050565b6000613335612cd3565b905061334182826132fa565b919050565b600067ffffffffffffffff821115613361576133606132cb565b5b61336a82612c67565b9050602081019050919050565b82818337600083830152505050565b600061339961339484613346565b61332b565b9050828152602081018484840111156133b5576133b46132c6565b5b6133c0848285613377565b509392505050565b600082601f8301126133dd576133dc613170565b5b81356133ed848260208601613386565b91505092915050565b600080600080600060a0868803121561341257613411612cdd565b5b600061342088828901612d30565b955050602061343188828901612d30565b945050604061344288828901612d66565b935050606086013567ffffffffffffffff81111561346357613462612ce2565b5b61346f888289016133c8565b925050608086013567ffffffffffffffff8111156134905761348f612ce2565b5b61349c888289016133c8565b9150509295509295909350565b60008083601f8401126134bf576134be613170565b5b8235905067ffffffffffffffff8111156134dc576134db613175565b5b6020830191508360408202830111156134f8576134f761317a565b5b9250929050565b6000806020838503121561351657613515612cdd565b5b600083013567ffffffffffffffff81111561353457613533612ce2565b5b613540858286016134a9565b92509250509250929050565b6000806040838503121561356357613562612cdd565b5b600061357185828601612e6f565b92505060206135828582860161315b565b9150509250929050565b600061359782613016565b9050919050565b6135a78161358c565b82525050565b60006020820190506135c2600083018461359e565b92915050565b600080604083850312156135df576135de612cdd565b5b60006135ed85828601612d30565b92505060206135fe85828601612d30565b9150509250929050565b600061361382613016565b9050919050565b61362381613608565b82525050565b600060208201905061363e600083018461361a565b92915050565b60008083601f84011261365a57613659613170565b5b8235905067ffffffffffffffff81111561367757613676613175565b5b6020830191508360208202830111156136935761369261317a565b5b9250929050565b60008083601f8401126136b0576136af613170565b5b8235905067ffffffffffffffff8111156136cd576136cc613175565b5b6020830191508360208202830111156136e9576136e861317a565b5b9250929050565b6000806000806040858703121561370a57613709612cdd565b5b600085013567ffffffffffffffff81111561372857613727612ce2565b5b61373487828801613644565b9450945050602085013567ffffffffffffffff81111561375757613756612ce2565b5b6137638782880161369a565b925092505092959194509250565b6000806000806080858703121561378b5761378a612cdd565b5b600061379987828801612e6f565b94505060206137aa8782880161315b565b93505060406137bb87828801612d66565b92505060606137cc87828801612d66565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061381f57607f821691505b602082108103613832576138316137d8565b5b50919050565b7f7265717565737420616c72656164792066696c6c656400000000000000000000600082015250565b600061386e601683612c2c565b915061387982613838565b602082019050919050565b6000602082019050818103600083015261389d81613861565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138de82612d45565b91506138e983612d45565b9250828203905081811115613901576139006138a4565b5b92915050565b600061391282612d45565b915061391d83612d45565b9250828201905080821115613935576139346138a4565b5b92915050565b7f216d61696c626f78000000000000000000000000000000000000000000000000600082015250565b6000613971600883612c2c565b915061397c8261393b565b602082019050919050565b600060208201905081810360008301526139a081613964565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000613a03602e83612c2c565b9150613a0e826139a7565b604082019050919050565b60006020820190508181036000830152613a32816139f6565b9050919050565b6000819050919050565b6000613a5e613a59613a5484613a39565b612fea565b612fb3565b9050919050565b613a6e81613a43565b82525050565b6000602082019050613a896000830184613a65565b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613aeb602583612c2c565b9150613af682613a8f565b604082019050919050565b60006020820190508181036000830152613b1a81613ade565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f216c656e67746800000000000000000000000000000000000000000000000000600082015250565b6000613b86600783612c2c565b9150613b9182613b50565b602082019050919050565b60006020820190508181036000830152613bb581613b79565b9050919050565b613bc581612e48565b82525050565b6000604082019050613be06000830185613bbc565b613bed6020830184612e1e565b9392505050565b600081519050613c0381612d4f565b92915050565b600060208284031215613c1f57613c1e612cdd565b5b6000613c2d84828501613bf4565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c92602683612c2c565b9150613c9d82613c36565b604082019050919050565b60006020820190508181036000830152613cc181613c85565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d24602483612c2c565b9150613d2f82613cc8565b604082019050919050565b60006020820190508181036000830152613d5381613d17565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613db6602283612c2c565b9150613dc182613d5a565b604082019050919050565b60006020820190508181036000830152613de581613da9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e22602083612c2c565b9150613e2d82613dec565b602082019050919050565b60006020820190508181036000830152613e5181613e15565b9050919050565b7f21636f6e74726163740000000000000000000000000000000000000000000000600082015250565b6000613e8e600983612c2c565b9150613e9982613e58565b602082019050919050565b60006020820190508181036000830152613ebd81613e81565b9050919050565b60008160e01b9050919050565b6000613edc82613ec4565b9050919050565b613ef4613eef82612e48565b613ed1565b82525050565b6000819050919050565b613f15613f1082612d45565b613efa565b82525050565b60008160601b9050919050565b6000613f3382613f1b565b9050919050565b6000613f4582613f28565b9050919050565b613f5d613f5882612d07565b613f3a565b82525050565b6000613f6f8288613ee3565b600482019150613f7f8287613f04565b602082019150613f8f8286613f04565b602082019150613f9f8285613f04565b602082019150613faf8284613f4c565b6014820191508190509695505050505050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613ff8601d83612c2c565b915061400382613fc2565b602082019050919050565b6000602082019050818103600083015261402781613feb565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061408a602583612c2c565b91506140958261402e565b604082019050919050565b600060208201905081810360008301526140b98161407d565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061411c602383612c2c565b9150614127826140c0565b604082019050919050565b6000602082019050818103600083015261414b8161410f565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006141ae602683612c2c565b91506141b982614152565b604082019050919050565b600060208201905081810360008301526141dd816141a1565b9050919050565b60006141ef82612d45565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614221576142206138a4565b5b600182019050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b6000614288602b83612c2c565b91506142938261422c565b604082019050919050565b600060208201905081810360008301526142b78161427b565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006142f4601f83612c2c565b91506142ff826142be565b602082019050919050565b60006020820190508181036000830152614323816142e7565b9050919050565b600060408201905061433f6000830185612e1e565b61434c6020830184612e1e565b9392505050565b6000819050919050565b61436e61436982612f7f565b614353565b82525050565b600081519050919050565b600081905092915050565b600061439582614374565b61439f818561437f565b93506143af818560208601612c3d565b80840191505092915050565b60006143c7828661435d565b6020820191506143d78285613f04565b6020820191506143e7828461438a565b9150819050949350505050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614450602183612c2c565b915061445b826143f4565b604082019050919050565b6000602082019050818103600083015261447f81614443565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006144e2602283612c2c565b91506144ed82614486565b604082019050919050565b60006020820190508181036000830152614511816144d5565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261457a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261453d565b614584868361453d565b95508019841693508086168417925050509392505050565b60006145b76145b26145ad84612d45565b612fea565b612d45565b9050919050565b6000819050919050565b6145d18361459c565b6145e56145dd826145be565b84845461454a565b825550505050565b600090565b6145fa6145ed565b6146058184846145c8565b505050565b5b818110156146295761461e6000826145f2565b60018101905061460b565b5050565b601f82111561466e5761463f81614518565b6146488461452d565b81016020851015614657578190505b61466b6146638561452d565b83018261460a565b50505b505050565b600082821c905092915050565b600061469160001984600802614673565b1980831691505092915050565b60006146aa8383614680565b9150826002028217905092915050565b6146c382612c21565b67ffffffffffffffff8111156146dc576146db6132cb565b5b6146e68254613807565b6146f182828561462d565b600060209050601f8311600181146147245760008415614712578287015190505b61471c858261469e565b865550614784565b601f19841661473286614518565b60005b8281101561475a57848901518255600182019150602085019450602081019050614735565b868310156147775784890151614773601f891682614680565b8355505b6001600288020188555050505b505050505050565b60006080820190506147a16000830187612f89565b6147ae6020830186613bbc565b6147bb6040830185612e1e565b6147c8606083018461329c565b95945050505050565b600080fd5b600080fd5b600080858511156147ef576147ee6147d1565b5b83861115614800576147ff6147d6565b5b6001850283019150848603905094509492505050565b600082905092915050565b600061482d8383614816565b826148388135612f7f565b92506020821015614878576148737fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080261453d565b831692505b505092915050565b600082825260208201905092915050565b600061489c82614374565b6148a68185614880565b93506148b6818560208601612c3d565b6148bf81612c67565b840191505092915050565b60006060820190506148df6000830186613bbc565b6148ec6020830185612f89565b81810360408301526148fe8184614891565b9050949350505050565b60008151905061491781613144565b92915050565b60006020828403121561493357614932612cdd565b5b600061494184828501614908565b91505092915050565b6000806040838503121561496157614960612cdd565b5b600061496f85828601612d66565b925050602061498085828601612d66565b915050925092905056fe4e6f20726f7574657220656e726f6c6c656420666f7220646f6d61696e2e2044696420796f7520737065636966792074686520726967687420646f6d61696e2049443fa2646970667358221220c14552771ae4c287924c40d77542afb6211048c2150985141d46033b488eefb664736f6c63430008100033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/integration-test/abis/FastHypERC20Collateral.json b/integration-test/abis/FastHypERC20Collateral.json new file mode 100644 index 00000000..e6b404bb --- /dev/null +++ b/integration-test/abis/FastHypERC20Collateral.json @@ -0,0 +1,605 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "FastHypERC20Collateral", + "sourceName": "contracts/FastHypERC20Collateral.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "erc20", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "domain", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "gas", + "type": "uint256" + } + ], + "name": "DestinationGasSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "interchainGasPaymaster", + "type": "address" + } + ], + "name": "InterchainGasPaymasterSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "InterchainSecurityModuleSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "mailbox", + "type": "address" + } + ], + "name": "MailboxSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "origin", + "type": "uint32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "recipient", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ReceivedTransferRemote", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "domain", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "router", + "type": "bytes32" + } + ], + "name": "RemoteRouterEnrolled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "destination", + "type": "uint32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "recipient", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "SentTransferRemote", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "name": "destinationGas", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "domains", + "outputs": [ + { + "internalType": "uint32[]", + "name": "", + "type": "uint32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_domain", + "type": "uint32" + }, + { + "internalType": "bytes32", + "name": "_router", + "type": "bytes32" + } + ], + "name": "enrollRemoteRouter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32[]", + "name": "_domains", + "type": "uint32[]" + }, + { + "internalType": "bytes32[]", + "name": "_addresses", + "type": "bytes32[]" + } + ], + "name": "enrollRemoteRouters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "fastTransferId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_destination", + "type": "uint32" + }, + { + "internalType": "bytes32", + "name": "_recipient", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amountOrId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_fastFee", + "type": "uint256" + } + ], + "name": "fastTransferRemote", + "outputs": [ + { + "internalType": "bytes32", + "name": "messageId", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_fastFee", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "_origin", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "_fastTransferId", + "type": "uint256" + } + ], + "name": "fillFastTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_origin", + "type": "uint32" + }, + { + "internalType": "bytes32", + "name": "_sender", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_message", + "type": "bytes" + } + ], + "name": "handle", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_mailbox", + "type": "address" + }, + { + "internalType": "address", + "name": "_interchainGasPaymaster", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "interchainGasPaymaster", + "outputs": [ + { + "internalType": "contract IInterchainGasPaymaster", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "interchainSecurityModule", + "outputs": [ + { + "internalType": "contract IInterchainSecurityModule", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mailbox", + "outputs": [ + { + "internalType": "contract IMailbox", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_destinationDomain", + "type": "uint32" + } + ], + "name": "quoteGasPayment", + "outputs": [ + { + "internalType": "uint256", + "name": "_gasPayment", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_domain", + "type": "uint32" + } + ], + "name": "routers", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "domain", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "gas", + "type": "uint256" + } + ], + "internalType": "struct GasRouter.GasRouterConfig[]", + "name": "gasConfigs", + "type": "tuple[]" + } + ], + "name": "setDestinationGas", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_interchainGasPaymaster", + "type": "address" + } + ], + "name": "setInterchainGasPaymaster", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_module", + "type": "address" + } + ], + "name": "setInterchainSecurityModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_mailbox", + "type": "address" + } + ], + "name": "setMailbox", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_destination", + "type": "uint32" + }, + { + "internalType": "bytes32", + "name": "_recipient", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amountOrId", + "type": "uint256" + } + ], + "name": "transferRemote", + "outputs": [ + { + "internalType": "bytes32", + "name": "messageId", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "wrappedToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a06040523480156200001157600080fd5b506040516200395e3803806200395e8339818101604052810190620000379190620000de565b808073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050505062000110565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000a68262000079565b9050919050565b620000b88162000099565b8114620000c457600080fd5b50565b600081519050620000d881620000ad565b92915050565b600060208284031215620000f757620000f662000074565b5b60006200010784828501620000c7565b91505092915050565b608051613816620001486000396000818161097e01528181610a8c0152818161102e0152818161107e01526119db01526138166000f3fe60806040526004361061014b5760003560e01c8063996c6cc3116100b6578063e9198bf91161006f578063e9198bf914610471578063f1bd6f0a1461049a578063f2ed8c53146104c3578063f2fde38b14610500578063f3c61d6b14610529578063f5f09f2e146105525761014b565b8063996c6cc314610373578063a478333b1461039e578063b1bd6436146103c9578063b49c53a7146103f2578063d5438eae1461041b578063de523cf3146104465761014b565b806356d5d4751161010857806356d5d4751461025e57806370a0823114610287578063715018a6146102c4578063775313a1146102db57806381b4e8b4146103185780638da5cb5b146103485761014b565b80630e72cc06146101505780631b177491146101795780632ead72f6146101a257806339bb4ad9146101df578063440df4f41461020a578063485cc95514610235575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906122d4565b610582565b005b34801561018557600080fd5b506101a0600480360381019061019b9190612373565b610596565b005b3480156101ae57600080fd5b506101c960048036038101906101c491906123ee565b6106cd565b6040516101d69190612434565b60405180910390f35b3480156101eb57600080fd5b506101f46106f6565b60405161020191906124ae565b60405180910390f35b34801561021657600080fd5b5061021f61071c565b60405161022c9190612587565b60405180910390f35b34801561024157600080fd5b5061025c600480360381019061025791906125a9565b61072d565b005b34801561026a57600080fd5b506102856004803603810190610280919061267a565b61086f565b005b34801561029357600080fd5b506102ae60048036038101906102a991906122d4565b61097a565b6040516102bb91906126fd565b60405180910390f35b3480156102d057600080fd5b506102d9610a1d565b005b3480156102e757600080fd5b5061030260048036038101906102fd91906123ee565b610a31565b60405161030f91906126fd565b60405180910390f35b610332600480360381019061032d9190612718565b610a49565b60405161033f9190612434565b60405180910390f35b34801561035457600080fd5b5061035d610a60565b60405161036a919061277a565b60405180910390f35b34801561037f57600080fd5b50610388610a8a565b60405161039591906127b6565b60405180910390f35b3480156103aa57600080fd5b506103b3610aae565b6040516103c091906126fd565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb9190612827565b610ab4565b005b3480156103fe57600080fd5b5061041960048036038101906104149190612874565b610b33565b005b34801561042757600080fd5b50610430610b49565b60405161043d91906128d5565b60405180910390f35b34801561045257600080fd5b5061045b610b6f565b6040516104689190612911565b60405180910390f35b34801561047d57600080fd5b50610498600480360381019061049391906129d8565b610b95565b005b3480156104a657600080fd5b506104c160048036038101906104bc91906122d4565b610c5e565b005b3480156104cf57600080fd5b506104ea60048036038101906104e591906123ee565b610c72565b6040516104f791906126fd565b60405180910390f35b34801561050c57600080fd5b50610527600480360381019061052291906122d4565b610d38565b005b34801561053557600080fd5b50610550600480360381019061054b91906122d4565b610dbb565b005b61056c60048036038101906105679190612a59565b610dcf565b6040516105799190612434565b60405180910390f35b61058a610e66565b61059381610ee4565b50565b60006105a5838387878a610fea565b9050600073ffffffffffffffffffffffffffffffffffffffff1660ce600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064090612b1d565b60405180910390fd5b3360ce600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506106b03385876106ab9190612b6c565b611026565b6106c58685876106c09190612b6c565b611077565b505050505050565b6000806106ea8363ffffffff1660986110c690919063ffffffff16565b91505080915050919050565b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061072860986110ed565b905090565b60008060019054906101000a900460ff1615905080801561075e5750600160008054906101000a900460ff1660ff16105b8061078b575061076d306111b6565b15801561078a5750600160008054906101000a900460ff1660ff16145b5b6107ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c190612c12565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610807576001600060016101000a81548160ff0219169083151502179055505b61081183836111d9565b801561086a5760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516108619190612c7a565b60405180910390a15b505050565b606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f690612ce1565b60405180910390fd5b838361090b828261123e565b60405180608001604052806043815260200161379e6043913990610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c9190612d80565b60405180910390fd5b5061097286868686611253565b505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016109d5919061277a565b602060405180830381865afa1580156109f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a169190612db7565b9050919050565b610a25610e66565b610a2f6000611265565b565b60cc6020528060005260406000206000915090505481565b6000610a578484843461132b565b90509392505050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60cd5481565b610abc610e66565b60005b82829050811015610b2e57610b1a838383818110610ae057610adf612de4565b5b9050604002016000016020810190610af891906123ee565b848484818110610b0b57610b0a612de4565b5b90506040020160200135611399565b600181610b279190612e13565b9050610abf565b505050565b610b3b610e66565b610b4582826113ff565b5050565b606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610b9d610e66565b818190508484905014610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc90612e93565b60405180910390fd5b600084849050905060005b81811015610c5657610c42868683818110610c0e57610c0d612de4565b5b9050602002016020810190610c2391906123ee565b858584818110610c3657610c35612de4565b5b905060200201356113ff565b600181610c4f9190612e13565b9050610bf0565b505050505050565b610c66610e66565b610c6f8161145d565b50565b6000606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a69297938360cc60008663ffffffff1663ffffffff168152602001908152602001600020546040518363ffffffff1660e01b8152600401610cf0929190612ec2565b602060405180830381865afa158015610d0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d319190612db7565b9050919050565b610d40610e66565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da690612f5d565b60405180910390fd5b610db881611265565b50565b610dc3610e66565b610dcc8161152e565b50565b60008060cd549050600181610de49190612e13565b60cd819055506000610e038585600185610dfe9190612e13565b6115ff565b9050610e1b87610e14888885611636565b3433611665565b9250858763ffffffff167fd229aacb94204188fe8042965fa6b269c62dc5818b21238779ab64bdd17efeec87604051610e5491906126fd565b60405180910390a35050949350505050565b610e6e61169d565b73ffffffffffffffffffffffffffffffffffffffff16610e8c610a60565b73ffffffffffffffffffffffffffffffffffffffff1614610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed990612fc9565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610f245750610f23816116a5565b5b610f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5a90613035565b60405180910390fd5b80606760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167ffec811ed4e60aebdaf7a79cad8a97196bf56e35362f039705598226d30c9d24860405160405180910390a250565b600085858585856040516020016110059594939291906130f4565b60405160208183030381529060405280519060200120905095945050505050565b6110738230837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166116c8909392919063ffffffff16565b5050565b6110c282827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166117519092919063ffffffff16565b5050565b6000806110e28360001b856000016117d790919063ffffffff16565b915091509250929050565b606060006110fa83611826565b9050805167ffffffffffffffff81111561111757611116613153565b5b6040519080825280602002602001820160405280156111455781602001602082028036833780820191505090505b50915060005b81518110156111af5781818151811061116757611166612de4565b5b602002602001015183828151811061118257611181612de4565b5b602002602001019063ffffffff16908163ffffffff168152505080806111a790613182565b91505061114b565b5050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f9061323c565b60405180910390fd5b6112318161145d565b61123a826118e3565b5050565b60008161124a846106cd565b14905092915050565b61125f84848484611946565b50505050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080611337846119d1565b905061134f86611348878785611636565b8533611665565b9150848663ffffffff167fd229aacb94204188fe8042965fa6b269c62dc5818b21238779ab64bdd17efeec8660405161138891906126fd565b60405180910390a350949350505050565b8060cc60008463ffffffff1663ffffffff168152602001908152602001600020819055508163ffffffff167f90563f253ecb04527a6a7ae1a8cbe2bdc6caefb39d5f7b06a973cf5e7f8035a4826040516113f391906126fd565b60405180910390a25050565b61141b8263ffffffff16826098611a379092919063ffffffff16565b8163ffffffff167f97fd51fef1f80c854cbd0150c248e8b2ac4ecdc97cc05e742b5f61c9f4dc6458826040516114519190612434565b60405180910390a25050565b80611467816116a5565b6114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d90613035565b60405180910390fd5b81606660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167fb87f5a0bface22cde699143559fb99f990ae54eea236995fc54178af91af859f60405160405180910390a25050565b80611538816116a5565b611577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156e90613035565b60405180910390fd5b81606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f7a61e573722ff8b205c8962b59d37e7d30573f368965597a844a94872204ebd760405160405180910390a25050565b606061160b3385611026565b828260405160200161161e92919061325c565b60405160208183030381529060405290509392505050565b606083838360405160200161164d939291906132ed565b60405160208183030381529060405290509392505050565b6000611693858560cc60008963ffffffff1663ffffffff168152602001908152602001600020548686611a58565b9050949350505050565b600033905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b61174b846323b872dd60e01b8585856040516024016116e993929190613326565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611b03565b50505050565b6117d28363a9059cbb60e01b848460405160240161177092919061335d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611b03565b505050565b60008060008460020160008581526020019081526020016000205490506000801b8103611816576118088585611bca565b6000801b925092505061181f565b60018192509250505b9250929050565b6060600061183683600001611bea565b90508067ffffffffffffffff81111561185257611851613153565b5b6040519080825280602002602001820160405280156118805781602001602082028036833780820191505090505b50915060005b818110156118dc576118a78185600001600001611bff90919063ffffffff16565b60001c8382815181106118bd576118bc612de4565b5b60200260200101818152505080806118d490613182565b915050611886565b5050919050565b600060019054906101000a900460ff16611932576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119299061323c565b60405180910390fd5b61193b8161152e565b611943611c16565b50565b60006119528383611c6f565b905060006119608484611c98565b905036600061196f8686611cc4565b9150915061198861197f85611ce5565b848a8585611cf2565b838863ffffffff167fba20947a325f450d232530e5f5fce293e7963499d5309a07cee84a269f2f15a6856040516119bf91906126fd565b60405180910390a35050505050505050565b6060611a203330847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166116c8909392919063ffffffff16565b604051806020016040528060008152509050919050565b611a528260001b8285600001611d159092919063ffffffff16565b50505050565b6000611a648686611d50565b9050606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166311bf2c1884838988876040518663ffffffff1660e01b8152600401611ac89493929190613386565b6000604051808303818588803b158015611ae157600080fd5b505af1158015611af5573d6000803e3d6000fd5b505050505095945050505050565b6000611b65826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611e099092919063ffffffff16565b9050600081511115611bc55780806020019051810190611b859190613403565b611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb906134a2565b60405180910390fd5b5b505050565b6000611be28284600001611e2190919063ffffffff16565b905092915050565b6000611bf882600001611e38565b9050919050565b6000611c0e8360000183611e4d565b905092915050565b600060019054906101000a900460ff16611c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5c9061323c565b60405180910390fd5b611c6d611e78565b565b60008282600090602092611c85939291906134cc565b90611c90919061351f565b905092915050565b60008282602090604092611cae939291906134cc565b90611cb9919061351f565b60001c905092915050565b36600083836040908092611cda939291906134cc565b915091509250929050565b60008160001c9050919050565b6000611d018686868686611ed9565b9050611d0d8186611077565b505050505050565b60008184600201600085815260200190815260200160002081905550611d478385600001611f9690919063ffffffff16565b90509392505050565b600080611d5c84611fad565b9050606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa31de018583866040518463ffffffff1660e01b8152600401611dbd939291906135c8565b6020604051808303816000875af1158015611ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e00919061361b565b91505092915050565b6060611e188484600085612036565b90509392505050565b6000611e308360000183612103565b905092915050565b6000611e4682600001612126565b9050919050565b6000826000018281548110611e6557611e64612de4565b5b9060005260206000200154905092915050565b600060019054906101000a900460ff16611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe9061323c565b60405180910390fd5b611ed7611ed261169d565b611265565b565b6000808383905003611eed57859050611f8d565b6000808484810190611eff9190613648565b91509150600060ce6000611f1689858c888f610fea565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f8657809350505050611f8d565b8893505050505b95945050505050565b6000611fa58360000183612137565b905092915050565b6000806000611fcc8463ffffffff1660986110c690919063ffffffff16565b915091508160405180608001604052806043815260200161379e604391399061202b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120229190612d80565b60405180910390fd5b508092505050919050565b60608247101561207b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612072906136fa565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516120a4919061371a565b60006040518083038185875af1925050503d80600081146120e1576040519150601f19603f3d011682016040523d82523d6000602084013e6120e6565b606091505b50915091506120f7878383876121a7565b92505050949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b60006121438383612103565b61219c5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506121a1565b600090505b92915050565b60608315612209576000835103612201576121c1856116a5565b612200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f79061377d565b60405180910390fd5b5b829050612214565b612213838361221c565b5b949350505050565b60008251111561222f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122639190612d80565b60405180910390fd5b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122a182612276565b9050919050565b6122b181612296565b81146122bc57600080fd5b50565b6000813590506122ce816122a8565b92915050565b6000602082840312156122ea576122e961226c565b5b60006122f8848285016122bf565b91505092915050565b6000819050919050565b61231481612301565b811461231f57600080fd5b50565b6000813590506123318161230b565b92915050565b600063ffffffff82169050919050565b61235081612337565b811461235b57600080fd5b50565b60008135905061236d81612347565b92915050565b600080600080600060a0868803121561238f5761238e61226c565b5b600061239d888289016122bf565b95505060206123ae88828901612322565b94505060406123bf88828901612322565b93505060606123d08882890161235e565b92505060806123e188828901612322565b9150509295509295909350565b6000602082840312156124045761240361226c565b5b60006124128482850161235e565b91505092915050565b6000819050919050565b61242e8161241b565b82525050565b60006020820190506124496000830184612425565b92915050565b6000819050919050565b600061247461246f61246a84612276565b61244f565b612276565b9050919050565b600061248682612459565b9050919050565b60006124988261247b565b9050919050565b6124a88161248d565b82525050565b60006020820190506124c3600083018461249f565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6124fe81612337565b82525050565b600061251083836124f5565b60208301905092915050565b6000602082019050919050565b6000612534826124c9565b61253e81856124d4565b9350612549836124e5565b8060005b8381101561257a5781516125618882612504565b975061256c8361251c565b92505060018101905061254d565b5085935050505092915050565b600060208201905081810360008301526125a18184612529565b905092915050565b600080604083850312156125c0576125bf61226c565b5b60006125ce858286016122bf565b92505060206125df858286016122bf565b9150509250929050565b6125f28161241b565b81146125fd57600080fd5b50565b60008135905061260f816125e9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261263a57612639612615565b5b8235905067ffffffffffffffff8111156126575761265661261a565b5b6020830191508360018202830111156126735761267261261f565b5b9250929050565b600080600080606085870312156126945761269361226c565b5b60006126a28782880161235e565b94505060206126b387828801612600565b935050604085013567ffffffffffffffff8111156126d4576126d3612271565b5b6126e087828801612624565b925092505092959194509250565b6126f781612301565b82525050565b600060208201905061271260008301846126ee565b92915050565b6000806000606084860312156127315761273061226c565b5b600061273f8682870161235e565b935050602061275086828701612600565b925050604061276186828701612322565b9150509250925092565b61277481612296565b82525050565b600060208201905061278f600083018461276b565b92915050565b60006127a08261247b565b9050919050565b6127b081612795565b82525050565b60006020820190506127cb60008301846127a7565b92915050565b60008083601f8401126127e7576127e6612615565b5b8235905067ffffffffffffffff8111156128045761280361261a565b5b6020830191508360408202830111156128205761281f61261f565b5b9250929050565b6000806020838503121561283e5761283d61226c565b5b600083013567ffffffffffffffff81111561285c5761285b612271565b5b612868858286016127d1565b92509250509250929050565b6000806040838503121561288b5761288a61226c565b5b60006128998582860161235e565b92505060206128aa85828601612600565b9150509250929050565b60006128bf8261247b565b9050919050565b6128cf816128b4565b82525050565b60006020820190506128ea60008301846128c6565b92915050565b60006128fb8261247b565b9050919050565b61290b816128f0565b82525050565b60006020820190506129266000830184612902565b92915050565b60008083601f84011261294257612941612615565b5b8235905067ffffffffffffffff81111561295f5761295e61261a565b5b60208301915083602082028301111561297b5761297a61261f565b5b9250929050565b60008083601f84011261299857612997612615565b5b8235905067ffffffffffffffff8111156129b5576129b461261a565b5b6020830191508360208202830111156129d1576129d061261f565b5b9250929050565b600080600080604085870312156129f2576129f161226c565b5b600085013567ffffffffffffffff811115612a1057612a0f612271565b5b612a1c8782880161292c565b9450945050602085013567ffffffffffffffff811115612a3f57612a3e612271565b5b612a4b87828801612982565b925092505092959194509250565b60008060008060808587031215612a7357612a7261226c565b5b6000612a818782880161235e565b9450506020612a9287828801612600565b9350506040612aa387828801612322565b9250506060612ab487828801612322565b91505092959194509250565b600082825260208201905092915050565b7f7265717565737420616c72656164792066696c6c656400000000000000000000600082015250565b6000612b07601683612ac0565b9150612b1282612ad1565b602082019050919050565b60006020820190508181036000830152612b3681612afa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b7782612301565b9150612b8283612301565b9250828203905081811115612b9a57612b99612b3d565b5b92915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000612bfc602e83612ac0565b9150612c0782612ba0565b604082019050919050565b60006020820190508181036000830152612c2b81612bef565b9050919050565b6000819050919050565b600060ff82169050919050565b6000612c64612c5f612c5a84612c32565b61244f565b612c3c565b9050919050565b612c7481612c49565b82525050565b6000602082019050612c8f6000830184612c6b565b92915050565b7f216d61696c626f78000000000000000000000000000000000000000000000000600082015250565b6000612ccb600883612ac0565b9150612cd682612c95565b602082019050919050565b60006020820190508181036000830152612cfa81612cbe565b9050919050565b600081519050919050565b60005b83811015612d2a578082015181840152602081019050612d0f565b60008484015250505050565b6000601f19601f8301169050919050565b6000612d5282612d01565b612d5c8185612ac0565b9350612d6c818560208601612d0c565b612d7581612d36565b840191505092915050565b60006020820190508181036000830152612d9a8184612d47565b905092915050565b600081519050612db18161230b565b92915050565b600060208284031215612dcd57612dcc61226c565b5b6000612ddb84828501612da2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612e1e82612301565b9150612e2983612301565b9250828201905080821115612e4157612e40612b3d565b5b92915050565b7f216c656e67746800000000000000000000000000000000000000000000000000600082015250565b6000612e7d600783612ac0565b9150612e8882612e47565b602082019050919050565b60006020820190508181036000830152612eac81612e70565b9050919050565b612ebc81612337565b82525050565b6000604082019050612ed76000830185612eb3565b612ee460208301846126ee565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612f47602683612ac0565b9150612f5282612eeb565b604082019050919050565b60006020820190508181036000830152612f7681612f3a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612fb3602083612ac0565b9150612fbe82612f7d565b602082019050919050565b60006020820190508181036000830152612fe281612fa6565b9050919050565b7f21636f6e74726163740000000000000000000000000000000000000000000000600082015250565b600061301f600983612ac0565b915061302a82612fe9565b602082019050919050565b6000602082019050818103600083015261304e81613012565b9050919050565b60008160e01b9050919050565b600061306d82613055565b9050919050565b61308561308082612337565b613062565b82525050565b6000819050919050565b6130a66130a182612301565b61308b565b82525050565b60008160601b9050919050565b60006130c4826130ac565b9050919050565b60006130d6826130b9565b9050919050565b6130ee6130e982612296565b6130cb565b82525050565b60006131008288613074565b6004820191506131108287613095565b6020820191506131208286613095565b6020820191506131308285613095565b60208201915061314082846130dd565b6014820191508190509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061318d82612301565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131bf576131be612b3d565b5b600182019050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b6000613226602b83612ac0565b9150613231826131ca565b604082019050919050565b6000602082019050818103600083015261325581613219565b9050919050565b600060408201905061327160008301856126ee565b61327e60208301846126ee565b9392505050565b6000819050919050565b6132a061329b8261241b565b613285565b82525050565b600081519050919050565b600081905092915050565b60006132c7826132a6565b6132d181856132b1565b93506132e1818560208601612d0c565b80840191505092915050565b60006132f9828661328f565b6020820191506133098285613095565b60208201915061331982846132bc565b9150819050949350505050565b600060608201905061333b600083018661276b565b613348602083018561276b565b61335560408301846126ee565b949350505050565b6000604082019050613372600083018561276b565b61337f60208301846126ee565b9392505050565b600060808201905061339b6000830187612425565b6133a86020830186612eb3565b6133b560408301856126ee565b6133c2606083018461276b565b95945050505050565b60008115159050919050565b6133e0816133cb565b81146133eb57600080fd5b50565b6000815190506133fd816133d7565b92915050565b6000602082840312156134195761341861226c565b5b6000613427848285016133ee565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061348c602a83612ac0565b915061349782613430565b604082019050919050565b600060208201905081810360008301526134bb8161347f565b9050919050565b600080fd5b600080fd5b600080858511156134e0576134df6134c2565b5b838611156134f1576134f06134c7565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b600061352b8383613507565b82613536813561241b565b92506020821015613576576135717fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613512565b831692505b505092915050565b600082825260208201905092915050565b600061359a826132a6565b6135a4818561357e565b93506135b4818560208601612d0c565b6135bd81612d36565b840191505092915050565b60006060820190506135dd6000830186612eb3565b6135ea6020830185612425565b81810360408301526135fc818461358f565b9050949350505050565b600081519050613615816125e9565b92915050565b6000602082840312156136315761363061226c565b5b600061363f84828501613606565b91505092915050565b6000806040838503121561365f5761365e61226c565b5b600061366d85828601612322565b925050602061367e85828601612322565b9150509250929050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006136e4602683612ac0565b91506136ef82613688565b604082019050919050565b60006020820190508181036000830152613713816136d7565b9050919050565b600061372682846132bc565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613767601d83612ac0565b915061377282613731565b602082019050919050565b600060208201905081810360008301526137968161375a565b905091905056fe4e6f20726f7574657220656e726f6c6c656420666f7220646f6d61696e2e2044696420796f7520737065636966792074686520726967687420646f6d61696e2049443fa264697066735822122048e10fbf91a17d3effb0a6bf13995a021d36b0f7daf36b98abbac58bd43f7a9964736f6c63430008100033", + "deployedBytecode": "0x60806040526004361061014b5760003560e01c8063996c6cc3116100b6578063e9198bf91161006f578063e9198bf914610471578063f1bd6f0a1461049a578063f2ed8c53146104c3578063f2fde38b14610500578063f3c61d6b14610529578063f5f09f2e146105525761014b565b8063996c6cc314610373578063a478333b1461039e578063b1bd6436146103c9578063b49c53a7146103f2578063d5438eae1461041b578063de523cf3146104465761014b565b806356d5d4751161010857806356d5d4751461025e57806370a0823114610287578063715018a6146102c4578063775313a1146102db57806381b4e8b4146103185780638da5cb5b146103485761014b565b80630e72cc06146101505780631b177491146101795780632ead72f6146101a257806339bb4ad9146101df578063440df4f41461020a578063485cc95514610235575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906122d4565b610582565b005b34801561018557600080fd5b506101a0600480360381019061019b9190612373565b610596565b005b3480156101ae57600080fd5b506101c960048036038101906101c491906123ee565b6106cd565b6040516101d69190612434565b60405180910390f35b3480156101eb57600080fd5b506101f46106f6565b60405161020191906124ae565b60405180910390f35b34801561021657600080fd5b5061021f61071c565b60405161022c9190612587565b60405180910390f35b34801561024157600080fd5b5061025c600480360381019061025791906125a9565b61072d565b005b34801561026a57600080fd5b506102856004803603810190610280919061267a565b61086f565b005b34801561029357600080fd5b506102ae60048036038101906102a991906122d4565b61097a565b6040516102bb91906126fd565b60405180910390f35b3480156102d057600080fd5b506102d9610a1d565b005b3480156102e757600080fd5b5061030260048036038101906102fd91906123ee565b610a31565b60405161030f91906126fd565b60405180910390f35b610332600480360381019061032d9190612718565b610a49565b60405161033f9190612434565b60405180910390f35b34801561035457600080fd5b5061035d610a60565b60405161036a919061277a565b60405180910390f35b34801561037f57600080fd5b50610388610a8a565b60405161039591906127b6565b60405180910390f35b3480156103aa57600080fd5b506103b3610aae565b6040516103c091906126fd565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb9190612827565b610ab4565b005b3480156103fe57600080fd5b5061041960048036038101906104149190612874565b610b33565b005b34801561042757600080fd5b50610430610b49565b60405161043d91906128d5565b60405180910390f35b34801561045257600080fd5b5061045b610b6f565b6040516104689190612911565b60405180910390f35b34801561047d57600080fd5b50610498600480360381019061049391906129d8565b610b95565b005b3480156104a657600080fd5b506104c160048036038101906104bc91906122d4565b610c5e565b005b3480156104cf57600080fd5b506104ea60048036038101906104e591906123ee565b610c72565b6040516104f791906126fd565b60405180910390f35b34801561050c57600080fd5b50610527600480360381019061052291906122d4565b610d38565b005b34801561053557600080fd5b50610550600480360381019061054b91906122d4565b610dbb565b005b61056c60048036038101906105679190612a59565b610dcf565b6040516105799190612434565b60405180910390f35b61058a610e66565b61059381610ee4565b50565b60006105a5838387878a610fea565b9050600073ffffffffffffffffffffffffffffffffffffffff1660ce600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064090612b1d565b60405180910390fd5b3360ce600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506106b03385876106ab9190612b6c565b611026565b6106c58685876106c09190612b6c565b611077565b505050505050565b6000806106ea8363ffffffff1660986110c690919063ffffffff16565b91505080915050919050565b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061072860986110ed565b905090565b60008060019054906101000a900460ff1615905080801561075e5750600160008054906101000a900460ff1660ff16105b8061078b575061076d306111b6565b15801561078a5750600160008054906101000a900460ff1660ff16145b5b6107ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c190612c12565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610807576001600060016101000a81548160ff0219169083151502179055505b61081183836111d9565b801561086a5760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516108619190612c7a565b60405180910390a15b505050565b606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f690612ce1565b60405180910390fd5b838361090b828261123e565b60405180608001604052806043815260200161379e6043913990610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c9190612d80565b60405180910390fd5b5061097286868686611253565b505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016109d5919061277a565b602060405180830381865afa1580156109f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a169190612db7565b9050919050565b610a25610e66565b610a2f6000611265565b565b60cc6020528060005260406000206000915090505481565b6000610a578484843461132b565b90509392505050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60cd5481565b610abc610e66565b60005b82829050811015610b2e57610b1a838383818110610ae057610adf612de4565b5b9050604002016000016020810190610af891906123ee565b848484818110610b0b57610b0a612de4565b5b90506040020160200135611399565b600181610b279190612e13565b9050610abf565b505050565b610b3b610e66565b610b4582826113ff565b5050565b606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610b9d610e66565b818190508484905014610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc90612e93565b60405180910390fd5b600084849050905060005b81811015610c5657610c42868683818110610c0e57610c0d612de4565b5b9050602002016020810190610c2391906123ee565b858584818110610c3657610c35612de4565b5b905060200201356113ff565b600181610c4f9190612e13565b9050610bf0565b505050505050565b610c66610e66565b610c6f8161145d565b50565b6000606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a69297938360cc60008663ffffffff1663ffffffff168152602001908152602001600020546040518363ffffffff1660e01b8152600401610cf0929190612ec2565b602060405180830381865afa158015610d0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d319190612db7565b9050919050565b610d40610e66565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da690612f5d565b60405180910390fd5b610db881611265565b50565b610dc3610e66565b610dcc8161152e565b50565b60008060cd549050600181610de49190612e13565b60cd819055506000610e038585600185610dfe9190612e13565b6115ff565b9050610e1b87610e14888885611636565b3433611665565b9250858763ffffffff167fd229aacb94204188fe8042965fa6b269c62dc5818b21238779ab64bdd17efeec87604051610e5491906126fd565b60405180910390a35050949350505050565b610e6e61169d565b73ffffffffffffffffffffffffffffffffffffffff16610e8c610a60565b73ffffffffffffffffffffffffffffffffffffffff1614610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed990612fc9565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610f245750610f23816116a5565b5b610f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5a90613035565b60405180910390fd5b80606760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167ffec811ed4e60aebdaf7a79cad8a97196bf56e35362f039705598226d30c9d24860405160405180910390a250565b600085858585856040516020016110059594939291906130f4565b60405160208183030381529060405280519060200120905095945050505050565b6110738230837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166116c8909392919063ffffffff16565b5050565b6110c282827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166117519092919063ffffffff16565b5050565b6000806110e28360001b856000016117d790919063ffffffff16565b915091509250929050565b606060006110fa83611826565b9050805167ffffffffffffffff81111561111757611116613153565b5b6040519080825280602002602001820160405280156111455781602001602082028036833780820191505090505b50915060005b81518110156111af5781818151811061116757611166612de4565b5b602002602001015183828151811061118257611181612de4565b5b602002602001019063ffffffff16908163ffffffff168152505080806111a790613182565b91505061114b565b5050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f9061323c565b60405180910390fd5b6112318161145d565b61123a826118e3565b5050565b60008161124a846106cd565b14905092915050565b61125f84848484611946565b50505050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080611337846119d1565b905061134f86611348878785611636565b8533611665565b9150848663ffffffff167fd229aacb94204188fe8042965fa6b269c62dc5818b21238779ab64bdd17efeec8660405161138891906126fd565b60405180910390a350949350505050565b8060cc60008463ffffffff1663ffffffff168152602001908152602001600020819055508163ffffffff167f90563f253ecb04527a6a7ae1a8cbe2bdc6caefb39d5f7b06a973cf5e7f8035a4826040516113f391906126fd565b60405180910390a25050565b61141b8263ffffffff16826098611a379092919063ffffffff16565b8163ffffffff167f97fd51fef1f80c854cbd0150c248e8b2ac4ecdc97cc05e742b5f61c9f4dc6458826040516114519190612434565b60405180910390a25050565b80611467816116a5565b6114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d90613035565b60405180910390fd5b81606660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167fb87f5a0bface22cde699143559fb99f990ae54eea236995fc54178af91af859f60405160405180910390a25050565b80611538816116a5565b611577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156e90613035565b60405180910390fd5b81606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f7a61e573722ff8b205c8962b59d37e7d30573f368965597a844a94872204ebd760405160405180910390a25050565b606061160b3385611026565b828260405160200161161e92919061325c565b60405160208183030381529060405290509392505050565b606083838360405160200161164d939291906132ed565b60405160208183030381529060405290509392505050565b6000611693858560cc60008963ffffffff1663ffffffff168152602001908152602001600020548686611a58565b9050949350505050565b600033905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b61174b846323b872dd60e01b8585856040516024016116e993929190613326565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611b03565b50505050565b6117d28363a9059cbb60e01b848460405160240161177092919061335d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611b03565b505050565b60008060008460020160008581526020019081526020016000205490506000801b8103611816576118088585611bca565b6000801b925092505061181f565b60018192509250505b9250929050565b6060600061183683600001611bea565b90508067ffffffffffffffff81111561185257611851613153565b5b6040519080825280602002602001820160405280156118805781602001602082028036833780820191505090505b50915060005b818110156118dc576118a78185600001600001611bff90919063ffffffff16565b60001c8382815181106118bd576118bc612de4565b5b60200260200101818152505080806118d490613182565b915050611886565b5050919050565b600060019054906101000a900460ff16611932576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119299061323c565b60405180910390fd5b61193b8161152e565b611943611c16565b50565b60006119528383611c6f565b905060006119608484611c98565b905036600061196f8686611cc4565b9150915061198861197f85611ce5565b848a8585611cf2565b838863ffffffff167fba20947a325f450d232530e5f5fce293e7963499d5309a07cee84a269f2f15a6856040516119bf91906126fd565b60405180910390a35050505050505050565b6060611a203330847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166116c8909392919063ffffffff16565b604051806020016040528060008152509050919050565b611a528260001b8285600001611d159092919063ffffffff16565b50505050565b6000611a648686611d50565b9050606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166311bf2c1884838988876040518663ffffffff1660e01b8152600401611ac89493929190613386565b6000604051808303818588803b158015611ae157600080fd5b505af1158015611af5573d6000803e3d6000fd5b505050505095945050505050565b6000611b65826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611e099092919063ffffffff16565b9050600081511115611bc55780806020019051810190611b859190613403565b611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb906134a2565b60405180910390fd5b5b505050565b6000611be28284600001611e2190919063ffffffff16565b905092915050565b6000611bf882600001611e38565b9050919050565b6000611c0e8360000183611e4d565b905092915050565b600060019054906101000a900460ff16611c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5c9061323c565b60405180910390fd5b611c6d611e78565b565b60008282600090602092611c85939291906134cc565b90611c90919061351f565b905092915050565b60008282602090604092611cae939291906134cc565b90611cb9919061351f565b60001c905092915050565b36600083836040908092611cda939291906134cc565b915091509250929050565b60008160001c9050919050565b6000611d018686868686611ed9565b9050611d0d8186611077565b505050505050565b60008184600201600085815260200190815260200160002081905550611d478385600001611f9690919063ffffffff16565b90509392505050565b600080611d5c84611fad565b9050606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa31de018583866040518463ffffffff1660e01b8152600401611dbd939291906135c8565b6020604051808303816000875af1158015611ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e00919061361b565b91505092915050565b6060611e188484600085612036565b90509392505050565b6000611e308360000183612103565b905092915050565b6000611e4682600001612126565b9050919050565b6000826000018281548110611e6557611e64612de4565b5b9060005260206000200154905092915050565b600060019054906101000a900460ff16611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe9061323c565b60405180910390fd5b611ed7611ed261169d565b611265565b565b6000808383905003611eed57859050611f8d565b6000808484810190611eff9190613648565b91509150600060ce6000611f1689858c888f610fea565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f8657809350505050611f8d565b8893505050505b95945050505050565b6000611fa58360000183612137565b905092915050565b6000806000611fcc8463ffffffff1660986110c690919063ffffffff16565b915091508160405180608001604052806043815260200161379e604391399061202b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120229190612d80565b60405180910390fd5b508092505050919050565b60608247101561207b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612072906136fa565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516120a4919061371a565b60006040518083038185875af1925050503d80600081146120e1576040519150601f19603f3d011682016040523d82523d6000602084013e6120e6565b606091505b50915091506120f7878383876121a7565b92505050949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b60006121438383612103565b61219c5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506121a1565b600090505b92915050565b60608315612209576000835103612201576121c1856116a5565b612200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f79061377d565b60405180910390fd5b5b829050612214565b612213838361221c565b5b949350505050565b60008251111561222f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122639190612d80565b60405180910390fd5b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122a182612276565b9050919050565b6122b181612296565b81146122bc57600080fd5b50565b6000813590506122ce816122a8565b92915050565b6000602082840312156122ea576122e961226c565b5b60006122f8848285016122bf565b91505092915050565b6000819050919050565b61231481612301565b811461231f57600080fd5b50565b6000813590506123318161230b565b92915050565b600063ffffffff82169050919050565b61235081612337565b811461235b57600080fd5b50565b60008135905061236d81612347565b92915050565b600080600080600060a0868803121561238f5761238e61226c565b5b600061239d888289016122bf565b95505060206123ae88828901612322565b94505060406123bf88828901612322565b93505060606123d08882890161235e565b92505060806123e188828901612322565b9150509295509295909350565b6000602082840312156124045761240361226c565b5b60006124128482850161235e565b91505092915050565b6000819050919050565b61242e8161241b565b82525050565b60006020820190506124496000830184612425565b92915050565b6000819050919050565b600061247461246f61246a84612276565b61244f565b612276565b9050919050565b600061248682612459565b9050919050565b60006124988261247b565b9050919050565b6124a88161248d565b82525050565b60006020820190506124c3600083018461249f565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6124fe81612337565b82525050565b600061251083836124f5565b60208301905092915050565b6000602082019050919050565b6000612534826124c9565b61253e81856124d4565b9350612549836124e5565b8060005b8381101561257a5781516125618882612504565b975061256c8361251c565b92505060018101905061254d565b5085935050505092915050565b600060208201905081810360008301526125a18184612529565b905092915050565b600080604083850312156125c0576125bf61226c565b5b60006125ce858286016122bf565b92505060206125df858286016122bf565b9150509250929050565b6125f28161241b565b81146125fd57600080fd5b50565b60008135905061260f816125e9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261263a57612639612615565b5b8235905067ffffffffffffffff8111156126575761265661261a565b5b6020830191508360018202830111156126735761267261261f565b5b9250929050565b600080600080606085870312156126945761269361226c565b5b60006126a28782880161235e565b94505060206126b387828801612600565b935050604085013567ffffffffffffffff8111156126d4576126d3612271565b5b6126e087828801612624565b925092505092959194509250565b6126f781612301565b82525050565b600060208201905061271260008301846126ee565b92915050565b6000806000606084860312156127315761273061226c565b5b600061273f8682870161235e565b935050602061275086828701612600565b925050604061276186828701612322565b9150509250925092565b61277481612296565b82525050565b600060208201905061278f600083018461276b565b92915050565b60006127a08261247b565b9050919050565b6127b081612795565b82525050565b60006020820190506127cb60008301846127a7565b92915050565b60008083601f8401126127e7576127e6612615565b5b8235905067ffffffffffffffff8111156128045761280361261a565b5b6020830191508360408202830111156128205761281f61261f565b5b9250929050565b6000806020838503121561283e5761283d61226c565b5b600083013567ffffffffffffffff81111561285c5761285b612271565b5b612868858286016127d1565b92509250509250929050565b6000806040838503121561288b5761288a61226c565b5b60006128998582860161235e565b92505060206128aa85828601612600565b9150509250929050565b60006128bf8261247b565b9050919050565b6128cf816128b4565b82525050565b60006020820190506128ea60008301846128c6565b92915050565b60006128fb8261247b565b9050919050565b61290b816128f0565b82525050565b60006020820190506129266000830184612902565b92915050565b60008083601f84011261294257612941612615565b5b8235905067ffffffffffffffff81111561295f5761295e61261a565b5b60208301915083602082028301111561297b5761297a61261f565b5b9250929050565b60008083601f84011261299857612997612615565b5b8235905067ffffffffffffffff8111156129b5576129b461261a565b5b6020830191508360208202830111156129d1576129d061261f565b5b9250929050565b600080600080604085870312156129f2576129f161226c565b5b600085013567ffffffffffffffff811115612a1057612a0f612271565b5b612a1c8782880161292c565b9450945050602085013567ffffffffffffffff811115612a3f57612a3e612271565b5b612a4b87828801612982565b925092505092959194509250565b60008060008060808587031215612a7357612a7261226c565b5b6000612a818782880161235e565b9450506020612a9287828801612600565b9350506040612aa387828801612322565b9250506060612ab487828801612322565b91505092959194509250565b600082825260208201905092915050565b7f7265717565737420616c72656164792066696c6c656400000000000000000000600082015250565b6000612b07601683612ac0565b9150612b1282612ad1565b602082019050919050565b60006020820190508181036000830152612b3681612afa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b7782612301565b9150612b8283612301565b9250828203905081811115612b9a57612b99612b3d565b5b92915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000612bfc602e83612ac0565b9150612c0782612ba0565b604082019050919050565b60006020820190508181036000830152612c2b81612bef565b9050919050565b6000819050919050565b600060ff82169050919050565b6000612c64612c5f612c5a84612c32565b61244f565b612c3c565b9050919050565b612c7481612c49565b82525050565b6000602082019050612c8f6000830184612c6b565b92915050565b7f216d61696c626f78000000000000000000000000000000000000000000000000600082015250565b6000612ccb600883612ac0565b9150612cd682612c95565b602082019050919050565b60006020820190508181036000830152612cfa81612cbe565b9050919050565b600081519050919050565b60005b83811015612d2a578082015181840152602081019050612d0f565b60008484015250505050565b6000601f19601f8301169050919050565b6000612d5282612d01565b612d5c8185612ac0565b9350612d6c818560208601612d0c565b612d7581612d36565b840191505092915050565b60006020820190508181036000830152612d9a8184612d47565b905092915050565b600081519050612db18161230b565b92915050565b600060208284031215612dcd57612dcc61226c565b5b6000612ddb84828501612da2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612e1e82612301565b9150612e2983612301565b9250828201905080821115612e4157612e40612b3d565b5b92915050565b7f216c656e67746800000000000000000000000000000000000000000000000000600082015250565b6000612e7d600783612ac0565b9150612e8882612e47565b602082019050919050565b60006020820190508181036000830152612eac81612e70565b9050919050565b612ebc81612337565b82525050565b6000604082019050612ed76000830185612eb3565b612ee460208301846126ee565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612f47602683612ac0565b9150612f5282612eeb565b604082019050919050565b60006020820190508181036000830152612f7681612f3a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612fb3602083612ac0565b9150612fbe82612f7d565b602082019050919050565b60006020820190508181036000830152612fe281612fa6565b9050919050565b7f21636f6e74726163740000000000000000000000000000000000000000000000600082015250565b600061301f600983612ac0565b915061302a82612fe9565b602082019050919050565b6000602082019050818103600083015261304e81613012565b9050919050565b60008160e01b9050919050565b600061306d82613055565b9050919050565b61308561308082612337565b613062565b82525050565b6000819050919050565b6130a66130a182612301565b61308b565b82525050565b60008160601b9050919050565b60006130c4826130ac565b9050919050565b60006130d6826130b9565b9050919050565b6130ee6130e982612296565b6130cb565b82525050565b60006131008288613074565b6004820191506131108287613095565b6020820191506131208286613095565b6020820191506131308285613095565b60208201915061314082846130dd565b6014820191508190509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061318d82612301565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131bf576131be612b3d565b5b600182019050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b6000613226602b83612ac0565b9150613231826131ca565b604082019050919050565b6000602082019050818103600083015261325581613219565b9050919050565b600060408201905061327160008301856126ee565b61327e60208301846126ee565b9392505050565b6000819050919050565b6132a061329b8261241b565b613285565b82525050565b600081519050919050565b600081905092915050565b60006132c7826132a6565b6132d181856132b1565b93506132e1818560208601612d0c565b80840191505092915050565b60006132f9828661328f565b6020820191506133098285613095565b60208201915061331982846132bc565b9150819050949350505050565b600060608201905061333b600083018661276b565b613348602083018561276b565b61335560408301846126ee565b949350505050565b6000604082019050613372600083018561276b565b61337f60208301846126ee565b9392505050565b600060808201905061339b6000830187612425565b6133a86020830186612eb3565b6133b560408301856126ee565b6133c2606083018461276b565b95945050505050565b60008115159050919050565b6133e0816133cb565b81146133eb57600080fd5b50565b6000815190506133fd816133d7565b92915050565b6000602082840312156134195761341861226c565b5b6000613427848285016133ee565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061348c602a83612ac0565b915061349782613430565b604082019050919050565b600060208201905081810360008301526134bb8161347f565b9050919050565b600080fd5b600080fd5b600080858511156134e0576134df6134c2565b5b838611156134f1576134f06134c7565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b600061352b8383613507565b82613536813561241b565b92506020821015613576576135717fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802613512565b831692505b505092915050565b600082825260208201905092915050565b600061359a826132a6565b6135a4818561357e565b93506135b4818560208601612d0c565b6135bd81612d36565b840191505092915050565b60006060820190506135dd6000830186612eb3565b6135ea6020830185612425565b81810360408301526135fc818461358f565b9050949350505050565b600081519050613615816125e9565b92915050565b6000602082840312156136315761363061226c565b5b600061363f84828501613606565b91505092915050565b6000806040838503121561365f5761365e61226c565b5b600061366d85828601612322565b925050602061367e85828601612322565b9150509250929050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006136e4602683612ac0565b91506136ef82613688565b604082019050919050565b60006020820190508181036000830152613713816136d7565b9050919050565b600061372682846132bc565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613767601d83612ac0565b915061377282613731565b602082019050919050565b600060208201905081810360008301526137968161375a565b905091905056fe4e6f20726f7574657220656e726f6c6c656420666f7220646f6d61696e2e2044696420796f7520737065636966792074686520726967687420646f6d61696e2049443fa264697066735822122048e10fbf91a17d3effb0a6bf13995a021d36b0f7daf36b98abbac58bd43f7a9964736f6c63430008100033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/integration-test/abis/Mailbox.json b/integration-test/abis/Mailbox.json index 379001d5..0f5c7c8b 100644 --- a/integration-test/abis/Mailbox.json +++ b/integration-test/abis/Mailbox.json @@ -439,8 +439,8 @@ "type": "function" } ], - "bytecode": "0x60a060405234801561001057600080fd5b5060405162002229380380620022298339810160408190526100319161003f565b63ffffffff1660805261006c565b60006020828403121561005157600080fd5b815163ffffffff8116811461006557600080fd5b9392505050565b6080516121936200009660003960008181610230015281816106300152610d0501526121936000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c8063907c0f92116100cd578063f2fde38b11610081578063fa31de0111610066578063fa31de011461030e578063fd54b22814610321578063ffa1ad741461032b57600080fd5b8063f2fde38b146102e8578063f794687a146102fb57600080fd5b8063e495f1d4116100b2578063e495f1d4146102aa578063e70f48ac146102cd578063ebf0c717146102e057600080fd5b8063907c0f9214610270578063b187bd261461029257600080fd5b8063715018a6116101245780638456cb59116101095780638456cb59146102235780638d3638f41461022b5780638da5cb5b1461025257600080fd5b8063715018a6146102085780637c39d1301461021057600080fd5b8063485cc95511610155578063485cc95514610199578063522ae002146101ac5780636e5f516e146101c357600080fd5b806306661abd146101715780633f4ba83a1461018f575b600080fd5b60b8545b60405163ffffffff90911681526020015b60405180910390f35b610197610345565b005b6101976101a7366004611a93565b610380565b6101b561080081565b604051908152602001610186565b6097546101e39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610186565b610197610533565b61019761021e366004611b0e565b610547565b6101976109fa565b6101757f000000000000000000000000000000000000000000000000000000000000000081565b60335473ffffffffffffffffffffffffffffffffffffffff166101e3565b610278610a35565b6040805192835263ffffffff909116602083015201610186565b61029a610a5d565b6040519015158152602001610186565b61029a6102b8366004611b7a565b60b96020526000908152604090205460ff1681565b6101e36102db366004611b93565b610a70565b6101b5610b3e565b6101976102f6366004611b93565b610b4a565b610197610309366004611b93565b610c01565b6101b561031c366004611bb0565b610c12565b60b8546101b59081565b610333600081565b60405160ff9091168152602001610186565b61034d610dce565b610355610e4f565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600054610100900460ff16158080156103a05750600054600160ff909116105b806103ba5750303b1580156103ba575060005460ff166001145b61044b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156104a957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6104b1610ec2565b6104b9610f59565b6104c283610b4a565b6104cb82610ff8565b801561052e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b61053b610dce565b61054560006110e5565b565b6001606554146105b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f7265656e7472616e742063616c6c20286f7220706175736564290000000000006044820152606401610442565b600060658190556105c4838361115c565b60ff161461062e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f2176657273696f6e0000000000000000000000000000000000000000000000006044820152606401610442565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff1661065f8383611180565b63ffffffff16146106cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f2164657374696e6174696f6e00000000000000000000000000000000000000006044820152606401610442565b600061070d83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506111a392505050565b600081815260b9602052604090205490915060ff1615610789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f64656c69766572656400000000000000000000000000000000000000000000006044820152606401610442565b600081815260b96020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556107cd6102db85856111ae565b6040517ff7e83aee00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063f7e83aee90610828908990899089908990600401611c52565b6020604051808303816000875af1158015610847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086b9190611c84565b6108d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f216d6f64756c65000000000000000000000000000000000000000000000000006044820152606401610442565b60006108dd85856111c7565b905060006108eb86866111d7565b905060006108f987876111ae565b90508073ffffffffffffffffffffffffffffffffffffffff166356d5d47584846109238b8b6111f0565b6040518563ffffffff1660e01b81526004016109429493929190611ca6565b600060405180830381600087803b15801561095c57600080fd5b505af1158015610970573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16828463ffffffff167f0d381c2a574ae8f04e213db7cfb4df8df712cdbd427d9868ffef380660ca657460405160405180910390a460405185907f1cae38cdd3d3919489272725a5ae62a4f48b2989b0dae843d3c279fee18073a990600090a25050600160655550505050505050565b610a02610dce565b610a0a61120c565b6040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b600080610a40610b3e565b6001610a4b60b85490565b610a559190611d05565b915091509091565b6000610a6b60655460021490565b905090565b60008173ffffffffffffffffffffffffffffffffffffffff1663de523cf36040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610af7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610af491810190611d29565b60015b15610b205773ffffffffffffffffffffffffffffffffffffffff811615610b1e5792915050565b505b505060975473ffffffffffffffffffffffffffffffffffffffff1690565b6000610a6b609861127f565b610b52610dce565b73ffffffffffffffffffffffffffffffffffffffff8116610bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610442565b610bfe816110e5565b50565b610c09610dce565b610bfe81610ff8565b6000610c2060655460021490565b15610c87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610442565b610800821115610cf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6d736720746f6f206c6f6e6700000000000000000000000000000000000000006044820152606401610442565b6000610d2e6000610d0360b85490565b7f0000000000000000000000000000000000000000000000000000000000000000338a8a8a8a611292565b80516020820120909150610d436098826112d0565b858763ffffffff163373ffffffffffffffffffffffffffffffffffffffff167f769f711d20c679153d382254f59892613b58a97cc876b249134ac25c80f9c81485604051610d919190611d46565b60405180910390a460405181907f788dbc1b7152732178210e7f4d9d010ef016f9eafbe66786bd7169f56e0c353a90600090a29695505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610442565b606554600214610ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f21706175736564000000000000000000000000000000000000000000000000006044820152606401610442565b6001606555565b600054610100900460ff16610ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610442565b600054610100900460ff16610ff0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610442565b61054561140f565b73ffffffffffffffffffffffffffffffffffffffff81163b611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f21636f6e747261637400000000000000000000000000000000000000000000006044820152606401610442565b609780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fa76ad0adbf45318f8633aa0210f711273d50fbb6fef76ed95bbae97082c75daa90600090a250565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061116b6001828486611db2565b61117491611ddc565b60f81c90505b92915050565b6000611190602d60298486611db2565b61119991611e22565b60e01c9392505050565b805160209091012090565b60006111c06111bd84846114af565b90565b9392505050565b6000611190600960058486611db2565b60006111e7602960098486611db2565b6111c091611e68565b36600061120083604d8187611db2565b915091505b9250929050565b606554600203611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610442565b6002606555565b600061117a8261128d6114bf565b611980565b606088888888888888886040516020016112b3989796959493929190611ea4565b604051602081830303815290604052905098975050505050505050565b60016112de6020600261205a565b6112e89190612066565b826020015410611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6d65726b6c6520747265652066756c6c000000000000000000000000000000006044820152606401610442565b60018260200160008282546113699190612079565b9091555050602082015460005b602081101561140657816001166001036113a5578284826020811061139d5761139d61208c565b015550505050565b8381602081106113b7576113b761208c565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092506002826113f291906120bb565b9150806113fe816120f6565b915050611376565b5061052e61212e565b600054610100900460ff166114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610442565b610545336110e5565b60006111e7604d602d8486611db2565b6114c7611a52565b600081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb560208201527fb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d3060408201527f21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba8560608201527fe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a1934460808201527f0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d60a08201527f887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a196860c08201527fffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f8360e08201527f9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af6101008201527fcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e06101208201527ff9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a56101408201527ff8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf8926101608201527f3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c6101808201527fc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb6101a08201527f5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc6101c08201527fda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d26101e08201527f2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f6102008201527fe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a6102208201527f5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a06102408201527fb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa06102608201527fc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e26102808201527ff4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd96102a08201527f5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e3776102c08201527f4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee6526102e08201527fcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef6103008201527f0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d6103208201527fb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d06103408201527f838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e6103608201527f662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e6103808201527f388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea3226103a08201527f93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d7356103c08201527f8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a96103e082015290565b6020820154600090815b6020811015611a4a57600182821c1660008683602081106119ad576119ad61208c565b01549050816001036119ea576040805160208101839052908101869052606001604051602081830303815290604052805190602001209450611a35565b848684602081106119fd576119fd61208c565b6020020151604051602001611a1c929190918252602082015260400190565b6040516020818303038152906040528051906020012094505b50508080611a42906120f6565b91505061198a565b505092915050565b6040518061040001604052806020906020820280368337509192915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bfe57600080fd5b60008060408385031215611aa657600080fd5b8235611ab181611a71565b91506020830135611ac181611a71565b809150509250929050565b60008083601f840112611ade57600080fd5b50813567ffffffffffffffff811115611af657600080fd5b60208301915083602082850101111561120557600080fd5b60008060008060408587031215611b2457600080fd5b843567ffffffffffffffff80821115611b3c57600080fd5b611b4888838901611acc565b90965094506020870135915080821115611b6157600080fd5b50611b6e87828801611acc565b95989497509550505050565b600060208284031215611b8c57600080fd5b5035919050565b600060208284031215611ba557600080fd5b81356111c081611a71565b60008060008060608587031215611bc657600080fd5b843563ffffffff81168114611bda57600080fd5b935060208501359250604085013567ffffffffffffffff811115611bfd57600080fd5b611b6e87828801611acc565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081526000611c66604083018688611c09565b8281036020840152611c79818587611c09565b979650505050505050565b600060208284031215611c9657600080fd5b815180151581146111c057600080fd5b63ffffffff85168152836020820152606060408201526000611ccc606083018486611c09565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff828116828216039080821115611d2257611d22611cd6565b5092915050565b600060208284031215611d3b57600080fd5b81516111c081611a71565b600060208083528351808285015260005b81811015611d7357858101830151858201604001528201611d57565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60008085851115611dc257600080fd5b83861115611dcf57600080fd5b5050820193919092039150565b7fff000000000000000000000000000000000000000000000000000000000000008135818116916001851015611a4a5760019490940360031b84901b1690921692915050565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015611a4a5760049490940360031b84901b1690921692915050565b8035602083101561117a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b7fff000000000000000000000000000000000000000000000000000000000000008960f81b16815260007fffffffff00000000000000000000000000000000000000000000000000000000808a60e01b166001840152808960e01b166005840152876009840152808760e01b1660298401525084602d8301528284604d8401375060009101604d01908152979650505050505050565b600181815b80851115611f9357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611f7957611f79611cd6565b80851615611f8657918102915b93841c9390800290611f3f565b509250929050565b600082611faa5750600161117a565b81611fb75750600061117a565b8160018114611fcd5760028114611fd757611ff3565b600191505061117a565b60ff841115611fe857611fe8611cd6565b50506001821b61117a565b5060208310610133831016604e8410600b8410161715612016575081810a61117a565b6120208383611f3a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561205257612052611cd6565b029392505050565b60006111c08383611f9b565b8181038181111561117a5761117a611cd6565b8082018082111561117a5761117a611cd6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826120f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361212757612127611cd6565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea2646970667358221220a7ca79ca720355c53819097f9127004ae2ab5d8c131e43c603a23865849f50ca64736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061016c5760003560e01c8063907c0f92116100cd578063f2fde38b11610081578063fa31de0111610066578063fa31de011461030e578063fd54b22814610321578063ffa1ad741461032b57600080fd5b8063f2fde38b146102e8578063f794687a146102fb57600080fd5b8063e495f1d4116100b2578063e495f1d4146102aa578063e70f48ac146102cd578063ebf0c717146102e057600080fd5b8063907c0f9214610270578063b187bd261461029257600080fd5b8063715018a6116101245780638456cb59116101095780638456cb59146102235780638d3638f41461022b5780638da5cb5b1461025257600080fd5b8063715018a6146102085780637c39d1301461021057600080fd5b8063485cc95511610155578063485cc95514610199578063522ae002146101ac5780636e5f516e146101c357600080fd5b806306661abd146101715780633f4ba83a1461018f575b600080fd5b60b8545b60405163ffffffff90911681526020015b60405180910390f35b610197610345565b005b6101976101a7366004611a93565b610380565b6101b561080081565b604051908152602001610186565b6097546101e39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610186565b610197610533565b61019761021e366004611b0e565b610547565b6101976109fa565b6101757f000000000000000000000000000000000000000000000000000000000000000081565b60335473ffffffffffffffffffffffffffffffffffffffff166101e3565b610278610a35565b6040805192835263ffffffff909116602083015201610186565b61029a610a5d565b6040519015158152602001610186565b61029a6102b8366004611b7a565b60b96020526000908152604090205460ff1681565b6101e36102db366004611b93565b610a70565b6101b5610b3e565b6101976102f6366004611b93565b610b4a565b610197610309366004611b93565b610c01565b6101b561031c366004611bb0565b610c12565b60b8546101b59081565b610333600081565b60405160ff9091168152602001610186565b61034d610dce565b610355610e4f565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600054610100900460ff16158080156103a05750600054600160ff909116105b806103ba5750303b1580156103ba575060005460ff166001145b61044b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156104a957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6104b1610ec2565b6104b9610f59565b6104c283610b4a565b6104cb82610ff8565b801561052e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b61053b610dce565b61054560006110e5565b565b6001606554146105b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f7265656e7472616e742063616c6c20286f7220706175736564290000000000006044820152606401610442565b600060658190556105c4838361115c565b60ff161461062e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f2176657273696f6e0000000000000000000000000000000000000000000000006044820152606401610442565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff1661065f8383611180565b63ffffffff16146106cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f2164657374696e6174696f6e00000000000000000000000000000000000000006044820152606401610442565b600061070d83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506111a392505050565b600081815260b9602052604090205490915060ff1615610789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f64656c69766572656400000000000000000000000000000000000000000000006044820152606401610442565b600081815260b96020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556107cd6102db85856111ae565b6040517ff7e83aee00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063f7e83aee90610828908990899089908990600401611c52565b6020604051808303816000875af1158015610847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086b9190611c84565b6108d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f216d6f64756c65000000000000000000000000000000000000000000000000006044820152606401610442565b60006108dd85856111c7565b905060006108eb86866111d7565b905060006108f987876111ae565b90508073ffffffffffffffffffffffffffffffffffffffff166356d5d47584846109238b8b6111f0565b6040518563ffffffff1660e01b81526004016109429493929190611ca6565b600060405180830381600087803b15801561095c57600080fd5b505af1158015610970573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16828463ffffffff167f0d381c2a574ae8f04e213db7cfb4df8df712cdbd427d9868ffef380660ca657460405160405180910390a460405185907f1cae38cdd3d3919489272725a5ae62a4f48b2989b0dae843d3c279fee18073a990600090a25050600160655550505050505050565b610a02610dce565b610a0a61120c565b6040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b600080610a40610b3e565b6001610a4b60b85490565b610a559190611d05565b915091509091565b6000610a6b60655460021490565b905090565b60008173ffffffffffffffffffffffffffffffffffffffff1663de523cf36040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610af7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610af491810190611d29565b60015b15610b205773ffffffffffffffffffffffffffffffffffffffff811615610b1e5792915050565b505b505060975473ffffffffffffffffffffffffffffffffffffffff1690565b6000610a6b609861127f565b610b52610dce565b73ffffffffffffffffffffffffffffffffffffffff8116610bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610442565b610bfe816110e5565b50565b610c09610dce565b610bfe81610ff8565b6000610c2060655460021490565b15610c87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610442565b610800821115610cf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6d736720746f6f206c6f6e6700000000000000000000000000000000000000006044820152606401610442565b6000610d2e6000610d0360b85490565b7f0000000000000000000000000000000000000000000000000000000000000000338a8a8a8a611292565b80516020820120909150610d436098826112d0565b858763ffffffff163373ffffffffffffffffffffffffffffffffffffffff167f769f711d20c679153d382254f59892613b58a97cc876b249134ac25c80f9c81485604051610d919190611d46565b60405180910390a460405181907f788dbc1b7152732178210e7f4d9d010ef016f9eafbe66786bd7169f56e0c353a90600090a29695505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610442565b606554600214610ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f21706175736564000000000000000000000000000000000000000000000000006044820152606401610442565b6001606555565b600054610100900460ff16610ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610442565b600054610100900460ff16610ff0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610442565b61054561140f565b73ffffffffffffffffffffffffffffffffffffffff81163b611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f21636f6e747261637400000000000000000000000000000000000000000000006044820152606401610442565b609780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fa76ad0adbf45318f8633aa0210f711273d50fbb6fef76ed95bbae97082c75daa90600090a250565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061116b6001828486611db2565b61117491611ddc565b60f81c90505b92915050565b6000611190602d60298486611db2565b61119991611e22565b60e01c9392505050565b805160209091012090565b60006111c06111bd84846114af565b90565b9392505050565b6000611190600960058486611db2565b60006111e7602960098486611db2565b6111c091611e68565b36600061120083604d8187611db2565b915091505b9250929050565b606554600203611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610442565b6002606555565b600061117a8261128d6114bf565b611980565b606088888888888888886040516020016112b3989796959493929190611ea4565b604051602081830303815290604052905098975050505050505050565b60016112de6020600261205a565b6112e89190612066565b826020015410611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6d65726b6c6520747265652066756c6c000000000000000000000000000000006044820152606401610442565b60018260200160008282546113699190612079565b9091555050602082015460005b602081101561140657816001166001036113a5578284826020811061139d5761139d61208c565b015550505050565b8381602081106113b7576113b761208c565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092506002826113f291906120bb565b9150806113fe816120f6565b915050611376565b5061052e61212e565b600054610100900460ff166114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610442565b610545336110e5565b60006111e7604d602d8486611db2565b6114c7611a52565b600081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb560208201527fb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d3060408201527f21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba8560608201527fe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a1934460808201527f0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d60a08201527f887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a196860c08201527fffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f8360e08201527f9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af6101008201527fcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e06101208201527ff9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a56101408201527ff8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf8926101608201527f3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c6101808201527fc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb6101a08201527f5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc6101c08201527fda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d26101e08201527f2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f6102008201527fe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a6102208201527f5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a06102408201527fb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa06102608201527fc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e26102808201527ff4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd96102a08201527f5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e3776102c08201527f4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee6526102e08201527fcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef6103008201527f0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d6103208201527fb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d06103408201527f838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e6103608201527f662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e6103808201527f388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea3226103a08201527f93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d7356103c08201527f8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a96103e082015290565b6020820154600090815b6020811015611a4a57600182821c1660008683602081106119ad576119ad61208c565b01549050816001036119ea576040805160208101839052908101869052606001604051602081830303815290604052805190602001209450611a35565b848684602081106119fd576119fd61208c565b6020020151604051602001611a1c929190918252602082015260400190565b6040516020818303038152906040528051906020012094505b50508080611a42906120f6565b91505061198a565b505092915050565b6040518061040001604052806020906020820280368337509192915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bfe57600080fd5b60008060408385031215611aa657600080fd5b8235611ab181611a71565b91506020830135611ac181611a71565b809150509250929050565b60008083601f840112611ade57600080fd5b50813567ffffffffffffffff811115611af657600080fd5b60208301915083602082850101111561120557600080fd5b60008060008060408587031215611b2457600080fd5b843567ffffffffffffffff80821115611b3c57600080fd5b611b4888838901611acc565b90965094506020870135915080821115611b6157600080fd5b50611b6e87828801611acc565b95989497509550505050565b600060208284031215611b8c57600080fd5b5035919050565b600060208284031215611ba557600080fd5b81356111c081611a71565b60008060008060608587031215611bc657600080fd5b843563ffffffff81168114611bda57600080fd5b935060208501359250604085013567ffffffffffffffff811115611bfd57600080fd5b611b6e87828801611acc565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081526000611c66604083018688611c09565b8281036020840152611c79818587611c09565b979650505050505050565b600060208284031215611c9657600080fd5b815180151581146111c057600080fd5b63ffffffff85168152836020820152606060408201526000611ccc606083018486611c09565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff828116828216039080821115611d2257611d22611cd6565b5092915050565b600060208284031215611d3b57600080fd5b81516111c081611a71565b600060208083528351808285015260005b81811015611d7357858101830151858201604001528201611d57565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60008085851115611dc257600080fd5b83861115611dcf57600080fd5b5050820193919092039150565b7fff000000000000000000000000000000000000000000000000000000000000008135818116916001851015611a4a5760019490940360031b84901b1690921692915050565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015611a4a5760049490940360031b84901b1690921692915050565b8035602083101561117a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b7fff000000000000000000000000000000000000000000000000000000000000008960f81b16815260007fffffffff00000000000000000000000000000000000000000000000000000000808a60e01b166001840152808960e01b166005840152876009840152808760e01b1660298401525084602d8301528284604d8401375060009101604d01908152979650505050505050565b600181815b80851115611f9357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611f7957611f79611cd6565b80851615611f8657918102915b93841c9390800290611f3f565b509250929050565b600082611faa5750600161117a565b81611fb75750600061117a565b8160018114611fcd5760028114611fd757611ff3565b600191505061117a565b60ff841115611fe857611fe8611cd6565b50506001821b61117a565b5060208310610133831016604e8410600b8410161715612016575081810a61117a565b6120208383611f3a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561205257612052611cd6565b029392505050565b60006111c08383611f9b565b8181038181111561117a5761117a611cd6565b8082018082111561117a5761117a611cd6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826120f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361212757612127611cd6565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea2646970667358221220a7ca79ca720355c53819097f9127004ae2ab5d8c131e43c603a23865849f50ca64736f6c63430008110033", + "bytecode": "0x60a060405234801561001057600080fd5b5060405162002229380380620022298339810160408190526100319161003f565b63ffffffff1660805261006c565b60006020828403121561005157600080fd5b815163ffffffff8116811461006557600080fd5b9392505050565b6080516121936200009660003960008181610230015281816106300152610d0501526121936000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c8063907c0f92116100cd578063f2fde38b11610081578063fa31de0111610066578063fa31de011461030e578063fd54b22814610321578063ffa1ad741461032b57600080fd5b8063f2fde38b146102e8578063f794687a146102fb57600080fd5b8063e495f1d4116100b2578063e495f1d4146102aa578063e70f48ac146102cd578063ebf0c717146102e057600080fd5b8063907c0f9214610270578063b187bd261461029257600080fd5b8063715018a6116101245780638456cb59116101095780638456cb59146102235780638d3638f41461022b5780638da5cb5b1461025257600080fd5b8063715018a6146102085780637c39d1301461021057600080fd5b8063485cc95511610155578063485cc95514610199578063522ae002146101ac5780636e5f516e146101c357600080fd5b806306661abd146101715780633f4ba83a1461018f575b600080fd5b60b8545b60405163ffffffff90911681526020015b60405180910390f35b610197610345565b005b6101976101a7366004611a93565b610380565b6101b561080081565b604051908152602001610186565b6097546101e39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610186565b610197610533565b61019761021e366004611b0e565b610547565b6101976109fa565b6101757f000000000000000000000000000000000000000000000000000000000000000081565b60335473ffffffffffffffffffffffffffffffffffffffff166101e3565b610278610a35565b6040805192835263ffffffff909116602083015201610186565b61029a610a5d565b6040519015158152602001610186565b61029a6102b8366004611b7a565b60b96020526000908152604090205460ff1681565b6101e36102db366004611b93565b610a70565b6101b5610b3e565b6101976102f6366004611b93565b610b4a565b610197610309366004611b93565b610c01565b6101b561031c366004611bb0565b610c12565b60b8546101b59081565b610333600081565b60405160ff9091168152602001610186565b61034d610dce565b610355610e4f565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600054610100900460ff16158080156103a05750600054600160ff909116105b806103ba5750303b1580156103ba575060005460ff166001145b61044b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156104a957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6104b1610ec2565b6104b9610f59565b6104c283610b4a565b6104cb82610ff8565b801561052e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b61053b610dce565b61054560006110e5565b565b6001606554146105b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f7265656e7472616e742063616c6c20286f7220706175736564290000000000006044820152606401610442565b600060658190556105c4838361115c565b60ff161461062e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f2176657273696f6e0000000000000000000000000000000000000000000000006044820152606401610442565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff1661065f8383611180565b63ffffffff16146106cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f2164657374696e6174696f6e00000000000000000000000000000000000000006044820152606401610442565b600061070d83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506111a392505050565b600081815260b9602052604090205490915060ff1615610789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f64656c69766572656400000000000000000000000000000000000000000000006044820152606401610442565b600081815260b96020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556107cd6102db85856111ae565b6040517ff7e83aee00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063f7e83aee90610828908990899089908990600401611c52565b6020604051808303816000875af1158015610847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086b9190611c84565b6108d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f216d6f64756c65000000000000000000000000000000000000000000000000006044820152606401610442565b60006108dd85856111c7565b905060006108eb86866111d7565b905060006108f987876111ae565b90508073ffffffffffffffffffffffffffffffffffffffff166356d5d47584846109238b8b6111f0565b6040518563ffffffff1660e01b81526004016109429493929190611ca6565b600060405180830381600087803b15801561095c57600080fd5b505af1158015610970573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16828463ffffffff167f0d381c2a574ae8f04e213db7cfb4df8df712cdbd427d9868ffef380660ca657460405160405180910390a460405185907f1cae38cdd3d3919489272725a5ae62a4f48b2989b0dae843d3c279fee18073a990600090a25050600160655550505050505050565b610a02610dce565b610a0a61120c565b6040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b600080610a40610b3e565b6001610a4b60b85490565b610a559190611d05565b915091509091565b6000610a6b60655460021490565b905090565b60008173ffffffffffffffffffffffffffffffffffffffff1663de523cf36040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610af7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610af491810190611d29565b60015b15610b205773ffffffffffffffffffffffffffffffffffffffff811615610b1e5792915050565b505b505060975473ffffffffffffffffffffffffffffffffffffffff1690565b6000610a6b609861127f565b610b52610dce565b73ffffffffffffffffffffffffffffffffffffffff8116610bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610442565b610bfe816110e5565b50565b610c09610dce565b610bfe81610ff8565b6000610c2060655460021490565b15610c87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610442565b610800821115610cf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6d736720746f6f206c6f6e6700000000000000000000000000000000000000006044820152606401610442565b6000610d2e6000610d0360b85490565b7f0000000000000000000000000000000000000000000000000000000000000000338a8a8a8a611292565b80516020820120909150610d436098826112d0565b858763ffffffff163373ffffffffffffffffffffffffffffffffffffffff167f769f711d20c679153d382254f59892613b58a97cc876b249134ac25c80f9c81485604051610d919190611d46565b60405180910390a460405181907f788dbc1b7152732178210e7f4d9d010ef016f9eafbe66786bd7169f56e0c353a90600090a29695505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610442565b606554600214610ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f21706175736564000000000000000000000000000000000000000000000000006044820152606401610442565b6001606555565b600054610100900460ff16610ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610442565b600054610100900460ff16610ff0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610442565b61054561140f565b73ffffffffffffffffffffffffffffffffffffffff81163b611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f21636f6e747261637400000000000000000000000000000000000000000000006044820152606401610442565b609780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fa76ad0adbf45318f8633aa0210f711273d50fbb6fef76ed95bbae97082c75daa90600090a250565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061116b6001828486611db2565b61117491611ddc565b60f81c90505b92915050565b6000611190602d60298486611db2565b61119991611e22565b60e01c9392505050565b805160209091012090565b60006111c06111bd84846114af565b90565b9392505050565b6000611190600960058486611db2565b60006111e7602960098486611db2565b6111c091611e68565b36600061120083604d8187611db2565b915091505b9250929050565b606554600203611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610442565b6002606555565b600061117a8261128d6114bf565b611980565b606088888888888888886040516020016112b3989796959493929190611ea4565b604051602081830303815290604052905098975050505050505050565b60016112de6020600261205a565b6112e89190612066565b826020015410611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6d65726b6c6520747265652066756c6c000000000000000000000000000000006044820152606401610442565b60018260200160008282546113699190612079565b9091555050602082015460005b602081101561140657816001166001036113a5578284826020811061139d5761139d61208c565b015550505050565b8381602081106113b7576113b761208c565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092506002826113f291906120bb565b9150806113fe816120f6565b915050611376565b5061052e61212e565b600054610100900460ff166114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610442565b610545336110e5565b60006111e7604d602d8486611db2565b6114c7611a52565b600081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb560208201527fb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d3060408201527f21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba8560608201527fe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a1934460808201527f0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d60a08201527f887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a196860c08201527fffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f8360e08201527f9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af6101008201527fcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e06101208201527ff9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a56101408201527ff8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf8926101608201527f3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c6101808201527fc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb6101a08201527f5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc6101c08201527fda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d26101e08201527f2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f6102008201527fe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a6102208201527f5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a06102408201527fb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa06102608201527fc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e26102808201527ff4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd96102a08201527f5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e3776102c08201527f4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee6526102e08201527fcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef6103008201527f0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d6103208201527fb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d06103408201527f838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e6103608201527f662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e6103808201527f388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea3226103a08201527f93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d7356103c08201527f8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a96103e082015290565b6020820154600090815b6020811015611a4a57600182821c1660008683602081106119ad576119ad61208c565b01549050816001036119ea576040805160208101839052908101869052606001604051602081830303815290604052805190602001209450611a35565b848684602081106119fd576119fd61208c565b6020020151604051602001611a1c929190918252602082015260400190565b6040516020818303038152906040528051906020012094505b50508080611a42906120f6565b91505061198a565b505092915050565b6040518061040001604052806020906020820280368337509192915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bfe57600080fd5b60008060408385031215611aa657600080fd5b8235611ab181611a71565b91506020830135611ac181611a71565b809150509250929050565b60008083601f840112611ade57600080fd5b50813567ffffffffffffffff811115611af657600080fd5b60208301915083602082850101111561120557600080fd5b60008060008060408587031215611b2457600080fd5b843567ffffffffffffffff80821115611b3c57600080fd5b611b4888838901611acc565b90965094506020870135915080821115611b6157600080fd5b50611b6e87828801611acc565b95989497509550505050565b600060208284031215611b8c57600080fd5b5035919050565b600060208284031215611ba557600080fd5b81356111c081611a71565b60008060008060608587031215611bc657600080fd5b843563ffffffff81168114611bda57600080fd5b935060208501359250604085013567ffffffffffffffff811115611bfd57600080fd5b611b6e87828801611acc565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081526000611c66604083018688611c09565b8281036020840152611c79818587611c09565b979650505050505050565b600060208284031215611c9657600080fd5b815180151581146111c057600080fd5b63ffffffff85168152836020820152606060408201526000611ccc606083018486611c09565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff828116828216039080821115611d2257611d22611cd6565b5092915050565b600060208284031215611d3b57600080fd5b81516111c081611a71565b600060208083528351808285015260005b81811015611d7357858101830151858201604001528201611d57565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60008085851115611dc257600080fd5b83861115611dcf57600080fd5b5050820193919092039150565b7fff000000000000000000000000000000000000000000000000000000000000008135818116916001851015611a4a5760019490940360031b84901b1690921692915050565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015611a4a5760049490940360031b84901b1690921692915050565b8035602083101561117a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b7fff000000000000000000000000000000000000000000000000000000000000008960f81b16815260007fffffffff00000000000000000000000000000000000000000000000000000000808a60e01b166001840152808960e01b166005840152876009840152808760e01b1660298401525084602d8301528284604d8401375060009101604d01908152979650505050505050565b600181815b80851115611f9357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611f7957611f79611cd6565b80851615611f8657918102915b93841c9390800290611f3f565b509250929050565b600082611faa5750600161117a565b81611fb75750600061117a565b8160018114611fcd5760028114611fd757611ff3565b600191505061117a565b60ff841115611fe857611fe8611cd6565b50506001821b61117a565b5060208310610133831016604e8410600b8410161715612016575081810a61117a565b6120208383611f3a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561205257612052611cd6565b029392505050565b60006111c08383611f9b565b8181038181111561117a5761117a611cd6565b8082018082111561117a5761117a611cd6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826120f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361212757612127611cd6565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea2646970667358221220d6f190bbbc6dd5996396b02e3f879b34f377436d5eb95ba31ba46f98da84871764736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061016c5760003560e01c8063907c0f92116100cd578063f2fde38b11610081578063fa31de0111610066578063fa31de011461030e578063fd54b22814610321578063ffa1ad741461032b57600080fd5b8063f2fde38b146102e8578063f794687a146102fb57600080fd5b8063e495f1d4116100b2578063e495f1d4146102aa578063e70f48ac146102cd578063ebf0c717146102e057600080fd5b8063907c0f9214610270578063b187bd261461029257600080fd5b8063715018a6116101245780638456cb59116101095780638456cb59146102235780638d3638f41461022b5780638da5cb5b1461025257600080fd5b8063715018a6146102085780637c39d1301461021057600080fd5b8063485cc95511610155578063485cc95514610199578063522ae002146101ac5780636e5f516e146101c357600080fd5b806306661abd146101715780633f4ba83a1461018f575b600080fd5b60b8545b60405163ffffffff90911681526020015b60405180910390f35b610197610345565b005b6101976101a7366004611a93565b610380565b6101b561080081565b604051908152602001610186565b6097546101e39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610186565b610197610533565b61019761021e366004611b0e565b610547565b6101976109fa565b6101757f000000000000000000000000000000000000000000000000000000000000000081565b60335473ffffffffffffffffffffffffffffffffffffffff166101e3565b610278610a35565b6040805192835263ffffffff909116602083015201610186565b61029a610a5d565b6040519015158152602001610186565b61029a6102b8366004611b7a565b60b96020526000908152604090205460ff1681565b6101e36102db366004611b93565b610a70565b6101b5610b3e565b6101976102f6366004611b93565b610b4a565b610197610309366004611b93565b610c01565b6101b561031c366004611bb0565b610c12565b60b8546101b59081565b610333600081565b60405160ff9091168152602001610186565b61034d610dce565b610355610e4f565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600054610100900460ff16158080156103a05750600054600160ff909116105b806103ba5750303b1580156103ba575060005460ff166001145b61044b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156104a957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6104b1610ec2565b6104b9610f59565b6104c283610b4a565b6104cb82610ff8565b801561052e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b61053b610dce565b61054560006110e5565b565b6001606554146105b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f7265656e7472616e742063616c6c20286f7220706175736564290000000000006044820152606401610442565b600060658190556105c4838361115c565b60ff161461062e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f2176657273696f6e0000000000000000000000000000000000000000000000006044820152606401610442565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff1661065f8383611180565b63ffffffff16146106cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f2164657374696e6174696f6e00000000000000000000000000000000000000006044820152606401610442565b600061070d83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506111a392505050565b600081815260b9602052604090205490915060ff1615610789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f64656c69766572656400000000000000000000000000000000000000000000006044820152606401610442565b600081815260b96020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556107cd6102db85856111ae565b6040517ff7e83aee00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063f7e83aee90610828908990899089908990600401611c52565b6020604051808303816000875af1158015610847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086b9190611c84565b6108d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f216d6f64756c65000000000000000000000000000000000000000000000000006044820152606401610442565b60006108dd85856111c7565b905060006108eb86866111d7565b905060006108f987876111ae565b90508073ffffffffffffffffffffffffffffffffffffffff166356d5d47584846109238b8b6111f0565b6040518563ffffffff1660e01b81526004016109429493929190611ca6565b600060405180830381600087803b15801561095c57600080fd5b505af1158015610970573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16828463ffffffff167f0d381c2a574ae8f04e213db7cfb4df8df712cdbd427d9868ffef380660ca657460405160405180910390a460405185907f1cae38cdd3d3919489272725a5ae62a4f48b2989b0dae843d3c279fee18073a990600090a25050600160655550505050505050565b610a02610dce565b610a0a61120c565b6040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b600080610a40610b3e565b6001610a4b60b85490565b610a559190611d05565b915091509091565b6000610a6b60655460021490565b905090565b60008173ffffffffffffffffffffffffffffffffffffffff1663de523cf36040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610af7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610af491810190611d29565b60015b15610b205773ffffffffffffffffffffffffffffffffffffffff811615610b1e5792915050565b505b505060975473ffffffffffffffffffffffffffffffffffffffff1690565b6000610a6b609861127f565b610b52610dce565b73ffffffffffffffffffffffffffffffffffffffff8116610bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610442565b610bfe816110e5565b50565b610c09610dce565b610bfe81610ff8565b6000610c2060655460021490565b15610c87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610442565b610800821115610cf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6d736720746f6f206c6f6e6700000000000000000000000000000000000000006044820152606401610442565b6000610d2e6000610d0360b85490565b7f0000000000000000000000000000000000000000000000000000000000000000338a8a8a8a611292565b80516020820120909150610d436098826112d0565b858763ffffffff163373ffffffffffffffffffffffffffffffffffffffff167f769f711d20c679153d382254f59892613b58a97cc876b249134ac25c80f9c81485604051610d919190611d46565b60405180910390a460405181907f788dbc1b7152732178210e7f4d9d010ef016f9eafbe66786bd7169f56e0c353a90600090a29695505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610442565b606554600214610ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f21706175736564000000000000000000000000000000000000000000000000006044820152606401610442565b6001606555565b600054610100900460ff16610ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610442565b600054610100900460ff16610ff0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610442565b61054561140f565b73ffffffffffffffffffffffffffffffffffffffff81163b611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f21636f6e747261637400000000000000000000000000000000000000000000006044820152606401610442565b609780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fa76ad0adbf45318f8633aa0210f711273d50fbb6fef76ed95bbae97082c75daa90600090a250565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061116b6001828486611db2565b61117491611ddc565b60f81c90505b92915050565b6000611190602d60298486611db2565b61119991611e22565b60e01c9392505050565b805160209091012090565b60006111c06111bd84846114af565b90565b9392505050565b6000611190600960058486611db2565b60006111e7602960098486611db2565b6111c091611e68565b36600061120083604d8187611db2565b915091505b9250929050565b606554600203611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610442565b6002606555565b600061117a8261128d6114bf565b611980565b606088888888888888886040516020016112b3989796959493929190611ea4565b604051602081830303815290604052905098975050505050505050565b60016112de6020600261205a565b6112e89190612066565b826020015410611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6d65726b6c6520747265652066756c6c000000000000000000000000000000006044820152606401610442565b60018260200160008282546113699190612079565b9091555050602082015460005b602081101561140657816001166001036113a5578284826020811061139d5761139d61208c565b015550505050565b8381602081106113b7576113b761208c565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092506002826113f291906120bb565b9150806113fe816120f6565b915050611376565b5061052e61212e565b600054610100900460ff166114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610442565b610545336110e5565b60006111e7604d602d8486611db2565b6114c7611a52565b600081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb560208201527fb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d3060408201527f21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba8560608201527fe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a1934460808201527f0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d60a08201527f887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a196860c08201527fffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f8360e08201527f9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af6101008201527fcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e06101208201527ff9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a56101408201527ff8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf8926101608201527f3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c6101808201527fc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb6101a08201527f5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc6101c08201527fda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d26101e08201527f2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f6102008201527fe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a6102208201527f5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a06102408201527fb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa06102608201527fc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e26102808201527ff4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd96102a08201527f5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e3776102c08201527f4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee6526102e08201527fcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef6103008201527f0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d6103208201527fb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d06103408201527f838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e6103608201527f662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e6103808201527f388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea3226103a08201527f93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d7356103c08201527f8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a96103e082015290565b6020820154600090815b6020811015611a4a57600182821c1660008683602081106119ad576119ad61208c565b01549050816001036119ea576040805160208101839052908101869052606001604051602081830303815290604052805190602001209450611a35565b848684602081106119fd576119fd61208c565b6020020151604051602001611a1c929190918252602082015260400190565b6040516020818303038152906040528051906020012094505b50508080611a42906120f6565b91505061198a565b505092915050565b6040518061040001604052806020906020820280368337509192915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bfe57600080fd5b60008060408385031215611aa657600080fd5b8235611ab181611a71565b91506020830135611ac181611a71565b809150509250929050565b60008083601f840112611ade57600080fd5b50813567ffffffffffffffff811115611af657600080fd5b60208301915083602082850101111561120557600080fd5b60008060008060408587031215611b2457600080fd5b843567ffffffffffffffff80821115611b3c57600080fd5b611b4888838901611acc565b90965094506020870135915080821115611b6157600080fd5b50611b6e87828801611acc565b95989497509550505050565b600060208284031215611b8c57600080fd5b5035919050565b600060208284031215611ba557600080fd5b81356111c081611a71565b60008060008060608587031215611bc657600080fd5b843563ffffffff81168114611bda57600080fd5b935060208501359250604085013567ffffffffffffffff811115611bfd57600080fd5b611b6e87828801611acc565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081526000611c66604083018688611c09565b8281036020840152611c79818587611c09565b979650505050505050565b600060208284031215611c9657600080fd5b815180151581146111c057600080fd5b63ffffffff85168152836020820152606060408201526000611ccc606083018486611c09565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff828116828216039080821115611d2257611d22611cd6565b5092915050565b600060208284031215611d3b57600080fd5b81516111c081611a71565b600060208083528351808285015260005b81811015611d7357858101830151858201604001528201611d57565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60008085851115611dc257600080fd5b83861115611dcf57600080fd5b5050820193919092039150565b7fff000000000000000000000000000000000000000000000000000000000000008135818116916001851015611a4a5760019490940360031b84901b1690921692915050565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015611a4a5760049490940360031b84901b1690921692915050565b8035602083101561117a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b7fff000000000000000000000000000000000000000000000000000000000000008960f81b16815260007fffffffff00000000000000000000000000000000000000000000000000000000808a60e01b166001840152808960e01b166005840152876009840152808760e01b1660298401525084602d8301528284604d8401375060009101604d01908152979650505050505050565b600181815b80851115611f9357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611f7957611f79611cd6565b80851615611f8657918102915b93841c9390800290611f3f565b509250929050565b600082611faa5750600161117a565b81611fb75750600061117a565b8160018114611fcd5760028114611fd757611ff3565b600191505061117a565b60ff841115611fe857611fe8611cd6565b50506001821b61117a565b5060208310610133831016604e8410600b8410161715612016575081810a61117a565b6120208383611f3a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561205257612052611cd6565b029392505050565b60006111c08383611f9b565b8181038181111561117a5761117a611cd6565b8082018082111561117a5761117a611cd6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000826120f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361212757612127611cd6565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea2646970667358221220d6f190bbbc6dd5996396b02e3f879b34f377436d5eb95ba31ba46f98da84871764736f6c63430008110033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/integration-test/abis/TestMultisigIsm.json b/integration-test/abis/TestMultisigIsm.json index bac925c5..34a74f8b 100644 --- a/integration-test/abis/TestMultisigIsm.json +++ b/integration-test/abis/TestMultisigIsm.json @@ -96,8 +96,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506000805460ff191660011790556103778061002d6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80634fc3aa7c116100505780634fc3aa7c146100af5780636465e69f146100f0578063f7e83aee1461010a57600080fd5b80632852b71c1461006c5780632e0ed2341461008e575b600080fd5b6000546100799060ff1681565b60405190151581526020015b60405180910390f35b6100a161009c3660046101d7565b610126565b604051610085929190610219565b6100ee6100bd36600461027d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b005b6100f8600481565b60405160ff9091168152602001610085565b6100796101183660046102a6565b60005460ff16949350505050565b60408051600180825281830190925260609160009182916020808301908036833701905050905060008160008151811061016257610162610312565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101529150600190505b9250929050565b60008083601f8401126101a757600080fd5b50813567ffffffffffffffff8111156101bf57600080fd5b60208301915083602082850101111561018e57600080fd5b600080602083850312156101ea57600080fd5b823567ffffffffffffffff81111561020157600080fd5b61020d85828601610195565b90969095509350505050565b604080825283519082018190526000906020906060840190828701845b8281101561026857815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101610236565b50505060ff9490941692019190915250919050565b60006020828403121561028f57600080fd5b8135801515811461029f57600080fd5b9392505050565b600080600080604085870312156102bc57600080fd5b843567ffffffffffffffff808211156102d457600080fd5b6102e088838901610195565b909650945060208701359150808211156102f957600080fd5b5061030687828801610195565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220d258f83fdc53fc8d3a60e50e37e6d4720ae9f373c977e98fc428991b63ce34c264736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80634fc3aa7c116100505780634fc3aa7c146100af5780636465e69f146100f0578063f7e83aee1461010a57600080fd5b80632852b71c1461006c5780632e0ed2341461008e575b600080fd5b6000546100799060ff1681565b60405190151581526020015b60405180910390f35b6100a161009c3660046101d7565b610126565b604051610085929190610219565b6100ee6100bd36600461027d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b005b6100f8600481565b60405160ff9091168152602001610085565b6100796101183660046102a6565b60005460ff16949350505050565b60408051600180825281830190925260609160009182916020808301908036833701905050905060008160008151811061016257610162610312565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101529150600190505b9250929050565b60008083601f8401126101a757600080fd5b50813567ffffffffffffffff8111156101bf57600080fd5b60208301915083602082850101111561018e57600080fd5b600080602083850312156101ea57600080fd5b823567ffffffffffffffff81111561020157600080fd5b61020d85828601610195565b90969095509350505050565b604080825283519082018190526000906020906060840190828701845b8281101561026857815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101610236565b50505060ff9490941692019190915250919050565b60006020828403121561028f57600080fd5b8135801515811461029f57600080fd5b9392505050565b600080600080604085870312156102bc57600080fd5b843567ffffffffffffffff808211156102d457600080fd5b6102e088838901610195565b909650945060208701359150808211156102f957600080fd5b5061030687828801610195565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220d258f83fdc53fc8d3a60e50e37e6d4720ae9f373c977e98fc428991b63ce34c264736f6c63430008110033", + "bytecode": "0x608060405234801561001057600080fd5b506000805460ff191660011790556103778061002d6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80634fc3aa7c116100505780634fc3aa7c146100af5780636465e69f146100f0578063f7e83aee1461010a57600080fd5b80632852b71c1461006c5780632e0ed2341461008e575b600080fd5b6000546100799060ff1681565b60405190151581526020015b60405180910390f35b6100a161009c3660046101d7565b610126565b604051610085929190610219565b6100ee6100bd36600461027d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b005b6100f8600481565b60405160ff9091168152602001610085565b6100796101183660046102a6565b60005460ff16949350505050565b60408051600180825281830190925260609160009182916020808301908036833701905050905060008160008151811061016257610162610312565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101529150600190505b9250929050565b60008083601f8401126101a757600080fd5b50813567ffffffffffffffff8111156101bf57600080fd5b60208301915083602082850101111561018e57600080fd5b600080602083850312156101ea57600080fd5b823567ffffffffffffffff81111561020157600080fd5b61020d85828601610195565b90969095509350505050565b604080825283519082018190526000906020906060840190828701845b8281101561026857815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101610236565b50505060ff9490941692019190915250919050565b60006020828403121561028f57600080fd5b8135801515811461029f57600080fd5b9392505050565b600080600080604085870312156102bc57600080fd5b843567ffffffffffffffff808211156102d457600080fd5b6102e088838901610195565b909650945060208701359150808211156102f957600080fd5b5061030687828801610195565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122017c3918e1ebea8ac9a9de746c40c8b031b8fef948d0933d04030e580d6ee3bfa64736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80634fc3aa7c116100505780634fc3aa7c146100af5780636465e69f146100f0578063f7e83aee1461010a57600080fd5b80632852b71c1461006c5780632e0ed2341461008e575b600080fd5b6000546100799060ff1681565b60405190151581526020015b60405180910390f35b6100a161009c3660046101d7565b610126565b604051610085929190610219565b6100ee6100bd36600461027d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b005b6100f8600481565b60405160ff9091168152602001610085565b6100796101183660046102a6565b60005460ff16949350505050565b60408051600180825281830190925260609160009182916020808301908036833701905050905060008160008151811061016257610162610312565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101529150600190505b9250929050565b60008083601f8401126101a757600080fd5b50813567ffffffffffffffff8111156101bf57600080fd5b60208301915083602082850101111561018e57600080fd5b600080602083850312156101ea57600080fd5b823567ffffffffffffffff81111561020157600080fd5b61020d85828601610195565b90969095509350505050565b604080825283519082018190526000906020906060840190828701845b8281101561026857815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101610236565b50505060ff9490941692019190915250919050565b60006020828403121561028f57600080fd5b8135801515811461029f57600080fd5b9392505050565b600080600080604085870312156102bc57600080fd5b843567ffffffffffffffff808211156102d457600080fd5b6102e088838901610195565b909650945060208701359150808211156102f957600080fd5b5061030687828801610195565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122017c3918e1ebea8ac9a9de746c40c8b031b8fef948d0933d04030e580d6ee3bfa64736f6c63430008110033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/integration-test/abis/TestRecipient.json b/integration-test/abis/TestRecipient.json index 82af9a07..07831e2c 100644 --- a/integration-test/abis/TestRecipient.json +++ b/integration-test/abis/TestRecipient.json @@ -225,8 +225,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6109d38061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100c85760003560e01c8063715018a611610081578063de523cf31161005b578063de523cf31461019d578063f07c1f47146101bd578063f2fde38b146101d057600080fd5b8063715018a61461016f5780638da5cb5b14610177578063a4982fde1461019557600080fd5b80632113522a116100b25780632113522a14610100578063256fec881461014557806356d5d4751461015c57600080fd5b80626e75ec146100cd5780630e72cc06146100eb575b600080fd5b6100d56101e3565b6040516100e291906105e0565b60405180910390f35b6100fe6100f93660046105fa565b610271565b005b6004546101209073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e2565b61014e60025481565b6040519081526020016100e2565b6100fe61016a366004610679565b6102c0565b6100fe61031a565b60005473ffffffffffffffffffffffffffffffffffffffff16610120565b6100d561032e565b6001546101209073ffffffffffffffffffffffffffffffffffffffff1681565b6100fe6101cb3660046106de565b61033b565b6100fe6101de3660046105fa565b6103ca565b600380546101f09061072a565b80601f016020809104026020016040519081016040528092919081815260200182805461021c9061072a565b80156102695780601f1061023e57610100808354040283529160200191610269565b820191906000526020600020905b81548152906001019060200180831161024c57829003601f168201915b505050505081565b610279610486565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b828463ffffffff167fba67744c899113a84f615d51af5d82f5fedcf26c9a474d9363c3ad9b0bd501ac84846040516102f99291906107c6565b60405180910390a360028390556003610313828483610860565b5050505050565b610322610486565b61032c6000610507565b565b600580546101f09061072a565b3373ffffffffffffffffffffffffffffffffffffffff167f97d8367a1f39eb9e97f262fafbb05925c0bcfe120aaad7b9737cae34f749c2068484846040516103859392919061097a565b60405180910390a2600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905560056103c4828483610860565b50505050565b6103d2610486565b73ffffffffffffffffffffffffffffffffffffffff811661047a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048381610507565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461032c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610471565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000815180845260005b818110156105a257602081850181015186830182015201610586565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006105f3602083018461057c565b9392505050565b60006020828403121561060c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146105f357600080fd5b60008083601f84011261064257600080fd5b50813567ffffffffffffffff81111561065a57600080fd5b60208301915083602082850101111561067257600080fd5b9250929050565b6000806000806060858703121561068f57600080fd5b843563ffffffff811681146106a357600080fd5b935060208501359250604085013567ffffffffffffffff8111156106c657600080fd5b6106d287828801610630565b95989497509550505050565b6000806000604084860312156106f357600080fd5b83359250602084013567ffffffffffffffff81111561071157600080fd5b61071d86828701610630565b9497909650939450505050565b600181811c9082168061073e57607f821691505b602082108103610777577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6020815260006107da60208301848661077d565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f82111561085b57600081815260208120601f850160051c810160208610156108385750805b601f850160051c820191505b8181101561085757828155600101610844565b5050505b505050565b67ffffffffffffffff831115610878576108786107e2565b61088c83610886835461072a565b83610811565b6000601f8411600181146108de57600085156108a85750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610313565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561092d578685013582556020948501946001909201910161090d565b5086821015610968577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b83815260406020820152600061099460408301848661077d565b9594505050505056fea2646970667358221220971699292bb904f6085b8dacb8dcd72f2d777c6c4660bfd65c63ccfcba74b5f764736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c85760003560e01c8063715018a611610081578063de523cf31161005b578063de523cf31461019d578063f07c1f47146101bd578063f2fde38b146101d057600080fd5b8063715018a61461016f5780638da5cb5b14610177578063a4982fde1461019557600080fd5b80632113522a116100b25780632113522a14610100578063256fec881461014557806356d5d4751461015c57600080fd5b80626e75ec146100cd5780630e72cc06146100eb575b600080fd5b6100d56101e3565b6040516100e291906105e0565b60405180910390f35b6100fe6100f93660046105fa565b610271565b005b6004546101209073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e2565b61014e60025481565b6040519081526020016100e2565b6100fe61016a366004610679565b6102c0565b6100fe61031a565b60005473ffffffffffffffffffffffffffffffffffffffff16610120565b6100d561032e565b6001546101209073ffffffffffffffffffffffffffffffffffffffff1681565b6100fe6101cb3660046106de565b61033b565b6100fe6101de3660046105fa565b6103ca565b600380546101f09061072a565b80601f016020809104026020016040519081016040528092919081815260200182805461021c9061072a565b80156102695780601f1061023e57610100808354040283529160200191610269565b820191906000526020600020905b81548152906001019060200180831161024c57829003601f168201915b505050505081565b610279610486565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b828463ffffffff167fba67744c899113a84f615d51af5d82f5fedcf26c9a474d9363c3ad9b0bd501ac84846040516102f99291906107c6565b60405180910390a360028390556003610313828483610860565b5050505050565b610322610486565b61032c6000610507565b565b600580546101f09061072a565b3373ffffffffffffffffffffffffffffffffffffffff167f97d8367a1f39eb9e97f262fafbb05925c0bcfe120aaad7b9737cae34f749c2068484846040516103859392919061097a565b60405180910390a2600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905560056103c4828483610860565b50505050565b6103d2610486565b73ffffffffffffffffffffffffffffffffffffffff811661047a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048381610507565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461032c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610471565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000815180845260005b818110156105a257602081850181015186830182015201610586565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006105f3602083018461057c565b9392505050565b60006020828403121561060c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146105f357600080fd5b60008083601f84011261064257600080fd5b50813567ffffffffffffffff81111561065a57600080fd5b60208301915083602082850101111561067257600080fd5b9250929050565b6000806000806060858703121561068f57600080fd5b843563ffffffff811681146106a357600080fd5b935060208501359250604085013567ffffffffffffffff8111156106c657600080fd5b6106d287828801610630565b95989497509550505050565b6000806000604084860312156106f357600080fd5b83359250602084013567ffffffffffffffff81111561071157600080fd5b61071d86828701610630565b9497909650939450505050565b600181811c9082168061073e57607f821691505b602082108103610777577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6020815260006107da60208301848661077d565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f82111561085b57600081815260208120601f850160051c810160208610156108385750805b601f850160051c820191505b8181101561085757828155600101610844565b5050505b505050565b67ffffffffffffffff831115610878576108786107e2565b61088c83610886835461072a565b83610811565b6000601f8411600181146108de57600085156108a85750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610313565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561092d578685013582556020948501946001909201910161090d565b5086821015610968577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b83815260406020820152600061099460408301848661077d565b9594505050505056fea2646970667358221220971699292bb904f6085b8dacb8dcd72f2d777c6c4660bfd65c63ccfcba74b5f764736f6c63430008110033", + "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6109d38061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100c85760003560e01c8063715018a611610081578063de523cf31161005b578063de523cf31461019d578063f07c1f47146101bd578063f2fde38b146101d057600080fd5b8063715018a61461016f5780638da5cb5b14610177578063a4982fde1461019557600080fd5b80632113522a116100b25780632113522a14610100578063256fec881461014557806356d5d4751461015c57600080fd5b80626e75ec146100cd5780630e72cc06146100eb575b600080fd5b6100d56101e3565b6040516100e291906105e0565b60405180910390f35b6100fe6100f93660046105fa565b610271565b005b6004546101209073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e2565b61014e60025481565b6040519081526020016100e2565b6100fe61016a366004610679565b6102c0565b6100fe61031a565b60005473ffffffffffffffffffffffffffffffffffffffff16610120565b6100d561032e565b6001546101209073ffffffffffffffffffffffffffffffffffffffff1681565b6100fe6101cb3660046106de565b61033b565b6100fe6101de3660046105fa565b6103ca565b600380546101f09061072a565b80601f016020809104026020016040519081016040528092919081815260200182805461021c9061072a565b80156102695780601f1061023e57610100808354040283529160200191610269565b820191906000526020600020905b81548152906001019060200180831161024c57829003601f168201915b505050505081565b610279610486565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b828463ffffffff167fba67744c899113a84f615d51af5d82f5fedcf26c9a474d9363c3ad9b0bd501ac84846040516102f99291906107c6565b60405180910390a360028390556003610313828483610860565b5050505050565b610322610486565b61032c6000610507565b565b600580546101f09061072a565b3373ffffffffffffffffffffffffffffffffffffffff167f97d8367a1f39eb9e97f262fafbb05925c0bcfe120aaad7b9737cae34f749c2068484846040516103859392919061097a565b60405180910390a2600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905560056103c4828483610860565b50505050565b6103d2610486565b73ffffffffffffffffffffffffffffffffffffffff811661047a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048381610507565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461032c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610471565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000815180845260005b818110156105a257602081850181015186830182015201610586565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006105f3602083018461057c565b9392505050565b60006020828403121561060c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146105f357600080fd5b60008083601f84011261064257600080fd5b50813567ffffffffffffffff81111561065a57600080fd5b60208301915083602082850101111561067257600080fd5b9250929050565b6000806000806060858703121561068f57600080fd5b843563ffffffff811681146106a357600080fd5b935060208501359250604085013567ffffffffffffffff8111156106c657600080fd5b6106d287828801610630565b95989497509550505050565b6000806000604084860312156106f357600080fd5b83359250602084013567ffffffffffffffff81111561071157600080fd5b61071d86828701610630565b9497909650939450505050565b600181811c9082168061073e57607f821691505b602082108103610777577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6020815260006107da60208301848661077d565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f82111561085b57600081815260208120601f850160051c810160208610156108385750805b601f850160051c820191505b8181101561085757828155600101610844565b5050505b505050565b67ffffffffffffffff831115610878576108786107e2565b61088c83610886835461072a565b83610811565b6000601f8411600181146108de57600085156108a85750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610313565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561092d578685013582556020948501946001909201910161090d565b5086821015610968577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b83815260406020820152600061099460408301848661077d565b9594505050505056fea26469706673582212205d3d83431969180ff80771b45e9b5540042b30ba13ab0219d5790e9d60e8bfec64736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c85760003560e01c8063715018a611610081578063de523cf31161005b578063de523cf31461019d578063f07c1f47146101bd578063f2fde38b146101d057600080fd5b8063715018a61461016f5780638da5cb5b14610177578063a4982fde1461019557600080fd5b80632113522a116100b25780632113522a14610100578063256fec881461014557806356d5d4751461015c57600080fd5b80626e75ec146100cd5780630e72cc06146100eb575b600080fd5b6100d56101e3565b6040516100e291906105e0565b60405180910390f35b6100fe6100f93660046105fa565b610271565b005b6004546101209073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e2565b61014e60025481565b6040519081526020016100e2565b6100fe61016a366004610679565b6102c0565b6100fe61031a565b60005473ffffffffffffffffffffffffffffffffffffffff16610120565b6100d561032e565b6001546101209073ffffffffffffffffffffffffffffffffffffffff1681565b6100fe6101cb3660046106de565b61033b565b6100fe6101de3660046105fa565b6103ca565b600380546101f09061072a565b80601f016020809104026020016040519081016040528092919081815260200182805461021c9061072a565b80156102695780601f1061023e57610100808354040283529160200191610269565b820191906000526020600020905b81548152906001019060200180831161024c57829003601f168201915b505050505081565b610279610486565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b828463ffffffff167fba67744c899113a84f615d51af5d82f5fedcf26c9a474d9363c3ad9b0bd501ac84846040516102f99291906107c6565b60405180910390a360028390556003610313828483610860565b5050505050565b610322610486565b61032c6000610507565b565b600580546101f09061072a565b3373ffffffffffffffffffffffffffffffffffffffff167f97d8367a1f39eb9e97f262fafbb05925c0bcfe120aaad7b9737cae34f749c2068484846040516103859392919061097a565b60405180910390a2600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905560056103c4828483610860565b50505050565b6103d2610486565b73ffffffffffffffffffffffffffffffffffffffff811661047a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048381610507565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461032c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610471565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000815180845260005b818110156105a257602081850181015186830182015201610586565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006105f3602083018461057c565b9392505050565b60006020828403121561060c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146105f357600080fd5b60008083601f84011261064257600080fd5b50813567ffffffffffffffff81111561065a57600080fd5b60208301915083602082850101111561067257600080fd5b9250929050565b6000806000806060858703121561068f57600080fd5b843563ffffffff811681146106a357600080fd5b935060208501359250604085013567ffffffffffffffff8111156106c657600080fd5b6106d287828801610630565b95989497509550505050565b6000806000604084860312156106f357600080fd5b83359250602084013567ffffffffffffffff81111561071157600080fd5b61071d86828701610630565b9497909650939450505050565b600181811c9082168061073e57607f821691505b602082108103610777577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6020815260006107da60208301848661077d565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f82111561085b57600081815260208120601f850160051c810160208610156108385750805b601f850160051c820191505b8181101561085757828155600101610844565b5050505b505050565b67ffffffffffffffff831115610878576108786107e2565b61088c83610886835461072a565b83610811565b6000601f8411600181146108de57600085156108a85750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610313565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561092d578685013582556020948501946001909201910161090d565b5086821015610968577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b83815260406020820152600061099460408301848661077d565b9594505050505056fea26469706673582212205d3d83431969180ff80771b45e9b5540042b30ba13ab0219d5790e9d60e8bfec64736f6c63430008110033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/integration-test/build.rs b/integration-test/build.rs index 0affa0ff..f91e73e8 100644 --- a/integration-test/build.rs +++ b/integration-test/build.rs @@ -17,9 +17,14 @@ fn generate_bind(name: &str, abi_file: &str, bind_out: PathBuf) { fn main() { let abi_base = current_dir().unwrap().join("abis"); - let bind_base = current_dir().unwrap().join("tests").join("contracts"); + let bind_base = current_dir() + .unwrap() + .join("tests") + .join("contracts/eth/bind"); let deployments = [ ("Mailbox", "mailbox"), + ("FastHypERC20", "fast_hyp_erc20"), + ("FastHypERC20Collateral", "fast_hyp_erc20_collateral"), ("TestMultisigIsm", "test_mock_ism"), ("TestRecipient", "test_mock_msg_receiver"), ]; diff --git a/integration-test/tests/contracts/cw/deploy.rs b/integration-test/tests/contracts/cw/deploy.rs new file mode 100644 index 00000000..64d19f98 --- /dev/null +++ b/integration-test/tests/contracts/cw/deploy.rs @@ -0,0 +1,92 @@ +use cosmwasm_std::Empty; +use test_tube::{Account, Runner, SigningAccount, Wasm}; + +use super::{ + types::{Codes, CoreDeployments}, + Hook, Ism, +}; + +pub fn deploy_core<'a, R: Runner<'a>>( + wasm: &Wasm<'a, R>, + deployer: &SigningAccount, + codes: &Codes, + origin_domain: u32, + test_ism: Ism, + test_hook: Hook, +) -> eyre::Result { + // deploy hub + let hub = wasm + .instantiate( + codes.hub, + &hpl_interface::hub::InstantiateMsg { + origin_domain, + mailbox_code: codes.mailbox, + }, + Some(deployer.address().as_str()), + Some("cw-hpl-hub"), + &[], + deployer, + )? + .data + .address; + + // deploy mailbox through hub + let mailbox_deploy_res = wasm.execute( + &hub, + &hpl_interface::hub::ExecuteMsg::Instantiate { + owner: deployer.address(), + default_ism: deployer.address(), // temporary + default_hook: deployer.address(), // temporary + }, + &[], + deployer, + )?; + + let mailbox_deploy_evt = mailbox_deploy_res + .events + .into_iter() + .find(|v| v.ty == "wasm-mailbox_instantiated") + .unwrap(); + + let mailbox = mailbox_deploy_evt.attributes.get(0).unwrap().value.clone(); + + // set default ism, hook + let ism = test_ism.deploy(wasm, codes, deployer)?; + let hook = test_hook.deploy(wasm, codes, mailbox.clone(), deployer)?; + + wasm.execute( + &mailbox, + &hpl_interface::mailbox::ExecuteMsg::SetDefaultISM { ism: ism.clone() }, + &[], + deployer, + )?; + + wasm.execute( + &mailbox, + &hpl_interface::mailbox::ExecuteMsg::SetDefaultHook { hook: hook.clone() }, + &[], + deployer, + )?; + + // deploy test message receiver + let msg_receiver = wasm + .instantiate( + codes.test_mock_msg_receiver, + &Empty {}, + None, + None, + &[], + deployer, + ) + .unwrap() + .data + .address; + + Ok(CoreDeployments { + hub, + ism, + hook, + mailbox, + msg_receiver, + }) +} diff --git a/integration-test/tests/contracts/cw/hook.rs b/integration-test/tests/contracts/cw/hook.rs new file mode 100644 index 00000000..4f723215 --- /dev/null +++ b/integration-test/tests/contracts/cw/hook.rs @@ -0,0 +1,132 @@ +use cosmwasm_schema::cw_serde; +use cosmwasm_std::{Addr, Empty, Uint256}; +use hpl_interface::hook::HookConfig; +use osmosis_test_tube::Wasm; +use test_tube::{Account, Runner, SigningAccount}; + +use super::types::Codes; + +pub enum Hook { + Mock { + gas: Uint256, + }, + + Routing { + owner: String, + routes: Vec<(u32, Self)>, + }, +} + +impl Hook { + pub fn mock(gas: Uint256) -> Self { + Self::Mock { gas } + } + + pub fn routing(owner: String, routes: Vec<(u32, Self)>) -> Self { + Self::Routing { owner, routes } + } +} + +impl Hook { + fn deploy_mock<'a, R: Runner<'a>>( + wasm: &Wasm<'a, R>, + codes: &Codes, + gas: Uint256, + deployer: &SigningAccount, + ) -> eyre::Result { + let hook = wasm + .instantiate( + codes.test_mock_hook, + &Empty {}, + Some(deployer.address().as_str()), + Some("cw-hpl-test-mock-hook"), + &[], + deployer, + )? + .data + .address; + + #[cw_serde] + pub enum TestHookExecuteMsg { + SetGasAmount { gas: Uint256 }, + } + + wasm.execute( + &hook, + &TestHookExecuteMsg::SetGasAmount { gas }, + &[], + deployer, + )?; + + Ok(hook) + } + + fn deploy_routing<'a, R: Runner<'a>>( + wasm: &Wasm<'a, R>, + codes: &Codes, + owner: String, + mailbox: String, + routes: Vec<(u32, Self)>, + deployer: &SigningAccount, + ) -> eyre::Result { + use hpl_interface::domain_routing_hook::*; + + let hook = wasm + .instantiate( + codes.domain_routing_hook, + &InstantiateMsg { + owner, + mailbox: mailbox.clone(), + }, + Some(deployer.address().as_str()), + Some("cw-hpl-domain-routing-hook"), + &[], + deployer, + )? + .data + .address; + + let routes = routes + .into_iter() + .map(|(domain, hook)| { + Ok(HookConfig { + destination: domain, + hook: Addr::unchecked(hook.deploy(wasm, codes, mailbox.clone(), deployer)?), + }) + }) + .collect::>()?; + + wasm.execute( + &hook, + &ExecuteMsg::SetHooks { hooks: routes }, + &[], + deployer, + )?; + + Ok(hook) + } + + pub fn deploy<'a, R: Runner<'a>>( + self, + wasm: &Wasm<'a, R>, + codes: &Codes, + mailbox: String, + deployer: &SigningAccount, + ) -> eyre::Result { + match self { + Hook::Mock { gas } => Self::deploy_mock(wasm, codes, gas, deployer), + Hook::Routing { owner, routes } => { + Self::deploy_routing(wasm, codes, owner, mailbox, routes, deployer) + } + } + } +} + +pub fn prepare_routing_hook(owner: String, routes: Vec<(u32, u128)>) -> Hook { + let routes = routes + .into_iter() + .map(|(domain, gas)| (domain, Hook::mock(gas.into()))) + .collect(); + + Hook::routing(owner, routes) +} diff --git a/integration-test/tests/contracts/cw/ism.rs b/integration-test/tests/contracts/cw/ism.rs new file mode 100644 index 00000000..c15dd410 --- /dev/null +++ b/integration-test/tests/contracts/cw/ism.rs @@ -0,0 +1,151 @@ +use cosmwasm_std::Empty; +use hpl_interface::ism::multisig::ThresholdSet; +use osmosis_test_tube::Wasm; +use test_tube::{Account, Runner, SigningAccount}; + +use crate::validator::{self, TestValidators}; + +use super::types::Codes; + +#[derive(Clone)] +pub enum Ism { + Routing(Vec<(u32, Self)>), + + Multisig { + hrp: String, + validators: validator::TestValidators, + }, + + #[allow(dead_code)] + Mock, +} + +impl Ism { + pub fn routing(isms: Vec<(u32, Self)>) -> Self { + Self::Routing(isms) + } + + pub fn multisig(hrp: &str, validators: validator::TestValidators) -> Self { + Self::Multisig { + hrp: hrp.to_string(), + validators, + } + } +} + +impl Ism { + fn deploy_mock<'a, R: Runner<'a>>( + wasm: &Wasm<'a, R>, + codes: &Codes, + deployer: &SigningAccount, + ) -> eyre::Result { + Ok(wasm + .instantiate(codes.test_mock_ism, &Empty {}, None, None, &[], deployer)? + .data + .address) + } + + fn deploy_multisig<'a, R: Runner<'a>>( + wasm: &Wasm<'a, R>, + codes: &Codes, + hrp: String, + set: validator::TestValidators, + deployer: &SigningAccount, + ) -> eyre::Result { + let multisig_ism = wasm + .instantiate( + codes.ism_multisig, + &hpl_interface::ism::multisig::InstantiateMsg { + owner: deployer.address(), + addr_prefix: hrp.to_string(), + }, + None, + None, + &[], + deployer, + )? + .data + .address; + + wasm.execute( + &multisig_ism, + &hpl_interface::ism::multisig::ExecuteMsg::EnrollValidators { + set: set.to_set(&hrp), + }, + &[], + deployer, + )?; + + wasm.execute( + &multisig_ism, + &hpl_interface::ism::multisig::ExecuteMsg::SetThreshold { + set: ThresholdSet { + domain: set.domain, + threshold: set.threshold, + }, + }, + &[], + deployer, + )?; + + Ok(multisig_ism) + } + + fn deploy_routing<'a, R: Runner<'a>>( + wasm: &Wasm<'a, R>, + codes: &Codes, + isms: Vec<(u32, Self)>, + deployer: &SigningAccount, + ) -> eyre::Result { + let routing_ism = wasm + .instantiate( + codes.ism_routing, + &hpl_interface::ism::routing::InstantiateMsg { + owner: deployer.address(), + isms: isms + .into_iter() + .map(|(domain, ism)| { + Ok(hpl_interface::ism::routing::ISMSet { + domain, + address: ism.deploy(wasm, codes, deployer)?, + }) + }) + .collect::>>()?, + }, + None, + None, + &[], + deployer, + )? + .data + .address; + + Ok(routing_ism) + } + + pub fn deploy<'a, R: Runner<'a>>( + self, + wasm: &Wasm<'a, R>, + codes: &Codes, + deployer: &SigningAccount, + ) -> eyre::Result { + match self { + Self::Mock => Self::deploy_mock(wasm, codes, deployer), + Self::Multisig { + hrp, + validators: set, + } => Self::deploy_multisig(wasm, codes, hrp, set, deployer), + Self::Routing(isms) => Self::deploy_routing(wasm, codes, isms, deployer), + } + } +} + +pub fn prepare_routing_ism(info: Vec<(u32, &str, TestValidators)>) -> Ism { + let mut isms = vec![]; + + for (domain, hrp, set) in info { + isms.push((domain, Ism::multisig(hrp, set))); + } + + Ism::routing(isms) +} diff --git a/integration-test/tests/contracts/cw/mod.rs b/integration-test/tests/contracts/cw/mod.rs new file mode 100644 index 00000000..1b06afc3 --- /dev/null +++ b/integration-test/tests/contracts/cw/mod.rs @@ -0,0 +1,12 @@ +mod deploy; +mod hook; +mod ism; +mod setup; +mod store; +mod types; + +pub use deploy::deploy_core; +pub use hook::{prepare_routing_hook, Hook}; +pub use ism::{prepare_routing_ism, Ism}; +pub use setup::setup_env; +pub use store::store_code; diff --git a/integration-test/tests/contracts/cw/setup.rs b/integration-test/tests/contracts/cw/setup.rs new file mode 100644 index 00000000..e64e171f --- /dev/null +++ b/integration-test/tests/contracts/cw/setup.rs @@ -0,0 +1,78 @@ +use std::{collections::BTreeMap, path::PathBuf}; + +use cosmwasm_std::{coin, Coin}; +use test_tube::{Account, Module, Runner, SigningAccount, Wasm}; + +use crate::validator::TestValidators; + +use super::{ + deploy_core, prepare_routing_hook, prepare_routing_ism, store_code, types::CoreDeployments, +}; + +const DEFAULT_GAS: u128 = 300_000; + +pub struct Env<'a, R: Runner<'a>> { + validators: BTreeMap, + + pub app: &'a R, + pub core: CoreDeployments, + pub domain: u32, + + acc_gen: Box SigningAccount>, + pub acc_owner: SigningAccount, + pub acc_tester: SigningAccount, + pub acc_deployer: SigningAccount, +} + +impl<'a, R: Runner<'a>> Env<'a, R> { + pub fn get_validator_set(&self, domain: u32) -> eyre::Result<&TestValidators> { + self.validators + .get(&domain) + .ok_or(eyre::eyre!("no validator set found")) + } + + pub fn gen_account(&'a self, coins: &'a [Coin]) -> SigningAccount { + (self.acc_gen)(self.app, coins) + } +} + +pub fn setup_env<'a, R: Runner<'a>>( + app: &'a R, + acc_gen: impl Fn(&R, &[Coin]) -> SigningAccount + 'static, + artifacts: Option>, + hrp: &str, + domain: u32, + validators: &[TestValidators], +) -> eyre::Result> { + let owner = acc_gen(app, &[coin(1_000_000u128.pow(3), "uosmo")]); + let deployer = acc_gen(app, &[coin(1_000_000u128.pow(3), "uosmo")]); + let tester = acc_gen(app, &[coin(1_000_000u128.pow(3), "uosmo")]); + + let ism = prepare_routing_ism( + validators + .iter() + .map(|v| (v.domain, hrp, v.clone())) + .collect(), + ); + let hook = prepare_routing_hook( + deployer.address(), + validators.iter().map(|v| (v.domain, DEFAULT_GAS)).collect(), + ); + + let wasm = Wasm::new(app); + let codes = store_code(&wasm, &deployer, artifacts)?; + let core = deploy_core(&wasm, &deployer, &codes, domain, ism, hook)?; + + Ok(Env { + validators: validators.iter().map(|v| (v.domain, v.clone())).collect(), + + app, + core, + domain, + + acc_gen: Box::new(acc_gen), + acc_owner: owner, + acc_tester: tester, + acc_deployer: deployer, + }) +} diff --git a/integration-test/tests/contracts/cw/store.rs b/integration-test/tests/contracts/cw/store.rs new file mode 100644 index 00000000..3831374b --- /dev/null +++ b/integration-test/tests/contracts/cw/store.rs @@ -0,0 +1,51 @@ +use std::path::PathBuf; + +use osmosis_test_tube::Wasm; +use test_tube::{Runner, SigningAccount}; + +use super::types::{Codes, CodesMap}; + +const DEFAULT_ARTIFACTS_PATH: &str = "../target/wasm32-unknown-unknown/release/"; + +const CONTRACTS: [&str; 15] = [ + "default_hook", + "domain_routing_hook", + "hub", + "igp_core", + "igp_gas_oracle", + "ism_multisig", + "ism_routing", + "mailbox", + "test_mock_hook", + "test_mock_ism", + "test_mock_msg_receiver", + "multicall", + "token_cw20", + "token_native", + "validator_announce", +]; + +pub fn store_code<'a, R: Runner<'a>>( + wasm: &Wasm<'a, R>, + deployer: &SigningAccount, + artifacts: Option>, +) -> eyre::Result { + let base_path: PathBuf = artifacts + .map(|v| v.into()) + .unwrap_or(DEFAULT_ARTIFACTS_PATH.into()); + + let artifacts = CONTRACTS + .into_iter() + .map(|name| { + let filename = format!("hpl_{name}.wasm"); + let path = base_path.join(filename); + let code = std::fs::read(path)?; + let store_resp = wasm.store_code(&code, None, deployer)?; + let code_id = store_resp.data.code_id; + + Ok((name.to_string(), code_id)) + }) + .collect::>()?; + + artifacts.try_into() +} diff --git a/integration-test/tests/contracts/cw/types.rs b/integration-test/tests/contracts/cw/types.rs new file mode 100644 index 00000000..b2f307aa --- /dev/null +++ b/integration-test/tests/contracts/cw/types.rs @@ -0,0 +1,53 @@ +use std::collections::BTreeMap; + +use cosmwasm_schema::cw_serde; + +#[cw_serde] +pub struct CodesMap(pub BTreeMap); + +impl FromIterator<(String, u64)> for CodesMap { + fn from_iter>(iter: T) -> Self { + Self(iter.into_iter().collect()) + } +} + +#[cw_serde] +pub struct Codes { + pub default_hook: u64, + pub domain_routing_hook: u64, + pub hub: u64, + pub igp_core: u64, + pub igp_gas_oracle: u64, + pub ism_multisig: u64, + pub ism_routing: u64, + pub mailbox: u64, + pub test_mock_hook: u64, + pub test_mock_ism: u64, + pub test_mock_msg_receiver: u64, + pub multicall: u64, + pub token_cw20: u64, + pub token_native: u64, + #[serde(rename = "validator_announce")] + pub va: u64, +} + +impl TryFrom for Codes { + type Error = eyre::Error; + + fn try_from(v: CodesMap) -> Result { + let bin = serde_json::to_vec(&v)?; + + let ret = serde_json::from_slice(&bin)?; + + Ok(ret) + } +} + +#[cw_serde] +pub struct CoreDeployments { + pub hub: String, + pub ism: String, + pub hook: String, + pub mailbox: String, + pub msg_receiver: String, +} diff --git a/integration-test/tests/contracts/eth/bind/mod.rs b/integration-test/tests/contracts/eth/bind/mod.rs new file mode 100644 index 00000000..153c5d2a --- /dev/null +++ b/integration-test/tests/contracts/eth/bind/mod.rs @@ -0,0 +1,10 @@ +#[allow(clippy::all)] +pub mod fast_hyp_erc20; +#[allow(clippy::all)] +pub mod fast_hyp_erc20_collateral; +#[allow(clippy::all)] +pub mod mailbox; +#[allow(clippy::all)] +pub mod test_mock_ism; +#[allow(clippy::all)] +pub mod test_mock_msg_receiver; diff --git a/integration-test/tests/setup/deploy_evm.rs b/integration-test/tests/contracts/eth/deploy.rs similarity index 61% rename from integration-test/tests/setup/deploy_evm.rs rename to integration-test/tests/contracts/eth/deploy.rs index ce3adcfe..883abf7f 100644 --- a/integration-test/tests/setup/deploy_evm.rs +++ b/integration-test/tests/contracts/eth/deploy.rs @@ -2,20 +2,12 @@ use std::sync::Arc; use ethers::{prelude::SignerMiddleware, providers::Middleware, signers::Signer}; -use crate::contracts::{mailbox, test_mock_ism, test_mock_msg_receiver}; +use super::{mailbox, test_mock_ism, test_mock_msg_receiver, types}; -#[derive(Debug)] -pub struct HplEvmDeployment { - pub mailbox: mailbox::Mailbox>, - - pub ism: test_mock_ism::TestMultisigIsm>, - pub msg_receiver: test_mock_msg_receiver::TestRecipient>, -} - -pub async fn deploy_evm_hyperlane<'a, M: Middleware + 'static, S: Signer + 'static>( +pub async fn deploy<'a, M: Middleware + 'static, S: Signer + 'static>( signer: Arc>, evm_domain: u32, -) -> eyre::Result> { +) -> eyre::Result> { let ism_multisig_contract = test_mock_ism::TestMultisigIsm::deploy(signer.clone(), ())? .send() .await?; @@ -34,7 +26,7 @@ pub async fn deploy_evm_hyperlane<'a, M: Middleware + 'static, S: Signer + 'stat .await? .await?; - let deployments = HplEvmDeployment { + let deployments = types::Deployments { mailbox: mailbox_contract, ism: ism_multisig_contract, msg_receiver: msg_receiver_contract, diff --git a/integration-test/tests/contracts/eth/mod.rs b/integration-test/tests/contracts/eth/mod.rs new file mode 100644 index 00000000..d35af76c --- /dev/null +++ b/integration-test/tests/contracts/eth/mod.rs @@ -0,0 +1,8 @@ +mod bind; +mod deploy; +mod setup; +mod types; + +pub use bind::*; +pub use deploy::deploy; +pub use setup::setup_env; diff --git a/integration-test/tests/contracts/eth/setup.rs b/integration-test/tests/contracts/eth/setup.rs new file mode 100644 index 00000000..6c4d0253 --- /dev/null +++ b/integration-test/tests/contracts/eth/setup.rs @@ -0,0 +1,39 @@ +use std::{sync::Arc, time::Duration}; + +use ethers::{ + prelude::{k256::ecdsa::SigningKey, SignerMiddleware}, + providers::{Http, Middleware, Provider}, + signers::{LocalWallet, Signer, Wallet}, + utils::{Anvil, AnvilInstance}, +}; + +use super::{deploy, types::Deployments}; + +pub struct Env { + pub app: AnvilInstance, + pub core: Deployments, + pub domain: u32, + + pub acc_owner: S, +} + +pub async fn setup_env(domain: u32) -> eyre::Result, Wallet>> { + let app = Anvil::new().spawn(); + + let wallet = LocalWallet::from(app.keys()[0].clone()); + let wallet = wallet.with_chain_id(app.chain_id()); + + let provider = + Provider::::try_from(&app.endpoint())?.interval(Duration::from_millis(10u64)); + let signer = Arc::new(SignerMiddleware::new(provider, wallet.clone())); + + let core = deploy(signer.clone(), domain).await?; + + Ok(Env { + app, + core, + domain, + + acc_owner: wallet, + }) +} diff --git a/integration-test/tests/contracts/eth/types.rs b/integration-test/tests/contracts/eth/types.rs new file mode 100644 index 00000000..0f7f298e --- /dev/null +++ b/integration-test/tests/contracts/eth/types.rs @@ -0,0 +1,12 @@ +use ethers::{prelude::SignerMiddleware, providers::Middleware, signers::Signer}; + +use super::{ + mailbox::Mailbox, test_mock_ism::TestMultisigIsm, test_mock_msg_receiver::TestRecipient, +}; + +pub struct Deployments { + pub mailbox: Mailbox>, + + pub ism: TestMultisigIsm>, + pub msg_receiver: TestRecipient>, +} diff --git a/integration-test/tests/contracts/mod.rs b/integration-test/tests/contracts/mod.rs index 1dc77fdd..285778f1 100644 --- a/integration-test/tests/contracts/mod.rs +++ b/integration-test/tests/contracts/mod.rs @@ -1,6 +1,2 @@ -#[allow(clippy::all)] -pub mod mailbox; -#[allow(clippy::all)] -pub mod test_mock_ism; -#[allow(clippy::all)] -pub mod test_mock_msg_receiver; +pub mod cw; +pub mod eth; diff --git a/integration-test/tests/mailbox.rs b/integration-test/tests/mailbox.rs index 68d08a2a..e6dc5d14 100644 --- a/integration-test/tests/mailbox.rs +++ b/integration-test/tests/mailbox.rs @@ -1,19 +1,22 @@ mod contracts; mod event; -mod setup; mod validator; use cosmwasm_std::{attr, Attribute, Binary, HexBinary}; use ethers::{prelude::parse_log, signers::Signer}; -use osmosis_test_tube::{Account, Module, Wasm}; -use setup::setup_env; +use osmosis_test_tube::{Account, Module, OsmosisTestApp, Wasm}; use hpl_interface::types::{bech32_decode, bech32_encode, bech32_to_h256}; use crate::{ - contracts::mailbox::{DispatchFilter, DispatchIdFilter}, + contracts::{ + cw, + eth::{ + self, + mailbox::{DispatchFilter, DispatchIdFilter}, + }, + }, event::{parse_dispatch_from_res, parse_dispatch_id_from_res}, - setup::HplCwIsmType, validator::TestValidators, }; @@ -22,47 +25,54 @@ fn sorted(mut attrs: Vec) -> Vec { attrs } -#[tokio::test] -async fn test_mailbox_cw_to_evm() -> eyre::Result<()> { - let evm_domain = 1; - let cw_domain = 2; +const DOMAIN_EVM: u32 = 1; - let validators = TestValidators::new(evm_domain, 5, 3); +const DOMAIN_OSMO: u32 = 2; +const PREFIX_OSMO: &str = "osmo"; - let hrp = "osmo"; - let cw_ism_type = HplCwIsmType::Multisig { - hrp, - validators: validators.clone(), - }; - let cw_routing_ism_type = HplCwIsmType::Routing(vec![(cw_domain, cw_ism_type)]); +const DOMAIN_NTRN: u32 = 3; +const PREFIX_NTRN: &str = "neutron"; + +#[tokio::test] +async fn test_mailbox_cw_to_evm() -> eyre::Result<()> { + // init Osmosis env + let osmo_app = OsmosisTestApp::new(); + let osmo = cw::setup_env( + &osmo_app, + |app, coins| app.init_account(coins).unwrap(), + None::<&str>, + "osmo", + DOMAIN_OSMO, + &[TestValidators::new(DOMAIN_EVM, 5, 3)], + )?; - let test_env = setup_env(evm_domain, cw_domain, cw_routing_ism_type).await?; - let cw_mailbox = test_env.cw_deployments.mailbox; - let cw_wasm = Wasm::new(&test_env.osmo_app); - let evm_mailbox = test_env.evm_deployments.mailbox; - let evm_receiver = test_env.evm_deployments.msg_receiver; + // init Anvil env + let anvil1 = eth::setup_env(DOMAIN_EVM).await?; let mut receiver = [0u8; 32]; - receiver[12..].copy_from_slice(&evm_receiver.address().0); - let _sender = bech32_decode(test_env.osmo_owner.address().as_str())?; + receiver[12..].copy_from_slice(&anvil1.core.msg_receiver.address().0); + let _sender = bech32_decode(osmo.acc_tester.address().as_str())?; let msg_body = b"hello world"; // dispatch - let dispatch_res = cw_wasm.execute( - &cw_mailbox, + let dispatch_res = Wasm::new(osmo.app).execute( + &osmo.core.mailbox, &hpl_interface::mailbox::ExecuteMsg::Dispatch { - dest_domain: evm_domain, + dest_domain: DOMAIN_EVM, recipient_addr: receiver.into(), msg_body: msg_body.into(), }, &[], - &test_env.osmo_owner, + &osmo.acc_tester, )?; let dispatch = parse_dispatch_from_res(&dispatch_res.events); let _dispatch_id = parse_dispatch_id_from_res(&dispatch_res.events); - let process_tx = evm_mailbox.process(vec![].into(), Binary::from(dispatch.message).0.into()); + let process_tx = anvil1 + .core + .mailbox + .process(vec![].into(), Binary::from(dispatch.message).0.into()); let _process_tx_res = process_tx.send().await?.await?.unwrap(); Ok(()) @@ -70,52 +80,52 @@ async fn test_mailbox_cw_to_evm() -> eyre::Result<()> { #[tokio::test] async fn test_mailbox_evm_to_cw() -> eyre::Result<()> { - let evm_domain = 1; - let cw_domain = 2; - - let validators = TestValidators::new(evm_domain, 5, 3); - - let hrp = "osmo"; - let cw_ism_type = HplCwIsmType::Multisig { - hrp, - validators: validators.clone(), - }; - let cw_routing_ism_type = HplCwIsmType::Routing(vec![(evm_domain, cw_ism_type)]); - - let test_env = setup_env(evm_domain, cw_domain, cw_routing_ism_type).await?; - let evm_mailbox = test_env.evm_deployments.mailbox; - let cw_mailbox = test_env.cw_deployments.mailbox; - let cw_receiver = test_env.cw_deployments.msg_receiver; - let cw_wasm = Wasm::new(&test_env.osmo_app); - - let sender = bech32_encode("osmo", test_env.eth_owner.address().as_bytes())?; - let receiver = bech32_to_h256(&cw_receiver)?; + // init Osmosis env + let osmo_app = OsmosisTestApp::new(); + let osmo = cw::setup_env( + &osmo_app, + |app, coins| app.init_account(coins).unwrap(), + None::<&str>, + "osmo", + DOMAIN_OSMO, + &[TestValidators::new(DOMAIN_EVM, 5, 3)], + )?; + + // init Anvil env + let anvil1 = eth::setup_env(DOMAIN_EVM).await?; + + // prepare message arguments + let sender = bech32_encode("osmo", anvil1.acc_owner.address().as_bytes())?; + let receiver = bech32_to_h256(&osmo.core.msg_receiver)?; let msg_body = b"hello world"; // dispatch - let dispatch_tx_call = evm_mailbox.dispatch(cw_domain, receiver, msg_body.into()); + let dispatch_tx_call = anvil1 + .core + .mailbox + .dispatch(DOMAIN_OSMO, receiver, msg_body.into()); let dispatch_res = dispatch_tx_call.send().await?.await?.unwrap(); let dispatch: DispatchFilter = parse_log(dispatch_res.logs[0].clone())?; let dispatch_id: DispatchIdFilter = parse_log(dispatch_res.logs[1].clone())?; // generate ism metadata - let ism_metadata = validators.make_metadata( - evm_mailbox.address(), - evm_mailbox.root().await?, + let ism_metadata = osmo.get_validator_set(DOMAIN_EVM)?.make_metadata( + anvil1.core.mailbox.address(), + anvil1.core.mailbox.root().await?, dispatch_id.message_id, true, - ); + )?; // process - let process_res = cw_wasm.execute( - &cw_mailbox, + let process_res = Wasm::new(osmo.app).execute( + &osmo.core.mailbox, &hpl_interface::mailbox::ExecuteMsg::Process { metadata: ism_metadata.into(), message: HexBinary::from(dispatch.message.to_vec()), }, &[], - &test_env.osmo_owner, + &osmo.acc_owner, )?; let process_recv_evt = process_res .events @@ -128,10 +138,13 @@ async fn test_mailbox_evm_to_cw() -> eyre::Result<()> { sorted(vec![ Attribute { key: "_contract_address".to_string(), - value: cw_receiver, + value: osmo.core.msg_receiver, }, attr("sender", sender), - attr("origin", evm_mailbox.local_domain().await?.to_string()), + attr( + "origin", + anvil1.core.mailbox.local_domain().await?.to_string() + ), attr("body", std::str::from_utf8(msg_body)?), ]), ); diff --git a/integration-test/tests/setup/deploy_cw.rs b/integration-test/tests/setup/deploy_cw.rs deleted file mode 100644 index 81239624..00000000 --- a/integration-test/tests/setup/deploy_cw.rs +++ /dev/null @@ -1,235 +0,0 @@ -use std::{collections::BTreeMap, fs, path::Path}; - -use cosmwasm_schema::cw_serde; -use hpl_interface::ism::multisig::ThresholdSet; -use osmosis_test_tube::{Account, Module, OsmosisTestApp, SigningAccount, Wasm}; - -use crate::validator::TestValidators; - -#[derive(Debug)] -pub struct HplCwDeploymentCodes { - pub hub: u64, - pub ism_multisig: u64, - pub ism_routing: u64, - pub mailbox: u64, - pub multicall: u64, - - pub test_mock_ism: u64, - pub test_mock_msg_receiver: u64, -} - -#[derive(Debug)] -pub struct HplCwDeploymentAddrs { - pub hub: String, - pub ism: String, - pub mailbox: String, - pub msg_receiver: String, -} - -#[derive(Debug)] -pub struct HplCwDeployment { - pub codes: HplCwDeploymentCodes, - pub addrs: HplCwDeploymentAddrs, -} - -#[cw_serde] -struct EmptyMsg {} - -pub enum HplCwIsmType<'a> { - Routing(Vec<(u32, HplCwIsmType<'a>)>), - - Multisig { - hrp: &'a str, - validators: TestValidators, - }, - - #[allow(dead_code)] - Mock, -} - -impl<'a> HplCwIsmType<'a> { - pub fn deploy( - self, - wasm: &Wasm<'a, OsmosisTestApp>, - codes: &HplCwDeploymentCodes, - deployer: &SigningAccount, - ) -> String { - match self { - Self::Mock => { - wasm.instantiate(codes.test_mock_ism, &EmptyMsg {}, None, None, &[], deployer) - .unwrap() - .data - .address - } - Self::Multisig { - hrp, - validators: set, - } => { - let multisig_ism = wasm - .instantiate( - codes.ism_multisig, - &hpl_interface::ism::multisig::InstantiateMsg { - owner: deployer.address(), - addr_prefix: hrp.to_string(), - }, - None, - None, - &[], - deployer, - ) - .unwrap() - .data - .address; - - wasm.execute( - &multisig_ism, - &hpl_interface::ism::multisig::ExecuteMsg::EnrollValidators { - set: set.to_set(hrp), - }, - &[], - deployer, - ) - .unwrap(); - - wasm.execute( - &multisig_ism, - &hpl_interface::ism::multisig::ExecuteMsg::SetThreshold { - set: ThresholdSet { - domain: set.domain, - threshold: set.threshold, - }, - }, - &[], - deployer, - ) - .unwrap(); - - multisig_ism - } - HplCwIsmType::Routing(isms) => { - wasm.instantiate( - codes.ism_routing, - &hpl_interface::ism::routing::InstantiateMsg { - owner: deployer.address(), - isms: isms - .into_iter() - .map(|(domain, ism)| hpl_interface::ism::routing::ISMSet { - domain, - address: ism.deploy(wasm, codes, deployer), - }) - .collect(), - }, - None, - None, - &[], - deployer, - ) - .unwrap() - .data - .address - } - } - } -} - -pub async fn deploy_cw_hyperlane( - app: &OsmosisTestApp, - deployer: &SigningAccount, - origin_domain: u32, - mock_ism: HplCwIsmType<'_>, -) -> eyre::Result { - let wasm = Wasm::new(app); - - // store codes - let base_path = Path::new("../target/wasm32-unknown-unknown/release/"); - let artifacts = [ - ("hub"), - ("ism_multisig"), - ("ism_routing"), - ("mailbox"), - ("multicall"), - ("test_mock_ism"), - ("test_mock_msg_receiver"), - ] - .into_iter() - .map(|name| { - let filename = format!("hpl_{name}.wasm"); - let path = base_path.join(filename); - let code = fs::read(path).unwrap(); - let store_resp = wasm.store_code(&code, None, deployer).unwrap(); - let code_id = store_resp.data.code_id; - - (name, code_id) - }) - .collect::>(); - - let codes = HplCwDeploymentCodes { - hub: *artifacts.get("hub").unwrap(), - ism_multisig: *artifacts.get("ism_multisig").unwrap(), - ism_routing: *artifacts.get("ism_routing").unwrap(), - mailbox: *artifacts.get("mailbox").unwrap(), - multicall: *artifacts.get("multicall").unwrap(), - test_mock_ism: *artifacts.get("test_mock_ism").unwrap(), - test_mock_msg_receiver: *artifacts.get("test_mock_msg_receiver").unwrap(), - }; - - let hub = wasm - .instantiate( - codes.hub, - &hpl_interface::hub::InstantiateMsg { - origin_domain, - mailbox_code: codes.mailbox, - }, - None, - None, - &[], - deployer, - ) - .unwrap() - .data - .address; - - let ism = mock_ism.deploy(&wasm, &codes, deployer); - - let mailbox_deploy_res = wasm - .execute( - &hub, - &hpl_interface::hub::ExecuteMsg::Instantiate { - owner: deployer.address(), - default_ism: ism.clone(), - default_hook: ism.clone(), // TODO: change into hooks - }, - &[], - deployer, - ) - .unwrap(); - - let mailbox_deploy_evt = mailbox_deploy_res - .events - .into_iter() - .find(|v| v.ty == "wasm-mailbox_instantiated") - .unwrap(); - let mailbox = mailbox_deploy_evt.attributes.get(0).unwrap().value.clone(); - - let msg_receiver = wasm - .instantiate( - codes.test_mock_msg_receiver, - &EmptyMsg {}, - None, - None, - &[], - deployer, - ) - .unwrap() - .data - .address; - - let addrs = HplCwDeploymentAddrs { - hub, - ism, - mailbox, - msg_receiver, - }; - - Ok(HplCwDeployment { codes, addrs }) -} diff --git a/integration-test/tests/setup/mod.rs b/integration-test/tests/setup/mod.rs deleted file mode 100644 index b95c6962..00000000 --- a/integration-test/tests/setup/mod.rs +++ /dev/null @@ -1,59 +0,0 @@ -mod deploy_cw; -mod deploy_evm; - -use std::{sync::Arc, time::Duration}; - -use cosmwasm_std::coin; -use ethers::{ - prelude::{k256::ecdsa::SigningKey, SignerMiddleware}, - providers::{Http, Middleware, Provider}, - signers::{LocalWallet, Signer, Wallet}, - utils::{Anvil, AnvilInstance}, -}; -use osmosis_test_tube::{OsmosisTestApp, SigningAccount}; - -use deploy_cw::deploy_cw_hyperlane; -use deploy_evm::deploy_evm_hyperlane; - -pub use self::deploy_cw::HplCwIsmType; - -const BASE: u128 = 1_000_000; - -pub struct HplTestEnv { - pub osmo_app: OsmosisTestApp, - pub osmo_owner: SigningAccount, - pub eth_app: AnvilInstance, - pub eth_owner: S, - pub cw_deployments: deploy_cw::HplCwDeploymentAddrs, - pub evm_deployments: deploy_evm::HplEvmDeployment, -} - -pub async fn setup_env( - evm_domain: u32, - cw_domain: u32, - cw_ism_type: HplCwIsmType<'_>, -) -> eyre::Result, Wallet>> { - let osmo_app = OsmosisTestApp::new(); - let eth_app = Anvil::new().spawn(); - let eth_wallet: LocalWallet = eth_app.keys()[0].clone().into(); - let eth_wallet = eth_wallet.with_chain_id(eth_app.chain_id()); - let eth_provider = - Provider::::try_from(ð_app.endpoint())?.interval(Duration::from_millis(10u64)); - let eth_signer = Arc::new(SignerMiddleware::new(eth_provider, eth_wallet.clone())); - - let osmo_owner = osmo_app.init_account(&[coin(1000000u128 * BASE, "uosmo")])?; - let cw_deployments = - deploy_cw_hyperlane(&osmo_app, &osmo_owner, cw_domain, cw_ism_type).await?; - let evm_deployments = deploy_evm_hyperlane(eth_signer, evm_domain).await?; - - let env = HplTestEnv { - osmo_app, - osmo_owner, - eth_app, - eth_owner: eth_wallet, - cw_deployments: cw_deployments.addrs, - evm_deployments, - }; - - Ok(env) -} diff --git a/integration-test/tests/validator.rs b/integration-test/tests/validator.rs index af534957..7c1ac826 100644 --- a/integration-test/tests/validator.rs +++ b/integration-test/tests/validator.rs @@ -148,22 +148,31 @@ impl TestValidators { merkle_root: [u8; 32], message_id: [u8; 32], is_passed: bool, - ) -> MessageIdMultisigIsmMetadata { + ) -> eyre::Result { + let mut addr = [0u8; 32]; + addr[32 - origin_mailbox.0.len()..].copy_from_slice(&origin_mailbox.0); + + let multisig_hash = hpl_ism_multisig::multisig_hash( + hpl_ism_multisig::domain_hash(self.domain, Binary(addr.to_vec()))?.to_vec(), + merkle_root.to_vec(), + 0, + message_id.to_vec(), + )?; + + let hashed_message = hpl_ism_multisig::eth_hash(multisig_hash)?; + let signatures = if is_passed { - self.sign(self.threshold, message_id) + self.sign(self.threshold, hashed_message.as_slice().try_into()?) } else { - self.sign(self.threshold - 1, message_id) + self.sign(self.threshold - 1, hashed_message.as_slice().try_into()?) }; - let mut addr = [0u8; 32]; - addr[32 - origin_mailbox.0.len()..].copy_from_slice(&origin_mailbox.0); - - MessageIdMultisigIsmMetadata { + Ok(MessageIdMultisigIsmMetadata { origin_mailbox: Binary::from(addr), merkle_root: Binary::from(merkle_root), signatures: signatures.iter().fold(Binary::default(), |acc, item| { Binary([acc.0, item.0.clone()].concat()) }), - } + }) } } diff --git a/packages/interface/src/default_hook.rs b/packages/interface/src/default_hook.rs index 9c86e4eb..c39389b3 100644 --- a/packages/interface/src/default_hook.rs +++ b/packages/interface/src/default_hook.rs @@ -1,14 +1,60 @@ -use cosmwasm_schema::cw_serde; +use cosmwasm_schema::{cw_serde, QueryResponses}; use cosmwasm_std::HexBinary; -use crate::domain_routing_hook; +use crate::{ + hook::{HookConfig, OwnerResponse, PauseInfoResponse}, + ownable::OwnableMsg, + post_dispatch_hook::{PostDispatchQueryMsg, QuoteDispatchResponse}, +}; + +#[cw_serde] +pub struct InstantiateMsg { + pub owner: String, + pub mailbox: String, +} #[cw_serde] pub enum ExecuteMsg { - DomainRoutingHookMsg(domain_routing_hook::ExecuteMsg), + Ownership(OwnableMsg), + + Pause {}, + + Unpause {}, + + UpdateMailbox { + mailbox: String, + }, + + SetHook { + destination: u32, + hook: String, + }, + + SetHooks { + hooks: Vec, + }, + + PostDispatch { + metadata: HexBinary, + message: HexBinary, + }, + ConfigCustomHook { destination_domain: u32, recipient: HexBinary, hook: String, }, } + +#[cw_serde] +#[derive(QueryResponses)] +pub enum QueryMsg { + #[returns(QuoteDispatchResponse)] + QuoteDispatch(PostDispatchQueryMsg), + + #[returns(PauseInfoResponse)] + PauseInfo {}, + + #[returns(OwnerResponse)] + Owner {}, +} diff --git a/packages/interface/src/domain_routing_hook.rs b/packages/interface/src/domain_routing_hook.rs index ee6ef6c2..734b159e 100644 --- a/packages/interface/src/domain_routing_hook.rs +++ b/packages/interface/src/domain_routing_hook.rs @@ -1,13 +1,11 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{Addr, HexBinary, Uint256}; +use cosmwasm_std::HexBinary; -use crate::{ownable::OwnableMsg, post_dispatch_hook::PostDispatchQueryMsg}; - -#[cw_serde] -pub struct HookConfig { - pub destination: u32, - pub hook: Addr, -} +use crate::{ + hook::{HookConfig, OwnerResponse, PauseInfoResponse}, + ownable::OwnableMsg, + post_dispatch_hook::{PostDispatchQueryMsg, QuoteDispatchResponse}, +}; #[cw_serde] pub struct InstantiateMsg { @@ -51,18 +49,3 @@ pub enum QueryMsg { #[returns(OwnerResponse)] Owner {}, } - -#[cw_serde] -pub struct QuoteDispatchResponse { - pub gas_amount: Uint256, -} - -#[cw_serde] -pub struct PauseInfoResponse { - pub paused: bool, -} - -#[cw_serde] -pub struct OwnerResponse { - pub owner: String, -} diff --git a/packages/interface/src/hook.rs b/packages/interface/src/hook.rs new file mode 100644 index 00000000..c752f3ca --- /dev/null +++ b/packages/interface/src/hook.rs @@ -0,0 +1,18 @@ +use cosmwasm_schema::cw_serde; +use cosmwasm_std::Addr; + +#[cw_serde] +pub struct HookConfig { + pub destination: u32, + pub hook: Addr, +} + +#[cw_serde] +pub struct PauseInfoResponse { + pub paused: bool, +} + +#[cw_serde] +pub struct OwnerResponse { + pub owner: String, +} diff --git a/packages/interface/src/lib.rs b/packages/interface/src/lib.rs index 8871f34f..d07ea3e6 100644 --- a/packages/interface/src/lib.rs +++ b/packages/interface/src/lib.rs @@ -1,5 +1,6 @@ pub mod default_hook; pub mod domain_routing_hook; +pub mod hook; pub mod hub; pub mod igp_core; pub mod igp_gas_oracle;