From b1228d772a35fd6e0c71450afe03c673d63e2917 Mon Sep 17 00:00:00 2001 From: Alan Wu Date: Wed, 12 Feb 2025 17:05:17 -0500 Subject: [PATCH] feat: support v4 pools & use UniversalRouter instead of SwapRouter02 --- .../bindings-uniswapx/src/i_swap_router_02.rs | 699 ------------------ crates/bindings-uniswapx/src/lib.rs | 3 +- ...ecutor.rs => universal_router_executor.rs} | 427 ++++------- src/collectors/uniswapx_route_collector.rs | 4 +- src/strategies/shared.rs | 46 +- 5 files changed, 166 insertions(+), 1013 deletions(-) delete mode 100644 crates/bindings-uniswapx/src/i_swap_router_02.rs rename crates/bindings-uniswapx/src/{swap_router_02_executor.rs => universal_router_executor.rs} (53%) diff --git a/crates/bindings-uniswapx/src/i_swap_router_02.rs b/crates/bindings-uniswapx/src/i_swap_router_02.rs deleted file mode 100644 index d70c882..0000000 --- a/crates/bindings-uniswapx/src/i_swap_router_02.rs +++ /dev/null @@ -1,699 +0,0 @@ -pub use i_swap_router_02::*; -/// This module was auto-generated with ethers-rs Abigen. -/// More information at: -#[allow( - clippy::enum_variant_names, - clippy::too_many_arguments, - clippy::upper_case_acronyms, - clippy::type_complexity, - dead_code, - non_camel_case_types, -)] -pub mod i_swap_router_02 { - pub use super::super::shared_types::*; - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("WETH9"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("WETH9"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("exactInput"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("exactInput"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("params"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple( - ::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Bytes, - ::ethers::core::abi::ethabi::ParamType::Address, - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ], - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("struct ExactInputParams"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("amountOut"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("exactInputSingle"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("exactInputSingle"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("params"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple( - ::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Address, - ::ethers::core::abi::ethabi::ParamType::Address, - ::ethers::core::abi::ethabi::ParamType::Uint(24usize), - ::ethers::core::abi::ethabi::ParamType::Address, - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(160usize), - ], - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned( - "struct ExactInputSingleParams", - ), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("amountOut"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("multicall"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("multicall"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("deadline"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("data"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Bytes, - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes[]"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("results"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Bytes, - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes[]"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("swapExactTokensForTokens"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "swapExactTokensForTokens", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("amountIn"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("amountOutMin"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("path"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Address, - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address[]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("to"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("amountOut"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("unwrapWETH9"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("unwrapWETH9"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("amountMinimum"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, - }, - ], - ), - ]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static ISWAPROUTER02_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new( - __abi, - ); - pub struct ISwapRouter02(::ethers::contract::Contract); - impl ::core::clone::Clone for ISwapRouter02 { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for ISwapRouter02 { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for ISwapRouter02 { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for ISwapRouter02 { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(ISwapRouter02)) - .field(&self.address()) - .finish() - } - } - impl ISwapRouter02 { - /// Creates a new contract instance with the specified `ethers` client at - /// `address`. The contract derefs to a `ethers::Contract` object. - pub fn new>( - address: T, - client: ::std::sync::Arc, - ) -> Self { - Self( - ::ethers::contract::Contract::new( - address.into(), - ISWAPROUTER02_ABI.clone(), - client, - ), - ) - } - ///Calls the contract's `WETH9` (0x4aa4a4fc) function - pub fn weth9( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([74, 164, 164, 252], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `exactInput` (0xb858183f) function - pub fn exact_input( - &self, - params: ExactInputParams, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([184, 88, 24, 63], (params,)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `exactInputSingle` (0x04e45aaf) function - pub fn exact_input_single( - &self, - params: ExactInputSingleParams, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([4, 228, 90, 175], (params,)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `multicall` (0x5ae401dc) function - pub fn multicall( - &self, - deadline: ::ethers::core::types::U256, - data: ::std::vec::Vec<::ethers::core::types::Bytes>, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::std::vec::Vec<::ethers::core::types::Bytes>, - > { - self.0 - .method_hash([90, 228, 1, 220], (deadline, data)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `swapExactTokensForTokens` (0x472b43f3) function - pub fn swap_exact_tokens_for_tokens( - &self, - amount_in: ::ethers::core::types::U256, - amount_out_min: ::ethers::core::types::U256, - path: ::std::vec::Vec<::ethers::core::types::Address>, - to: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([71, 43, 67, 243], (amount_in, amount_out_min, path, to)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `unwrapWETH9` (0x49616997) function - pub fn unwrap_weth9( - &self, - amount_minimum: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([73, 97, 105, 151], amount_minimum) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for ISwapRouter02 { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `WETH9` function with signature `WETH9()` and selector `0x4aa4a4fc` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "WETH9", abi = "WETH9()")] - pub struct Weth9Call; - ///Container type for all input parameters for the `exactInput` function with signature `exactInput((bytes,address,uint256,uint256))` and selector `0xb858183f` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "exactInput", abi = "exactInput((bytes,address,uint256,uint256))")] - pub struct ExactInputCall { - pub params: ExactInputParams, - } - ///Container type for all input parameters for the `exactInputSingle` function with signature `exactInputSingle((address,address,uint24,address,uint256,uint256,uint160))` and selector `0x04e45aaf` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "exactInputSingle", - abi = "exactInputSingle((address,address,uint24,address,uint256,uint256,uint160))" - )] - pub struct ExactInputSingleCall { - pub params: ExactInputSingleParams, - } - ///Container type for all input parameters for the `multicall` function with signature `multicall(uint256,bytes[])` and selector `0x5ae401dc` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "multicall", abi = "multicall(uint256,bytes[])")] - pub struct MulticallCall { - pub deadline: ::ethers::core::types::U256, - pub data: ::std::vec::Vec<::ethers::core::types::Bytes>, - } - ///Container type for all input parameters for the `swapExactTokensForTokens` function with signature `swapExactTokensForTokens(uint256,uint256,address[],address)` and selector `0x472b43f3` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "swapExactTokensForTokens", - abi = "swapExactTokensForTokens(uint256,uint256,address[],address)" - )] - pub struct SwapExactTokensForTokensCall { - pub amount_in: ::ethers::core::types::U256, - pub amount_out_min: ::ethers::core::types::U256, - pub path: ::std::vec::Vec<::ethers::core::types::Address>, - pub to: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `unwrapWETH9` function with signature `unwrapWETH9(uint256)` and selector `0x49616997` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "unwrapWETH9", abi = "unwrapWETH9(uint256)")] - pub struct UnwrapWETH9Call { - pub amount_minimum: ::ethers::core::types::U256, - } - ///Container type for all of the contract's call - #[derive( - Clone, - ::ethers::contract::EthAbiType, - serde::Serialize, - serde::Deserialize, - Debug, - PartialEq, - Eq, - Hash - )] - pub enum ISwapRouter02Calls { - Weth9(Weth9Call), - ExactInput(ExactInputCall), - ExactInputSingle(ExactInputSingleCall), - Multicall(MulticallCall), - SwapExactTokensForTokens(SwapExactTokensForTokensCall), - UnwrapWETH9(UnwrapWETH9Call), - } - impl ::ethers::core::abi::AbiDecode for ISwapRouter02Calls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::Weth9(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ExactInput(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ExactInputSingle(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::Multicall(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::SwapExactTokensForTokens(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UnwrapWETH9(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for ISwapRouter02Calls { - fn encode(self) -> Vec { - match self { - Self::Weth9(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ExactInput(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ExactInputSingle(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Multicall(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::SwapExactTokensForTokens(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UnwrapWETH9(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - } - } - } - impl ::core::fmt::Display for ISwapRouter02Calls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::Weth9(element) => ::core::fmt::Display::fmt(element, f), - Self::ExactInput(element) => ::core::fmt::Display::fmt(element, f), - Self::ExactInputSingle(element) => ::core::fmt::Display::fmt(element, f), - Self::Multicall(element) => ::core::fmt::Display::fmt(element, f), - Self::SwapExactTokensForTokens(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::UnwrapWETH9(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for ISwapRouter02Calls { - fn from(value: Weth9Call) -> Self { - Self::Weth9(value) - } - } - impl ::core::convert::From for ISwapRouter02Calls { - fn from(value: ExactInputCall) -> Self { - Self::ExactInput(value) - } - } - impl ::core::convert::From for ISwapRouter02Calls { - fn from(value: ExactInputSingleCall) -> Self { - Self::ExactInputSingle(value) - } - } - impl ::core::convert::From for ISwapRouter02Calls { - fn from(value: MulticallCall) -> Self { - Self::Multicall(value) - } - } - impl ::core::convert::From for ISwapRouter02Calls { - fn from(value: SwapExactTokensForTokensCall) -> Self { - Self::SwapExactTokensForTokens(value) - } - } - impl ::core::convert::From for ISwapRouter02Calls { - fn from(value: UnwrapWETH9Call) -> Self { - Self::UnwrapWETH9(value) - } - } - ///Container type for all return fields from the `WETH9` function with signature `WETH9()` and selector `0x4aa4a4fc` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct Weth9Return(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `exactInput` function with signature `exactInput((bytes,address,uint256,uint256))` and selector `0xb858183f` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ExactInputReturn { - pub amount_out: ::ethers::core::types::U256, - } - ///Container type for all return fields from the `exactInputSingle` function with signature `exactInputSingle((address,address,uint24,address,uint256,uint256,uint160))` and selector `0x04e45aaf` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ExactInputSingleReturn { - pub amount_out: ::ethers::core::types::U256, - } - ///Container type for all return fields from the `multicall` function with signature `multicall(uint256,bytes[])` and selector `0x5ae401dc` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct MulticallReturn { - pub results: ::std::vec::Vec<::ethers::core::types::Bytes>, - } - ///Container type for all return fields from the `swapExactTokensForTokens` function with signature `swapExactTokensForTokens(uint256,uint256,address[],address)` and selector `0x472b43f3` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct SwapExactTokensForTokensReturn { - pub amount_out: ::ethers::core::types::U256, - } - ///`ExactInputSingleParams(address,address,uint24,address,uint256,uint256,uint160)` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ExactInputSingleParams { - pub token_in: ::ethers::core::types::Address, - pub token_out: ::ethers::core::types::Address, - pub fee: u32, - pub recipient: ::ethers::core::types::Address, - pub amount_in: ::ethers::core::types::U256, - pub amount_out_minimum: ::ethers::core::types::U256, - pub sqrt_price_limit_x96: ::ethers::core::types::U256, - } -} diff --git a/crates/bindings-uniswapx/src/lib.rs b/crates/bindings-uniswapx/src/lib.rs index 7e22f4b..27bd7d3 100644 --- a/crates/bindings-uniswapx/src/lib.rs +++ b/crates/bindings-uniswapx/src/lib.rs @@ -36,7 +36,6 @@ pub mod i_protocol_fee_controller; pub mod i_reactor; pub mod i_reactor_callback; pub mod i_signature_transfer; -pub mod i_swap_router_02; pub mod i_validation_callback; pub mod ieip712; pub mod ierc165; @@ -95,7 +94,6 @@ pub mod signed_math; pub mod solarray; pub mod storage_slot; pub mod strings; -pub mod swap_router_02_executor; pub mod uint_16_array_library; pub mod uint_string; pub mod v2_dutch_order_lib; @@ -103,3 +101,4 @@ pub mod v2_dutch_order_reactor; pub mod v3_dutch_order_lib; pub mod v3_dutch_order_reactor; pub mod weth; +pub mod universal_router_executor; diff --git a/crates/bindings-uniswapx/src/swap_router_02_executor.rs b/crates/bindings-uniswapx/src/universal_router_executor.rs similarity index 53% rename from crates/bindings-uniswapx/src/swap_router_02_executor.rs rename to crates/bindings-uniswapx/src/universal_router_executor.rs index 3687f4e..bfa0783 100644 --- a/crates/bindings-uniswapx/src/swap_router_02_executor.rs +++ b/crates/bindings-uniswapx/src/universal_router_executor.rs @@ -1,4 +1,4 @@ -pub use swap_router_02_executor::*; +pub use universal_router_executor::*; /// This module was auto-generated with ethers-rs Abigen. /// More information at: #[allow( @@ -9,7 +9,7 @@ pub use swap_router_02_executor::*; dead_code, non_camel_case_types, )] -pub mod swap_router_02_executor { +pub mod universal_router_executor { pub use super::super::shared_types::*; #[allow(deprecated)] fn __abi() -> ::ethers::core::abi::Abi { @@ -17,10 +17,14 @@ pub mod swap_router_02_executor { constructor: ::core::option::Option::Some(::ethers::core::abi::ethabi::Constructor { inputs: ::std::vec![ ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_whitelistedCaller"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, + name: ::std::borrow::ToOwned::to_owned("_whitelistedCallers"), + kind: ::ethers::core::abi::ethabi::ParamType::Array( + ::std::boxed::Box::new( + ::ethers::core::abi::ethabi::ParamType::Address, + ), + ), internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), + ::std::borrow::ToOwned::to_owned("address[]"), ), }, ::ethers::core::abi::ethabi::Param { @@ -38,10 +42,17 @@ pub mod swap_router_02_executor { ), }, ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_swapRouter02"), + name: ::std::borrow::ToOwned::to_owned("_universalRouter"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("_permit2"), kind: ::ethers::core::abi::ethabi::ParamType::Address, internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract ISwapRouter02"), + ::std::borrow::ToOwned::to_owned("contract IPermit2"), ), }, ], @@ -116,52 +127,37 @@ pub mod swap_router_02_executor { ], ), ( - ::std::borrow::ToOwned::to_owned("multicall"), + ::std::borrow::ToOwned::to_owned("owner"), ::std::vec![ ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("multicall"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("tokensToApprove"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Address, - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract ERC20[]"), - ), - }, + name: ::std::borrow::ToOwned::to_owned("owner"), + inputs: ::std::vec![], + outputs: ::std::vec![ ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("multicallData"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Bytes, - ), - ), + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Address, internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes[]"), + ::std::borrow::ToOwned::to_owned("address"), ), }, ], - outputs: ::std::vec![], constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, }, ], ), ( - ::std::borrow::ToOwned::to_owned("owner"), + ::std::borrow::ToOwned::to_owned("permit2"), ::std::vec![ ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("owner"), + name: ::std::borrow::ToOwned::to_owned("permit2"), inputs: ::std::vec![], outputs: ::std::vec![ ::ethers::core::abi::ethabi::Param { name: ::std::string::String::new(), kind: ::ethers::core::abi::ethabi::ParamType::Address, internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), + ::std::borrow::ToOwned::to_owned("contract IPermit2"), ), }, ], @@ -254,26 +250,6 @@ pub mod swap_router_02_executor { }, ], ), - ( - ::std::borrow::ToOwned::to_owned("swapRouter02"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("swapRouter02"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract ISwapRouter02"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), ( ::std::borrow::ToOwned::to_owned("transferOwnership"), ::std::vec![ @@ -295,62 +271,49 @@ pub mod swap_router_02_executor { ], ), ( - ::std::borrow::ToOwned::to_owned("unwrapWETH"), + ::std::borrow::ToOwned::to_owned("universalRouter"), ::std::vec![ ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("unwrapWETH"), - inputs: ::std::vec![ + name: ::std::borrow::ToOwned::to_owned("universalRouter"), + inputs: ::std::vec![], + outputs: ::std::vec![ ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("recipient"), + name: ::std::string::String::new(), kind: ::ethers::core::abi::ethabi::ParamType::Address, internal_type: ::core::option::Option::Some( ::std::borrow::ToOwned::to_owned("address"), ), }, ], - outputs: ::std::vec![], constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, }, ], ), ( - ::std::borrow::ToOwned::to_owned("weth"), + ::std::borrow::ToOwned::to_owned("withdrawERC20"), ::std::vec![ ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("weth"), - inputs: ::std::vec![], - outputs: ::std::vec![ + name: ::std::borrow::ToOwned::to_owned("withdrawERC20"), + inputs: ::std::vec![ ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), + name: ::std::borrow::ToOwned::to_owned("token"), kind: ::ethers::core::abi::ethabi::ParamType::Address, internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract WETH"), + ::std::borrow::ToOwned::to_owned("contract ERC20"), ), }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("whitelistedCaller"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("whitelistedCaller"), - inputs: ::std::vec![], - outputs: ::std::vec![ ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), + name: ::std::borrow::ToOwned::to_owned("to"), kind: ::ethers::core::abi::ethabi::ParamType::Address, internal_type: ::core::option::Option::Some( ::std::borrow::ToOwned::to_owned("address"), ), }, ], + outputs: ::std::vec![], constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, }, ], ), @@ -440,46 +403,46 @@ pub mod swap_router_02_executor { } } ///The parsed JSON ABI of the contract. - pub static SWAPROUTER02EXECUTOR_ABI: ::ethers::contract::Lazy< + pub static UNIVERSALROUTEREXECUTOR_ABI: ::ethers::contract::Lazy< ::ethers::core::abi::Abi, > = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"a\x01\0`@R4\x80\x15b\0\0\x11W_\x80\xFD[P`@Qb\0\x19a8\x03\x80b\0\x19a\x839\x81\x01`@\x81\x90Rb\0\x004\x91b\0\x01&V[_\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x84\x16\x90\x81\x17\x82U`@Q\x84\x92\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90\x82\x90\xA3P`\x01`\x01`\xA0\x1B\x03\x80\x85\x16`\xA0R\x83\x81\x16`\xC0R\x81\x16`\x80\x81\x90R`@\x80Qc\x12\xA9)?`\xE2\x1B\x81R\x90QcJ\xA4\xA4\xFC\x91`\x04\x80\x82\x01\x92` \x92\x90\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15b\0\0\xD1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90b\0\0\xF7\x91\x90b\0\x01\x8BV[`\x01`\x01`\xA0\x1B\x03\x16`\xE0RPb\0\x01\xB0\x92PPPV[`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14b\0\x01#W_\x80\xFD[PV[_\x80_\x80`\x80\x85\x87\x03\x12\x15b\0\x01:W_\x80\xFD[\x84Qb\0\x01G\x81b\0\x01\x0EV[` \x86\x01Q\x90\x94Pb\0\x01Z\x81b\0\x01\x0EV[`@\x86\x01Q\x90\x93Pb\0\x01m\x81b\0\x01\x0EV[``\x86\x01Q\x90\x92Pb\0\x01\x80\x81b\0\x01\x0EV[\x93\x96\x92\x95P\x90\x93PPV[_` \x82\x84\x03\x12\x15b\0\x01\x9CW_\x80\xFD[\x81Qb\0\x01\xA9\x81b\0\x01\x0EV[\x93\x92PPPV[`\x80Q`\xA0Q`\xC0Q`\xE0Qa\x171b\0\x020_9_\x81\x81`\xE2\x01R\x81\x81a\x08\xDC\x01Ra\t\x8C\x01R_\x81\x81a\x02M\x01R\x81\x81a\x02\xE4\x01R\x81\x81a\x03\xF8\x01R\x81\x81a\x05S\x01R\x81\x81a\nC\x01Ra\n\xE2\x01R_a\x01\xEF\x01R_\x81\x81a\x01\x9D\x01R\x81\x81a\x03`\x01R\x81\x81a\x04\x90\x01R\x81\x81a\x06\x15\x01Ra\x06\xDF\x01Ra\x171_\xF3\xFE`\x80`@R`\x046\x10a\0\xC6W_5`\xE0\x1C\x80c\x8C!\xB4\x11\x11a\0qW\x80c\xD0\xF2\xD8\xAC\x11a\0LW\x80c\xD0\xF2\xD8\xAC\x14a\x02oW\x80c\xE5\x13^\xC6\x14a\x02\x8EW\x80c\xF2\xFD\xE3\x8B\x14a\x02\xADW_\x80\xFD[\x80c\x8C!\xB4\x11\x14a\x01\xDEW\x80c\x8D\xA5\xCB[\x14a\x02\x11W\x80c\xABW&P\x14a\x02=_\xFD[PPPP`@Q=_\x82>`\x1F=\x90\x81\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x82\x01`@Ra\x05G\x91\x90\x81\x01\x90a\x13\x9EV[PG\x15a\x05xWa\x05x\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Ga\r\x10V[PPPPPPPV[_Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x06\x06W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0C`$\x82\x01R\x7FUNAUTHORIZED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[_[\x83\x81\x10\x15a\x06\xA1Wa\x06\x99\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x87\x87\x85\x81\x81\x10a\x06gWa\x06ga\x12\x93V[\x90P` \x02\x01` \x81\x01\x90a\x06|\x91\x90a\x0F\x86V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x91\x90a\x0C?V[`\x01\x01a\x06\x08V[P`@Q\x7FZ\xE4\x01\xDC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90cZ\xE4\x01\xDC\x90a\x078\x90\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x86\x90\x86\x90`\x04\x01a\x15'V[_`@Q\x80\x83\x03\x81_\x87Z\xF1\x15\x80\x15a\x07SW=_\x80>=_\xFD[PPPP`@Q=_\x82>`\x1F=\x90\x81\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x82\x01`@Ra\x07\x98\x91\x90\x81\x01\x90a\x13\x9EV[PPPPPV[_Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x08\x1FW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0C`$\x82\x01R\x7FUNAUTHORIZED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x05\xFDV[a\x08)\x81Ga\r\xABV[PV[_Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x08\xACW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0C`$\x82\x01R\x7FUNAUTHORIZED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x05\xFDV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R_\x90\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\t6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\tZ\x91\x90a\x15\xB6V[`@Q\x7F.\x1A}M\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R\x90\x91P\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90c.\x1A}M\x90`$\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\t\xE2W_\x80\xFD[PZ\xF1\x15\x80\x15a\t\xF4W=_\x80>=_\xFD[PPPPa\n\x02\x82Ga\r\xABV[PPV[`@Q\x7F\r3X\x84\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90c\r3X\x84\x90a\n|\x90\x86\x90\x86\x90\x86\x90`\x04\x01a\x16\x17V[_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\n\x93W_\x80\xFD[PZ\xF1\x15\x80\x15a\x05xW=_\x80>=_\xFD[`@Q\x7F\x13\xFBr\xC7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90c\x13\xFBr\xC7\x90a\x0B\x1D\x90\x87\x90\x87\x90\x87\x90\x87\x90`\x04\x01a\x16=_\xFD[PPPPPPPPV[_Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x0B\xD0W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0C`$\x82\x01R\x7FUNAUTHORIZED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x05\xFDV[_\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16\x90\x81\x17\x82U`@Q\x90\x913\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PV[_`@Q\x7F\t^\xA7\xB3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16`\x04\x82\x01R\x82`$\x82\x01R` _`D\x83_\x89Z\xF1=\x15`\x1F=\x11`\x01_Q\x14\x16\x17\x16\x91PP\x80a\r\nW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0E`$\x82\x01R\x7FAPPROVE_FAILED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x05\xFDV[PPPPV[_\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x82`@Q_`@Q\x80\x83\x03\x81\x85\x87Z\xF1\x92PPP=\x80_\x81\x14a\rfW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\rkV[``\x91P[PP\x90P\x80a\r\xA6W`@Q\x7F\xF4\xB3\xB1\xBC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPV[_\x80_\x80_\x85\x87Z\xF1\x90P\x80a\r\xA6W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x13`$\x82\x01R\x7FETH_TRANSFER_FAILED\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x05\xFDV[_\x80\x83`\x1F\x84\x01\x12a\x0E-W_\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x0EDW_\x80\xFD[` \x83\x01\x91P\x83` \x82`\x05\x1B\x85\x01\x01\x11\x15a\x0E^W_\x80\xFD[\x92P\x92\x90PV[_\x80\x83`\x1F\x84\x01\x12a\x0EuW_\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x0E\x8CW_\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\x0E^W_\x80\xFD[_\x80_\x80`@\x85\x87\x03\x12\x15a\x0E\xB6W_\x80\xFD[\x845g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0E\xCDW_\x80\xFD[a\x0E\xD9\x88\x83\x89\x01a\x0E\x1DV[\x90\x96P\x94P` \x87\x015\x91P\x80\x82\x11\x15a\x0E\xF1W_\x80\xFD[Pa\x0E\xFE\x87\x82\x88\x01a\x0EeV[\x95\x98\x94\x97P\x95PPPPV[_\x80_\x80`@\x85\x87\x03\x12\x15a\x0F\x1DW_\x80\xFD[\x845g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0F4W_\x80\xFD[a\x0F@\x88\x83\x89\x01a\x0E\x1DV[\x90\x96P\x94P` \x87\x015\x91P\x80\x82\x11\x15a\x0FXW_\x80\xFD[Pa\x0E\xFE\x87\x82\x88\x01a\x0E\x1DV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x08)W_\x80\xFD[_` \x82\x84\x03\x12\x15a\x0F\x96W_\x80\xFD[\x815a\x0F\xA1\x81a\x0FeV[\x93\x92PPPV[_\x80_`@\x84\x86\x03\x12\x15a\x0F\xBAW_\x80\xFD[\x835g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0F\xD1W_\x80\xFD[\x90\x85\x01\x90`@\x82\x88\x03\x12\x15a\x0F\xE4W_\x80\xFD[\x90\x93P` \x85\x015\x90\x80\x82\x11\x15a\x0F\xF9W_\x80\xFD[Pa\x10\x06\x86\x82\x87\x01a\x0EeV[\x94\x97\x90\x96P\x93\x94PPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[`@Q`\x1F\x82\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x10\x87Wa\x10\x87a\x10\x13V[`@R\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x10\xA8Wa\x10\xA8a\x10\x13V[P`\x05\x1B` \x01\x90V[_\x82`\x1F\x83\x01\x12a\x10\xC1W_\x80\xFD[\x815` a\x10\xD6a\x10\xD1\x83a\x10\x8FV[a\x10@V[\x80\x83\x82R` \x82\x01\x91P` \x84`\x05\x1B\x87\x01\x01\x93P\x86\x84\x11\x15a\x10\xF7W_\x80\xFD[` \x86\x01[\x84\x81\x10\x15a\x11\x1CW\x805a\x11\x0F\x81a\x0FeV[\x83R\x91\x83\x01\x91\x83\x01a\x10\xFCV[P\x96\x95PPPPPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x11@Wa\x11@a\x10\x13V[P`\x1F\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16` \x01\x90V[_\x80_``\x84\x86\x03\x12\x15a\x11~W_\x80\xFD[\x835g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x11\x95W_\x80\xFD[a\x11\xA1\x87\x83\x88\x01a\x10\xB2V[\x94P` \x91P\x81\x86\x015\x81\x81\x11\x15a\x11\xB7W_\x80\xFD[a\x11\xC3\x88\x82\x89\x01a\x10\xB2V[\x94PP`@\x80\x87\x015\x82\x81\x11\x15a\x11\xD8W_\x80\xFD[\x87\x01`\x1F\x81\x01\x89\x13a\x11\xE8W_\x80\xFD[\x805a\x11\xF6a\x10\xD1\x82a\x10\x8FV[\x81\x81R`\x05\x91\x90\x91\x1B\x82\x01\x85\x01\x90\x85\x81\x01\x90\x8B\x83\x11\x15a\x12\x14W_\x80\xFD[\x86\x84\x01[\x83\x81\x10\x15a\x12\x81W\x805\x87\x81\x11\x15a\x12.W_\x80\xFD[\x85\x01`?\x81\x01\x8E\x13a\x12>W_\x80\xFD[\x88\x81\x015a\x12Na\x10\xD1\x82a\x11'V[\x81\x81R\x8F\x89\x83\x85\x01\x01\x11\x15a\x12aW_\x80\xFD[\x81\x89\x84\x01\x8C\x83\x017_\x91\x81\x01\x8B\x01\x91\x90\x91R\x84RP\x91\x87\x01\x91\x87\x01a\x12\x18V[P\x80\x97PPPPPPPP\x92P\x92P\x92V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`2`\x04R`$_\xFD[_[\x83\x81\x10\x15a\x12\xDAW\x81\x81\x01Q\x83\x82\x01R` \x01a\x12\xC2V[PP_\x91\x01RV[_`@\x82\x01\x84\x83R` `@\x81\x85\x01R\x81\x85Q\x80\x84R``\x86\x01\x91P``\x81`\x05\x1B\x87\x01\x01\x93P\x82\x87\x01_[\x82\x81\x10\x15a\x13\x90W\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xA0\x88\x87\x03\x01\x84R\x81Q\x80Q\x80\x88Ra\x13S\x81\x88\x8A\x01\x89\x85\x01a\x12\xC0V[`\x1F\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x96\x90\x96\x01\x85\x01\x95P\x92\x84\x01\x92\x90\x84\x01\x90`\x01\x01a\x13\x0EV[P\x93\x98\x97PPPPPPPPV[_` \x80\x83\x85\x03\x12\x15a\x13\xAFW_\x80\xFD[\x82Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x13\xC6W_\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x13\xD9W_\x80\xFD[\x81Qa\x13\xE7a\x10\xD1\x82a\x10\x8FV[\x81\x81R`\x05\x91\x90\x91\x1B\x83\x01\x84\x01\x90\x84\x81\x01\x90\x88\x83\x11\x15a\x14\x05W_\x80\xFD[\x85\x85\x01[\x83\x81\x10\x15a\x14sW\x80Q\x85\x81\x11\x15a\x14\x1FW_\x80\xFD[\x86\x01`?\x81\x01\x8B\x13a\x14/W_\x80\xFD[\x87\x81\x01Q`@a\x14Aa\x10\xD1\x83a\x11'V[\x82\x81R\x8D\x82\x84\x86\x01\x01\x11\x15a\x14TW_\x80\xFD[a\x14c\x83\x8C\x83\x01\x84\x87\x01a\x12\xC0V[\x86RPPP\x91\x86\x01\x91\x86\x01a\x14\tV[P\x98\x97PPPPPPPPV[\x81\x83R\x81\x81` \x85\x017P_` \x82\x84\x01\x01R_` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x84\x01\x01\x90P\x92\x91PPV[_\x80\x835\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE1\x846\x03\x01\x81\x12a\x14\xFAW_\x80\xFD[\x83\x01` \x81\x01\x92P5\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x15\x19W_\x80\xFD[\x806\x03\x82\x13\x15a\x0E^W_\x80\xFD[_`@\x82\x01\x85\x83R` `@` \x85\x01R\x81\x85\x83R``\x85\x01\x90P``\x86`\x05\x1B\x86\x01\x01\x92P\x86_[\x87\x81\x10\x15a\x15\xA8W\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xA0\x87\x86\x03\x01\x83Ra\x15\x89\x82\x8Aa\x14\xC7V[a\x15\x94\x87\x82\x84a\x14\x80V[\x96PPP\x91\x83\x01\x91\x90\x83\x01\x90`\x01\x01a\x15PV[P\x92\x98\x97PPPPPPPPV[_` \x82\x84\x03\x12\x15a\x15\xC6W_\x80\xFD[PQ\x91\x90PV[_a\x15\xD8\x82\x83a\x14\xC7V[`@\x85Ra\x15\xEA`@\x86\x01\x82\x84a\x14\x80V[\x91PPa\x15\xFA` \x84\x01\x84a\x14\xC7V[\x85\x83\x03` \x87\x01Ra\x16\r\x83\x82\x84a\x14\x80V[\x96\x95PPPPPPV[`@\x81R_a\x16)`@\x83\x01\x86a\x15\xCDV[\x82\x81\x03` \x84\x01Ra\x16\r\x81\x85\x87a\x14\x80V[`@\x80\x82R\x81\x01\x84\x90R_```\x05\x86\x90\x1B\x83\x01\x81\x01\x90\x83\x01\x87\x83[\x88\x81\x10\x15a\x16\xDAW\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xA0\x86\x85\x03\x01\x83R\x815\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC1\x8B6\x03\x01\x81\x12a\x16\xB8W_\x80\xFD[a\x16\xC4\x85\x8C\x83\x01a\x15\xCDV[\x94PP` \x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x16XV[PPP\x82\x81\x03` \x84\x01Ra\x16\xF0\x81\x85\x87a\x14\x80V[\x97\x96PPPPPPPV\xFE\xA2dipfsX\"\x12 -i\xC6I`\xC7\xE4\xC5\xF4\xE7\x9D\x02\x88~~\r@\x03~\x12ObD\x0B\xDF\x115\x1F\0\xD6-\x88dsolcC\0\x08\x18\x003"; + const __BYTECODE: &[u8] = b"`\xE0`@R4\x80\x15b\0\0\x11W`\0\x80\xFD[P`@Qb\0\x16\x9A8\x03\x80b\0\x16\x9A\x839\x81\x01`@\x81\x90Rb\0\x004\x91b\0\x016V[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x85\x16\x90\x81\x17\x82U`@Q\x85\x92\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90\x82\x90\xA3P`\0[\x85Q\x81\x10\x15b\0\0\xDFW`\x01\x80`\0\x88\x84\x81Q\x81\x10b\0\0\xA4Wb\0\0\xA4b\0\x02TV[` \x90\x81\x02\x91\x90\x91\x01\x81\x01Q`\x01`\x01`\xA0\x1B\x03\x16\x82R\x81\x01\x91\x90\x91R`@\x01`\0 \x80T`\xFF\x19\x16\x91\x15\x15\x91\x90\x91\x17\x90U`\x01\x01b\0\0\x80V[P`\x01`\x01`\xA0\x1B\x03\x93\x84\x16`\xA0R\x90\x83\x16`\x80R\x90\x91\x16`\xC0RPb\0\x02j\x90PV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[\x80Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14b\0\x011W`\0\x80\xFD[\x91\x90PV[`\0\x80`\0\x80`\0`\xA0\x86\x88\x03\x12\x15b\0\x01OW`\0\x80\xFD[\x85Q`\x01`\x01`@\x1B\x03\x80\x82\x11\x15b\0\x01gW`\0\x80\xFD[\x81\x88\x01\x91P\x88`\x1F\x83\x01\x12b\0\x01|W`\0\x80\xFD[\x81Q` \x82\x82\x11\x15b\0\x01\x93Wb\0\x01\x93b\0\x01\x03V[\x81`\x05\x1B`@Q`\x1F\x19`?\x83\x01\x16\x81\x01\x81\x81\x10\x86\x82\x11\x17\x15b\0\x01\xBBWb\0\x01\xBBb\0\x01\x03V[`@R\x92\x83R\x81\x83\x01\x93P\x84\x81\x01\x82\x01\x92\x8C\x84\x11\x15b\0\x01\xDAW`\0\x80\xFD[\x94\x82\x01\x94[\x83\x86\x10\x15b\0\x02\x03Wb\0\x01\xF3\x86b\0\x01\x19V[\x85R\x94\x82\x01\x94\x93\x82\x01\x93b\0\x01\xDFV[\x99Pb\0\x02\x14\x90P\x8A\x82\x01b\0\x01\x19V[\x97PPPPPb\0\x02(`@\x87\x01b\0\x01\x19V[\x92Pb\0\x028``\x87\x01b\0\x01\x19V[\x91Pb\0\x02H`\x80\x87\x01b\0\x01\x19V[\x90P\x92\x95P\x92\x95\x90\x93PV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\x80Q`\xA0Q`\xC0Qa\x13\xC2b\0\x02\xD8`\09`\0\x81\x81`\xD3\x01R\x81\x81a\x03\x0B\x01Ra\x03\x8C\x01R`\0\x81\x81a\x01\xF3\x01R\x81\x81a\x02\x8D\x01R\x81\x81a\x04\xBB\x01R\x81\x81a\x05\xBD\x01R\x81\x81a\x08A\x01Ra\t;\x01R`\0\x81\x81a\x010\x01R\x81\x81a\x04.\x01Ra\x05\x1B\x01Ra\x13\xC2`\0\xF3\xFE`\x80`@R`\x046\x10a\0\xB5W`\x005`\xE0\x1C\x80c\x94V\xFB\xCC\x11a\0iW\x80c\xD0\xF2\xD8\xAC\x11a\0NW\x80c\xD0\xF2\xD8\xAC\x14a\x02\x15W\x80c\xE5\x13^\xC6\x14a\x025W\x80c\xF2\xFD\xE3\x8B\x14a\x02UW`\0\x80\xFD[\x80c\x94V\xFB\xCC\x14a\x01\xC1W\x80c\xABW&P\x14a\x01\xE1W`\0\x80\xFD[\x80cX]\xA6(\x11a\0\x9AW\x80cX]\xA6(\x14a\x01RW\x80ci\r\x83 \x14a\x01tW\x80c\x8D\xA5\xCB[\x14a\x01\x94W`\0\x80\xFD[\x80c\x12&\x1E\xE7\x14a\0\xC1W\x80c5\xA9\xE4\xDF\x14a\x01\x1EW`\0\x80\xFD[6a\0\xBCW\0[`\0\x80\xFD[4\x80\x15a\0\xCDW`\0\x80\xFD[Pa\0\xF5\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01*W`\0\x80\xFD[Pa\0\xF5\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[4\x80\x15a\x01^W`\0\x80\xFD[Pa\x01ra\x01m6`\x04a\r\xE5V[a\x02uV[\0[4\x80\x15a\x01\x80W`\0\x80\xFD[Pa\x01ra\x01\x8F6`\x04a\x0EsV[a\x05\xEDV[4\x80\x15a\x01\xA0W`\0\x80\xFD[P`\0Ta\0\xF5\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81V[4\x80\x15a\x01\xCDW`\0\x80\xFD[Pa\x01ra\x01\xDC6`\x04a\x0E\x97V[a\x06\x80V[4\x80\x15a\x01\xEDW`\0\x80\xFD[Pa\0\xF5\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[4\x80\x15a\x02!W`\0\x80\xFD[Pa\x01ra\x0206`\x04a\x0E\xD0V[a\x07\xB7V[4\x80\x15a\x02AW`\0\x80\xFD[Pa\x01ra\x02P6`\x04a\r\xE5V[a\x08\xB1V[4\x80\x15a\x02aW`\0\x80\xFD[Pa\x01ra\x02p6`\x04a\x0EsV[a\t\xAEV[3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x02\xE4W`@Q\x7F\x93?\xE5/\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80\x80a\x02\xF4\x84\x86\x01\x86a\x10HV[\x92P\x92P\x92P`\0[\x83Q\x81\x10\x15a\x04\xA9Wa\x03\x8A\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x86\x84\x81Q\x81\x10a\x03]Wa\x03]a\x11@V[` \x02` \x01\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\n\x9F\x90\x92\x91\x90c\xFF\xFF\xFF\xFF\x16V[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x87Q|E\x85\x83\x81Q\x81\x10a\x03\xD8Wa\x03\xD8a\x11@V[` \x90\x81\x02\x91\x90\x91\x01\x01Q`@Q\x7F\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\xE0\x84\x90\x1B\x16\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x91\x82\x16`\x04\x82\x01R\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x82\x16`$\x82\x01R`D\x81\x01\x91\x90\x91Re\xFF\xFF\xFF\xFF\xFF\xFF`d\x82\x01R`\x84\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x04\x85W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x04\x99W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x02\xFD\x90PV[P`\0[\x82Q\x81\x10\x15a\x05\x15Wa\x05\r\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x84\x81Q\x81\x10a\x03]Wa\x03]a\x11@V[`\x01\x01a\x04\xADV[P`\0\x80\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x83`@Qa\x05^\x91\x90a\x11oV[`\0`@Q\x80\x83\x03\x81`\0\x86Z\xF1\x91PP=\x80`\0\x81\x14a\x05\x9BW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x05\xA0V[``\x91P[P\x91P\x91P\x81a\x05\xB2W\x80Q` \x82\x01\xFD[G\x15a\x05\xE2Wa\x05\xE2\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Ga\x0BtV[PPPPPPPPPV[`\0Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x06sW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0C`$\x82\x01R\x7FUNAUTHORIZED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[a\x06}\x81Ga\x0C\x13V[PV[`\0Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x07\x01W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0C`$\x82\x01R\x7FUNAUTHORIZED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06jV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01Ra\x07\xB3\x90\x82\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07qW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\x95\x91\x90a\x11\x9EV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x16\x91\x90a\x0C\x88V[PPV[3`\0\x90\x81R`\x01` R`@\x81 T`\xFF\x16\x15\x15\x90\x03a\x08\x04W`@Q\x7F\x8Cn]q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x7F\r3X\x84\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90c\r3X\x84\x90a\x08z\x90\x86\x90\x86\x90\x86\x90`\x04\x01a\x12\xAFV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x08\x94W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08\xA8W=`\0\x80>=`\0\xFD[PPPPPPPV[3`\0\x90\x81R`\x01` R`@\x81 T`\xFF\x16\x15\x15\x90\x03a\x08\xFEW`@Q\x7F\x8Cn]q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x7F\x13\xFBr\xC7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90c\x13\xFBr\xC7\x90a\tv\x90\x87\x90\x87\x90\x87\x90\x87\x90`\x04\x01a\x12\xD5V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\t\x90W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\t\xA4W=`\0\x80>=`\0\xFD[PPPPPPPPV[`\0Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\n/W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0C`$\x82\x01R\x7FUNAUTHORIZED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06jV[`\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16\x90\x81\x17\x82U`@Q\x90\x913\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PV[`\0`@Q\x7F\t^\xA7\xB3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16`\x04\x82\x01R\x82`$\x82\x01R` `\0`D\x83`\0\x89Z\xF1=\x15`\x1F=\x11`\x01`\0Q\x14\x16\x17\x16\x91PP\x80a\x0BnW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0E`$\x82\x01R\x7FAPPROVE_FAILED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06jV[PPPPV[`\0\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x82`@Q`\0`@Q\x80\x83\x03\x81\x85\x87Z\xF1\x92PPP=\x80`\0\x81\x14a\x0B\xCEW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x0B\xD3V[``\x91P[PP\x90P\x80a\x0C\x0EW`@Q\x7F\xF4\xB3\xB1\xBC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPV[`\0\x80`\0\x80`\0\x85\x87Z\xF1\x90P\x80a\x0C\x0EW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x13`$\x82\x01R\x7FETH_TRANSFER_FAILED\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06jV[`\0`@Q\x7F\xA9\x05\x9C\xBB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16`\x04\x82\x01R\x82`$\x82\x01R` `\0`D\x83`\0\x89Z\xF1=\x15`\x1F=\x11`\x01`\0Q\x14\x16\x17\x16\x91PP\x80a\x0BnW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0F`$\x82\x01R\x7FTRANSFER_FAILED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06jV[`\0\x80\x83`\x1F\x84\x01\x12a\riW`\0\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\r\x81W`\0\x80\xFD[` \x83\x01\x91P\x83` \x82`\x05\x1B\x85\x01\x01\x11\x15a\r\x9CW`\0\x80\xFD[\x92P\x92\x90PV[`\0\x80\x83`\x1F\x84\x01\x12a\r\xB5W`\0\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\r\xCDW`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\r\x9CW`\0\x80\xFD[`\0\x80`\0\x80`@\x85\x87\x03\x12\x15a\r\xFBW`\0\x80\xFD[\x845g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0E\x13W`\0\x80\xFD[a\x0E\x1F\x88\x83\x89\x01a\rWV[\x90\x96P\x94P` \x87\x015\x91P\x80\x82\x11\x15a\x0E8W`\0\x80\xFD[Pa\x0EE\x87\x82\x88\x01a\r\xA3V[\x95\x98\x94\x97P\x95PPPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x06}W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\x0E\x85W`\0\x80\xFD[\x815a\x0E\x90\x81a\x0EQV[\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x0E\xAAW`\0\x80\xFD[\x825a\x0E\xB5\x81a\x0EQV[\x91P` \x83\x015a\x0E\xC5\x81a\x0EQV[\x80\x91PP\x92P\x92\x90PV[`\0\x80`\0`@\x84\x86\x03\x12\x15a\x0E\xE5W`\0\x80\xFD[\x835g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0E\xFDW`\0\x80\xFD[\x90\x85\x01\x90`@\x82\x88\x03\x12\x15a\x0F\x11W`\0\x80\xFD[\x90\x93P` \x85\x015\x90\x80\x82\x11\x15a\x0F'W`\0\x80\xFD[Pa\x0F4\x86\x82\x87\x01a\r\xA3V[\x94\x97\x90\x96P\x93\x94PPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`A`\x04R`$`\0\xFD[`@Q`\x1F\x82\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x0F\xB7Wa\x0F\xB7a\x0FAV[`@R\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a\x0F\xD0W`\0\x80\xFD[\x815` g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x0F\xECWa\x0F\xECa\x0FAV[\x81`\x05\x1Ba\x0F\xFB\x82\x82\x01a\x0FpV[\x92\x83R\x84\x81\x01\x82\x01\x92\x82\x81\x01\x90\x87\x85\x11\x15a\x10\x15W`\0\x80\xFD[\x83\x87\x01\x92P[\x84\x83\x10\x15a\x10=W\x825a\x10.\x81a\x0EQV[\x82R\x91\x83\x01\x91\x90\x83\x01\x90a\x10\x1BV[\x97\x96PPPPPPPV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x10]W`\0\x80\xFD[\x835g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x10uW`\0\x80\xFD[a\x10\x81\x87\x83\x88\x01a\x0F\xBFV[\x94P` \x91P\x81\x86\x015\x81\x81\x11\x15a\x10\x98W`\0\x80\xFD[a\x10\xA4\x88\x82\x89\x01a\x0F\xBFV[\x94PP`@\x86\x015\x81\x81\x11\x15a\x10\xB9W`\0\x80\xFD[\x86\x01`\x1F\x81\x01\x88\x13a\x10\xCAW`\0\x80\xFD[\x805\x82\x81\x11\x15a\x10\xDCWa\x10\xDCa\x0FAV[a\x11\x0C\x84\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x01a\x0FpV[\x92P\x80\x83R\x88\x84\x82\x84\x01\x01\x11\x15a\x11\"W`\0\x80\xFD[\x80\x84\x83\x01\x85\x85\x017`\0\x84\x82\x85\x01\x01RPP\x80\x92PPP\x92P\x92P\x92V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`2`\x04R`$`\0\xFD[`\0\x82Q`\0[\x81\x81\x10\x15a\x11\x90W` \x81\x86\x01\x81\x01Q\x85\x83\x01R\x01a\x11vV[P`\0\x92\x01\x91\x82RP\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x11\xB0W`\0\x80\xFD[PQ\x91\x90PV[`\0\x80\x835\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE1\x846\x03\x01\x81\x12a\x11\xECW`\0\x80\xFD[\x83\x01` \x81\x01\x92P5\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x12\x0CW`\0\x80\xFD[\x806\x03\x82\x13\x15a\r\x9CW`\0\x80\xFD[\x81\x83R\x81\x81` \x85\x017P`\0` \x82\x84\x01\x01R`\0` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x84\x01\x01\x90P\x92\x91PPV[`\0a\x12p\x82\x83a\x11\xB7V[`@\x85Ra\x12\x82`@\x86\x01\x82\x84a\x12\x1BV[\x91PPa\x12\x92` \x84\x01\x84a\x11\xB7V[\x85\x83\x03` \x87\x01Ra\x12\xA5\x83\x82\x84a\x12\x1BV[\x96\x95PPPPPPV[`@\x81R`\0a\x12\xC2`@\x83\x01\x86a\x12dV[\x82\x81\x03` \x84\x01Ra\x12\xA5\x81\x85\x87a\x12\x1BV[`@\x80\x82R\x81\x01\x84\x90R`\0```\x05\x86\x90\x1B\x83\x01\x81\x01\x90\x83\x01\x87\x83\x80[\x89\x81\x10\x15a\x13uW\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xA0\x87\x86\x03\x01\x84R\x825\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC1\x8C6\x03\x01\x81\x12a\x13SW\x82\x83\xFD[a\x13_\x86\x8D\x83\x01a\x12dV[\x95PP` \x93\x84\x01\x93\x92\x90\x92\x01\x91`\x01\x01a\x12\xF3V[PPPP\x82\x81\x03` \x84\x01Ra\x10=\x81\x85\x87a\x12\x1BV\xFE\xA2dipfsX\"\x12 H\x91\xC7\xFA1\0\xCE2K\xDA) 7lh\xD9H0\xC8\xC5OS<[\x81\x97@\xAA\x05\xE6\x95pdsolcC\0\x08\x18\x003"; /// The bytecode of the contract. - pub static SWAPROUTER02EXECUTOR_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( + pub static UNIVERSALROUTEREXECUTOR_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __BYTECODE, ); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\0\xC6W_5`\xE0\x1C\x80c\x8C!\xB4\x11\x11a\0qW\x80c\xD0\xF2\xD8\xAC\x11a\0LW\x80c\xD0\xF2\xD8\xAC\x14a\x02oW\x80c\xE5\x13^\xC6\x14a\x02\x8EW\x80c\xF2\xFD\xE3\x8B\x14a\x02\xADW_\x80\xFD[\x80c\x8C!\xB4\x11\x14a\x01\xDEW\x80c\x8D\xA5\xCB[\x14a\x02\x11W\x80c\xABW&P\x14a\x02=_\xFD[PPPP`@Q=_\x82>`\x1F=\x90\x81\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x82\x01`@Ra\x05G\x91\x90\x81\x01\x90a\x13\x9EV[PG\x15a\x05xWa\x05x\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Ga\r\x10V[PPPPPPPV[_Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x06\x06W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0C`$\x82\x01R\x7FUNAUTHORIZED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[_[\x83\x81\x10\x15a\x06\xA1Wa\x06\x99\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x87\x87\x85\x81\x81\x10a\x06gWa\x06ga\x12\x93V[\x90P` \x02\x01` \x81\x01\x90a\x06|\x91\x90a\x0F\x86V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x91\x90a\x0C?V[`\x01\x01a\x06\x08V[P`@Q\x7FZ\xE4\x01\xDC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90cZ\xE4\x01\xDC\x90a\x078\x90\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x86\x90\x86\x90`\x04\x01a\x15'V[_`@Q\x80\x83\x03\x81_\x87Z\xF1\x15\x80\x15a\x07SW=_\x80>=_\xFD[PPPP`@Q=_\x82>`\x1F=\x90\x81\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x82\x01`@Ra\x07\x98\x91\x90\x81\x01\x90a\x13\x9EV[PPPPPV[_Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x08\x1FW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0C`$\x82\x01R\x7FUNAUTHORIZED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x05\xFDV[a\x08)\x81Ga\r\xABV[PV[_Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x08\xACW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0C`$\x82\x01R\x7FUNAUTHORIZED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x05\xFDV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01R_\x90\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\t6W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\tZ\x91\x90a\x15\xB6V[`@Q\x7F.\x1A}M\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R\x90\x91P\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90c.\x1A}M\x90`$\x01_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\t\xE2W_\x80\xFD[PZ\xF1\x15\x80\x15a\t\xF4W=_\x80>=_\xFD[PPPPa\n\x02\x82Ga\r\xABV[PPV[`@Q\x7F\r3X\x84\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90c\r3X\x84\x90a\n|\x90\x86\x90\x86\x90\x86\x90`\x04\x01a\x16\x17V[_`@Q\x80\x83\x03\x81_\x87\x80;\x15\x80\x15a\n\x93W_\x80\xFD[PZ\xF1\x15\x80\x15a\x05xW=_\x80>=_\xFD[`@Q\x7F\x13\xFBr\xC7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90c\x13\xFBr\xC7\x90a\x0B\x1D\x90\x87\x90\x87\x90\x87\x90\x87\x90`\x04\x01a\x16=_\xFD[PPPPPPPPV[_Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x0B\xD0W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0C`$\x82\x01R\x7FUNAUTHORIZED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x05\xFDV[_\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16\x90\x81\x17\x82U`@Q\x90\x913\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PV[_`@Q\x7F\t^\xA7\xB3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16`\x04\x82\x01R\x82`$\x82\x01R` _`D\x83_\x89Z\xF1=\x15`\x1F=\x11`\x01_Q\x14\x16\x17\x16\x91PP\x80a\r\nW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0E`$\x82\x01R\x7FAPPROVE_FAILED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x05\xFDV[PPPPV[_\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x82`@Q_`@Q\x80\x83\x03\x81\x85\x87Z\xF1\x92PPP=\x80_\x81\x14a\rfW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\rkV[``\x91P[PP\x90P\x80a\r\xA6W`@Q\x7F\xF4\xB3\xB1\xBC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPV[_\x80_\x80_\x85\x87Z\xF1\x90P\x80a\r\xA6W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x13`$\x82\x01R\x7FETH_TRANSFER_FAILED\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x05\xFDV[_\x80\x83`\x1F\x84\x01\x12a\x0E-W_\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x0EDW_\x80\xFD[` \x83\x01\x91P\x83` \x82`\x05\x1B\x85\x01\x01\x11\x15a\x0E^W_\x80\xFD[\x92P\x92\x90PV[_\x80\x83`\x1F\x84\x01\x12a\x0EuW_\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x0E\x8CW_\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\x0E^W_\x80\xFD[_\x80_\x80`@\x85\x87\x03\x12\x15a\x0E\xB6W_\x80\xFD[\x845g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0E\xCDW_\x80\xFD[a\x0E\xD9\x88\x83\x89\x01a\x0E\x1DV[\x90\x96P\x94P` \x87\x015\x91P\x80\x82\x11\x15a\x0E\xF1W_\x80\xFD[Pa\x0E\xFE\x87\x82\x88\x01a\x0EeV[\x95\x98\x94\x97P\x95PPPPV[_\x80_\x80`@\x85\x87\x03\x12\x15a\x0F\x1DW_\x80\xFD[\x845g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0F4W_\x80\xFD[a\x0F@\x88\x83\x89\x01a\x0E\x1DV[\x90\x96P\x94P` \x87\x015\x91P\x80\x82\x11\x15a\x0FXW_\x80\xFD[Pa\x0E\xFE\x87\x82\x88\x01a\x0E\x1DV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x08)W_\x80\xFD[_` \x82\x84\x03\x12\x15a\x0F\x96W_\x80\xFD[\x815a\x0F\xA1\x81a\x0FeV[\x93\x92PPPV[_\x80_`@\x84\x86\x03\x12\x15a\x0F\xBAW_\x80\xFD[\x835g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0F\xD1W_\x80\xFD[\x90\x85\x01\x90`@\x82\x88\x03\x12\x15a\x0F\xE4W_\x80\xFD[\x90\x93P` \x85\x015\x90\x80\x82\x11\x15a\x0F\xF9W_\x80\xFD[Pa\x10\x06\x86\x82\x87\x01a\x0EeV[\x94\x97\x90\x96P\x93\x94PPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`A`\x04R`$_\xFD[`@Q`\x1F\x82\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x10\x87Wa\x10\x87a\x10\x13V[`@R\x91\x90PV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x10\xA8Wa\x10\xA8a\x10\x13V[P`\x05\x1B` \x01\x90V[_\x82`\x1F\x83\x01\x12a\x10\xC1W_\x80\xFD[\x815` a\x10\xD6a\x10\xD1\x83a\x10\x8FV[a\x10@V[\x80\x83\x82R` \x82\x01\x91P` \x84`\x05\x1B\x87\x01\x01\x93P\x86\x84\x11\x15a\x10\xF7W_\x80\xFD[` \x86\x01[\x84\x81\x10\x15a\x11\x1CW\x805a\x11\x0F\x81a\x0FeV[\x83R\x91\x83\x01\x91\x83\x01a\x10\xFCV[P\x96\x95PPPPPPV[_g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x11@Wa\x11@a\x10\x13V[P`\x1F\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16` \x01\x90V[_\x80_``\x84\x86\x03\x12\x15a\x11~W_\x80\xFD[\x835g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x11\x95W_\x80\xFD[a\x11\xA1\x87\x83\x88\x01a\x10\xB2V[\x94P` \x91P\x81\x86\x015\x81\x81\x11\x15a\x11\xB7W_\x80\xFD[a\x11\xC3\x88\x82\x89\x01a\x10\xB2V[\x94PP`@\x80\x87\x015\x82\x81\x11\x15a\x11\xD8W_\x80\xFD[\x87\x01`\x1F\x81\x01\x89\x13a\x11\xE8W_\x80\xFD[\x805a\x11\xF6a\x10\xD1\x82a\x10\x8FV[\x81\x81R`\x05\x91\x90\x91\x1B\x82\x01\x85\x01\x90\x85\x81\x01\x90\x8B\x83\x11\x15a\x12\x14W_\x80\xFD[\x86\x84\x01[\x83\x81\x10\x15a\x12\x81W\x805\x87\x81\x11\x15a\x12.W_\x80\xFD[\x85\x01`?\x81\x01\x8E\x13a\x12>W_\x80\xFD[\x88\x81\x015a\x12Na\x10\xD1\x82a\x11'V[\x81\x81R\x8F\x89\x83\x85\x01\x01\x11\x15a\x12aW_\x80\xFD[\x81\x89\x84\x01\x8C\x83\x017_\x91\x81\x01\x8B\x01\x91\x90\x91R\x84RP\x91\x87\x01\x91\x87\x01a\x12\x18V[P\x80\x97PPPPPPPP\x92P\x92P\x92V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_R`2`\x04R`$_\xFD[_[\x83\x81\x10\x15a\x12\xDAW\x81\x81\x01Q\x83\x82\x01R` \x01a\x12\xC2V[PP_\x91\x01RV[_`@\x82\x01\x84\x83R` `@\x81\x85\x01R\x81\x85Q\x80\x84R``\x86\x01\x91P``\x81`\x05\x1B\x87\x01\x01\x93P\x82\x87\x01_[\x82\x81\x10\x15a\x13\x90W\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xA0\x88\x87\x03\x01\x84R\x81Q\x80Q\x80\x88Ra\x13S\x81\x88\x8A\x01\x89\x85\x01a\x12\xC0V[`\x1F\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x96\x90\x96\x01\x85\x01\x95P\x92\x84\x01\x92\x90\x84\x01\x90`\x01\x01a\x13\x0EV[P\x93\x98\x97PPPPPPPPV[_` \x80\x83\x85\x03\x12\x15a\x13\xAFW_\x80\xFD[\x82Qg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x13\xC6W_\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x13\xD9W_\x80\xFD[\x81Qa\x13\xE7a\x10\xD1\x82a\x10\x8FV[\x81\x81R`\x05\x91\x90\x91\x1B\x83\x01\x84\x01\x90\x84\x81\x01\x90\x88\x83\x11\x15a\x14\x05W_\x80\xFD[\x85\x85\x01[\x83\x81\x10\x15a\x14sW\x80Q\x85\x81\x11\x15a\x14\x1FW_\x80\xFD[\x86\x01`?\x81\x01\x8B\x13a\x14/W_\x80\xFD[\x87\x81\x01Q`@a\x14Aa\x10\xD1\x83a\x11'V[\x82\x81R\x8D\x82\x84\x86\x01\x01\x11\x15a\x14TW_\x80\xFD[a\x14c\x83\x8C\x83\x01\x84\x87\x01a\x12\xC0V[\x86RPPP\x91\x86\x01\x91\x86\x01a\x14\tV[P\x98\x97PPPPPPPPV[\x81\x83R\x81\x81` \x85\x017P_` \x82\x84\x01\x01R_` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x84\x01\x01\x90P\x92\x91PPV[_\x80\x835\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE1\x846\x03\x01\x81\x12a\x14\xFAW_\x80\xFD[\x83\x01` \x81\x01\x92P5\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x15\x19W_\x80\xFD[\x806\x03\x82\x13\x15a\x0E^W_\x80\xFD[_`@\x82\x01\x85\x83R` `@` \x85\x01R\x81\x85\x83R``\x85\x01\x90P``\x86`\x05\x1B\x86\x01\x01\x92P\x86_[\x87\x81\x10\x15a\x15\xA8W\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xA0\x87\x86\x03\x01\x83Ra\x15\x89\x82\x8Aa\x14\xC7V[a\x15\x94\x87\x82\x84a\x14\x80V[\x96PPP\x91\x83\x01\x91\x90\x83\x01\x90`\x01\x01a\x15PV[P\x92\x98\x97PPPPPPPPV[_` \x82\x84\x03\x12\x15a\x15\xC6W_\x80\xFD[PQ\x91\x90PV[_a\x15\xD8\x82\x83a\x14\xC7V[`@\x85Ra\x15\xEA`@\x86\x01\x82\x84a\x14\x80V[\x91PPa\x15\xFA` \x84\x01\x84a\x14\xC7V[\x85\x83\x03` \x87\x01Ra\x16\r\x83\x82\x84a\x14\x80V[\x96\x95PPPPPPV[`@\x81R_a\x16)`@\x83\x01\x86a\x15\xCDV[\x82\x81\x03` \x84\x01Ra\x16\r\x81\x85\x87a\x14\x80V[`@\x80\x82R\x81\x01\x84\x90R_```\x05\x86\x90\x1B\x83\x01\x81\x01\x90\x83\x01\x87\x83[\x88\x81\x10\x15a\x16\xDAW\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xA0\x86\x85\x03\x01\x83R\x815\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC1\x8B6\x03\x01\x81\x12a\x16\xB8W_\x80\xFD[a\x16\xC4\x85\x8C\x83\x01a\x15\xCDV[\x94PP` \x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x16XV[PPP\x82\x81\x03` \x84\x01Ra\x16\xF0\x81\x85\x87a\x14\x80V[\x97\x96PPPPPPPV\xFE\xA2dipfsX\"\x12 -i\xC6I`\xC7\xE4\xC5\xF4\xE7\x9D\x02\x88~~\r@\x03~\x12ObD\x0B\xDF\x115\x1F\0\xD6-\x88dsolcC\0\x08\x18\x003"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\0\xB5W`\x005`\xE0\x1C\x80c\x94V\xFB\xCC\x11a\0iW\x80c\xD0\xF2\xD8\xAC\x11a\0NW\x80c\xD0\xF2\xD8\xAC\x14a\x02\x15W\x80c\xE5\x13^\xC6\x14a\x025W\x80c\xF2\xFD\xE3\x8B\x14a\x02UW`\0\x80\xFD[\x80c\x94V\xFB\xCC\x14a\x01\xC1W\x80c\xABW&P\x14a\x01\xE1W`\0\x80\xFD[\x80cX]\xA6(\x11a\0\x9AW\x80cX]\xA6(\x14a\x01RW\x80ci\r\x83 \x14a\x01tW\x80c\x8D\xA5\xCB[\x14a\x01\x94W`\0\x80\xFD[\x80c\x12&\x1E\xE7\x14a\0\xC1W\x80c5\xA9\xE4\xDF\x14a\x01\x1EW`\0\x80\xFD[6a\0\xBCW\0[`\0\x80\xFD[4\x80\x15a\0\xCDW`\0\x80\xFD[Pa\0\xF5\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01*W`\0\x80\xFD[Pa\0\xF5\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[4\x80\x15a\x01^W`\0\x80\xFD[Pa\x01ra\x01m6`\x04a\r\xE5V[a\x02uV[\0[4\x80\x15a\x01\x80W`\0\x80\xFD[Pa\x01ra\x01\x8F6`\x04a\x0EsV[a\x05\xEDV[4\x80\x15a\x01\xA0W`\0\x80\xFD[P`\0Ta\0\xF5\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81V[4\x80\x15a\x01\xCDW`\0\x80\xFD[Pa\x01ra\x01\xDC6`\x04a\x0E\x97V[a\x06\x80V[4\x80\x15a\x01\xEDW`\0\x80\xFD[Pa\0\xF5\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81V[4\x80\x15a\x02!W`\0\x80\xFD[Pa\x01ra\x0206`\x04a\x0E\xD0V[a\x07\xB7V[4\x80\x15a\x02AW`\0\x80\xFD[Pa\x01ra\x02P6`\x04a\r\xE5V[a\x08\xB1V[4\x80\x15a\x02aW`\0\x80\xFD[Pa\x01ra\x02p6`\x04a\x0EsV[a\t\xAEV[3s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x02\xE4W`@Q\x7F\x93?\xE5/\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80\x80a\x02\xF4\x84\x86\x01\x86a\x10HV[\x92P\x92P\x92P`\0[\x83Q\x81\x10\x15a\x04\xA9Wa\x03\x8A\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x86\x84\x81Q\x81\x10a\x03]Wa\x03]a\x11@V[` \x02` \x01\x01Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\n\x9F\x90\x92\x91\x90c\xFF\xFF\xFF\xFF\x16V[\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16c\x87Q|E\x85\x83\x81Q\x81\x10a\x03\xD8Wa\x03\xD8a\x11@V[` \x90\x81\x02\x91\x90\x91\x01\x01Q`@Q\x7F\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\xE0\x84\x90\x1B\x16\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x91\x82\x16`\x04\x82\x01R\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x82\x16`$\x82\x01R`D\x81\x01\x91\x90\x91Re\xFF\xFF\xFF\xFF\xFF\xFF`d\x82\x01R`\x84\x01`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x04\x85W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x04\x99W=`\0\x80>=`\0\xFD[PP`\x01\x90\x92\x01\x91Pa\x02\xFD\x90PV[P`\0[\x82Q\x81\x10\x15a\x05\x15Wa\x05\r\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x84\x81Q\x81\x10a\x03]Wa\x03]a\x11@V[`\x01\x01a\x04\xADV[P`\0\x80\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x83`@Qa\x05^\x91\x90a\x11oV[`\0`@Q\x80\x83\x03\x81`\0\x86Z\xF1\x91PP=\x80`\0\x81\x14a\x05\x9BW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x05\xA0V[``\x91P[P\x91P\x91P\x81a\x05\xB2W\x80Q` \x82\x01\xFD[G\x15a\x05\xE2Wa\x05\xE2\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Ga\x0BtV[PPPPPPPPPV[`\0Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x06sW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0C`$\x82\x01R\x7FUNAUTHORIZED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[a\x06}\x81Ga\x0C\x13V[PV[`\0Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x07\x01W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0C`$\x82\x01R\x7FUNAUTHORIZED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06jV[`@Q\x7Fp\xA0\x821\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R0`\x04\x82\x01Ra\x07\xB3\x90\x82\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07qW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\x95\x91\x90a\x11\x9EV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x16\x91\x90a\x0C\x88V[PPV[3`\0\x90\x81R`\x01` R`@\x81 T`\xFF\x16\x15\x15\x90\x03a\x08\x04W`@Q\x7F\x8Cn]q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x7F\r3X\x84\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90c\r3X\x84\x90a\x08z\x90\x86\x90\x86\x90\x86\x90`\x04\x01a\x12\xAFV[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\x08\x94W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\x08\xA8W=`\0\x80>=`\0\xFD[PPPPPPPV[3`\0\x90\x81R`\x01` R`@\x81 T`\xFF\x16\x15\x15\x90\x03a\x08\xFEW`@Q\x7F\x8Cn]q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x7F\x13\xFBr\xC7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x90c\x13\xFBr\xC7\x90a\tv\x90\x87\x90\x87\x90\x87\x90\x87\x90`\x04\x01a\x12\xD5V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\t\x90W`\0\x80\xFD[PZ\xF1\x15\x80\x15a\t\xA4W=`\0\x80>=`\0\xFD[PPPPPPPPV[`\0Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\n/W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0C`$\x82\x01R\x7FUNAUTHORIZED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06jV[`\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16\x90\x81\x17\x82U`@Q\x90\x913\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PV[`\0`@Q\x7F\t^\xA7\xB3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16`\x04\x82\x01R\x82`$\x82\x01R` `\0`D\x83`\0\x89Z\xF1=\x15`\x1F=\x11`\x01`\0Q\x14\x16\x17\x16\x91PP\x80a\x0BnW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0E`$\x82\x01R\x7FAPPROVE_FAILED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06jV[PPPPV[`\0\x82s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x82`@Q`\0`@Q\x80\x83\x03\x81\x85\x87Z\xF1\x92PPP=\x80`\0\x81\x14a\x0B\xCEW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x0B\xD3V[``\x91P[PP\x90P\x80a\x0C\x0EW`@Q\x7F\xF4\xB3\xB1\xBC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPV[`\0\x80`\0\x80`\0\x85\x87Z\xF1\x90P\x80a\x0C\x0EW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x13`$\x82\x01R\x7FETH_TRANSFER_FAILED\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06jV[`\0`@Q\x7F\xA9\x05\x9C\xBB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16`\x04\x82\x01R\x82`$\x82\x01R` `\0`D\x83`\0\x89Z\xF1=\x15`\x1F=\x11`\x01`\0Q\x14\x16\x17\x16\x91PP\x80a\x0BnW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0F`$\x82\x01R\x7FTRANSFER_FAILED\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06jV[`\0\x80\x83`\x1F\x84\x01\x12a\riW`\0\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\r\x81W`\0\x80\xFD[` \x83\x01\x91P\x83` \x82`\x05\x1B\x85\x01\x01\x11\x15a\r\x9CW`\0\x80\xFD[\x92P\x92\x90PV[`\0\x80\x83`\x1F\x84\x01\x12a\r\xB5W`\0\x80\xFD[P\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\r\xCDW`\0\x80\xFD[` \x83\x01\x91P\x83` \x82\x85\x01\x01\x11\x15a\r\x9CW`\0\x80\xFD[`\0\x80`\0\x80`@\x85\x87\x03\x12\x15a\r\xFBW`\0\x80\xFD[\x845g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0E\x13W`\0\x80\xFD[a\x0E\x1F\x88\x83\x89\x01a\rWV[\x90\x96P\x94P` \x87\x015\x91P\x80\x82\x11\x15a\x0E8W`\0\x80\xFD[Pa\x0EE\x87\x82\x88\x01a\r\xA3V[\x95\x98\x94\x97P\x95PPPPV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x06}W`\0\x80\xFD[`\0` \x82\x84\x03\x12\x15a\x0E\x85W`\0\x80\xFD[\x815a\x0E\x90\x81a\x0EQV[\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x0E\xAAW`\0\x80\xFD[\x825a\x0E\xB5\x81a\x0EQV[\x91P` \x83\x015a\x0E\xC5\x81a\x0EQV[\x80\x91PP\x92P\x92\x90PV[`\0\x80`\0`@\x84\x86\x03\x12\x15a\x0E\xE5W`\0\x80\xFD[\x835g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x0E\xFDW`\0\x80\xFD[\x90\x85\x01\x90`@\x82\x88\x03\x12\x15a\x0F\x11W`\0\x80\xFD[\x90\x93P` \x85\x015\x90\x80\x82\x11\x15a\x0F'W`\0\x80\xFD[Pa\x0F4\x86\x82\x87\x01a\r\xA3V[\x94\x97\x90\x96P\x93\x94PPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`A`\x04R`$`\0\xFD[`@Q`\x1F\x82\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x0F\xB7Wa\x0F\xB7a\x0FAV[`@R\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a\x0F\xD0W`\0\x80\xFD[\x815` g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x15a\x0F\xECWa\x0F\xECa\x0FAV[\x81`\x05\x1Ba\x0F\xFB\x82\x82\x01a\x0FpV[\x92\x83R\x84\x81\x01\x82\x01\x92\x82\x81\x01\x90\x87\x85\x11\x15a\x10\x15W`\0\x80\xFD[\x83\x87\x01\x92P[\x84\x83\x10\x15a\x10=W\x825a\x10.\x81a\x0EQV[\x82R\x91\x83\x01\x91\x90\x83\x01\x90a\x10\x1BV[\x97\x96PPPPPPPV[`\0\x80`\0``\x84\x86\x03\x12\x15a\x10]W`\0\x80\xFD[\x835g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x10uW`\0\x80\xFD[a\x10\x81\x87\x83\x88\x01a\x0F\xBFV[\x94P` \x91P\x81\x86\x015\x81\x81\x11\x15a\x10\x98W`\0\x80\xFD[a\x10\xA4\x88\x82\x89\x01a\x0F\xBFV[\x94PP`@\x86\x015\x81\x81\x11\x15a\x10\xB9W`\0\x80\xFD[\x86\x01`\x1F\x81\x01\x88\x13a\x10\xCAW`\0\x80\xFD[\x805\x82\x81\x11\x15a\x10\xDCWa\x10\xDCa\x0FAV[a\x11\x0C\x84\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x01a\x0FpV[\x92P\x80\x83R\x88\x84\x82\x84\x01\x01\x11\x15a\x11\"W`\0\x80\xFD[\x80\x84\x83\x01\x85\x85\x017`\0\x84\x82\x85\x01\x01RPP\x80\x92PPP\x92P\x92P\x92V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`2`\x04R`$`\0\xFD[`\0\x82Q`\0[\x81\x81\x10\x15a\x11\x90W` \x81\x86\x01\x81\x01Q\x85\x83\x01R\x01a\x11vV[P`\0\x92\x01\x91\x82RP\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x11\xB0W`\0\x80\xFD[PQ\x91\x90PV[`\0\x80\x835\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE1\x846\x03\x01\x81\x12a\x11\xECW`\0\x80\xFD[\x83\x01` \x81\x01\x92P5\x90Pg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x12\x0CW`\0\x80\xFD[\x806\x03\x82\x13\x15a\r\x9CW`\0\x80\xFD[\x81\x83R\x81\x81` \x85\x017P`\0` \x82\x84\x01\x01R`\0` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x84\x01\x01\x90P\x92\x91PPV[`\0a\x12p\x82\x83a\x11\xB7V[`@\x85Ra\x12\x82`@\x86\x01\x82\x84a\x12\x1BV[\x91PPa\x12\x92` \x84\x01\x84a\x11\xB7V[\x85\x83\x03` \x87\x01Ra\x12\xA5\x83\x82\x84a\x12\x1BV[\x96\x95PPPPPPV[`@\x81R`\0a\x12\xC2`@\x83\x01\x86a\x12dV[\x82\x81\x03` \x84\x01Ra\x12\xA5\x81\x85\x87a\x12\x1BV[`@\x80\x82R\x81\x01\x84\x90R`\0```\x05\x86\x90\x1B\x83\x01\x81\x01\x90\x83\x01\x87\x83\x80[\x89\x81\x10\x15a\x13uW\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xA0\x87\x86\x03\x01\x84R\x825\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC1\x8C6\x03\x01\x81\x12a\x13SW\x82\x83\xFD[a\x13_\x86\x8D\x83\x01a\x12dV[\x95PP` \x93\x84\x01\x93\x92\x90\x92\x01\x91`\x01\x01a\x12\xF3V[PPPP\x82\x81\x03` \x84\x01Ra\x10=\x81\x85\x87a\x12\x1BV\xFE\xA2dipfsX\"\x12 H\x91\xC7\xFA1\0\xCE2K\xDA) 7lh\xD9H0\xC8\xC5OS<[\x81\x97@\xAA\x05\xE6\x95pdsolcC\0\x08\x18\x003"; /// The deployed bytecode of the contract. - pub static SWAPROUTER02EXECUTOR_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( + pub static UNIVERSALROUTEREXECUTOR_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( __DEPLOYED_BYTECODE, ); - pub struct SwapRouter02Executor(::ethers::contract::Contract); - impl ::core::clone::Clone for SwapRouter02Executor { + pub struct UniversalRouterExecutor(::ethers::contract::Contract); + impl ::core::clone::Clone for UniversalRouterExecutor { fn clone(&self) -> Self { Self(::core::clone::Clone::clone(&self.0)) } } - impl ::core::ops::Deref for SwapRouter02Executor { + impl ::core::ops::Deref for UniversalRouterExecutor { type Target = ::ethers::contract::Contract; fn deref(&self) -> &Self::Target { &self.0 } } - impl ::core::ops::DerefMut for SwapRouter02Executor { + impl ::core::ops::DerefMut for UniversalRouterExecutor { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } } - impl ::core::fmt::Debug for SwapRouter02Executor { + impl ::core::fmt::Debug for UniversalRouterExecutor { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(SwapRouter02Executor)) + f.debug_tuple(::core::stringify!(UniversalRouterExecutor)) .field(&self.address()) .finish() } } - impl SwapRouter02Executor { + impl UniversalRouterExecutor { /// Creates a new contract instance with the specified `ethers` client at /// `address`. The contract derefs to a `ethers::Contract` object. pub fn new>( @@ -489,7 +452,7 @@ pub mod swap_router_02_executor { Self( ::ethers::contract::Contract::new( address.into(), - SWAPROUTER02EXECUTOR_ABI.clone(), + UNIVERSALROUTEREXECUTOR_ABI.clone(), client, ), ) @@ -525,8 +488,8 @@ pub mod swap_router_02_executor { ::ethers::contract::ContractError, > { let factory = ::ethers::contract::ContractFactory::new( - SWAPROUTER02EXECUTOR_ABI.clone(), - SWAPROUTER02EXECUTOR_BYTECODE.clone().into(), + UNIVERSALROUTEREXECUTOR_ABI.clone(), + UNIVERSALROUTEREXECUTOR_BYTECODE.clone().into(), client, ); let deployer = factory.deploy(constructor_args)?; @@ -553,25 +516,26 @@ pub mod swap_router_02_executor { .method_hash([229, 19, 94, 198], (orders, callback_data)) .expect("method not found (this should never happen)") } - ///Calls the contract's `multicall` (0x63fb0b96) function - pub fn multicall( + ///Calls the contract's `owner` (0x8da5cb5b) function + pub fn owner( &self, - tokens_to_approve: ::std::vec::Vec<::ethers::core::types::Address>, - multicall_data: ::std::vec::Vec<::ethers::core::types::Bytes>, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall< + M, + ::ethers::core::types::Address, + > { self.0 - .method_hash([99, 251, 11, 150], (tokens_to_approve, multicall_data)) + .method_hash([141, 165, 203, 91], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `owner` (0x8da5cb5b) function - pub fn owner( + ///Calls the contract's `permit2` (0x12261ee7) function + pub fn permit_2( &self, ) -> ::ethers::contract::builders::ContractCall< M, ::ethers::core::types::Address, > { self.0 - .method_hash([141, 165, 203, 91], ()) + .method_hash([18, 38, 30, 231], ()) .expect("method not found (this should never happen)") } ///Calls the contract's `reactor` (0xab572650) function @@ -595,17 +559,6 @@ pub mod swap_router_02_executor { .method_hash([88, 93, 166, 40], (p0, callback_data)) .expect("method not found (this should never happen)") } - ///Calls the contract's `swapRouter02` (0x7eaf1116) function - pub fn swap_router_02( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([126, 175, 17, 22], ()) - .expect("method not found (this should never happen)") - } ///Calls the contract's `transferOwnership` (0xf2fde38b) function pub fn transfer_ownership( &self, @@ -615,35 +568,25 @@ pub mod swap_router_02_executor { .method_hash([242, 253, 227, 139], new_owner) .expect("method not found (this should never happen)") } - ///Calls the contract's `unwrapWETH` (0x89a3f136) function - pub fn unwrap_weth( - &self, - recipient: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([137, 163, 241, 54], recipient) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `weth` (0x3fc8cef3) function - pub fn weth( + ///Calls the contract's `universalRouter` (0x35a9e4df) function + pub fn universal_router( &self, ) -> ::ethers::contract::builders::ContractCall< M, ::ethers::core::types::Address, > { self.0 - .method_hash([63, 200, 206, 243], ()) + .method_hash([53, 169, 228, 223], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `whitelistedCaller` (0x8c21b411) function - pub fn whitelisted_caller( + ///Calls the contract's `withdrawERC20` (0x9456fbcc) function + pub fn withdraw_erc20( &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { + token: ::ethers::core::types::Address, + to: ::ethers::core::types::Address, + ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([140, 33, 180, 17], ()) + .method_hash([148, 86, 251, 204], (token, to)) .expect("method not found (this should never happen)") } ///Calls the contract's `withdrawETH` (0x690d8320) function @@ -677,7 +620,7 @@ pub mod swap_router_02_executor { } } impl From<::ethers::contract::Contract> - for SwapRouter02Executor { + for UniversalRouterExecutor { fn from(contract: ::ethers::contract::Contract) -> Self { Self::new(contract.address(), contract.client()) } @@ -738,7 +681,7 @@ pub mod swap_router_02_executor { Eq, Hash )] - pub enum SwapRouter02ExecutorErrors { + pub enum UniversalRouterExecutorErrors { CallerNotWhitelisted(CallerNotWhitelisted), MsgSenderNotReactor(MsgSenderNotReactor), NativeTransferFailed(NativeTransferFailed), @@ -746,7 +689,7 @@ pub mod swap_router_02_executor { /// Error(string) -- 0x08c379a0 RevertString(::std::string::String), } - impl ::ethers::core::abi::AbiDecode for SwapRouter02ExecutorErrors { + impl ::ethers::core::abi::AbiDecode for UniversalRouterExecutorErrors { fn decode( data: impl AsRef<[u8]>, ) -> ::core::result::Result { @@ -774,7 +717,7 @@ pub mod swap_router_02_executor { Err(::ethers::core::abi::Error::InvalidData.into()) } } - impl ::ethers::core::abi::AbiEncode for SwapRouter02ExecutorErrors { + impl ::ethers::core::abi::AbiEncode for UniversalRouterExecutorErrors { fn encode(self) -> ::std::vec::Vec { match self { Self::CallerNotWhitelisted(element) => { @@ -790,7 +733,7 @@ pub mod swap_router_02_executor { } } } - impl ::ethers::contract::ContractRevert for SwapRouter02ExecutorErrors { + impl ::ethers::contract::ContractRevert for UniversalRouterExecutorErrors { fn valid_selector(selector: [u8; 4]) -> bool { match selector { [0x08, 0xc3, 0x79, 0xa0] => true, @@ -810,7 +753,7 @@ pub mod swap_router_02_executor { } } } - impl ::core::fmt::Display for SwapRouter02ExecutorErrors { + impl ::core::fmt::Display for UniversalRouterExecutorErrors { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::CallerNotWhitelisted(element) => { @@ -826,22 +769,22 @@ pub mod swap_router_02_executor { } } } - impl ::core::convert::From<::std::string::String> for SwapRouter02ExecutorErrors { + impl ::core::convert::From<::std::string::String> for UniversalRouterExecutorErrors { fn from(value: String) -> Self { Self::RevertString(value) } } - impl ::core::convert::From for SwapRouter02ExecutorErrors { + impl ::core::convert::From for UniversalRouterExecutorErrors { fn from(value: CallerNotWhitelisted) -> Self { Self::CallerNotWhitelisted(value) } } - impl ::core::convert::From for SwapRouter02ExecutorErrors { + impl ::core::convert::From for UniversalRouterExecutorErrors { fn from(value: MsgSenderNotReactor) -> Self { Self::MsgSenderNotReactor(value) } } - impl ::core::convert::From for SwapRouter02ExecutorErrors { + impl ::core::convert::From for UniversalRouterExecutorErrors { fn from(value: NativeTransferFailed) -> Self { Self::NativeTransferFailed(value) } @@ -904,7 +847,7 @@ pub mod swap_router_02_executor { pub orders: ::std::vec::Vec, pub callback_data: ::ethers::core::types::Bytes, } - ///Container type for all input parameters for the `multicall` function with signature `multicall(address[],bytes[])` and selector `0x63fb0b96` + ///Container type for all input parameters for the `owner` function with signature `owner()` and selector `0x8da5cb5b` #[derive( Clone, ::ethers::contract::EthCall, @@ -917,12 +860,9 @@ pub mod swap_router_02_executor { Eq, Hash )] - #[ethcall(name = "multicall", abi = "multicall(address[],bytes[])")] - pub struct MulticallCall { - pub tokens_to_approve: ::std::vec::Vec<::ethers::core::types::Address>, - pub multicall_data: ::std::vec::Vec<::ethers::core::types::Bytes>, - } - ///Container type for all input parameters for the `owner` function with signature `owner()` and selector `0x8da5cb5b` + #[ethcall(name = "owner", abi = "owner()")] + pub struct OwnerCall; + ///Container type for all input parameters for the `permit2` function with signature `permit2()` and selector `0x12261ee7` #[derive( Clone, ::ethers::contract::EthCall, @@ -935,8 +875,8 @@ pub mod swap_router_02_executor { Eq, Hash )] - #[ethcall(name = "owner", abi = "owner()")] - pub struct OwnerCall; + #[ethcall(name = "permit2", abi = "permit2()")] + pub struct Permit2Call; ///Container type for all input parameters for the `reactor` function with signature `reactor()` and selector `0xab572650` #[derive( Clone, @@ -973,21 +913,6 @@ pub mod swap_router_02_executor { pub p0: ::std::vec::Vec, pub callback_data: ::ethers::core::types::Bytes, } - ///Container type for all input parameters for the `swapRouter02` function with signature `swapRouter02()` and selector `0x7eaf1116` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "swapRouter02", abi = "swapRouter02()")] - pub struct SwapRouter02Call; ///Container type for all input parameters for the `transferOwnership` function with signature `transferOwnership(address)` and selector `0xf2fde38b` #[derive( Clone, @@ -1005,7 +930,7 @@ pub mod swap_router_02_executor { pub struct TransferOwnershipCall { pub new_owner: ::ethers::core::types::Address, } - ///Container type for all input parameters for the `unwrapWETH` function with signature `unwrapWETH(address)` and selector `0x89a3f136` + ///Container type for all input parameters for the `universalRouter` function with signature `universalRouter()` and selector `0x35a9e4df` #[derive( Clone, ::ethers::contract::EthCall, @@ -1018,11 +943,9 @@ pub mod swap_router_02_executor { Eq, Hash )] - #[ethcall(name = "unwrapWETH", abi = "unwrapWETH(address)")] - pub struct UnwrapWETHCall { - pub recipient: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `weth` function with signature `weth()` and selector `0x3fc8cef3` + #[ethcall(name = "universalRouter", abi = "universalRouter()")] + pub struct UniversalRouterCall; + ///Container type for all input parameters for the `withdrawERC20` function with signature `withdrawERC20(address,address)` and selector `0x9456fbcc` #[derive( Clone, ::ethers::contract::EthCall, @@ -1035,23 +958,11 @@ pub mod swap_router_02_executor { Eq, Hash )] - #[ethcall(name = "weth", abi = "weth()")] - pub struct WethCall; - ///Container type for all input parameters for the `whitelistedCaller` function with signature `whitelistedCaller()` and selector `0x8c21b411` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "whitelistedCaller", abi = "whitelistedCaller()")] - pub struct WhitelistedCallerCall; + #[ethcall(name = "withdrawERC20", abi = "withdrawERC20(address,address)")] + pub struct WithdrawERC20Call { + pub token: ::ethers::core::types::Address, + pub to: ::ethers::core::types::Address, + } ///Container type for all input parameters for the `withdrawETH` function with signature `withdrawETH(address)` and selector `0x690d8320` #[derive( Clone, @@ -1080,21 +991,19 @@ pub mod swap_router_02_executor { Eq, Hash )] - pub enum SwapRouter02ExecutorCalls { + pub enum UniversalRouterExecutorCalls { Execute(ExecuteCall), ExecuteBatch(ExecuteBatchCall), - Multicall(MulticallCall), Owner(OwnerCall), + Permit2(Permit2Call), Reactor(ReactorCall), ReactorCallback(ReactorCallbackCall), - SwapRouter02(SwapRouter02Call), TransferOwnership(TransferOwnershipCall), - UnwrapWETH(UnwrapWETHCall), - Weth(WethCall), - WhitelistedCaller(WhitelistedCallerCall), + UniversalRouter(UniversalRouterCall), + WithdrawERC20(WithdrawERC20Call), WithdrawETH(WithdrawETHCall), } - impl ::ethers::core::abi::AbiDecode for SwapRouter02ExecutorCalls { + impl ::ethers::core::abi::AbiDecode for UniversalRouterExecutorCalls { fn decode( data: impl AsRef<[u8]>, ) -> ::core::result::Result { @@ -1109,15 +1018,15 @@ pub mod swap_router_02_executor { ) { return Ok(Self::ExecuteBatch(decoded)); } - if let Ok(decoded) = ::decode( + if let Ok(decoded) = ::decode( data, ) { - return Ok(Self::Multicall(decoded)); + return Ok(Self::Owner(decoded)); } - if let Ok(decoded) = ::decode( + if let Ok(decoded) = ::decode( data, ) { - return Ok(Self::Owner(decoded)); + return Ok(Self::Permit2(decoded)); } if let Ok(decoded) = ::decode( data, @@ -1129,30 +1038,20 @@ pub mod swap_router_02_executor { ) { return Ok(Self::ReactorCallback(decoded)); } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::SwapRouter02(decoded)); - } if let Ok(decoded) = ::decode( data, ) { return Ok(Self::TransferOwnership(decoded)); } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UnwrapWETH(decoded)); - } - if let Ok(decoded) = ::decode( + if let Ok(decoded) = ::decode( data, ) { - return Ok(Self::Weth(decoded)); + return Ok(Self::UniversalRouter(decoded)); } - if let Ok(decoded) = ::decode( + if let Ok(decoded) = ::decode( data, ) { - return Ok(Self::WhitelistedCaller(decoded)); + return Ok(Self::WithdrawERC20(decoded)); } if let Ok(decoded) = ::decode( data, @@ -1162,32 +1061,26 @@ pub mod swap_router_02_executor { Err(::ethers::core::abi::Error::InvalidData.into()) } } - impl ::ethers::core::abi::AbiEncode for SwapRouter02ExecutorCalls { + impl ::ethers::core::abi::AbiEncode for UniversalRouterExecutorCalls { fn encode(self) -> Vec { match self { Self::Execute(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::ExecuteBatch(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::Multicall(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } Self::Owner(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::Permit2(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::Reactor(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::ReactorCallback(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::SwapRouter02(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } Self::TransferOwnership(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::UnwrapWETH(element) => { + Self::UniversalRouter(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::Weth(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::WhitelistedCaller(element) => { + Self::WithdrawERC20(element) => { ::ethers::core::abi::AbiEncode::encode(element) } Self::WithdrawETH(element) => { @@ -1196,80 +1089,68 @@ pub mod swap_router_02_executor { } } } - impl ::core::fmt::Display for SwapRouter02ExecutorCalls { + impl ::core::fmt::Display for UniversalRouterExecutorCalls { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::Execute(element) => ::core::fmt::Display::fmt(element, f), Self::ExecuteBatch(element) => ::core::fmt::Display::fmt(element, f), - Self::Multicall(element) => ::core::fmt::Display::fmt(element, f), Self::Owner(element) => ::core::fmt::Display::fmt(element, f), + Self::Permit2(element) => ::core::fmt::Display::fmt(element, f), Self::Reactor(element) => ::core::fmt::Display::fmt(element, f), Self::ReactorCallback(element) => ::core::fmt::Display::fmt(element, f), - Self::SwapRouter02(element) => ::core::fmt::Display::fmt(element, f), Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f), - Self::UnwrapWETH(element) => ::core::fmt::Display::fmt(element, f), - Self::Weth(element) => ::core::fmt::Display::fmt(element, f), - Self::WhitelistedCaller(element) => ::core::fmt::Display::fmt(element, f), + Self::UniversalRouter(element) => ::core::fmt::Display::fmt(element, f), + Self::WithdrawERC20(element) => ::core::fmt::Display::fmt(element, f), Self::WithdrawETH(element) => ::core::fmt::Display::fmt(element, f), } } } - impl ::core::convert::From for SwapRouter02ExecutorCalls { + impl ::core::convert::From for UniversalRouterExecutorCalls { fn from(value: ExecuteCall) -> Self { Self::Execute(value) } } - impl ::core::convert::From for SwapRouter02ExecutorCalls { + impl ::core::convert::From for UniversalRouterExecutorCalls { fn from(value: ExecuteBatchCall) -> Self { Self::ExecuteBatch(value) } } - impl ::core::convert::From for SwapRouter02ExecutorCalls { - fn from(value: MulticallCall) -> Self { - Self::Multicall(value) - } - } - impl ::core::convert::From for SwapRouter02ExecutorCalls { + impl ::core::convert::From for UniversalRouterExecutorCalls { fn from(value: OwnerCall) -> Self { Self::Owner(value) } } - impl ::core::convert::From for SwapRouter02ExecutorCalls { + impl ::core::convert::From for UniversalRouterExecutorCalls { + fn from(value: Permit2Call) -> Self { + Self::Permit2(value) + } + } + impl ::core::convert::From for UniversalRouterExecutorCalls { fn from(value: ReactorCall) -> Self { Self::Reactor(value) } } - impl ::core::convert::From for SwapRouter02ExecutorCalls { + impl ::core::convert::From for UniversalRouterExecutorCalls { fn from(value: ReactorCallbackCall) -> Self { Self::ReactorCallback(value) } } - impl ::core::convert::From for SwapRouter02ExecutorCalls { - fn from(value: SwapRouter02Call) -> Self { - Self::SwapRouter02(value) - } - } - impl ::core::convert::From for SwapRouter02ExecutorCalls { + impl ::core::convert::From for UniversalRouterExecutorCalls { fn from(value: TransferOwnershipCall) -> Self { Self::TransferOwnership(value) } } - impl ::core::convert::From for SwapRouter02ExecutorCalls { - fn from(value: UnwrapWETHCall) -> Self { - Self::UnwrapWETH(value) - } - } - impl ::core::convert::From for SwapRouter02ExecutorCalls { - fn from(value: WethCall) -> Self { - Self::Weth(value) + impl ::core::convert::From for UniversalRouterExecutorCalls { + fn from(value: UniversalRouterCall) -> Self { + Self::UniversalRouter(value) } } - impl ::core::convert::From for SwapRouter02ExecutorCalls { - fn from(value: WhitelistedCallerCall) -> Self { - Self::WhitelistedCaller(value) + impl ::core::convert::From for UniversalRouterExecutorCalls { + fn from(value: WithdrawERC20Call) -> Self { + Self::WithdrawERC20(value) } } - impl ::core::convert::From for SwapRouter02ExecutorCalls { + impl ::core::convert::From for UniversalRouterExecutorCalls { fn from(value: WithdrawETHCall) -> Self { Self::WithdrawETH(value) } @@ -1288,21 +1169,7 @@ pub mod swap_router_02_executor { Hash )] pub struct OwnerReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `reactor` function with signature `reactor()` and selector `0xab572650` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ReactorReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `swapRouter02` function with signature `swapRouter02()` and selector `0x7eaf1116` + ///Container type for all return fields from the `permit2` function with signature `permit2()` and selector `0x12261ee7` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -1315,8 +1182,8 @@ pub mod swap_router_02_executor { Eq, Hash )] - pub struct SwapRouter02Return(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `weth` function with signature `weth()` and selector `0x3fc8cef3` + pub struct Permit2Return(pub ::ethers::core::types::Address); + ///Container type for all return fields from the `reactor` function with signature `reactor()` and selector `0xab572650` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -1329,8 +1196,8 @@ pub mod swap_router_02_executor { Eq, Hash )] - pub struct WethReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `whitelistedCaller` function with signature `whitelistedCaller()` and selector `0x8c21b411` + pub struct ReactorReturn(pub ::ethers::core::types::Address); + ///Container type for all return fields from the `universalRouter` function with signature `universalRouter()` and selector `0x35a9e4df` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -1343,5 +1210,5 @@ pub mod swap_router_02_executor { Eq, Hash )] - pub struct WhitelistedCallerReturn(pub ::ethers::core::types::Address); + pub struct UniversalRouterReturn(pub ::ethers::core::types::Address); } diff --git a/src/collectors/uniswapx_route_collector.rs b/src/collectors/uniswapx_route_collector.rs index 8876541..4c1f14c 100644 --- a/src/collectors/uniswapx_route_collector.rs +++ b/src/collectors/uniswapx_route_collector.rs @@ -194,9 +194,9 @@ impl UniswapXRouteCollector { amount: params.amount, recipient: params.recipient, slippage_tolerance: SLIPPAGE_TOLERANCE.to_string(), - enable_universal_router: false, + enable_universal_router: true, deadline: DEADLINE, - protocols: "v2,v3,mixed".to_string(), + protocols: "v2,v3,v4,mixed".to_string(), }; let query_string = serde_qs::to_string(&query).unwrap(); diff --git a/src/strategies/shared.rs b/src/strategies/shared.rs index 3e12dce..3a2ca6d 100644 --- a/src/strategies/shared.rs +++ b/src/strategies/shared.rs @@ -1,11 +1,12 @@ use crate::collectors::uniswapx_route_collector::RoutedOrder; +use alloy_primitives::hex; use anyhow::Result; use async_trait::async_trait; use bindings_uniswapx::{ - erc20::ERC20, shared_types::SignedOrder, swap_router_02_executor::SwapRouter02Executor, + erc20::ERC20, shared_types::SignedOrder, universal_router_executor::UniversalRouterExecutor, }; use ethers::{ - abi::{ethabi, ParamType, Token}, + abi::{ethabi, Token}, providers::Middleware, types::{ transaction::eip2718::TypedTransaction, Address, Bytes, Eip1559TransactionRequest, H160, @@ -19,7 +20,7 @@ use std::{ }; const REACTOR_ADDRESS: &str = "0x00000011F84B9aa48e5f8aA8B9897600006289Be"; -const SWAPROUTER_02_ADDRESS: &str = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"; +const PERMIT2_ADDRESS: &str = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; pub const WETH_ADDRESS: &str = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"; #[async_trait] @@ -34,17 +35,17 @@ pub trait UniswapXStrategy { ) -> Result { let chain_id: U256 = client.get_chainid().await?; let fill_contract = - SwapRouter02Executor::new(H160::from_str(executor_address)?, client.clone()); + UniversalRouterExecutor::new(H160::from_str(executor_address)?, client.clone()); let token_in: H160 = H160::from_str(&request.token_in)?; let token_out: H160 = H160::from_str(&request.token_out)?; - let swaprouter_02_approval = self + let permit2_approval = self .get_tokens_to_approve( client.clone(), token_in, executor_address, - SWAPROUTER_02_ADDRESS, + PERMIT2_ADDRESS, ) .await?; @@ -52,33 +53,18 @@ pub trait UniswapXStrategy { .get_tokens_to_approve(client.clone(), token_out, executor_address, REACTOR_ADDRESS) .await?; - // Strip off function selector - let multicall_bytes = &route.method_parameters.calldata[10..]; - - // Decode multicall into [Uint256, bytes[]] (deadline, multicallData) - let decoded_multicall_bytes = ethabi::decode( - &[ - ParamType::Uint(256), - ParamType::Array(Box::new(ParamType::Bytes)), - ], - &Bytes::from_str(multicall_bytes).expect("Failed to decode multicall bytes"), - ); - - let decoded_multicall_bytes = match decoded_multicall_bytes { - Ok(data) => data[1].clone(), // already in bytes[] - Err(e) => { - return Err(anyhow::anyhow!("Failed to decode multicall bytes: {}", e)); - } - }; - - // abi encode as [tokens to approve to swap router 02, tokens to approve to reactor, multicall data] + let execute_bytes = &route.method_parameters.calldata; + + let encoded_execute_bytes = hex::decode(&execute_bytes[2..]).expect("Failed to decode hex"); + + // abi encode as [tokens to approve to permit2, tokens to approve to reactor, execute data] // [address[], address[], bytes[]] - let calldata = ethabi::encode(&[ - Token::Array(swaprouter_02_approval), + let encoded_params = ethabi::encode(&[ + Token::Array(permit2_approval), Token::Array(reactor_approval), - decoded_multicall_bytes, + Token::Bytes(encoded_execute_bytes), ]); - let mut call = fill_contract.execute_batch(signed_orders, Bytes::from(calldata)); + let mut call = fill_contract.execute_batch(signed_orders, Bytes::from(encoded_params)); Ok(call.tx.set_chain_id(chain_id.as_u64()).clone()) }