ETH Price: $2,800.14 (+2.58%)

Token

Ether.fi-Liquid1 (LQIDETHFIV1)
 

Overview

Max Total Supply

19,515.691098956939853929 LQIDETHFIV1

Holders

5,095 ( -0.098%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.175632041006655869 LQIDETHFIV1

Value
$0.00
0xfadd3b0dcfb0ae4a0ee676fab249bfbb0560c78f
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

ether.fi's eETH is a decentralized, non-custodial liquid staking token that earns staking rewards while maintaining full liquidity and control over their assets. eETH offers users a flexible and secure way to contribute to network validation and participate in the DeFi space.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CellarWithOracleWithBalancerFlashLoansWithMultiAssetDepositWithNativeSupport

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
shanghai EvmVersion
File 1 of 45 : CellarWithOracleWithBalancerFlashLoansWithMultiAssetDepositWithNativeSupport.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
import { Registry, ERC20, Math, SafeTransferLib, Address } from "src/base/Cellar.sol";
import { CellarWithOracleWithBalancerFlashLoansWithMultiAssetDeposit } from "src/base/permutations/advanced
    /CellarWithOracleWithBalancerFlashLoansWithMultiAssetDeposit.sol";
contract CellarWithOracleWithBalancerFlashLoansWithMultiAssetDepositWithNativeSupport is
CellarWithOracleWithBalancerFlashLoansWithMultiAssetDeposit
{
//============================== IMMUTABLES ===============================
constructor(
address _owner,
Registry _registry,
ERC20 _asset,
string memory _name,
string memory _symbol,
uint32 _holdingPosition,
bytes memory _holdingPositionConfig,
uint256 _initialDeposit,
uint64 _strategistPlatformCut,
uint192 _shareSupplyCap,
address _balancerVault
)
CellarWithOracleWithBalancerFlashLoansWithMultiAssetDeposit(
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 2 of 45 : Cellar.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
import {Math} from "src/utils/Math.sol";
import {ERC4626} from "@solmate/mixins/ERC4626.sol";
import {SafeTransferLib} from "@solmate/utils/SafeTransferLib.sol";
import {ERC20} from "@solmate/tokens/ERC20.sol";
// import { ERC4626, SafeTransferLib, Math, ERC20 } from "src/base/ERC4626.sol";
import {Registry} from "src/Registry.sol";
import {PriceRouter} from "src/modules/price-router/PriceRouter.sol";
import {Uint32Array} from "src/utils/Uint32Array.sol";
import {BaseAdaptor} from "src/modules/adaptors/BaseAdaptor.sol";
import {Address} from "@openzeppelin/contracts/utils/Address.sol";
import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";
import {Auth, Authority} from "@solmate/auth/Auth.sol";
/**
* @title Sommelier Cellar
* @notice A composable ERC4626 that can use arbitrary DeFi assets/positions using adaptors.
* @author crispymangoes
*/
contract Cellar is ERC4626, Auth, ERC721Holder {
using Uint32Array for uint32[];
using SafeTransferLib for ERC20;
using Math for uint256;
using Address for address;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 3 of 45 : CellarWithOracleWithBalancerFlashLoansWithMultiAssetDeposit.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
import { Registry, ERC20, Math, SafeTransferLib, Address } from "src/base/Cellar.sol";
import { CellarWithOracleWithBalancerFlashLoans } from "src/base/permutations/CellarWithOracleWithBalancerFlashLoans.sol";
contract CellarWithOracleWithBalancerFlashLoansWithMultiAssetDeposit is CellarWithOracleWithBalancerFlashLoans {
using Math for uint256;
using SafeTransferLib for ERC20;
using Address for address;
// ========================================= STRUCTS =========================================
/**
* @notice Stores data needed for multi-asset deposits into this cellar.
* @param isSupported bool indicating that mapped asset is supported
* @param holdingPosition the holding position to deposit alternative assets into
* @param depositFee fee taken for depositing this alternative asset
*/
struct AlternativeAssetData {
bool isSupported;
uint32 holdingPosition;
uint32 depositFee;
}
// ========================================= CONSTANTS =========================================
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 4 of 45 : Math.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
library Math {
/**
* @notice Substract with a floor of 0 for the result.
*/
function subMinZero(uint256 x, uint256 y) internal pure returns (uint256) {
return x > y ? x - y : 0;
}
/**
* @notice Used to change the decimals of precision used for an amount.
*/
function changeDecimals(uint256 amount, uint8 fromDecimals, uint8 toDecimals) internal pure returns (uint256) {
if (fromDecimals == toDecimals) {
return amount;
} else if (fromDecimals < toDecimals) {
return amount * 10 ** (toDecimals - fromDecimals);
} else {
return amount / 10 ** (fromDecimals - toDecimals);
}
}
// ===================================== OPENZEPPELIN'S MATH =====================================
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 5 of 45 : ERC4626.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
import {ERC20} from "../tokens/ERC20.sol";
import {SafeTransferLib} from "../utils/SafeTransferLib.sol";
import {FixedPointMathLib} from "../utils/FixedPointMathLib.sol";
/// @notice Minimal ERC4626 tokenized Vault implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/mixins/ERC4626.sol)
abstract contract ERC4626 is ERC20 {
using SafeTransferLib for ERC20;
using FixedPointMathLib for uint256;
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event Deposit(address indexed caller, address indexed owner, uint256 assets, uint256 shares);
event Withdraw(
address indexed caller,
address indexed receiver,
address indexed owner,
uint256 assets,
uint256 shares
);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 6 of 45 : SafeTransferLib.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
import {ERC20} from "../tokens/ERC20.sol";
/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
/*//////////////////////////////////////////////////////////////
ETH OPERATIONS
//////////////////////////////////////////////////////////////*/
function safeTransferETH(address to, uint256 amount) internal {
bool success;
/// @solidity memory-safe-assembly
assembly {
// Transfer the ETH and store if it succeeded or not.
success := call(gas(), to, amount, 0, 0, 0, 0)
}
require(success, "ETH_TRANSFER_FAILED");
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 7 of 45 : ERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
/*//////////////////////////////////////////////////////////////
METADATA STORAGE
//////////////////////////////////////////////////////////////*/
string public name;
string public symbol;
uint8 public immutable decimals;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 8 of 45 : Registry.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { Cellar } from "src/base/Cellar.sol";
import { ERC20 } from "@solmate/tokens/ERC20.sol";
import { BaseAdaptor } from "src/modules/adaptors/BaseAdaptor.sol";
import { PriceRouter } from "src/modules/price-router/PriceRouter.sol";
contract Registry is Ownable {
// ============================================= ADDRESS CONFIG =============================================
/**
* @notice Emitted when the address of a contract is changed.
* @param id value representing the unique ID tied to the changed contract
* @param oldAddress address of the contract before the change
* @param newAddress address of the contract after the contract
*/
event AddressChanged(uint256 indexed id, address oldAddress, address newAddress);
/**
* @notice Attempted to set the address of a contract that is not registered.
* @param id id of the contract that is not registered
*/
error Registry__ContractNotRegistered(uint256 id);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 9 of 45 : PriceRouter.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
import { SafeTransferLib } from "@solmate/utils/SafeTransferLib.sol";
import { ERC20 } from "@solmate/tokens/ERC20.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { IChainlinkAggregator } from "src/interfaces/external/IChainlinkAggregator.sol";
import { SafeCast } from "@openzeppelin/contracts/utils/math/SafeCast.sol";
import { Math } from "src/utils/Math.sol";
import { Address } from "@openzeppelin/contracts/utils/Address.sol";
import { Extension } from "src/modules/price-router/Extensions/Extension.sol";
import { Registry } from "src/Registry.sol";
import { UniswapV3Pool } from "src/interfaces/external/UniswapV3Pool.sol";
import { OracleLibrary } from "@uniswapV3P/libraries/OracleLibrary.sol";
/**
* @title Sommelier Price Router
* @notice Provides a universal interface allowing Sommelier contracts to retrieve secure pricing
* data from Chainlink.
* @author crispymangoes
*/
contract PriceRouter is Ownable {
using SafeTransferLib for ERC20;
using SafeCast for int256;
using Math for uint256;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 10 of 45 : Uint32Array.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
/**
* @notice A library to extend the uint32 array data type.
*/
library Uint32Array {
// =========================================== ADDRESS STORAGE ===========================================
/**
* @notice Add an uint32 to the array at a given index.
* @param array uint32 array to add the uint32 to
* @param index index to add the uint32 at
* @param value uint32 to add to the array
*/
function add(uint32[] storage array, uint32 index, uint32 value) internal {
uint256 len = array.length;
if (len > 0) {
array.push(array[len - 1]);
for (uint256 i = len - 1; i > index; i--) array[i] = array[i - 1];
array[index] = value;
} else {
array.push(value);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 11 of 45 : BaseAdaptor.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
import { Math } from "src/utils/Math.sol";
import { SafeTransferLib } from "@solmate/utils/SafeTransferLib.sol";
import { ERC20 } from "@solmate/tokens/ERC20.sol";
import { Registry } from "src/Registry.sol";
import { Cellar } from "src/base/Cellar.sol";
import { PriceRouter } from "src/modules/price-router/PriceRouter.sol";
/**
* @title Base Adaptor
* @notice Base contract all adaptors must inherit from.
* @dev Allows Cellars to interact with arbritrary DeFi assets and protocols.
* @author crispymangoes
*/
abstract contract BaseAdaptor {
using SafeTransferLib for ERC20;
using Math for uint256;
/**
* @notice Attempted to specify an external receiver during a Cellar `callOnAdaptor` call.
*/
error BaseAdaptor__ExternalReceiverBlocked();
/**
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 12 of 45 : Address.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 13 of 45 : ERC721Holder.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol)
pragma solidity ^0.8.0;
import "../IERC721Receiver.sol";
/**
* @dev Implementation of the {IERC721Receiver} interface.
*
* Accepts all token transfers.
* Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
*/
contract ERC721Holder is IERC721Receiver {
/**
* @dev See {IERC721Receiver-onERC721Received}.
*
* Always returns `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address,
address,
uint256,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC721Received.selector;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 14 of 45 : Auth.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Provides a flexible and updatable auth pattern which is completely separate from application logic.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Auth.sol)
/// @author Modified from Dappsys (https://github.com/dapphub/ds-auth/blob/master/src/auth.sol)
abstract contract Auth {
event OwnershipTransferred(address indexed user, address indexed newOwner);
event AuthorityUpdated(address indexed user, Authority indexed newAuthority);
address public owner;
Authority public authority;
constructor(address _owner, Authority _authority) {
owner = _owner;
authority = _authority;
emit OwnershipTransferred(msg.sender, _owner);
emit AuthorityUpdated(msg.sender, _authority);
}
modifier requiresAuth() virtual {
require(isAuthorized(msg.sender, msg.sig), "UNAUTHORIZED");
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 15 of 45 : CellarWithOracleWithBalancerFlashLoans.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
import { Registry, ERC20, Math, SafeTransferLib } from "src/base/Cellar.sol";
import { IFlashLoanRecipient, IERC20 } from "@balancer/interfaces/contracts/vault/IFlashLoanRecipient.sol";
import { CellarWithOracle } from "src/base/permutations/CellarWithOracle.sol";
import { ERC4626SharePriceOracle } from "src/base/ERC4626SharePriceOracle.sol";
contract CellarWithOracleWithBalancerFlashLoans is CellarWithOracle, IFlashLoanRecipient {
using Math for uint256;
using SafeTransferLib for ERC20;
/**
* @notice The Balancer Vault contract on current network.
* @dev For mainnet use 0xBA12222222228d8Ba445958a75a0704d566BF2C8.
*/
address internal immutable balancerVault;
constructor(
address _owner,
Registry _registry,
ERC20 _asset,
string memory _name,
string memory _symbol,
uint32 _holdingPosition,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 16 of 45 : FixedPointMathLib.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Arithmetic library with operations for fixed-point numbers.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)
/// @author Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol)
library FixedPointMathLib {
/*//////////////////////////////////////////////////////////////
SIMPLIFIED FIXED POINT OPERATIONS
//////////////////////////////////////////////////////////////*/
uint256 internal constant MAX_UINT256 = 2**256 - 1;
uint256 internal constant WAD = 1e18; // The scalar of ETH and most ERC20s.
function mulWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
return mulDivDown(x, y, WAD); // Equivalent to (x * y) / WAD rounded down.
}
function mulWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
return mulDivUp(x, y, WAD); // Equivalent to (x * y) / WAD rounded up.
}
function divWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
return mulDivDown(x, WAD, y); // Equivalent to (x * WAD) / y rounded down.
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 17 of 45 : Ownable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 18 of 45 : IChainlinkAggregator.sol
1
2
3
4
5
6
7
8
9
10
11
12
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol";
interface IChainlinkAggregator is AggregatorV2V3Interface {
function maxAnswer() external view returns (int192);
function minAnswer() external view returns (int192);
function aggregator() external view returns (address);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 19 of 45 : SafeCast.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)
// This file was procedurally generated from scripts/generate/templates/SafeCast.js.
pragma solidity ^0.8.0;
/**
* @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
* checks.
*
* Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
* easily result in undesired exploitation or bugs, since developers usually
* assume that overflows raise errors. `SafeCast` restores this intuition by
* reverting the transaction when such an operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*
* Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
* all math on `uint256` and `int256` and then downcasting.
*/
library SafeCast {
/**
* @dev Returns the downcasted uint248 from uint256, reverting on
* overflow (when the input is greater than largest uint248).
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 20 of 45 : Extension.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
import { ERC20 } from "@solmate/tokens/ERC20.sol";
import { PriceRouter } from "src/modules/price-router/PriceRouter.sol";
import { Math } from "src/utils/Math.sol";
/**
* @title Sommelier Price Router Extension abstract contract.
* @notice Provides shared logic between Extensions.
* @author crispymangoes
*/
abstract contract Extension {
/**
* @notice Attempted to call a function only callable by the price router.
*/
error Extension__OnlyPriceRouter();
/**
* @notice Prevents non price router contracts from calling a function.
*/
modifier onlyPriceRouter() {
if (msg.sender != address(priceRouter)) revert Extension__OnlyPriceRouter();
_;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 21 of 45 : UniswapV3Pool.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity ^0.8.10;
interface UniswapV3Pool {
event Burn(
address indexed owner,
int24 indexed tickLower,
int24 indexed tickUpper,
uint128 amount,
uint256 amount0,
uint256 amount1
);
event Collect(
address indexed owner,
address recipient,
int24 indexed tickLower,
int24 indexed tickUpper,
uint128 amount0,
uint128 amount1
);
event CollectProtocol(address indexed sender, address indexed recipient, uint128 amount0, uint128 amount1);
event Flash(
address indexed sender,
address indexed recipient,
uint256 amount0,
uint256 amount1,
uint256 paid0,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 22 of 45 : OracleLibrary.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0 <0.9.0;
import '@uniswap/v3-core/contracts/libraries/FullMath.sol';
import '@uniswap/v3-core/contracts/libraries/TickMath.sol';
import '@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol';
/// @title Oracle library
/// @notice Provides functions to integrate with V3 pool oracle
library OracleLibrary {
/// @notice Calculates time-weighted means of tick and liquidity for a given Uniswap V3 pool
/// @param pool Address of the pool that we want to observe
/// @param secondsAgo Number of seconds in the past from which to calculate the time-weighted means
/// @return arithmeticMeanTick The arithmetic mean tick from (block.timestamp - secondsAgo) to block.timestamp
/// @return harmonicMeanLiquidity The harmonic mean liquidity from (block.timestamp - secondsAgo) to block.timestamp
function consult(address pool, uint32 secondsAgo)
internal
view
returns (int24 arithmeticMeanTick, uint128 harmonicMeanLiquidity)
{
require(secondsAgo != 0, 'BP');
uint32[] memory secondsAgos = new uint32[](2);
secondsAgos[0] = secondsAgo;
secondsAgos[1] = 0;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 23 of 45 : IERC721Receiver.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 24 of 45 : IFlashLoanRecipient.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-3.0-or-later
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
pragma solidity >=0.7.0 <0.9.0;
// Inspired by Aave Protocol's IFlashLoanReceiver.
import "../solidity-utils/openzeppelin/IERC20.sol";
interface IFlashLoanRecipient {
/**
* @dev When `flashLoan` is called on the Vault, it invokes the `receiveFlashLoan` hook on the recipient.
*
* At the time of the call, the Vault will have transferred `amounts` for `tokens` to the recipient. Before this
* call returns, the recipient must have transferred `amounts` plus `feeAmounts` for each token back to the
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 25 of 45 : CellarWithOracle.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
import { Cellar, Registry, ERC20, Math } from "src/base/Cellar.sol";
import { ERC4626SharePriceOracle } from "src/base/ERC4626SharePriceOracle.sol";
contract CellarWithOracle is Cellar {
using Math for uint256;
constructor(
address _owner,
Registry _registry,
ERC20 _asset,
string memory _name,
string memory _symbol,
uint32 _holdingPosition,
bytes memory _holdingPositionConfig,
uint256 _initialDeposit,
uint64 _strategistPlatformCut,
uint192 _shareSupplyCap
)
Cellar(
_owner,
_registry,
_asset,
_name,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 26 of 45 : ERC4626SharePriceOracle.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
import { ERC4626 } from "@solmate/mixins/ERC4626.sol";
import { SafeTransferLib } from "@solmate/utils/SafeTransferLib.sol";
import { ERC20 } from "@solmate/tokens/ERC20.sol";
import { Math } from "src/utils/Math.sol";
import { Owned } from "@solmate/auth/Owned.sol";
import { AutomationCompatibleInterface } from "@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol";
import { IRegistrar } from "src/interfaces/external/Chainlink/IRegistrar.sol";
import { IRegistry } from "src/interfaces/external/Chainlink/IRegistry.sol";
import { IChainlinkAggregator } from "src/interfaces/external/IChainlinkAggregator.sol";
contract ERC4626SharePriceOracle is AutomationCompatibleInterface {
using Math for uint256;
using SafeTransferLib for ERC20;
// ========================================= STRUCTS =========================================
struct Observation {
uint64 timestamp;
uint192 cumulative;
}
/**
* @notice Use a struct for constructor args so we do not encounter stack too deep errors.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 27 of 45 : Context.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 28 of 45 : AggregatorV2V3Interface.sol
1
2
3
4
5
6
7
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./AggregatorInterface.sol";
import "./AggregatorV3Interface.sol";
interface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface {}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 29 of 45 : FullMath.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @title Contains 512-bit math functions
/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision
/// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits
library FullMath {
/// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
/// @param a The multiplicand
/// @param b The multiplier
/// @param denominator The divisor
/// @return result The 256-bit result
/// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv
function mulDiv(
uint256 a,
uint256 b,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = a * b
// Compute the product mod 2**256 and mod 2**256 - 1
// then use the Chinese Remainder Theorem to reconstruct
// the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2**256 + prod0
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 30 of 45 : TickMath.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
/// @title Math library for computing sqrt prices from ticks and vice versa
/// @notice Computes sqrt price for ticks of size 1.0001, i.e. sqrt(1.0001^tick) as fixed point Q64.96 numbers. Supports
/// prices between 2**-128 and 2**128
library TickMath {
error T();
error R();
/// @dev The minimum tick that may be passed to #getSqrtRatioAtTick computed from log base 1.0001 of 2**-128
int24 internal constant MIN_TICK = -887272;
/// @dev The maximum tick that may be passed to #getSqrtRatioAtTick computed from log base 1.0001 of 2**128
int24 internal constant MAX_TICK = -MIN_TICK;
/// @dev The minimum value that can be returned from #getSqrtRatioAtTick. Equivalent to getSqrtRatioAtTick(MIN_TICK)
uint160 internal constant MIN_SQRT_RATIO = 4295128739;
/// @dev The maximum value that can be returned from #getSqrtRatioAtTick. Equivalent to getSqrtRatioAtTick(MAX_TICK)
uint160 internal constant MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970342;
/// @notice Calculates sqrt(1.0001^tick) * 2^96
/// @dev Throws if |tick| > max tick
/// @param tick The input tick for the above formula
/// @return sqrtPriceX96 A Fixed point Q64.96 number representing the sqrt of the ratio of the two assets (token1/token0)
/// at the given tick
function getSqrtRatioAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 31 of 45 : IUniswapV3Pool.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;
import {IUniswapV3PoolImmutables} from './pool/IUniswapV3PoolImmutables.sol';
import {IUniswapV3PoolState} from './pool/IUniswapV3PoolState.sol';
import {IUniswapV3PoolDerivedState} from './pool/IUniswapV3PoolDerivedState.sol';
import {IUniswapV3PoolActions} from './pool/IUniswapV3PoolActions.sol';
import {IUniswapV3PoolOwnerActions} from './pool/IUniswapV3PoolOwnerActions.sol';
import {IUniswapV3PoolErrors} from './pool/IUniswapV3PoolErrors.sol';
import {IUniswapV3PoolEvents} from './pool/IUniswapV3PoolEvents.sol';
/// @title The interface for a Uniswap V3 Pool
/// @notice A Uniswap pool facilitates swapping and automated market making between any two assets that strictly conform
/// to the ERC20 specification
/// @dev The pool interface is broken up into many smaller pieces
interface IUniswapV3Pool is
IUniswapV3PoolImmutables,
IUniswapV3PoolState,
IUniswapV3PoolDerivedState,
IUniswapV3PoolActions,
IUniswapV3PoolOwnerActions,
IUniswapV3PoolErrors,
IUniswapV3PoolEvents
{
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 32 of 45 : IERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 33 of 45 : Owned.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event OwnershipTransferred(address indexed user, address indexed newOwner);
/*//////////////////////////////////////////////////////////////
OWNERSHIP STORAGE
//////////////////////////////////////////////////////////////*/
address public owner;
modifier onlyOwner() virtual {
require(msg.sender == owner, "UNAUTHORIZED");
_;
}
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 34 of 45 : AutomationCompatibleInterface.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface AutomationCompatibleInterface {
/**
* @notice method that is simulated by the keepers to see if any work actually
* needs to be performed. This method does does not actually need to be
* executable, and since it is only ever simulated it can consume lots of gas.
* @dev To ensure that it is never called, you may want to add the
* cannotExecute modifier from KeeperBase to your implementation of this
* method.
* @param checkData specified in the upkeep registration so it is always the
* same for a registered upkeep. This can easily be broken down into specific
* arguments using `abi.decode`, so multiple upkeeps can be registered on the
* same contract and easily differentiated by the contract.
* @return upkeepNeeded boolean to indicate whether the keeper should call
* performUpkeep or not.
* @return performData bytes that the keeper should call performUpkeep with, if
* upkeep is needed. If you would like to encode data to decode later, try
* `abi.encode`.
*/
function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);
/**
* @notice method that is actually executed by the keepers, via the registry.
* The data returned by the checkUpkeep simulation will be passed into
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 35 of 45 : IRegistrar.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
interface IRegistrar {
struct RegistrationParams {
string name;
bytes encryptedEmail;
address upkeepContract;
uint32 gasLimit;
address adminAddress;
uint8 triggerType;
bytes checkData;
bytes triggerConfig;
bytes offchainConfig;
uint96 amount;
}
enum AutoApproveType {
DISABLED,
ENABLED_SENDER_ALLOWLIST,
ENABLED_ALL
}
function registerUpkeep(RegistrationParams calldata requestParams) external returns (uint256 id);
function setTriggerConfig(
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 36 of 45 : IRegistry.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.21;
interface IRegistry {
struct UpkeepInfo {
address target;
uint32 executeGas;
bytes checkData;
uint96 balance;
address admin;
uint64 maxValidBlocknumber;
uint32 lastPerformBlockNumber;
uint96 amountSpent;
bool paused;
bytes offchainConfig;
}
function getForwarder(uint256 upkeepID) external view returns (address forwarder);
function getUpkeep(uint256 id) external view returns (UpkeepInfo memory upkeepInfo);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 37 of 45 : AggregatorInterface.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface AggregatorInterface {
function latestAnswer() external view returns (int256);
function latestTimestamp() external view returns (uint256);
function latestRound() external view returns (uint256);
function getAnswer(uint256 roundId) external view returns (int256);
function getTimestamp(uint256 roundId) external view returns (uint256);
event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);
event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 38 of 45 : AggregatorV3Interface.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface AggregatorV3Interface {
function decimals() external view returns (uint8);
function description() external view returns (string memory);
function version() external view returns (uint256);
function getRoundData(uint80 _roundId)
external
view
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
function latestRoundData()
external
view
returns (
uint80 roundId,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 39 of 45 : IUniswapV3PoolImmutables.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;
/// @title Pool state that never changes
/// @notice These parameters are fixed for a pool forever, i.e., the methods will always return the same values
interface IUniswapV3PoolImmutables {
/// @notice The contract that deployed the pool, which must adhere to the IUniswapV3Factory interface
/// @return The contract address
function factory() external view returns (address);
/// @notice The first of the two tokens of the pool, sorted by address
/// @return The token contract address
function token0() external view returns (address);
/// @notice The second of the two tokens of the pool, sorted by address
/// @return The token contract address
function token1() external view returns (address);
/// @notice The pool's fee in hundredths of a bip, i.e. 1e-6
/// @return The fee
function fee() external view returns (uint24);
/// @notice The pool tick spacing
/// @dev Ticks can only be used at multiples of this value, minimum of 1 and always positive
/// e.g.: a tickSpacing of 3 means ticks can be initialized every 3rd tick, i.e., ..., -6, -3, 0, 3, 6, ...
/// This value is an int24 to avoid casting even though it is always positive.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 40 of 45 : IUniswapV3PoolState.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;
/// @title Pool state that can change
/// @notice These methods compose the pool's state, and can change with any frequency including multiple times
/// per transaction
interface IUniswapV3PoolState {
/// @notice The 0th storage slot in the pool stores many values, and is exposed as a single method to save gas
/// when accessed externally.
/// @return sqrtPriceX96 The current price of the pool as a sqrt(token1/token0) Q64.96 value
/// @return tick The current tick of the pool, i.e. according to the last tick transition that was run.
/// This value may not always be equal to SqrtTickMath.getTickAtSqrtRatio(sqrtPriceX96) if the price is on a tick
/// boundary.
/// @return observationIndex The index of the last oracle observation that was written,
/// @return observationCardinality The current maximum number of observations stored in the pool,
/// @return observationCardinalityNext The next maximum number of observations, to be updated when the observation.
/// @return feeProtocol The protocol fee for both tokens of the pool.
/// Encoded as two 4 bit values, where the protocol fee of token1 is shifted 4 bits and the protocol fee of token0
/// is the lower 4 bits. Used as the denominator of a fraction of the swap fee, e.g. 4 means 1/4th of the swap fee.
/// unlocked Whether the pool is currently locked to reentrancy
function slot0()
external
view
returns (
uint160 sqrtPriceX96,
int24 tick,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 41 of 45 : IUniswapV3PoolDerivedState.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;
/// @title Pool state that is not stored
/// @notice Contains view functions to provide information about the pool that is computed rather than stored on the
/// blockchain. The functions here may have variable gas costs.
interface IUniswapV3PoolDerivedState {
/// @notice Returns the cumulative tick and liquidity as of each timestamp `secondsAgo` from the current block timestamp
/// @dev To get a time weighted average tick or liquidity-in-range, you must call this with two values, one representing
/// the beginning of the period and another for the end of the period. E.g., to get the last hour time-weighted average tick,
/// you must call it with secondsAgos = [3600, 0].
/// @dev The time weighted average tick represents the geometric time weighted average price of the pool, in
/// log base sqrt(1.0001) of token1 / token0. The TickMath library can be used to go from a tick value to a ratio.
/// @param secondsAgos From how long ago each cumulative tick and liquidity value should be returned
/// @return tickCumulatives Cumulative tick values as of each `secondsAgos` from the current block timestamp
/// @return secondsPerLiquidityCumulativeX128s Cumulative seconds per liquidity-in-range value as of each `secondsAgos` from the current block
/// timestamp
function observe(uint32[] calldata secondsAgos)
external
view
returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s);
/// @notice Returns a snapshot of the tick cumulative, seconds per liquidity and seconds inside a tick range
/// @dev Snapshots must only be compared to other snapshots, taken over a period for which a position existed.
/// I.e., snapshots cannot be compared if a position is not held for the entire period between when the first
/// snapshot is taken and the second snapshot is taken.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 42 of 45 : IUniswapV3PoolActions.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;
/// @title Permissionless pool actions
/// @notice Contains pool methods that can be called by anyone
interface IUniswapV3PoolActions {
/// @notice Sets the initial price for the pool
/// @dev Price is represented as a sqrt(amountToken1/amountToken0) Q64.96 value
/// @param sqrtPriceX96 the initial sqrt price of the pool as a Q64.96
function initialize(uint160 sqrtPriceX96) external;
/// @notice Adds liquidity for the given recipient/tickLower/tickUpper position
/// @dev The caller of this method receives a callback in the form of IUniswapV3MintCallback#uniswapV3MintCallback
/// in which they must pay any token0 or token1 owed for the liquidity. The amount of token0/token1 due depends
/// on tickLower, tickUpper, the amount of liquidity, and the current price.
/// @param recipient The address for which the liquidity will be created
/// @param tickLower The lower tick of the position in which to add liquidity
/// @param tickUpper The upper tick of the position in which to add liquidity
/// @param amount The amount of liquidity to mint
/// @param data Any data that should be passed through to the callback
/// @return amount0 The amount of token0 that was paid to mint the given amount of liquidity. Matches the value in the callback
/// @return amount1 The amount of token1 that was paid to mint the given amount of liquidity. Matches the value in the callback
function mint(
address recipient,
int24 tickLower,
int24 tickUpper,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 43 of 45 : IUniswapV3PoolOwnerActions.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;
/// @title Permissioned pool actions
/// @notice Contains pool methods that may only be called by the factory owner
interface IUniswapV3PoolOwnerActions {
/// @notice Set the denominator of the protocol's % share of the fees
/// @param feeProtocol0 new protocol fee for token0 of the pool
/// @param feeProtocol1 new protocol fee for token1 of the pool
function setFeeProtocol(uint8 feeProtocol0, uint8 feeProtocol1) external;
/// @notice Collect the protocol fee accrued to the pool
/// @param recipient The address to which collected protocol fees should be sent
/// @param amount0Requested The maximum amount of token0 to send, can be 0 to collect fees in only token1
/// @param amount1Requested The maximum amount of token1 to send, can be 0 to collect fees in only token0
/// @return amount0 The protocol fee collected in token0
/// @return amount1 The protocol fee collected in token1
function collectProtocol(
address recipient,
uint128 amount0Requested,
uint128 amount1Requested
) external returns (uint128 amount0, uint128 amount1);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 44 of 45 : IUniswapV3PoolErrors.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;
/// @title Errors emitted by a pool
/// @notice Contains all events emitted by the pool
interface IUniswapV3PoolErrors {
error LOK();
error TLU();
error TLM();
error TUM();
error AI();
error M0();
error M1();
error AS();
error IIA();
error L();
error F0();
error F1();
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 45 of 45 : IUniswapV3PoolEvents.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;
/// @title Events emitted by a pool
/// @notice Contains all events emitted by the pool
interface IUniswapV3PoolEvents {
/// @notice Emitted exactly once by a pool when #initialize is first called on the pool
/// @dev Mint/Burn/Swap cannot be emitted by the pool before Initialize
/// @param sqrtPriceX96 The initial sqrt price of the pool, as a Q64.96
/// @param tick The initial tick of the pool, i.e. log base 1.0001 of the starting price of the pool
event Initialize(uint160 sqrtPriceX96, int24 tick);
/// @notice Emitted when liquidity is minted for a given position
/// @param sender The address that minted the liquidity
/// @param owner The owner of the position and recipient of any minted liquidity
/// @param tickLower The lower tick of the position
/// @param tickUpper The upper tick of the position
/// @param amount The amount of liquidity minted to the position range
/// @param amount0 How much token0 was required for the minted liquidity
/// @param amount1 How much token1 was required for the minted liquidity
event Mint(
address sender,
address indexed owner,
int24 indexed tickLower,
int24 indexed tickUpper,
uint128 amount,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Settings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"remappings": [
"@solmate/=lib/solmate/src/",
"@forge-std/=lib/forge-std/src/",
"@ds-test/=lib/forge-std/lib/ds-test/src/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"@openzeppelin/=lib/openzeppelin-contracts/",
"@uniswap/v3-periphery/=lib/v3-periphery/",
"@uniswap/v3-core/=lib/v3-core/",
"@chainlink/=lib/chainlink/",
"@uniswapV3P/=lib/v3-periphery/contracts/",
"@uniswapV3C/=lib/v3-core/contracts/",
"@balancer/=lib/balancer-v2-monorepo/pkg/",
"@ccip/=lib/ccip/",
"@balancer-labs/=lib/balancer-v2-monorepo/../../node_modules/@balancer-labs/",
"axelar-gmp-sdk-solidity/=lib/axelar-gmp-sdk-solidity/contracts/",
"balancer-v2-monorepo/=lib/balancer-v2-monorepo/",
"ccip/=lib/ccip/contracts/",
"chainlink/=lib/chainlink/integration-tests/contracts/ethereum/src/",
"forge-std/=lib/forge-std/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"pendle-core-v2-public/=lib/pendle-core-v2-public/contracts/",
"solmate/=lib/solmate/src/",
"v3-core/=lib/v3-core/contracts/",
"v3-periphery/=lib/v3-periphery/contracts/"
],
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"contract Registry","name":"_registry","type":"address"},{"internalType":"contract ERC20","name":"_asset","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint32","name":"_holdingPosition","type":"uint32"},{"internalType":"bytes","name":"_holdingPositionConfig","type":"bytes"},{"internalType":"uint256","name":"_initialDeposit","type":"uint256"},{"internalType":"uint64","name":"_strategistPlatformCut","type":"uint64"},{"internalType":"uint192","name":"_shareSupplyCap","type":"uint192"},{"internalType":"address","name":"_balancerVault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CellarWithMultiAssetDeposit__AlternativeAssetFeeTooLarge","type":"error"},{"inputs":[],"name":"CellarWithMultiAssetDeposit__AlternativeAssetNotSupported","type":"error"},{"inputs":[],"name":"CellarWithMultiAssetDeposit__CallDataLengthNotSupported","type":"error"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"expectedAsset","type":"address"}],"name":"Cellar__AssetMismatch","type":"error"},{"inputs":[{"internalType":"address","name":"adaptor","type":"address"}],"name":"Cellar__CallToAdaptorNotAllowed","type":"error"},{"inputs":[],"name":"Cellar__CallerNotBalancerVault","type":"error"},{"inputs":[],"name":"Cellar__ContractNotShutdown","type":"error"},{"inputs":[],"name":"Cellar__ContractShutdown","type":"error"},{"inputs":[{"internalType":"uint32","name":"position","type":"uint32"}],"name":"Cellar__DebtMismatch","type":"error"},{"inputs":[],"name":"Cellar__ExpectedAddressDoesNotMatchActual","type":"error"},{"inputs":[],"name":"Cellar__ExternalInitiator","type":"error"},{"inputs":[],"name":"Cellar__FailedToForceOutPosition","type":"error"},{"inputs":[{"internalType":"address","name":"illiquidPosition","type":"address"}],"name":"Cellar__IlliquidWithdraw","type":"error"},{"inputs":[{"internalType":"uint256","name":"assetsOwed","type":"uint256"}],"name":"Cellar__IncompleteWithdraw","type":"error"},{"inputs":[],"name":"Cellar__InvalidFee","type":"error"},{"inputs":[],"name":"Cellar__InvalidFeeCut","type":"error"},{"inputs":[{"internalType":"uint32","name":"positionId","type":"uint32"}],"name":"Cellar__InvalidHoldingPosition","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"Cellar__InvalidRebalanceDeviation","type":"error"},{"inputs":[],"name":"Cellar__InvalidShareSupplyCap","type":"error"},{"inputs":[],"name":"Cellar__MinimumConstructorMintNotMet","type":"error"},{"inputs":[],"name":"Cellar__OracleFailure","type":"error"},{"inputs":[],"name":"Cellar__Paused","type":"error"},{"inputs":[{"internalType":"uint32","name":"position","type":"uint32"}],"name":"Cellar__PositionAlreadyUsed","type":"error"},{"inputs":[{"internalType":"uint256","name":"maxPositions","type":"uint256"}],"name":"Cellar__PositionArrayFull","type":"error"},{"inputs":[{"internalType":"uint32","name":"position","type":"uint32"},{"internalType":"uint256","name":"sharesRemaining","type":"uint256"}],"name":"Cellar__PositionNotEmpty","type":"error"},{"inputs":[{"internalType":"uint32","name":"position","type":"uint32"}],"name":"Cellar__PositionNotInCatalogue","type":"error"},{"inputs":[{"internalType":"uint32","name":"position","type":"uint32"}],"name":"Cellar__PositionNotUsed","type":"error"},{"inputs":[],"name":"Cellar__RemovingHoldingPosition","type":"error"},{"inputs":[],"name":"Cellar__SettingValueToRegistryIdZeroIsProhibited","type":"error"},{"inputs":[],"name":"Cellar__ShareSupplyCapExceeded","type":"error"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"Cellar__TotalAssetDeviatedOutsideRange","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"}],"name":"Cellar__TotalSharesMustRemainConstant","type":"error"},{"inputs":[],"name":"Cellar__ZeroAssets","type":"error"},{"inputs":[],"name":"Cellar__ZeroShares","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"adaptor","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"AdaptorCalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"adaptor","type":"address"},{"indexed":false,"internalType":"bool","name":"inCatalogue","type":"bool"}],"name":"AdaptorCatalogueAltered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"asset","type":"address"}],"name":"AlternativeAssetDropped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint32","name":"holdingPosition","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"depositFee","type":"uint32"}],"name":"AlternativeAssetUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"AuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"depositAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"MultiAssetDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"position","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"PositionAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"positionId","type":"uint32"},{"indexed":false,"internalType":"bool","name":"inCatalogue","type":"bool"}],"name":"PositionCatalogueAltered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"position","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"PositionRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newPosition1","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"newPosition2","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"index1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index2","type":"uint256"}],"name":"PositionSwapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldDeviation","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDeviation","type":"uint256"}],"name":"RebalanceDeviationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOracle","type":"address"}],"name":"SharePriceOracleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isShutdown","type":"bool"}],"name":"ShutdownChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPayoutAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newPayoutAddress","type":"address"}],"name":"StrategistPayoutAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"oldPlatformCut","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"newPlatformCut","type":"uint64"}],"name":"StrategistPlatformCutChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adaptor","type":"address"}],"name":"addAdaptorToCatalogue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"index","type":"uint32"},{"internalType":"uint32","name":"positionId","type":"uint32"},{"internalType":"bytes","name":"configurationData","type":"bytes"},{"internalType":"bool","name":"inDebtArray","type":"bool"}],"name":"addPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"positionId","type":"uint32"}],"name":"addPositionToCatalogue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"name":"alternativeAssetData","outputs":[{"internalType":"bool","name":"isSupported","type":"bool"},{"internalType":"uint32","name":"holdingPosition","type":"uint32"},{"internalType":"uint32","name":"depositFee","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"authority","outputs":[{"internalType":"contract Authority","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockExternalReceiver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"checkTotalAssets","type":"bool"},{"internalType":"uint16","name":"allowableRange","type":"uint16"},{"internalType":"address","name":"expectedPriceRouter","type":"address"}],"name":"cachePriceRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"adaptor","type":"address"},{"internalType":"bytes[]","name":"callData","type":"bytes[]"}],"internalType":"struct Cellar.AdaptorCall[]","name":"data","type":"tuple[]"}],"name":"callOnAdaptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint192","name":"_newShareSupplyCap","type":"uint192"}],"name":"decreaseShareSupplyCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"_alternativeAsset","type":"address"}],"name":"dropAlternativeAssetData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeData","outputs":[{"internalType":"uint64","name":"strategistPlatformCut","type":"uint64"},{"internalType":"uint64","name":"platformFee","type":"uint64"},{"internalType":"uint64","name":"lastAccrual","type":"uint64"},{"internalType":"address","name":"strategistPayoutAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"index","type":"uint32"},{"internalType":"uint32","name":"positionId","type":"uint32"},{"internalType":"bool","name":"inDebtArray","type":"bool"}],"name":"forcePositionOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCreditPositions","outputs":[{"internalType":"uint32[]","name":"","type":"uint32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDebtPositions","outputs":[{"internalType":"uint32[]","name":"","type":"uint32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holdingPosition","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ignorePause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint192","name":"_newShareSupplyCap","type":"uint192"}],"name":"increaseShareSupplyCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initiateShutdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isPositionUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isShutdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liftShutdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"depositAsset","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"multiAssetDeposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"depositAsset","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewMultiAssetDeposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceRouter","outputs":[{"internalType":"contract PriceRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"feeAmounts","type":"uint256[]"},{"internalType":"bytes","name":"userData","type":"bytes"}],"name":"receiveFlashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"contract Registry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adaptor","type":"address"}],"name":"removeAdaptorFromCatalogue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"index","type":"uint32"},{"internalType":"bool","name":"inDebtArray","type":"bool"}],"name":"removePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"positionId","type":"uint32"}],"name":"removePositionFromCatalogue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"_alternativeAsset","type":"address"},{"internalType":"uint32","name":"_alternativeHoldingPosition","type":"uint32"},{"internalType":"uint32","name":"_alternativeAssetFee","type":"uint32"}],"name":"setAlternativeAssetData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"positionId","type":"uint32"}],"name":"setHoldingPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDeviation","type":"uint256"}],"name":"setRebalanceDeviation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_registryId","type":"uint256"},{"internalType":"contract ERC4626SharePriceOracle","name":"_sharePriceOracle","type":"address"}],"name":"setSharePriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"payout","type":"address"}],"name":"setStrategistPayoutAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"cut","type":"uint64"}],"name":"setStrategistPlatformCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharePriceOracle","outputs":[{"internalType":"contract ERC4626SharePriceOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shareSupplyCap","outputs":[{"internalType":"uint192","name":"","type":"uint192"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"index1","type":"uint32"},{"internalType":"uint32","name":"index2","type":"uint32"},{"internalType":"bool","name":"inDebtArray","type":"bool"}],"name":"swapPositions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleIgnorePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssetsWithdrawable","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101c0604052670a688906bd8b000061014052662386f26fc10000610160525f6101808190526101a052601080546001600160c01b0319166e2386f26fc100000a688906bd8b0000179055601180546001600160a01b0319169055660110d9316ec00060125534801562000071575f80fd5b50604051620076dd380380620076dd833981016040819052620000949162001103565b8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a89898989898989898989335f8989898181846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000102573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000128919062001228565b5f620001358482620012d6565b506001620001448382620012d6565b5060ff81166080524660a0526200015a62000386565b60c0525050506001600160a01b0392831660e0525050600680548483166001600160a01b0319918216811790925560078054938516939091169290921790915560405133905f8051602062007696833981519152905f90a36040516001600160a01b0382169033907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a350506001600160a01b038916610100819052604051635c9fcd8560e11b81526002600482015263b93f9b0a90602401602060405180830381865afa15801562000232573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200025891906200139e565b600980546001600160a01b0319166001600160a01b0392909216919091179055620002838562000420565b620002915f868682620004e7565b6200029c85620007b0565b600880546001600160c01b0319166001600160c01b038316179055612710831015620002db57604051632d0d251960e11b815260040160405180910390fd5b620002f26001600160a01b0389168b3086620008c6565b620002fe338462000957565b6200030a8584620009c2565b601080546001600160401b0319166001600160401b038416179055620003308a62000a58565b5050505050505050505050505050505050505050806001600160a01b0316610120816001600160a01b03168152505050505050505050505050505050505050505050505050505050505050505050505062001646565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051620003b89190620013bc565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6200042a62000ae5565b61010051604051635159d87f60e11b815263ffffffff831660048201526001600160a01b039091169063a2b3b0fe906024015f6040518083038186803b15801562000473575f80fd5b505afa15801562000486573d5f803e3d5ffd5b5050505063ffffffff81165f818152600e6020908152604091829020805460ff191660019081179091558251938452908301527fea052d1fb1ecba6aaf6bd32e92f20e7b6a094eaa478248322cc8ff024a90978f910160405180910390a150565b620004f162000ae5565b620004fb62000b3b565b63ffffffff83165f908152600c602052604090205460ff16156200053f5760405163335894fb60e11b815263ffffffff841660048201526024015b60405180910390fd5b63ffffffff83165f908152600e602052604090205460ff166200057e57604051631f9db01d60e31b815263ffffffff8416600482015260240162000536565b610100516040516385ae5d5760e01b815263ffffffff851660048201525f91829182916001600160a01b0316906385ae5d57906024015f60405180830381865afa158015620005cf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052620005f8919081019062001446565b925092509250831515821515146200062c57604051632b1d0bd360e11b815263ffffffff8716600482015260240162000536565b604080516080810182526001600160a01b0380861682528415156020808401918252838501868152606085018b905263ffffffff8c165f908152600d9092529490208351815492511515600160a01b026001600160a81b031990931693169290921717815591519091906001820190620006a79082620012d6565b5060608201516002820190620006be9082620012d6565b5090505081156200070557600b54602011620006f15760405163f025236d60e01b81526020600482015260240162000536565b620006ff600b888862000b67565b6200073b565b600a546020116200072d5760405163f025236d60e01b81526020600482015260240162000536565b6200073b600a888862000b67565b63ffffffff86165f908152600c602052604090819020805460ff19166001179055517fc4f8cb57c016f0b294fff2666f86fa6cfee9b03aed19f816ae4bf44b7e837bbb906200079f9088908a9063ffffffff92831681529116602082015260400190565b60405180910390a150505050505050565b620007ba62000ae5565b63ffffffff81165f908152600c602052604090205460ff16620007f9576040516370abe85960e01b815263ffffffff8216600482015260240162000536565b60e0516001600160a01b0316620008108262000d3c565b6001600160a01b0316146200085a5760e0516200082d8262000d3c565b60405163298473c760e11b81526001600160a01b0392831660048201529116602482015260440162000536565b63ffffffff81165f908152600d6020526040902054600160a01b900460ff1615620008a157604051630a42c0f960e41b815263ffffffff8216600482015260240162000536565b6008805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b5f6040516323b872dd60e01b815284600482015283602482015282604482015260205f6064835f8a5af13d15601f3d1160015f511416171691505080620009505760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000604482015260640162000536565b5050505050565b8060025f8282546200096a9190620014be565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b63ffffffff82165f908152600d602052604090819020805491516001600160a01b039092169162000a52916369445c3160e01b9162000a0f91869160018201916002019060240162001555565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b039384161790526001600160a01b0384169162000dce16565b50505050565b62000a6f336001600160e01b03195f351662000dff565b62000aac5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640162000536565b600680546001600160a01b0319166001600160a01b03831690811790915560405133905f8051602062007696833981519152905f90a350565b62000afc336001600160e01b03195f351662000dff565b62000b395760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640162000536565b565b600854600160c81b900460ff161562000b39576040516337a5332d60e11b815260040160405180910390fd5b8254801562000cfc57838062000b7f60018462001583565b8154811062000b925762000b9262001599565b5f9182526020808320600880840490910154855460018082018855968652928520918304909101805463ffffffff60046007958616810261010090810a83810219909416969097160290950a909204909316021790559062000bf5908362001583565b90505b8363ffffffff1681111562000ca8578462000c1560018362001583565b8154811062000c285762000c2862001599565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff1685828154811062000c615762000c6162001599565b905f5260205f2090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff160217905550808062000c9f90620015ad565b91505062000bf8565b5081848463ffffffff168154811062000cc55762000cc562001599565b905f5260205f2090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff16021790555062000a52565b5082546001810184555f93845260209093206008840401805460079094166004026101000a63ffffffff8181021990951692909416939093021790915550565b63ffffffff81165f908152600d60205260408082208054915163e170a9bf60e01b81526001600160a01b0390921691829163e170a9bf9162000d859160010190600401620015c5565b602060405180830381865afa15801562000da1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000dc791906200139e565b9392505050565b606062000df68383604051806060016040528060278152602001620076b66027913962000eba565b90505b92915050565b6007545f906001600160a01b0316801580159062000e99575060405163b700961360e01b81526001600160a01b0385811660048301523060248301526001600160e01b03198516604483015282169063b700961390606401602060405180830381865afa15801562000e73573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000e999190620015d9565b8062000eb257506006546001600160a01b038581169116145b949350505050565b60605f80856001600160a01b03168560405162000ed89190620015f5565b5f60405180830381855af49150503d805f811462000f12576040519150601f19603f3d011682016040523d82523d5f602084013e62000f17565b606091505b50909250905062000f2b8683838762000f35565b9695505050505050565b6060831562000fa85782515f0362000fa0576001600160a01b0385163b62000fa05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000536565b508162000eb2565b62000eb2838381511562000fbf5781518083602001fd5b8060405162461bcd60e51b815260040162000536919062001612565b6001600160a01b038116811462000ff0575f80fd5b50565b8051620010008162000fdb565b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620010355781810151838201526020016200101b565b50505f910152565b5f82601f8301126200104d575f80fd5b81516001600160401b03808211156200106a576200106a62001005565b604051601f8301601f19908116603f0116810190828211818310171562001095576200109562001005565b81604052838152866020858801011115620010ae575f80fd5b62000f2b84602083016020890162001019565b805163ffffffff8116811462001000575f80fd5b80516001600160401b038116811462001000575f80fd5b80516001600160c01b038116811462001000575f80fd5b5f805f805f805f805f805f6101608c8e0312156200111f575f80fd5b6200112a8c62000ff3565b9a506200113a60208d0162000ff3565b99506200114a60408d0162000ff3565b60608d01519099506001600160401b0381111562001166575f80fd5b620011748e828f016200103d565b60808e015190995090506001600160401b0381111562001192575f80fd5b620011a08e828f016200103d565b975050620011b160a08d01620010c1565b60c08d01519096506001600160401b03811115620011cd575f80fd5b620011db8e828f016200103d565b95505060e08c01519350620011f46101008d01620010d5565b9250620012056101208d01620010ec565b9150620012166101408d0162000ff3565b90509295989b509295989b9093969950565b5f6020828403121562001239575f80fd5b815160ff8116811462000dc7575f80fd5b600181811c908216806200125f57607f821691505b6020821081036200127e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620012d1575f81815260208120601f850160051c81016020861015620012ac5750805b601f850160051c820191505b81811015620012cd57828155600101620012b8565b5050505b505050565b81516001600160401b03811115620012f257620012f262001005565b6200130a816200130384546200124a565b8462001284565b602080601f83116001811462001340575f8415620013285750858301515b5f19600386901b1c1916600185901b178555620012cd565b5f85815260208120601f198616915b8281101562001370578886015182559484019460019091019084016200134f565b50858210156200138e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215620013af575f80fd5b815162000dc78162000fdb565b5f808354620013cb816200124a565b60018281168015620013e65760018114620013fc576200142a565b60ff19841687528215158302870194506200142a565b875f526020805f205f5b85811015620014215781548a82015290840190820162001406565b50505082870194505b50929695505050505050565b8051801515811462001000575f80fd5b5f805f6060848603121562001459575f80fd5b8351620014668162000fdb565b9250620014766020850162001436565b60408501519092506001600160401b0381111562001492575f80fd5b620014a0868287016200103d565b9150509250925092565b634e487b7160e01b5f52601160045260245ffd5b8082018082111562000df95762000df9620014aa565b5f8154620014e2816200124a565b8085526020600183811680156200150257600181146200151d576200154a565b60ff1985168884015283151560051b8801830195506200154a565b865f52825f205f5b85811015620015425781548a820186015290830190840162001525565b890184019650505b505050505092915050565b838152606060208201525f6200156f6060830185620014d4565b828103604084015262000f2b8185620014d4565b8181038181111562000df95762000df9620014aa565b634e487b7160e01b5f52603260045260245ffd5b5f81620015be57620015be620014aa565b505f190190565b602081525f62000df66020830184620014d4565b5f60208284031215620015ea575f80fd5b62000df68262001436565b5f82516200160881846020870162001019565b9190910192915050565b602081525f82518060208401526200163281604085016020870162001019565b601f01601f19169190910160400192915050565b60805160a05160c05160e0516101005161012051615f8a6200170c5f395f8181612f2f0152612fbe01525f81816109200152818161179e01528181611af5015281816122e9015281816125bc0152818161288c0152818161329b015261434201525f81816106b801528181610f9401528181610fd501528181611da0015281816121de015281816134b10152818161376401528181613a8b01528181613fa1015261497601525f6114b001525f61148001525f818161062101526149f20152615f8a5ff3fe60806040526004361061042f575f3560e01c8063855bccb31161022b578063ba08765211610129578063d446bbcc116100b3578063e753e60011610078578063e753e60014610d9a578063ef8b30f714610c53578063f04f270714610e1b578063f2fde38b14610e3a578063f5743bc914610e59575f80fd5b8063d446bbcc14610cd0578063d505accf14610d07578063d7d4bf4514610d26578063d905777e14610d45578063dd62ed3e14610d64575f80fd5b8063c63d75b6116100f9578063c63d75b614610c34578063c6e6f59214610c53578063ce96cb7714610c72578063cf30901214610c91578063d1e8840414610cb1575f80fd5b8063ba08765214610bb7578063bf7e214f14610bd6578063bf86d69014610bf5578063c588d8d614610c15575f80fd5b8063a373e3ff116101b5578063b0a75d361161017a578063b0a75d3614610b27578063b187bd2614610b46578063b3d7f6b914610b5a578063b460af9414610b79578063b5292a9914610b98575f80fd5b8063a373e3ff14610aa2578063a8144e4814610ab6578063a9059cbb14610aca578063ac9650d814610ae9578063b0646e2714610b08575f80fd5b806395d89b41116101fb57806395d89b41146109f85780639955a9d414610a0c5780639959af9414610a2b5780639c5f00c214610a4b578063a07bee0b14610a83575f80fd5b8063855bccb31461096d5780638da5cb5b1461098c57806393bbeac0146109ab57806394bf804d146109d9575f80fd5b80633d8ab1e5116103385780635e2c576e116102c257806371e99dc21161028757806371e99dc2146108bd5780637a9e5e4b146108d15780637ab92915146108f05780637b1039991461090f5780637ecebe0014610942575f80fd5b80635e2c576e146107d55780635f6b88a0146107e95780636419111e146108085780636e553f651461087357806370a0823114610892575f80fd5b80634cdad506116103085780634cdad506146104a35780634e84befe14610759578063501eb4fe14610778578063530a371414610797578063575bbce6146107b6575f80fd5b80633d8ab1e5146106da5780633e3382ba146106f9578063402d267d1461071a5780634c4602da14610739575f80fd5b8063196e8285116103b9578063313ce56711610389578063313ce5671461061057806333e15be2146106555780633644e51514610674578063379e0b131461068857806338d52e0f146106a7575f80fd5b8063196e82851461057c578063217bb34d146105b357806323b872dd146105d25780632b91c5de146105f1575f80fd5b8063095ea7b3116103ff578063095ea7b3146104c25780630a28a477146104f15780630a680e1814610510578063150b7a021461052457806318160ddd14610567575f80fd5b806301e1d1141461043a57806306fdde03146104615780630780fd3a1461048257806307a2d13a146104a3575f80fd5b3661043657005b5f80fd5b348015610445575f80fd5b5061044e610e78565b6040519081526020015b60405180910390f35b34801561046c575f80fd5b50610475610ec2565b6040516104589190614ea5565b34801561048d575f80fd5b506104a161049c366004614ecf565b610f4d565b005b3480156104ae575f80fd5b5061044e6104bd366004614ee8565b611093565b3480156104cd575f80fd5b506104e16104dc366004614f13565b6110b6565b6040519015158152602001610458565b3480156104fc575f80fd5b5061044e61050b366004614ee8565b611122565b34801561051b575f80fd5b506104a161113d565b34801561052f575f80fd5b5061054e61053e366004615021565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610458565b348015610572575f80fd5b5061044e60025481565b348015610587575f80fd5b5060135461059b906001600160a01b031681565b6040516001600160a01b039091168152602001610458565b3480156105be575f80fd5b506104a16105cd366004615088565b611197565b3480156105dd575f80fd5b506104e16105ec3660046150a3565b6111fe565b3480156105fc575f80fd5b5061044e61060b3660046150e1565b6112d8565b34801561061b575f80fd5b506106437f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610458565b348015610660575f80fd5b506104a161066f36600461512d565b6113a2565b34801561067f575f80fd5b5061044e61147d565b348015610693575f80fd5b506104a16106a2366004615162565b6114d2565b3480156106b2575f80fd5b5061059b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106e5575f80fd5b506104a16106f4366004615088565b611777565b348015610704575f80fd5b5061070d61184e565b604051610458919061519b565b348015610725575f80fd5b5061044e610734366004615088565b6118cf565b348015610744575f80fd5b506008546104e190600160d81b900460ff1681565b348015610764575f80fd5b506104a161077336600461522b565b61196b565b348015610783575f80fd5b506104a1610792366004614ecf565b611ad2565b3480156107a2575f80fd5b506104a16107b1366004614ee8565b611baa565b3480156107c1575f80fd5b506104a16107d0366004615269565b611c32565b3480156107e0575f80fd5b506104a1611c8c565b3480156107f4575f80fd5b506104a1610803366004615088565b611cfb565b348015610813575f80fd5b5061084f610822366004615088565b60146020525f908152604090205460ff81169063ffffffff61010082048116916501000000000090041683565b60408051931515845263ffffffff9283166020850152911690820152606001610458565b34801561087e575f80fd5b5061044e61088d36600461528f565b611d59565b34801561089d575f80fd5b5061044e6108ac366004615088565b60036020525f908152604090205481565b3480156108c8575f80fd5b5061070d611dee565b3480156108dc575f80fd5b506104a16108eb366004615088565b611e4a565b3480156108fb575f80fd5b5061044e61090a366004614f13565b611f2f565b34801561091a575f80fd5b5061059b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561094d575f80fd5b5061044e61095c366004615088565b60056020525f908152604090205481565b348015610978575f80fd5b506104a16109873660046152b2565b611f7b565b348015610997575f80fd5b5060065461059b906001600160a01b031681565b3480156109b6575f80fd5b506104e16109c5366004614ee8565b600c6020525f908152604090205460ff1681565b3480156109e4575f80fd5b5061044e6109f336600461528f565b612124565b348015610a03575f80fd5b50610475612228565b348015610a17575f80fd5b506104a1610a263660046152f4565b612235565b348015610a36575f80fd5b506008546104e190600160d01b900460ff1681565b348015610a56575f80fd5b50600854610a6e90600160e01b900463ffffffff1681565b60405163ffffffff9091168152602001610458565b348015610a8e575f80fd5b506104a1610a9d366004615162565b6124fb565b348015610aad575f80fd5b506104a1612656565b348015610ac1575f80fd5b5061044e612696565b348015610ad5575f80fd5b506104e1610ae4366004614f13565b6126d3565b348015610af4575f80fd5b506104a1610b0336600461522b565b612736565b348015610b13575f80fd5b506104a1610b22366004615269565b6127bb565b348015610b32575f80fd5b506104a1610b41366004615088565b6127f3565b348015610b51575f80fd5b506104e1612864565b348015610b65575f80fd5b5061044e610b74366004614ee8565b612902565b348015610b84575f80fd5b5061044e610b93366004615360565b61291e565b348015610ba3575f80fd5b506104a1610bb2366004615394565b61299b565b348015610bc2575f80fd5b5061044e610bd1366004615360565b612a3f565b348015610be1575f80fd5b5060075461059b906001600160a01b031681565b348015610c00575f80fd5b506008546104e190600160c81b900460ff1681565b348015610c20575f80fd5b506104a1610c2f3660046153ba565b612ac6565b348015610c3f575f80fd5b5061044e610c4e366004615088565b612b8e565b348015610c5e575f80fd5b5061044e610c6d366004614ee8565b612c02565b348015610c7d575f80fd5b5061044e610c8c366004615088565b612c1e565b348015610c9c575f80fd5b506008546104e190600160c01b900460ff1681565b348015610cbc575f80fd5b506104a1610ccb366004614ecf565b612c54565b348015610cdb575f80fd5b50600854610cef906001600160c01b031681565b6040516001600160c01b039091168152602001610458565b348015610d12575f80fd5b506104a1610d213660046153fb565b612caf565b348015610d31575f80fd5b5060095461059b906001600160a01b031681565b348015610d50575f80fd5b5061044e610d5f366004615088565b612eed565b348015610d6f575f80fd5b5061044e610d7e366004615467565b600460209081525f928352604080842090915290825290205481565b348015610da5575f80fd5b50601054601154610de2916001600160401b0380821692680100000000000000008304821692600160801b9004909116906001600160a01b031684565b604080516001600160401b039586168152938516602085015291909316908201526001600160a01b039091166060820152608001610458565b348015610e26575f80fd5b506104a1610e35366004615493565b612f24565b348015610e45575f80fd5b506104a1610e54366004615088565b61306c565b348015610e64575f80fd5b506104a1610e7336600461528f565b6130e8565b5f610e81613275565b600854600160c01b900460ff1615610eb45760405162461bcd60e51b8152600401610eab90615577565b60405180910390fd5b610ebd5f61332c565b905090565b5f8054610ece9061559b565b80601f0160208091040260200160405190810160405280929190818152602001828054610efa9061559b565b8015610f455780601f10610f1c57610100808354040283529160200191610f45565b820191905f5260205f20905b815481529060010190602001808311610f2857829003601f168201915b505050505081565b610f556137d7565b63ffffffff81165f908152600c602052604090205460ff16610f92576040516370abe85960e01b815263ffffffff82166004820152602401610eab565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610fc582613808565b6001600160a01b031614611029577f0000000000000000000000000000000000000000000000000000000000000000610ffd82613808565b60405163298473c760e11b81526001600160a01b03928316600482015291166024820152604401610eab565b63ffffffff81165f908152600d6020526040902054600160a01b900460ff161561106e57604051630a42c0f960e41b815263ffffffff82166004820152602401610eab565b6008805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b5f805f61109f5f613895565b915091506110ae8483836139a9565b949350505050565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906111109086815260200190565b60405180910390a35060015b92915050565b5f805f61112e5f613895565b915091506110ae8483836139b5565b6111456137d7565b61114d6139c1565b6008805460ff60c81b1916600160c81b179055604051600181527fb8527b93c36dabdfe078af41be789ba946a4adcfeafcf9d8de21d51629859e3c906020015b60405180910390a1565b61119f6137d7565b6001600160a01b0381165f81815260146020908152604091829020805468ffffffffffffffffff1916905590519182527f741bf5c2d606526029e0f199a3ddf6c7ebafa7edb2e1405174105f458195e67991015b60405180910390a150565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f1981146112575761123383826155e7565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b6001600160a01b0385165f908152600360205260408120805485929061127e9084906155e7565b90915550506001600160a01b038085165f81815260036020526040908190208054870190555190918716905f80516020615f35833981519152906112c59087815260200190565b60405180910390a3506001949350505050565b6008545f90600160c01b900460ff16156113045760405162461bcd60e51b8152600401610eab90615577565b6008805460ff60c01b1916600160c01b1790555f808061132487876139ec565b92509250925061133887878585858a613b42565b604080516001600160a01b038a81168252602082018a905291810183905291955086169033907f385ba312edecbeeae57aca70f4fde3d83578697795291e74b1b4edb37d7291bf9060600160405180910390a350506008805460ff60c01b19169055509392505050565b6113aa6137d7565b5f816113f257600a8363ffffffff16815481106113c9576113c96155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff16611430565b600b8363ffffffff168154811061140b5761140b6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff165b90505f61143c82613bd2565b9050801561146c57604051631c7b946d60e31b815263ffffffff8316600482015260248101829052604401610eab565b611477848385613c58565b50505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146114ad57610ebd613d3a565b507f000000000000000000000000000000000000000000000000000000000000000090565b6114da6137d7565b5f80821561160357600b8463ffffffff16815481106114fb576114fb6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff169150600b8563ffffffff168154811061153a5761153a6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff1690508181600b8763ffffffff168154811061157b5761157b6155fa565b905f5260205f209060089182820401919006600402600b8863ffffffff16815481106115a9576115a96155fa565b905f5260205f2090600891828204019190066004028491906101000a81548163ffffffff021916908363ffffffff1602179055508391906101000a81548163ffffffff021916908363ffffffff1602179055505050611720565b600a8463ffffffff168154811061161c5761161c6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff169150600a8563ffffffff168154811061165b5761165b6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff1690508181600a8763ffffffff168154811061169c5761169c6155fa565b905f5260205f209060089182820401919006600402600a8863ffffffff16815481106116ca576116ca6155fa565b905f5260205f2090600891828204019190066004028491906101000a81548163ffffffff021916908363ffffffff1602179055508391906101000a81548163ffffffff021916908363ffffffff16021790555050505b6040805163ffffffff84811682528381166020830152878116828401528616606082015290517fb7c5df04749a3a06a9a7bf1a8142ccf2a4ee6cbf4709489e876a6e4eb3301e8a9181900360800190a15050505050565b61177f6137d7565b604051636777140560e11b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063ceee280a906024015f6040518083038186803b1580156117de575f80fd5b505afa1580156117f0573d5f803e3d5ffd5b505050506001600160a01b0381165f818152600f6020908152604091829020805460ff191660019081179091558251938452908301527f572570e8a43782d3698a3fed258c72f9c201c19be1e4764e359d1adc8f00af7a91016111f3565b6060600b8054806020026020016040519081016040528092919081815260200182805480156118c557602002820191905f5260205f20905f905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116118885790505b5050505050905090565b6008545f90600160c81b900460ff16156118ea57505f919050565b6008546001600160c01b03166002600160c01b0319810161190e57505f1992915050565b5f8061191a6001613895565b91509150826001600160c01b0316811061193857505f949350505050565b5f61194c826001600160c01b0386166155e7565b90506119598184846139a9565b9695505050505050565b505050919050565b600854600160c01b900460ff16156119955760405162461bcd60e51b8152600401610eab90615577565b6008805460ff60c01b1916600160c01b1790556119b06137d7565b6119b86139c1565b6119c0613275565b6008805460ff60d81b1916600160d81b1790555f8080806119e08161332c565b9050611a0b601254670de0b6b3a76400006119fb91906155e7565b8290670de0b6b3a7640000613dd2565b9350611a26601254670de0b6b3a76400006119fb919061560e565b6002549093509150611a429050611a3d858761575c565b613dff565b5f611a4c5f61332c565b905083811080611a5b57508281115b15611a8a5760405163628cc47560e11b8152600481018290526024810185905260448101849052606401610eab565b6002548214611aba57600254604051632b40145960e21b8152600481019190915260248101839052604401610eab565b50506008805463ff0000ff60c01b1916905550505050565b611ada6137d7565b604051635159d87f60e11b815263ffffffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a2b3b0fe906024015f6040518083038186803b158015611b3d575f80fd5b505afa158015611b4f573d5f803e3d5ffd5b5050505063ffffffff81165f818152600e6020908152604091829020805460ff191660019081179091558251938452908301527fea052d1fb1ecba6aaf6bd32e92f20e7b6a094eaa478248322cc8ff024a90978f91016111f3565b611bb26137d7565b67016345785d8a0000811115611bec576040516302d2a90f60e51b81526004810182905267016345785d8a00006024820152604401610eab565b601280549082905560408051828152602081018490527fdf4be33b2e9e3dd4d9e0e85645aea428494a0644a72c51d6a15aedae6b66a3ff91015b60405180910390a15050565b611c3a6137d7565b6008546001600160c01b039081169082161115611c6a576040516334f1ec1b60e01b815260040160405180910390fd5b600880546001600160c01b0319166001600160c01b0392909216919091179055565b611c946137d7565b600854600160c81b900460ff16611cbe5760405163ec7165bf60e01b815260040160405180910390fd5b6008805460ff60c81b191690556040515f81527fb8527b93c36dabdfe078af41be789ba946a4adcfeafcf9d8de21d51629859e3c9060200161118d565b611d036137d7565b6001600160a01b0381165f818152600f60209081526040808320805460ff191690558051938452908301919091527f572570e8a43782d3698a3fed258c72f9c201c19be1e4764e359d1adc8f00af7a91016111f3565b6008545f90600160c01b900460ff1615611d855760405162461bcd60e51b8152600401610eab90615577565b6008805460ff60c01b1916600160c01b1790819055611dda907f00000000000000000000000000000000000000000000000000000000000000009085908190819063ffffffff600160e01b9091041687613b42565b6008805460ff60c01b191690559392505050565b6060600a8054806020026020016040519081016040528092919081815260200182805480156118c5575f918252602091829020805463ffffffff1684529082028301929091600491018084116118885790505050505050905090565b6006546001600160a01b0316331480611edc575060075460405163b700961360e01b81526001600160a01b039091169063b700961390611e9d90339030906001600160e01b03195f351690600401615768565b602060405180830381865afa158015611eb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611edc9190615795565b611ee4575f80fd5b600780546001600160a01b0319166001600160a01b03831690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a350565b5f805f611f3c85856139ec565b50915091505f80611f4d6001613895565b9092509050611f7083611f6081876155e7565b611f6a908561560e565b83613f84565b979650505050505050565b611f836137d7565b63ffffffff82165f908152600c602052604090205460ff16611fc0576040516370abe85960e01b815263ffffffff83166004820152602401610eab565b826001600160a01b0316611fd383613808565b6001600160a01b031614611feb5782610ffd83613808565b63ffffffff82165f908152600d6020526040902054600160a01b900460ff161561203057604051630a42c0f960e41b815263ffffffff83166004820152602401610eab565b6298968063ffffffff8216111561205a57604051632e3a13e960e21b815260040160405180910390fd5b60408051606080820183526001825263ffffffff85811660208085018281528784168688018181526001600160a01b038c165f818152601486528a902098518954945192518816650100000000000268ffffffff000000000019939098166101000264ffffffff00199115159190911664ffffffffff19909516949094179390931716949094179095558551948552840152928201929092527f2682afad81f7b7a2141b8d3c671b3efc09ac3dac73f06a5cd8e4714ae8864c1b91015b60405180910390a1505050565b6008545f90600160c01b900460ff16156121505760405162461bcd60e51b8152600401610eab90615577565b6008805460ff60c01b1916600160c01b1790555f8061216f6001613895565b9150915061217e858383613f90565b9250825f036121a057604051639768300560e01b815260040160405180910390fd5b6008546001600160c01b03166121b6868361560e565b11156121d55760405163adea3dfd60e01b815260040160405180910390fd5b600854612213907f000000000000000000000000000000000000000000000000000000000000000090600160e01b900463ffffffff16858888613f9c565b50506008805460ff60c01b1916905592915050565b60018054610ece9061559b565b61223d6137d7565b6122456139c1565b63ffffffff83165f908152600c602052604090205460ff16156122835760405163335894fb60e11b815263ffffffff84166004820152602401610eab565b63ffffffff83165f908152600e602052604090205460ff166122c057604051631f9db01d60e31b815263ffffffff84166004820152602401610eab565b6040516385ae5d5760e01b815263ffffffff841660048201525f90819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906385ae5d57906024015f60405180830381865afa15801561232d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261235491908101906157b0565b9250925092508315158215151461238657604051632b1d0bd360e11b815263ffffffff87166004820152602401610eab565b604080516080810182526001600160a01b0380861682528415156020808401918252838501868152606085018b905263ffffffff8c165f908152600d9092529490208351815492511515600160a01b026001600160a81b0319909316931692909217178155915190919060018201906123ff908261588e565b5060608201516002820190612414908261588e565b50905050811561245557600b546020116124445760405163f025236d60e01b815260206004820152602401610eab565b612450600b8888614040565b612487565b600a5460201161247b5760405163f025236d60e01b815260206004820152602401610eab565b612487600a8888614040565b63ffffffff86165f908152600c602052604090819020805460ff19166001179055517fc4f8cb57c016f0b294fff2666f86fa6cfee9b03aed19f816ae4bf44b7e837bbb906124ea9088908a9063ffffffff92831681529116602082015260400190565b60405180910390a150505050505050565b6125036137d7565b5f8161254b57600a8463ffffffff1681548110612522576125226155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff16612589565b600b8463ffffffff1681548110612564576125646155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff165b90508063ffffffff168363ffffffff1614158061262d57506040516321a0f75360e01b815263ffffffff841660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906321a0f75390602401602060405180830381865afa158015612609573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262d9190615795565b1561264b5760405163d4db0b7960e01b815260040160405180910390fd5b611477848484613c58565b61265e6137d7565b600854600160d01b900460ff16612676576001612678565b5f5b60088054911515600160d01b0260ff60d01b19909216919091179055565b5f61269f613275565b600854600160c01b900460ff16156126c95760405162461bcd60e51b8152600401610eab90615577565b610ebd600161332c565b335f908152600360205260408120805483919083906126f39084906155e7565b90915550506001600160a01b0383165f81815260036020526040908190208054850190555133905f80516020615f35833981519152906111109086815260200190565b5f5b818110156127b6576127a3838383818110612755576127556155fa565b90506020028101906127679190615949565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525030939250506141fd9050565b50806127ae8161598b565b915050612738565b505050565b6127c36137d7565b6008546001600160c01b039081169082161015611c6a576040516334f1ec1b60e01b815260040160405180910390fd5b6127fb6137d7565b601154604080516001600160a01b03928316815291831660208301527f51dbb5a65bb22737861a63ec12ba6ce78a98631e9404b0567a2eaf7a06fc544d910160405180910390a1601180546001600160a01b0319166001600160a01b0392909216919091179055565b6008545f90600160d01b900460ff166128fd57604051630ad85dff60e41b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ad85dff090602401602060405180830381865afa1580156128d9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebd9190615795565b505f90565b5f805f61290f6001613895565b915091506110ae848383613f90565b6008545f90600160c01b900460ff161561294a5760405162461bcd60e51b8152600401610eab90615577565b6008805460ff60c01b1916600160c01b1790555f8061296881613895565b915091506129778683836139b5565b925061298586848787614222565b50506008805460ff60c01b191690559392505050565b6129a36137d7565b670de0b6b3a76400006001600160401b03821611156129d557604051633d0203e560e01b815260040160405180910390fd5b601054604080516001600160401b03928316815291831660208301527fb5cc994a260a85a42d6588668221571ae0a14f0a28f9e4817a5195262102c868910160405180910390a16010805467ffffffffffffffff19166001600160401b0392909216919091179055565b6008545f90600160c01b900460ff1615612a6b5760405162461bcd60e51b8152600401610eab90615577565b6008805460ff60c01b1916600160c01b1790555f80612a8981613895565b91509150612a988683836139a9565b9250825f03612aba57604051639768300560e01b815260040160405180910390fd5b61298583878787614222565b612ace6137d7565b5f808415612b13575f612adf610e78565b9050612afe612af0866127106159a3565b829061ffff166127106142f8565b9250612b0f612af0866127106159c5565b9150505b612b1e600284614316565b600980546001600160a01b0319166001600160a01b0385161790555f612b42610e78565b90508515612b865782811080612b5757508181115b15612b865760405163628cc47560e11b8152600481018290526024810184905260448101839052606401610eab565b505050505050565b6008545f90600160c81b900460ff1615612ba957505f919050565b6008546001600160c01b03166002600160c01b03198101612bcd57505f1992915050565b6002546001600160c01b038216811015612bf957612bf4816001600160c01b0384166155e7565b6110ae565b5f949350505050565b5f805f612c0f6001613895565b915091506110ae848383613f84565b6008545f90600160c01b900460ff1615612c4a5760405162461bcd60e51b8152600401610eab90615577565b61111c825f6143f4565b612c5c6137d7565b63ffffffff81165f818152600e60209081526040808320805460ff191690558051938452908301919091527fea052d1fb1ecba6aaf6bd32e92f20e7b6a094eaa478248322cc8ff024a90978f91016111f3565b42841015612cff5760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610eab565b5f6001612d0a61147d565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015612e12573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590612e485750876001600160a01b0316816001600160a01b0316145b612e855760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610eab565b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6008545f90600160c01b900460ff1615612f195760405162461bcd60e51b8152600401610eab90615577565b61111c8260016143f4565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612f6d57604051633cf941a360e01b815260040160405180910390fd5b600854600160d81b900460ff16612f97576040516304a246dd60e51b815260040160405180910390fd5b5f612fa4828401846159e0565b9050612faf81613dff565b5f5b86811015613060576130507f0000000000000000000000000000000000000000000000000000000000000000878784818110612fef57612fef6155fa565b905060200201358a8a85818110613008576130086155fa565b90506020020135613019919061560e565b8c8c8581811061302b5761302b6155fa565b90506020020160208101906130409190615088565b6001600160a01b0316919061446e565b6130598161598b565b9050612fb1565b50505050505050505050565b613081335f356001600160e01b0319166144e2565b61309d5760405162461bcd60e51b8152600401610eab90615a24565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6130fd335f356001600160e01b0319166144e2565b6131195760405162461bcd60e51b8152600401610eab90615a24565b6131238282614316565b601260ff16816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613164573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131889190615a4a565b60ff161415806132095750306001600160a01b0316816001600160a01b031663d4b839926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131fd9190615a65565b6001600160a01b031614155b156132275760405163229e78bb60e01b815260040160405180910390fd5b601380546001600160a01b0319166001600160a01b0383169081179091556040519081527f51b1b17228af00bd72d43ecec4334e09b3584633abf6ef363a9fde05dfa73f8890602001611c26565b600854600160d01b900460ff1661332a57604051630ad85dff60e41b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ad85dff090602401602060405180830381865afa1580156132e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061330c9190615795565b1561332a57604051630f301f8f60e41b815260040160405180910390fd5b565b600a545f9081816001600160401b0381111561334a5761334a614f3d565b604051908082528060200260200182016040528015613373578160200160208202803683370190505b5090505f826001600160401b0381111561338f5761338f614f3d565b6040519080825280602002602001820160405280156133b8578160200160208202803683370190505b509050841561351f575f5b83811015613484575f600a82815481106133df576133df6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff16905061340e81614588565b838381518110613420576134206155fa565b60200260200101818152505f036134375750613474565b61344081613808565b848381518110613452576134526155fa565b60200260200101906001600160a01b031690816001600160a01b031681525050505b61347d8161598b565b90506133c3565b5060095460405163b333a17560e01b81526001600160a01b039091169063b333a175906134d990859085907f000000000000000000000000000000000000000000000000000000000000000090600401615af0565b602060405180830381865afa1580156134f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135189190615b2d565b9350611963565b600b545f816001600160401b0381111561353b5761353b614f3d565b604051908082528060200260200182016040528015613564578160200160208202803683370190505b5090505f826001600160401b0381111561358057613580614f3d565b6040519080825280602002602001820160405280156135a9578160200160208202803683370190505b5090505f5b8681101561366f575f600a82815481106135ca576135ca6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff1690506135f981613bd2565b86838151811061360b5761360b6155fa565b60200260200101818152505f03613622575061365f565b61362b81613808565b87838151811061363d5761363d6155fa565b60200260200101906001600160a01b031690816001600160a01b031681525050505b6136688161598b565b90506135ae565b505f5b83811015613733575f600b828154811061368e5761368e6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff1690506136bd81613bd2565b8383815181106136cf576136cf6155fa565b60200260200101818152505f036136e65750613723565b6136ef81613808565b848381518110613701576137016155fa565b60200260200101906001600160a01b031690816001600160a01b031681525050505b61372c8161598b565b9050613672565b50600954604051637563738b60e11b81526001600160a01b039091169063eac6e7169061378c9088908890879087907f000000000000000000000000000000000000000000000000000000000000000090600401615b44565b602060405180830381865afa1580156137a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137cb9190615b2d565b98975050505050505050565b6137ec335f356001600160e01b0319166144e2565b61332a5760405162461bcd60e51b8152600401610eab90615a24565b63ffffffff81165f908152600d60205260408082208054915163e170a9bf60e01b81526001600160a01b0390921691829163e170a9bf9161384f9160010190600401615c24565b602060405180830381865afa15801561386a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061388e9190615a65565b9392505050565b6013545f9081906001600160a01b0316801561398a575f805f836001600160a01b031663c36af4606040518163ffffffff1660e01b8152600401606060405180830381865afa1580156138ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390e9190615c36565b92509250925080156139335760405163229e78bb60e01b815260040160405180910390fd5b5f8715613950578284116139475782613949565b835b9050613962565b82841061395d578261395f565b835b90505b600254955061397f866139776012600a615d41565b8391906142f8565b9650505050506139a3565b60405163229e78bb60e01b815260040160405180910390fd5b50915091565b5f6110ae8484846142f8565b5f6110ae848385613dd2565b600854600160c81b900460ff161561332a576040516337a5332d60e11b815260040160405180910390fd5b6001600160a01b0382165f9081526014602090815260408083208151606081018352905460ff8116151580835263ffffffff610100830481169584019590955265010000000000909104909316918101919091528291829190613a625760405163217feaeb60e01b815260040160405180910390fd5b60095460405163151d4a5960e31b81526001600160a01b038881166004830152602482018890527f0000000000000000000000000000000000000000000000000000000000000000811660448301529091169063a8ea52c890606401602060405180830381865afa158015613ad9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613afd9190615b2d565b9350613b3181604001516305f5e100613b169190615d4f565b63ffffffff166305f5e100866142f89092919063ffffffff16565b925080602001519150509250925092565b5f805f613b4f6001613895565b9092509050613b6286611f60818a6155e7565b9250825f03613b845760405163426f153760e11b815260040160405180910390fd5b6008546001600160c01b0316613b9a848361560e565b1115613bb95760405163adea3dfd60e01b815260040160405180910390fd5b613bc689868a8688613f9c565b50509695505050505050565b63ffffffff81165f908152600d602052604080822080549151637841536560e01b81526001600160a01b03909216918291637841536591613c199160010190600401615c24565b602060405180830381865afa158015613c34573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061388e9190615b2d565b60085463ffffffff600160e01b909104811690831603613c8b576040516319ded73160e21b815260040160405180910390fd5b8015613ca157613c9c600b8461463d565b613cac565b613cac600a8461463d565b63ffffffff82165f908152600c60209081526040808320805460ff19169055600d909152812080546001600160a81b031916815590613cee6001830182614e06565b613cfb600283015f614e06565b50506040805163ffffffff8085168252851660208201527fa5cd0099b78b279c04987aa80ffffaf8fc8c8af4e7c7bce2686e8d01e2e1bd519101612117565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051613d6a9190615d6c565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b828202811515841585830485141716613de9575f80fd5b6001826001830304018115150290509392505050565b5f5b8151811015613f80575f828281518110613e1d57613e1d6155fa565b602090810291909101810151516001600160a01b0381165f908152600f90925260409091205490915060ff16613e7157604051635df6b61760e11b81526001600160a01b0382166004820152602401610eab565b5f5b838381518110613e8557613e856155fa565b60200260200101516020015151811015613f6d57613eeb848481518110613eae57613eae6155fa565b6020026020010151602001518281518110613ecb57613ecb6155fa565b6020026020010151836001600160a01b03166141fd90919063ffffffff16565b507f7445c6598e1b553f076d507692eab3dceef0d608757141b53e9e56aa8bbaf48382858581518110613f2057613f206155fa565b6020026020010151602001518381518110613f3d57613f3d6155fa565b6020026020010151604051613f53929190615dde565b60405180910390a180613f658161598b565b915050613e73565b505080613f799061598b565b9050613e01565b5050565b5f6110ae8483856142f8565b5f6110ae848484613dd2565b613fc87f000000000000000000000000000000000000000000000000000000000000000084848461477c565b613fdd6001600160a01b03861633308661478c565b613fe7818361480b565b60408051848152602081018490526001600160a01b0383169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a361403984848484614862565b5050505050565b825480156141bd5783806140556001846155e7565b81548110614065576140656155fa565b5f9182526020808320600880840490910154855460018082018855968652928520918304909101805463ffffffff60046007958616810261010090810a83810219909416969097160290950a90920490931602179055906140c690836155e7565b90505b8363ffffffff1681111561416d57846140e36001836155e7565b815481106140f3576140f36155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff16858281548110614129576141296155fa565b905f5260205f2090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff160217905550808061416590615e01565b9150506140c9565b5081848463ffffffff1681548110614187576141876155fa565b905f5260205f2090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff160217905550611477565b5082546001810184555f93845260209093206008840401805460079094166004026101000a63ffffffff8181021990951692909416939093021790915550565b606061388e8383604051806060016040528060278152602001615f0e6027913961486c565b61422e84848484614784565b336001600160a01b03821614614299576001600160a01b0381165f9081526004602090815260408083203384529091529020545f1981146142975761427384826155e7565b6001600160a01b0383165f9081526004602090815260408083203384529091529020555b505b6142a381846148d6565b60408051858152602081018590526001600160a01b03808416929085169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a46114778483614935565b82820281151584158583048514171661430f575f80fd5b0492915050565b815f0361433657604051632db38d0560e01b815260040160405180910390fd5b806001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b93f9b0a846040518263ffffffff1660e01b815260040161438e91815260200190565b602060405180830381865afa1580156143a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143cd9190615a65565b6001600160a01b031614613f8057604051634ee204d760e01b815260040160405180910390fd5b5f6143fd613275565b5f806144085f613895565b6001600160a01b0387165f90815260036020526040812054929450909250906144329084846139a9565b90505f61443f600161332c565b90508082111561444f5780614451565b815b9450851561446457611f70858585613f84565b5050505092915050565b5f60405163a9059cbb60e01b815283600482015282602482015260205f6044835f895af13d15601f3d1160015f5114161716915050806114775760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610eab565b6007545f906001600160a01b03168015801590614569575060405163b700961360e01b81526001600160a01b0382169063b70096139061452a90879030908890600401615768565b602060405180830381865afa158015614545573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145699190615795565b806110ae57506006546001600160a01b03858116911614949350505050565b63ffffffff81165f908152600d6020526040812054600160a01b900460ff16156145b357505f919050565b63ffffffff82165f908152600d60205260409081902080549151637d2872e960e11b81526001600160a01b039092169163fa50e5d2916145fe91600182019160020190600401615e16565b602060405180830381865afa158015614619573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111c9190615b2d565b815463ffffffff8216811161468a5760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152606401610eab565b63ffffffff82165b61469d6001836155e7565b81101561473a57836146b082600161560e565b815481106146c0576146c06155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff168482815481106146f6576146f66155fa565b905f5260205f2090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff16021790555080806147329061598b565b915050614692565b508280548061474b5761474b615e43565b5f8281526020902060085f1990920191820401805463ffffffff600460078516026101000a02191690559055505050565b6147846139c1565b611477613275565b5f6040516323b872dd60e01b815284600482015283602482015282604482015260205f6064835f8a5af13d15601f3d1160015f5114161716915050806140395760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401610eab565b8060025f82825461481c919061560e565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481525f80516020615f3583398151915291015b60405180910390a35050565b6114778484614c8a565b60605f80856001600160a01b0316856040516148889190615e57565b5f60405180830381855af49150503d805f81146148c0576040519150601f19603f3d011682016040523d82523d5f602084013e6148c5565b606091505b509150915061195986838387614d16565b6001600160a01b0382165f90815260036020526040812080548392906148fd9084906155e7565b90915550506002805482900390556040518181525f906001600160a01b038416905f80516020615f3583398151915290602001614856565b61495c60405180608001604052805f81526020015f81526020015f81526020015f81525090565b600954604051630226614760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015290911690630226614790602401602060405180830381865afa1580156149c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149e89190615b2d565b6040820152614a187f0000000000000000000000000000000000000000000000000000000000000000600a615d41565b6060820152600a545f5b81811015614c67575f600a8281548110614a3e57614a3e6155fa565b5f9182526020822060088204015460079091166004026101000a900463ffffffff169150614a6b82614588565b9050805f03614a7b575050614c57565b5f614a8583613808565b600954604051630226614760e01b81526001600160a01b038084166004830152929350911690630226614790602401602060405180830381865afa158015614acf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614af39190615b2d565b865f018181525050806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b5b9190615a4a565b614b6690600a615d41565b6020870181905286515f918291614b9091614b8987670de0b6b3a7640000615e72565b91906142f8565b9050614baf88606001518960400151836142f89092919063ffffffff16565b9150614bc3670de0b6b3a764000083615e89565b9150505f89821115614c26575f614bf189604001518a606001518d670de0b6b3a7640000614b899190615e72565b60208a01518a51919250614c07918391906142f8565b9150614c1b670de0b6b3a764000083615e89565b91505f9a5050614c35565b5082614c32828b6155e7565b99505b614c4085828b614d8e565b895f03614c51575050505050614c67565b50505050505b614c608161598b565b9050614a22565b5083156114775760405163cc5ea39b60e01b815260048101859052602401610eab565b63ffffffff82165f908152600d602052604090819020805491516001600160a01b0390921691611477916369445c3160e01b91614cd4918691600182019160020190602401615ea8565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526001600160a01b038316906141fd565b60608315614d845782515f03614d7d576001600160a01b0385163b614d7d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610eab565b50816110ae565b6110ae8383614ddc565b63ffffffff83165f908152600d602052604090819020805491516001600160a01b03909216916140399163c9111bd760e01b91614cd491879187916001810191600290910190602401615ed2565b815115614dec5781518083602001fd5b8060405162461bcd60e51b8152600401610eab9190614ea5565b508054614e129061559b565b5f825580601f10614e21575050565b601f0160209004905f5260205f2090810190614e3d9190614e40565b50565b5b80821115614e54575f8155600101614e41565b5090565b5f5b83811015614e72578181015183820152602001614e5a565b50505f910152565b5f8151808452614e91816020860160208601614e58565b601f01601f19169290920160200192915050565b602081525f61388e6020830184614e7a565b803563ffffffff81168114614eca575f80fd5b919050565b5f60208284031215614edf575f80fd5b61388e82614eb7565b5f60208284031215614ef8575f80fd5b5035919050565b6001600160a01b0381168114614e3d575f80fd5b5f8060408385031215614f24575f80fd5b8235614f2f81614eff565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b0381118282101715614f7357614f73614f3d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614fa157614fa1614f3d565b604052919050565b5f6001600160401b03821115614fc157614fc1614f3d565b50601f01601f191660200190565b5f82601f830112614fde575f80fd5b8135614ff1614fec82614fa9565b614f79565b818152846020838601011115615005575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215615034575f80fd5b843561503f81614eff565b9350602085013561504f81614eff565b92506040850135915060608501356001600160401b03811115615070575f80fd5b61507c87828801614fcf565b91505092959194509250565b5f60208284031215615098575f80fd5b813561388e81614eff565b5f805f606084860312156150b5575f80fd5b83356150c081614eff565b925060208401356150d081614eff565b929592945050506040919091013590565b5f805f606084860312156150f3575f80fd5b83356150fe81614eff565b925060208401359150604084013561511581614eff565b809150509250925092565b8015158114614e3d575f80fd5b5f806040838503121561513e575f80fd5b61514783614eb7565b9150602083013561515781615120565b809150509250929050565b5f805f60608486031215615174575f80fd5b61517d84614eb7565b925061518b60208501614eb7565b9150604084013561511581615120565b602080825282518282018190525f9190848201906040850190845b818110156151d857835163ffffffff16835292840192918401916001016151b6565b50909695505050505050565b5f8083601f8401126151f4575f80fd5b5081356001600160401b0381111561520a575f80fd5b6020830191508360208260051b8501011115615224575f80fd5b9250929050565b5f806020838503121561523c575f80fd5b82356001600160401b03811115615251575f80fd5b61525d858286016151e4565b90969095509350505050565b5f60208284031215615279575f80fd5b81356001600160c01b038116811461388e575f80fd5b5f80604083850312156152a0575f80fd5b82359150602083013561515781614eff565b5f805f606084860312156152c4575f80fd5b83356152cf81614eff565b92506152dd60208501614eb7565b91506152eb60408501614eb7565b90509250925092565b5f805f8060808587031215615307575f80fd5b61531085614eb7565b935061531e60208601614eb7565b925060408501356001600160401b03811115615338575f80fd5b61534487828801614fcf565b925050606085013561535581615120565b939692955090935050565b5f805f60608486031215615372575f80fd5b83359250602084013561538481614eff565b9150604084013561511581614eff565b5f602082840312156153a4575f80fd5b81356001600160401b038116811461388e575f80fd5b5f805f606084860312156153cc575f80fd5b83356153d781615120565b9250602084013561ffff81168114615384575f80fd5b60ff81168114614e3d575f80fd5b5f805f805f805f60e0888a031215615411575f80fd5b873561541c81614eff565b9650602088013561542c81614eff565b95506040880135945060608801359350608088013561544a816153ed565b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215615478575f80fd5b823561548381614eff565b9150602083013561515781614eff565b5f805f805f805f806080898b0312156154aa575f80fd5b88356001600160401b03808211156154c0575f80fd5b6154cc8c838d016151e4565b909a50985060208b01359150808211156154e4575f80fd5b6154f08c838d016151e4565b909850965060408b0135915080821115615508575f80fd5b6155148c838d016151e4565b909650945060608b013591508082111561552c575f80fd5b818b0191508b601f83011261553f575f80fd5b81358181111561554d575f80fd5b8c602082850101111561555e575f80fd5b6020830194508093505050509295985092959890939650565b6020808252600a90820152695245454e5452414e435960b01b604082015260600190565b600181811c908216806155af57607f821691505b6020821081036155cd57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561111c5761111c6155d3565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561111c5761111c6155d3565b5f6001600160401b0382111561563957615639614f3d565b5060051b60200190565b5f615650614fec84615621565b8381529050602080820190600585901b84018681111561566e575f80fd5b845b81811015615751576001600160401b03808235111561568d575f80fd5b813587016040818b0312156156a0575f80fd5b6156a8614f51565b6156b28235614eff565b8135815285820135838111156156c6575f80fd5b8083019250508a601f8301126156da575f80fd5b81356156e8614fec82615621565b81815260059190911b8301870190878101908d831115615706575f80fd5b8885015b8381101561573b57868135111561571f575f80fd5b61572e8f8b8335890101614fcf565b835291890191890161570a565b5083890152505086525050928201928201615670565b505050509392505050565b5f61388e368484615643565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f602082840312156157a5575f80fd5b815161388e81615120565b5f805f606084860312156157c2575f80fd5b83516157cd81614eff565b60208501519093506157de81615120565b60408501519092506001600160401b038111156157f9575f80fd5b8401601f81018613615809575f80fd5b8051615817614fec82614fa9565b81815287602083850101111561582b575f80fd5b61583c826020830160208601614e58565b8093505050509250925092565b601f8211156127b6575f81815260208120601f850160051c8101602086101561586f5750805b601f850160051c820191505b81811015612b865782815560010161587b565b81516001600160401b038111156158a7576158a7614f3d565b6158bb816158b5845461559b565b84615849565b602080601f8311600181146158ee575f84156158d75750858301515b5f19600386901b1c1916600185901b178555612b86565b5f85815260208120601f198616915b8281101561591c578886015182559484019460019091019084016158fd565b508582101561593957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f808335601e1984360301811261595e575f80fd5b8301803591506001600160401b03821115615977575f80fd5b602001915036819003821315615224575f80fd5b5f6001820161599c5761599c6155d3565b5060010190565b61ffff8281168282160390808211156159be576159be6155d3565b5092915050565b61ffff8181168382160190808211156159be576159be6155d3565b5f602082840312156159f0575f80fd5b81356001600160401b03811115615a05575f80fd5b8201601f81018413615a15575f80fd5b6110ae84823560208401615643565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b5f60208284031215615a5a575f80fd5b815161388e816153ed565b5f60208284031215615a75575f80fd5b815161388e81614eff565b5f8151808452602080850194508084015f5b83811015615ab75781516001600160a01b031687529582019590820190600101615a92565b509495945050505050565b5f8151808452602080850194508084015f5b83811015615ab757815187529582019590820190600101615ad4565b606081525f615b026060830186615a80565b8281036020840152615b148186615ac2565b91505060018060a01b0383166040830152949350505050565b5f60208284031215615b3d575f80fd5b5051919050565b60a081525f615b5660a0830188615a80565b8281036020840152615b688188615ac2565b90508281036040840152615b7c8187615a80565b90508281036060840152615b908186615ac2565b91505060018060a01b03831660808301529695505050505050565b5f8154615bb78161559b565b808552602060018381168015615bd45760018114615bee57615c19565b60ff1985168884015283151560051b880183019550615c19565b865f52825f205f5b85811015615c115781548a8201860152908301908401615bf6565b890184019650505b505050505092915050565b602081525f61388e6020830184615bab565b5f805f60608486031215615c48575f80fd5b8351925060208401519150604084015161511581615120565b600181815b80851115615c9b57815f1904821115615c8157615c816155d3565b80851615615c8e57918102915b93841c9390800290615c66565b509250929050565b5f82615cb15750600161111c565b81615cbd57505f61111c565b8160018114615cd35760028114615cdd57615cf9565b600191505061111c565b60ff841115615cee57615cee6155d3565b50506001821b61111c565b5060208310610133831016604e8410600b8410161715615d1c575081810a61111c565b615d268383615c61565b805f1904821115615d3957615d396155d3565b029392505050565b5f61388e60ff841683615ca3565b63ffffffff8281168282160390808211156159be576159be6155d3565b5f808354615d798161559b565b60018281168015615d915760018114615da657615dd2565b60ff1984168752821515830287019450615dd2565b875f526020805f205f5b85811015615dc95781548a820152908401908201615db0565b50505082870194505b50929695505050505050565b6001600160a01b03831681526040602082018190525f906110ae90830184614e7a565b5f81615e0f57615e0f6155d3565b505f190190565b604081525f615e286040830185615bab565b8281036020840152615e3a8185615bab565b95945050505050565b634e487b7160e01b5f52603160045260245ffd5b5f8251615e68818460208701614e58565b9190910192915050565b808202811582820484141761111c5761111c6155d3565b5f82615ea357634e487b7160e01b5f52601260045260245ffd5b500490565b838152606060208201525f615ec06060830185615bab565b82810360408401526119598185615bab565b8481526001600160a01b03841660208201526080604082018190525f90615efb90830185615bab565b8281036060840152611f708185615bab56fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122001ee3b7a5e5b203fe12552069e6757861290b0f372c1673e65521345b9de750b64736f6c634300081500338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65640000000000000000000000002322ba43eff1542b6a7baed35e66099ea0d12bd100000000000000000000000037912f4c0f0d916890ebd755bf6d1f0a0e059bbd000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c8000000000000000000000000000000000000000000000000000000000000001045746865722e66692d4c69717569643100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4c5149444554484649563100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001

Deployed Bytecode

0x60806040526004361061042f575f3560e01c8063855bccb31161022b578063ba08765211610129578063d446bbcc116100b3578063e753e60011610078578063e753e60014610d9a578063ef8b30f714610c53578063f04f270714610e1b578063f2fde38b14610e3a578063f5743bc914610e59575f80fd5b8063d446bbcc14610cd0578063d505accf14610d07578063d7d4bf4514610d26578063d905777e14610d45578063dd62ed3e14610d64575f80fd5b8063c63d75b6116100f9578063c63d75b614610c34578063c6e6f59214610c53578063ce96cb7714610c72578063cf30901214610c91578063d1e8840414610cb1575f80fd5b8063ba08765214610bb7578063bf7e214f14610bd6578063bf86d69014610bf5578063c588d8d614610c15575f80fd5b8063a373e3ff116101b5578063b0a75d361161017a578063b0a75d3614610b27578063b187bd2614610b46578063b3d7f6b914610b5a578063b460af9414610b79578063b5292a9914610b98575f80fd5b8063a373e3ff14610aa2578063a8144e4814610ab6578063a9059cbb14610aca578063ac9650d814610ae9578063b0646e2714610b08575f80fd5b806395d89b41116101fb57806395d89b41146109f85780639955a9d414610a0c5780639959af9414610a2b5780639c5f00c214610a4b578063a07bee0b14610a83575f80fd5b8063855bccb31461096d5780638da5cb5b1461098c57806393bbeac0146109ab57806394bf804d146109d9575f80fd5b80633d8ab1e5116103385780635e2c576e116102c257806371e99dc21161028757806371e99dc2146108bd5780637a9e5e4b146108d15780637ab92915146108f05780637b1039991461090f5780637ecebe0014610942575f80fd5b80635e2c576e146107d55780635f6b88a0146107e95780636419111e146108085780636e553f651461087357806370a0823114610892575f80fd5b80634cdad506116103085780634cdad506146104a35780634e84befe14610759578063501eb4fe14610778578063530a371414610797578063575bbce6146107b6575f80fd5b80633d8ab1e5146106da5780633e3382ba146106f9578063402d267d1461071a5780634c4602da14610739575f80fd5b8063196e8285116103b9578063313ce56711610389578063313ce5671461061057806333e15be2146106555780633644e51514610674578063379e0b131461068857806338d52e0f146106a7575f80fd5b8063196e82851461057c578063217bb34d146105b357806323b872dd146105d25780632b91c5de146105f1575f80fd5b8063095ea7b3116103ff578063095ea7b3146104c25780630a28a477146104f15780630a680e1814610510578063150b7a021461052457806318160ddd14610567575f80fd5b806301e1d1141461043a57806306fdde03146104615780630780fd3a1461048257806307a2d13a146104a3575f80fd5b3661043657005b5f80fd5b348015610445575f80fd5b5061044e610e78565b6040519081526020015b60405180910390f35b34801561046c575f80fd5b50610475610ec2565b6040516104589190614ea5565b34801561048d575f80fd5b506104a161049c366004614ecf565b610f4d565b005b3480156104ae575f80fd5b5061044e6104bd366004614ee8565b611093565b3480156104cd575f80fd5b506104e16104dc366004614f13565b6110b6565b6040519015158152602001610458565b3480156104fc575f80fd5b5061044e61050b366004614ee8565b611122565b34801561051b575f80fd5b506104a161113d565b34801561052f575f80fd5b5061054e61053e366004615021565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610458565b348015610572575f80fd5b5061044e60025481565b348015610587575f80fd5b5060135461059b906001600160a01b031681565b6040516001600160a01b039091168152602001610458565b3480156105be575f80fd5b506104a16105cd366004615088565b611197565b3480156105dd575f80fd5b506104e16105ec3660046150a3565b6111fe565b3480156105fc575f80fd5b5061044e61060b3660046150e1565b6112d8565b34801561061b575f80fd5b506106437f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610458565b348015610660575f80fd5b506104a161066f36600461512d565b6113a2565b34801561067f575f80fd5b5061044e61147d565b348015610693575f80fd5b506104a16106a2366004615162565b6114d2565b3480156106b2575f80fd5b5061059b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b3480156106e5575f80fd5b506104a16106f4366004615088565b611777565b348015610704575f80fd5b5061070d61184e565b604051610458919061519b565b348015610725575f80fd5b5061044e610734366004615088565b6118cf565b348015610744575f80fd5b506008546104e190600160d81b900460ff1681565b348015610764575f80fd5b506104a161077336600461522b565b61196b565b348015610783575f80fd5b506104a1610792366004614ecf565b611ad2565b3480156107a2575f80fd5b506104a16107b1366004614ee8565b611baa565b3480156107c1575f80fd5b506104a16107d0366004615269565b611c32565b3480156107e0575f80fd5b506104a1611c8c565b3480156107f4575f80fd5b506104a1610803366004615088565b611cfb565b348015610813575f80fd5b5061084f610822366004615088565b60146020525f908152604090205460ff81169063ffffffff61010082048116916501000000000090041683565b60408051931515845263ffffffff9283166020850152911690820152606001610458565b34801561087e575f80fd5b5061044e61088d36600461528f565b611d59565b34801561089d575f80fd5b5061044e6108ac366004615088565b60036020525f908152604090205481565b3480156108c8575f80fd5b5061070d611dee565b3480156108dc575f80fd5b506104a16108eb366004615088565b611e4a565b3480156108fb575f80fd5b5061044e61090a366004614f13565b611f2f565b34801561091a575f80fd5b5061059b7f00000000000000000000000037912f4c0f0d916890ebd755bf6d1f0a0e059bbd81565b34801561094d575f80fd5b5061044e61095c366004615088565b60056020525f908152604090205481565b348015610978575f80fd5b506104a16109873660046152b2565b611f7b565b348015610997575f80fd5b5060065461059b906001600160a01b031681565b3480156109b6575f80fd5b506104e16109c5366004614ee8565b600c6020525f908152604090205460ff1681565b3480156109e4575f80fd5b5061044e6109f336600461528f565b612124565b348015610a03575f80fd5b50610475612228565b348015610a17575f80fd5b506104a1610a263660046152f4565b612235565b348015610a36575f80fd5b506008546104e190600160d01b900460ff1681565b348015610a56575f80fd5b50600854610a6e90600160e01b900463ffffffff1681565b60405163ffffffff9091168152602001610458565b348015610a8e575f80fd5b506104a1610a9d366004615162565b6124fb565b348015610aad575f80fd5b506104a1612656565b348015610ac1575f80fd5b5061044e612696565b348015610ad5575f80fd5b506104e1610ae4366004614f13565b6126d3565b348015610af4575f80fd5b506104a1610b0336600461522b565b612736565b348015610b13575f80fd5b506104a1610b22366004615269565b6127bb565b348015610b32575f80fd5b506104a1610b41366004615088565b6127f3565b348015610b51575f80fd5b506104e1612864565b348015610b65575f80fd5b5061044e610b74366004614ee8565b612902565b348015610b84575f80fd5b5061044e610b93366004615360565b61291e565b348015610ba3575f80fd5b506104a1610bb2366004615394565b61299b565b348015610bc2575f80fd5b5061044e610bd1366004615360565b612a3f565b348015610be1575f80fd5b5060075461059b906001600160a01b031681565b348015610c00575f80fd5b506008546104e190600160c81b900460ff1681565b348015610c20575f80fd5b506104a1610c2f3660046153ba565b612ac6565b348015610c3f575f80fd5b5061044e610c4e366004615088565b612b8e565b348015610c5e575f80fd5b5061044e610c6d366004614ee8565b612c02565b348015610c7d575f80fd5b5061044e610c8c366004615088565b612c1e565b348015610c9c575f80fd5b506008546104e190600160c01b900460ff1681565b348015610cbc575f80fd5b506104a1610ccb366004614ecf565b612c54565b348015610cdb575f80fd5b50600854610cef906001600160c01b031681565b6040516001600160c01b039091168152602001610458565b348015610d12575f80fd5b506104a1610d213660046153fb565b612caf565b348015610d31575f80fd5b5060095461059b906001600160a01b031681565b348015610d50575f80fd5b5061044e610d5f366004615088565b612eed565b348015610d6f575f80fd5b5061044e610d7e366004615467565b600460209081525f928352604080842090915290825290205481565b348015610da5575f80fd5b50601054601154610de2916001600160401b0380821692680100000000000000008304821692600160801b9004909116906001600160a01b031684565b604080516001600160401b039586168152938516602085015291909316908201526001600160a01b039091166060820152608001610458565b348015610e26575f80fd5b506104a1610e35366004615493565b612f24565b348015610e45575f80fd5b506104a1610e54366004615088565b61306c565b348015610e64575f80fd5b506104a1610e7336600461528f565b6130e8565b5f610e81613275565b600854600160c01b900460ff1615610eb45760405162461bcd60e51b8152600401610eab90615577565b60405180910390fd5b610ebd5f61332c565b905090565b5f8054610ece9061559b565b80601f0160208091040260200160405190810160405280929190818152602001828054610efa9061559b565b8015610f455780601f10610f1c57610100808354040283529160200191610f45565b820191905f5260205f20905b815481529060010190602001808311610f2857829003601f168201915b505050505081565b610f556137d7565b63ffffffff81165f908152600c602052604090205460ff16610f92576040516370abe85960e01b815263ffffffff82166004820152602401610eab565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316610fc582613808565b6001600160a01b031614611029577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610ffd82613808565b60405163298473c760e11b81526001600160a01b03928316600482015291166024820152604401610eab565b63ffffffff81165f908152600d6020526040902054600160a01b900460ff161561106e57604051630a42c0f960e41b815263ffffffff82166004820152602401610eab565b6008805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b5f805f61109f5f613895565b915091506110ae8483836139a9565b949350505050565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906111109086815260200190565b60405180910390a35060015b92915050565b5f805f61112e5f613895565b915091506110ae8483836139b5565b6111456137d7565b61114d6139c1565b6008805460ff60c81b1916600160c81b179055604051600181527fb8527b93c36dabdfe078af41be789ba946a4adcfeafcf9d8de21d51629859e3c906020015b60405180910390a1565b61119f6137d7565b6001600160a01b0381165f81815260146020908152604091829020805468ffffffffffffffffff1916905590519182527f741bf5c2d606526029e0f199a3ddf6c7ebafa7edb2e1405174105f458195e67991015b60405180910390a150565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f1981146112575761123383826155e7565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b6001600160a01b0385165f908152600360205260408120805485929061127e9084906155e7565b90915550506001600160a01b038085165f81815260036020526040908190208054870190555190918716905f80516020615f35833981519152906112c59087815260200190565b60405180910390a3506001949350505050565b6008545f90600160c01b900460ff16156113045760405162461bcd60e51b8152600401610eab90615577565b6008805460ff60c01b1916600160c01b1790555f808061132487876139ec565b92509250925061133887878585858a613b42565b604080516001600160a01b038a81168252602082018a905291810183905291955086169033907f385ba312edecbeeae57aca70f4fde3d83578697795291e74b1b4edb37d7291bf9060600160405180910390a350506008805460ff60c01b19169055509392505050565b6113aa6137d7565b5f816113f257600a8363ffffffff16815481106113c9576113c96155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff16611430565b600b8363ffffffff168154811061140b5761140b6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff165b90505f61143c82613bd2565b9050801561146c57604051631c7b946d60e31b815263ffffffff8316600482015260248101829052604401610eab565b611477848385613c58565b50505050565b5f7f000000000000000000000000000000000000000000000000000000000000000146146114ad57610ebd613d3a565b507f3959e56230166632a285ba1eca657e0bb21e45b2bd570705d743c85fb04bb17490565b6114da6137d7565b5f80821561160357600b8463ffffffff16815481106114fb576114fb6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff169150600b8563ffffffff168154811061153a5761153a6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff1690508181600b8763ffffffff168154811061157b5761157b6155fa565b905f5260205f209060089182820401919006600402600b8863ffffffff16815481106115a9576115a96155fa565b905f5260205f2090600891828204019190066004028491906101000a81548163ffffffff021916908363ffffffff1602179055508391906101000a81548163ffffffff021916908363ffffffff1602179055505050611720565b600a8463ffffffff168154811061161c5761161c6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff169150600a8563ffffffff168154811061165b5761165b6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff1690508181600a8763ffffffff168154811061169c5761169c6155fa565b905f5260205f209060089182820401919006600402600a8863ffffffff16815481106116ca576116ca6155fa565b905f5260205f2090600891828204019190066004028491906101000a81548163ffffffff021916908363ffffffff1602179055508391906101000a81548163ffffffff021916908363ffffffff16021790555050505b6040805163ffffffff84811682528381166020830152878116828401528616606082015290517fb7c5df04749a3a06a9a7bf1a8142ccf2a4ee6cbf4709489e876a6e4eb3301e8a9181900360800190a15050505050565b61177f6137d7565b604051636777140560e11b81526001600160a01b0382811660048301527f00000000000000000000000037912f4c0f0d916890ebd755bf6d1f0a0e059bbd169063ceee280a906024015f6040518083038186803b1580156117de575f80fd5b505afa1580156117f0573d5f803e3d5ffd5b505050506001600160a01b0381165f818152600f6020908152604091829020805460ff191660019081179091558251938452908301527f572570e8a43782d3698a3fed258c72f9c201c19be1e4764e359d1adc8f00af7a91016111f3565b6060600b8054806020026020016040519081016040528092919081815260200182805480156118c557602002820191905f5260205f20905f905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116118885790505b5050505050905090565b6008545f90600160c81b900460ff16156118ea57505f919050565b6008546001600160c01b03166002600160c01b0319810161190e57505f1992915050565b5f8061191a6001613895565b91509150826001600160c01b0316811061193857505f949350505050565b5f61194c826001600160c01b0386166155e7565b90506119598184846139a9565b9695505050505050565b505050919050565b600854600160c01b900460ff16156119955760405162461bcd60e51b8152600401610eab90615577565b6008805460ff60c01b1916600160c01b1790556119b06137d7565b6119b86139c1565b6119c0613275565b6008805460ff60d81b1916600160d81b1790555f8080806119e08161332c565b9050611a0b601254670de0b6b3a76400006119fb91906155e7565b8290670de0b6b3a7640000613dd2565b9350611a26601254670de0b6b3a76400006119fb919061560e565b6002549093509150611a429050611a3d858761575c565b613dff565b5f611a4c5f61332c565b905083811080611a5b57508281115b15611a8a5760405163628cc47560e11b8152600481018290526024810185905260448101849052606401610eab565b6002548214611aba57600254604051632b40145960e21b8152600481019190915260248101839052604401610eab565b50506008805463ff0000ff60c01b1916905550505050565b611ada6137d7565b604051635159d87f60e11b815263ffffffff821660048201527f00000000000000000000000037912f4c0f0d916890ebd755bf6d1f0a0e059bbd6001600160a01b03169063a2b3b0fe906024015f6040518083038186803b158015611b3d575f80fd5b505afa158015611b4f573d5f803e3d5ffd5b5050505063ffffffff81165f818152600e6020908152604091829020805460ff191660019081179091558251938452908301527fea052d1fb1ecba6aaf6bd32e92f20e7b6a094eaa478248322cc8ff024a90978f91016111f3565b611bb26137d7565b67016345785d8a0000811115611bec576040516302d2a90f60e51b81526004810182905267016345785d8a00006024820152604401610eab565b601280549082905560408051828152602081018490527fdf4be33b2e9e3dd4d9e0e85645aea428494a0644a72c51d6a15aedae6b66a3ff91015b60405180910390a15050565b611c3a6137d7565b6008546001600160c01b039081169082161115611c6a576040516334f1ec1b60e01b815260040160405180910390fd5b600880546001600160c01b0319166001600160c01b0392909216919091179055565b611c946137d7565b600854600160c81b900460ff16611cbe5760405163ec7165bf60e01b815260040160405180910390fd5b6008805460ff60c81b191690556040515f81527fb8527b93c36dabdfe078af41be789ba946a4adcfeafcf9d8de21d51629859e3c9060200161118d565b611d036137d7565b6001600160a01b0381165f818152600f60209081526040808320805460ff191690558051938452908301919091527f572570e8a43782d3698a3fed258c72f9c201c19be1e4764e359d1adc8f00af7a91016111f3565b6008545f90600160c01b900460ff1615611d855760405162461bcd60e51b8152600401610eab90615577565b6008805460ff60c01b1916600160c01b1790819055611dda907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29085908190819063ffffffff600160e01b9091041687613b42565b6008805460ff60c01b191690559392505050565b6060600a8054806020026020016040519081016040528092919081815260200182805480156118c5575f918252602091829020805463ffffffff1684529082028301929091600491018084116118885790505050505050905090565b6006546001600160a01b0316331480611edc575060075460405163b700961360e01b81526001600160a01b039091169063b700961390611e9d90339030906001600160e01b03195f351690600401615768565b602060405180830381865afa158015611eb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611edc9190615795565b611ee4575f80fd5b600780546001600160a01b0319166001600160a01b03831690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a350565b5f805f611f3c85856139ec565b50915091505f80611f4d6001613895565b9092509050611f7083611f6081876155e7565b611f6a908561560e565b83613f84565b979650505050505050565b611f836137d7565b63ffffffff82165f908152600c602052604090205460ff16611fc0576040516370abe85960e01b815263ffffffff83166004820152602401610eab565b826001600160a01b0316611fd383613808565b6001600160a01b031614611feb5782610ffd83613808565b63ffffffff82165f908152600d6020526040902054600160a01b900460ff161561203057604051630a42c0f960e41b815263ffffffff83166004820152602401610eab565b6298968063ffffffff8216111561205a57604051632e3a13e960e21b815260040160405180910390fd5b60408051606080820183526001825263ffffffff85811660208085018281528784168688018181526001600160a01b038c165f818152601486528a902098518954945192518816650100000000000268ffffffff000000000019939098166101000264ffffffff00199115159190911664ffffffffff19909516949094179390931716949094179095558551948552840152928201929092527f2682afad81f7b7a2141b8d3c671b3efc09ac3dac73f06a5cd8e4714ae8864c1b91015b60405180910390a1505050565b6008545f90600160c01b900460ff16156121505760405162461bcd60e51b8152600401610eab90615577565b6008805460ff60c01b1916600160c01b1790555f8061216f6001613895565b9150915061217e858383613f90565b9250825f036121a057604051639768300560e01b815260040160405180910390fd5b6008546001600160c01b03166121b6868361560e565b11156121d55760405163adea3dfd60e01b815260040160405180910390fd5b600854612213907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290600160e01b900463ffffffff16858888613f9c565b50506008805460ff60c01b1916905592915050565b60018054610ece9061559b565b61223d6137d7565b6122456139c1565b63ffffffff83165f908152600c602052604090205460ff16156122835760405163335894fb60e11b815263ffffffff84166004820152602401610eab565b63ffffffff83165f908152600e602052604090205460ff166122c057604051631f9db01d60e31b815263ffffffff84166004820152602401610eab565b6040516385ae5d5760e01b815263ffffffff841660048201525f90819081906001600160a01b037f00000000000000000000000037912f4c0f0d916890ebd755bf6d1f0a0e059bbd16906385ae5d57906024015f60405180830381865afa15801561232d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261235491908101906157b0565b9250925092508315158215151461238657604051632b1d0bd360e11b815263ffffffff87166004820152602401610eab565b604080516080810182526001600160a01b0380861682528415156020808401918252838501868152606085018b905263ffffffff8c165f908152600d9092529490208351815492511515600160a01b026001600160a81b0319909316931692909217178155915190919060018201906123ff908261588e565b5060608201516002820190612414908261588e565b50905050811561245557600b546020116124445760405163f025236d60e01b815260206004820152602401610eab565b612450600b8888614040565b612487565b600a5460201161247b5760405163f025236d60e01b815260206004820152602401610eab565b612487600a8888614040565b63ffffffff86165f908152600c602052604090819020805460ff19166001179055517fc4f8cb57c016f0b294fff2666f86fa6cfee9b03aed19f816ae4bf44b7e837bbb906124ea9088908a9063ffffffff92831681529116602082015260400190565b60405180910390a150505050505050565b6125036137d7565b5f8161254b57600a8463ffffffff1681548110612522576125226155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff16612589565b600b8463ffffffff1681548110612564576125646155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff165b90508063ffffffff168363ffffffff1614158061262d57506040516321a0f75360e01b815263ffffffff841660048201527f00000000000000000000000037912f4c0f0d916890ebd755bf6d1f0a0e059bbd6001600160a01b0316906321a0f75390602401602060405180830381865afa158015612609573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262d9190615795565b1561264b5760405163d4db0b7960e01b815260040160405180910390fd5b611477848484613c58565b61265e6137d7565b600854600160d01b900460ff16612676576001612678565b5f5b60088054911515600160d01b0260ff60d01b19909216919091179055565b5f61269f613275565b600854600160c01b900460ff16156126c95760405162461bcd60e51b8152600401610eab90615577565b610ebd600161332c565b335f908152600360205260408120805483919083906126f39084906155e7565b90915550506001600160a01b0383165f81815260036020526040908190208054850190555133905f80516020615f35833981519152906111109086815260200190565b5f5b818110156127b6576127a3838383818110612755576127556155fa565b90506020028101906127679190615949565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525030939250506141fd9050565b50806127ae8161598b565b915050612738565b505050565b6127c36137d7565b6008546001600160c01b039081169082161015611c6a576040516334f1ec1b60e01b815260040160405180910390fd5b6127fb6137d7565b601154604080516001600160a01b03928316815291831660208301527f51dbb5a65bb22737861a63ec12ba6ce78a98631e9404b0567a2eaf7a06fc544d910160405180910390a1601180546001600160a01b0319166001600160a01b0392909216919091179055565b6008545f90600160d01b900460ff166128fd57604051630ad85dff60e41b81523060048201527f00000000000000000000000037912f4c0f0d916890ebd755bf6d1f0a0e059bbd6001600160a01b03169063ad85dff090602401602060405180830381865afa1580156128d9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebd9190615795565b505f90565b5f805f61290f6001613895565b915091506110ae848383613f90565b6008545f90600160c01b900460ff161561294a5760405162461bcd60e51b8152600401610eab90615577565b6008805460ff60c01b1916600160c01b1790555f8061296881613895565b915091506129778683836139b5565b925061298586848787614222565b50506008805460ff60c01b191690559392505050565b6129a36137d7565b670de0b6b3a76400006001600160401b03821611156129d557604051633d0203e560e01b815260040160405180910390fd5b601054604080516001600160401b03928316815291831660208301527fb5cc994a260a85a42d6588668221571ae0a14f0a28f9e4817a5195262102c868910160405180910390a16010805467ffffffffffffffff19166001600160401b0392909216919091179055565b6008545f90600160c01b900460ff1615612a6b5760405162461bcd60e51b8152600401610eab90615577565b6008805460ff60c01b1916600160c01b1790555f80612a8981613895565b91509150612a988683836139a9565b9250825f03612aba57604051639768300560e01b815260040160405180910390fd5b61298583878787614222565b612ace6137d7565b5f808415612b13575f612adf610e78565b9050612afe612af0866127106159a3565b829061ffff166127106142f8565b9250612b0f612af0866127106159c5565b9150505b612b1e600284614316565b600980546001600160a01b0319166001600160a01b0385161790555f612b42610e78565b90508515612b865782811080612b5757508181115b15612b865760405163628cc47560e11b8152600481018290526024810184905260448101839052606401610eab565b505050505050565b6008545f90600160c81b900460ff1615612ba957505f919050565b6008546001600160c01b03166002600160c01b03198101612bcd57505f1992915050565b6002546001600160c01b038216811015612bf957612bf4816001600160c01b0384166155e7565b6110ae565b5f949350505050565b5f805f612c0f6001613895565b915091506110ae848383613f84565b6008545f90600160c01b900460ff1615612c4a5760405162461bcd60e51b8152600401610eab90615577565b61111c825f6143f4565b612c5c6137d7565b63ffffffff81165f818152600e60209081526040808320805460ff191690558051938452908301919091527fea052d1fb1ecba6aaf6bd32e92f20e7b6a094eaa478248322cc8ff024a90978f91016111f3565b42841015612cff5760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610eab565b5f6001612d0a61147d565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015612e12573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590612e485750876001600160a01b0316816001600160a01b0316145b612e855760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610eab565b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6008545f90600160c01b900460ff1615612f195760405162461bcd60e51b8152600401610eab90615577565b61111c8260016143f4565b336001600160a01b037f000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c81614612f6d57604051633cf941a360e01b815260040160405180910390fd5b600854600160d81b900460ff16612f97576040516304a246dd60e51b815260040160405180910390fd5b5f612fa4828401846159e0565b9050612faf81613dff565b5f5b86811015613060576130507f000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c8878784818110612fef57612fef6155fa565b905060200201358a8a85818110613008576130086155fa565b90506020020135613019919061560e565b8c8c8581811061302b5761302b6155fa565b90506020020160208101906130409190615088565b6001600160a01b0316919061446e565b6130598161598b565b9050612fb1565b50505050505050505050565b613081335f356001600160e01b0319166144e2565b61309d5760405162461bcd60e51b8152600401610eab90615a24565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6130fd335f356001600160e01b0319166144e2565b6131195760405162461bcd60e51b8152600401610eab90615a24565b6131238282614316565b601260ff16816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613164573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131889190615a4a565b60ff161415806132095750306001600160a01b0316816001600160a01b031663d4b839926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131fd9190615a65565b6001600160a01b031614155b156132275760405163229e78bb60e01b815260040160405180910390fd5b601380546001600160a01b0319166001600160a01b0383169081179091556040519081527f51b1b17228af00bd72d43ecec4334e09b3584633abf6ef363a9fde05dfa73f8890602001611c26565b600854600160d01b900460ff1661332a57604051630ad85dff60e41b81523060048201527f00000000000000000000000037912f4c0f0d916890ebd755bf6d1f0a0e059bbd6001600160a01b03169063ad85dff090602401602060405180830381865afa1580156132e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061330c9190615795565b1561332a57604051630f301f8f60e41b815260040160405180910390fd5b565b600a545f9081816001600160401b0381111561334a5761334a614f3d565b604051908082528060200260200182016040528015613373578160200160208202803683370190505b5090505f826001600160401b0381111561338f5761338f614f3d565b6040519080825280602002602001820160405280156133b8578160200160208202803683370190505b509050841561351f575f5b83811015613484575f600a82815481106133df576133df6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff16905061340e81614588565b838381518110613420576134206155fa565b60200260200101818152505f036134375750613474565b61344081613808565b848381518110613452576134526155fa565b60200260200101906001600160a01b031690816001600160a01b031681525050505b61347d8161598b565b90506133c3565b5060095460405163b333a17560e01b81526001600160a01b039091169063b333a175906134d990859085907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290600401615af0565b602060405180830381865afa1580156134f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135189190615b2d565b9350611963565b600b545f816001600160401b0381111561353b5761353b614f3d565b604051908082528060200260200182016040528015613564578160200160208202803683370190505b5090505f826001600160401b0381111561358057613580614f3d565b6040519080825280602002602001820160405280156135a9578160200160208202803683370190505b5090505f5b8681101561366f575f600a82815481106135ca576135ca6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff1690506135f981613bd2565b86838151811061360b5761360b6155fa565b60200260200101818152505f03613622575061365f565b61362b81613808565b87838151811061363d5761363d6155fa565b60200260200101906001600160a01b031690816001600160a01b031681525050505b6136688161598b565b90506135ae565b505f5b83811015613733575f600b828154811061368e5761368e6155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff1690506136bd81613bd2565b8383815181106136cf576136cf6155fa565b60200260200101818152505f036136e65750613723565b6136ef81613808565b848381518110613701576137016155fa565b60200260200101906001600160a01b031690816001600160a01b031681525050505b61372c8161598b565b9050613672565b50600954604051637563738b60e11b81526001600160a01b039091169063eac6e7169061378c9088908890879087907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290600401615b44565b602060405180830381865afa1580156137a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137cb9190615b2d565b98975050505050505050565b6137ec335f356001600160e01b0319166144e2565b61332a5760405162461bcd60e51b8152600401610eab90615a24565b63ffffffff81165f908152600d60205260408082208054915163e170a9bf60e01b81526001600160a01b0390921691829163e170a9bf9161384f9160010190600401615c24565b602060405180830381865afa15801561386a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061388e9190615a65565b9392505050565b6013545f9081906001600160a01b0316801561398a575f805f836001600160a01b031663c36af4606040518163ffffffff1660e01b8152600401606060405180830381865afa1580156138ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390e9190615c36565b92509250925080156139335760405163229e78bb60e01b815260040160405180910390fd5b5f8715613950578284116139475782613949565b835b9050613962565b82841061395d578261395f565b835b90505b600254955061397f866139776012600a615d41565b8391906142f8565b9650505050506139a3565b60405163229e78bb60e01b815260040160405180910390fd5b50915091565b5f6110ae8484846142f8565b5f6110ae848385613dd2565b600854600160c81b900460ff161561332a576040516337a5332d60e11b815260040160405180910390fd5b6001600160a01b0382165f9081526014602090815260408083208151606081018352905460ff8116151580835263ffffffff610100830481169584019590955265010000000000909104909316918101919091528291829190613a625760405163217feaeb60e01b815260040160405180910390fd5b60095460405163151d4a5960e31b81526001600160a01b038881166004830152602482018890527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2811660448301529091169063a8ea52c890606401602060405180830381865afa158015613ad9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613afd9190615b2d565b9350613b3181604001516305f5e100613b169190615d4f565b63ffffffff166305f5e100866142f89092919063ffffffff16565b925080602001519150509250925092565b5f805f613b4f6001613895565b9092509050613b6286611f60818a6155e7565b9250825f03613b845760405163426f153760e11b815260040160405180910390fd5b6008546001600160c01b0316613b9a848361560e565b1115613bb95760405163adea3dfd60e01b815260040160405180910390fd5b613bc689868a8688613f9c565b50509695505050505050565b63ffffffff81165f908152600d602052604080822080549151637841536560e01b81526001600160a01b03909216918291637841536591613c199160010190600401615c24565b602060405180830381865afa158015613c34573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061388e9190615b2d565b60085463ffffffff600160e01b909104811690831603613c8b576040516319ded73160e21b815260040160405180910390fd5b8015613ca157613c9c600b8461463d565b613cac565b613cac600a8461463d565b63ffffffff82165f908152600c60209081526040808320805460ff19169055600d909152812080546001600160a81b031916815590613cee6001830182614e06565b613cfb600283015f614e06565b50506040805163ffffffff8085168252851660208201527fa5cd0099b78b279c04987aa80ffffaf8fc8c8af4e7c7bce2686e8d01e2e1bd519101612117565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051613d6a9190615d6c565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b828202811515841585830485141716613de9575f80fd5b6001826001830304018115150290509392505050565b5f5b8151811015613f80575f828281518110613e1d57613e1d6155fa565b602090810291909101810151516001600160a01b0381165f908152600f90925260409091205490915060ff16613e7157604051635df6b61760e11b81526001600160a01b0382166004820152602401610eab565b5f5b838381518110613e8557613e856155fa565b60200260200101516020015151811015613f6d57613eeb848481518110613eae57613eae6155fa565b6020026020010151602001518281518110613ecb57613ecb6155fa565b6020026020010151836001600160a01b03166141fd90919063ffffffff16565b507f7445c6598e1b553f076d507692eab3dceef0d608757141b53e9e56aa8bbaf48382858581518110613f2057613f206155fa565b6020026020010151602001518381518110613f3d57613f3d6155fa565b6020026020010151604051613f53929190615dde565b60405180910390a180613f658161598b565b915050613e73565b505080613f799061598b565b9050613e01565b5050565b5f6110ae8483856142f8565b5f6110ae848484613dd2565b613fc87f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc284848461477c565b613fdd6001600160a01b03861633308661478c565b613fe7818361480b565b60408051848152602081018490526001600160a01b0383169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a361403984848484614862565b5050505050565b825480156141bd5783806140556001846155e7565b81548110614065576140656155fa565b5f9182526020808320600880840490910154855460018082018855968652928520918304909101805463ffffffff60046007958616810261010090810a83810219909416969097160290950a90920490931602179055906140c690836155e7565b90505b8363ffffffff1681111561416d57846140e36001836155e7565b815481106140f3576140f36155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff16858281548110614129576141296155fa565b905f5260205f2090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff160217905550808061416590615e01565b9150506140c9565b5081848463ffffffff1681548110614187576141876155fa565b905f5260205f2090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff160217905550611477565b5082546001810184555f93845260209093206008840401805460079094166004026101000a63ffffffff8181021990951692909416939093021790915550565b606061388e8383604051806060016040528060278152602001615f0e6027913961486c565b61422e84848484614784565b336001600160a01b03821614614299576001600160a01b0381165f9081526004602090815260408083203384529091529020545f1981146142975761427384826155e7565b6001600160a01b0383165f9081526004602090815260408083203384529091529020555b505b6142a381846148d6565b60408051858152602081018590526001600160a01b03808416929085169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a46114778483614935565b82820281151584158583048514171661430f575f80fd5b0492915050565b815f0361433657604051632db38d0560e01b815260040160405180910390fd5b806001600160a01b03167f00000000000000000000000037912f4c0f0d916890ebd755bf6d1f0a0e059bbd6001600160a01b031663b93f9b0a846040518263ffffffff1660e01b815260040161438e91815260200190565b602060405180830381865afa1580156143a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143cd9190615a65565b6001600160a01b031614613f8057604051634ee204d760e01b815260040160405180910390fd5b5f6143fd613275565b5f806144085f613895565b6001600160a01b0387165f90815260036020526040812054929450909250906144329084846139a9565b90505f61443f600161332c565b90508082111561444f5780614451565b815b9450851561446457611f70858585613f84565b5050505092915050565b5f60405163a9059cbb60e01b815283600482015282602482015260205f6044835f895af13d15601f3d1160015f5114161716915050806114775760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610eab565b6007545f906001600160a01b03168015801590614569575060405163b700961360e01b81526001600160a01b0382169063b70096139061452a90879030908890600401615768565b602060405180830381865afa158015614545573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145699190615795565b806110ae57506006546001600160a01b03858116911614949350505050565b63ffffffff81165f908152600d6020526040812054600160a01b900460ff16156145b357505f919050565b63ffffffff82165f908152600d60205260409081902080549151637d2872e960e11b81526001600160a01b039092169163fa50e5d2916145fe91600182019160020190600401615e16565b602060405180830381865afa158015614619573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111c9190615b2d565b815463ffffffff8216811161468a5760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152606401610eab565b63ffffffff82165b61469d6001836155e7565b81101561473a57836146b082600161560e565b815481106146c0576146c06155fa565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff168482815481106146f6576146f66155fa565b905f5260205f2090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff16021790555080806147329061598b565b915050614692565b508280548061474b5761474b615e43565b5f8281526020902060085f1990920191820401805463ffffffff600460078516026101000a02191690559055505050565b6147846139c1565b611477613275565b5f6040516323b872dd60e01b815284600482015283602482015282604482015260205f6064835f8a5af13d15601f3d1160015f5114161716915050806140395760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401610eab565b8060025f82825461481c919061560e565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481525f80516020615f3583398151915291015b60405180910390a35050565b6114778484614c8a565b60605f80856001600160a01b0316856040516148889190615e57565b5f60405180830381855af49150503d805f81146148c0576040519150601f19603f3d011682016040523d82523d5f602084013e6148c5565b606091505b509150915061195986838387614d16565b6001600160a01b0382165f90815260036020526040812080548392906148fd9084906155e7565b90915550506002805482900390556040518181525f906001600160a01b038416905f80516020615f3583398151915290602001614856565b61495c60405180608001604052805f81526020015f81526020015f81526020015f81525090565b600954604051630226614760e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28116600483015290911690630226614790602401602060405180830381865afa1580156149c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149e89190615b2d565b6040820152614a187f0000000000000000000000000000000000000000000000000000000000000012600a615d41565b6060820152600a545f5b81811015614c67575f600a8281548110614a3e57614a3e6155fa565b5f9182526020822060088204015460079091166004026101000a900463ffffffff169150614a6b82614588565b9050805f03614a7b575050614c57565b5f614a8583613808565b600954604051630226614760e01b81526001600160a01b038084166004830152929350911690630226614790602401602060405180830381865afa158015614acf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614af39190615b2d565b865f018181525050806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b5b9190615a4a565b614b6690600a615d41565b6020870181905286515f918291614b9091614b8987670de0b6b3a7640000615e72565b91906142f8565b9050614baf88606001518960400151836142f89092919063ffffffff16565b9150614bc3670de0b6b3a764000083615e89565b9150505f89821115614c26575f614bf189604001518a606001518d670de0b6b3a7640000614b899190615e72565b60208a01518a51919250614c07918391906142f8565b9150614c1b670de0b6b3a764000083615e89565b91505f9a5050614c35565b5082614c32828b6155e7565b99505b614c4085828b614d8e565b895f03614c51575050505050614c67565b50505050505b614c608161598b565b9050614a22565b5083156114775760405163cc5ea39b60e01b815260048101859052602401610eab565b63ffffffff82165f908152600d602052604090819020805491516001600160a01b0390921691611477916369445c3160e01b91614cd4918691600182019160020190602401615ea8565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526001600160a01b038316906141fd565b60608315614d845782515f03614d7d576001600160a01b0385163b614d7d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610eab565b50816110ae565b6110ae8383614ddc565b63ffffffff83165f908152600d602052604090819020805491516001600160a01b03909216916140399163c9111bd760e01b91614cd491879187916001810191600290910190602401615ed2565b815115614dec5781518083602001fd5b8060405162461bcd60e51b8152600401610eab9190614ea5565b508054614e129061559b565b5f825580601f10614e21575050565b601f0160209004905f5260205f2090810190614e3d9190614e40565b50565b5b80821115614e54575f8155600101614e41565b5090565b5f5b83811015614e72578181015183820152602001614e5a565b50505f910152565b5f8151808452614e91816020860160208601614e58565b601f01601f19169290920160200192915050565b602081525f61388e6020830184614e7a565b803563ffffffff81168114614eca575f80fd5b919050565b5f60208284031215614edf575f80fd5b61388e82614eb7565b5f60208284031215614ef8575f80fd5b5035919050565b6001600160a01b0381168114614e3d575f80fd5b5f8060408385031215614f24575f80fd5b8235614f2f81614eff565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b0381118282101715614f7357614f73614f3d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614fa157614fa1614f3d565b604052919050565b5f6001600160401b03821115614fc157614fc1614f3d565b50601f01601f191660200190565b5f82601f830112614fde575f80fd5b8135614ff1614fec82614fa9565b614f79565b818152846020838601011115615005575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215615034575f80fd5b843561503f81614eff565b9350602085013561504f81614eff565b92506040850135915060608501356001600160401b03811115615070575f80fd5b61507c87828801614fcf565b91505092959194509250565b5f60208284031215615098575f80fd5b813561388e81614eff565b5f805f606084860312156150b5575f80fd5b83356150c081614eff565b925060208401356150d081614eff565b929592945050506040919091013590565b5f805f606084860312156150f3575f80fd5b83356150fe81614eff565b925060208401359150604084013561511581614eff565b809150509250925092565b8015158114614e3d575f80fd5b5f806040838503121561513e575f80fd5b61514783614eb7565b9150602083013561515781615120565b809150509250929050565b5f805f60608486031215615174575f80fd5b61517d84614eb7565b925061518b60208501614eb7565b9150604084013561511581615120565b602080825282518282018190525f9190848201906040850190845b818110156151d857835163ffffffff16835292840192918401916001016151b6565b50909695505050505050565b5f8083601f8401126151f4575f80fd5b5081356001600160401b0381111561520a575f80fd5b6020830191508360208260051b8501011115615224575f80fd5b9250929050565b5f806020838503121561523c575f80fd5b82356001600160401b03811115615251575f80fd5b61525d858286016151e4565b90969095509350505050565b5f60208284031215615279575f80fd5b81356001600160c01b038116811461388e575f80fd5b5f80604083850312156152a0575f80fd5b82359150602083013561515781614eff565b5f805f606084860312156152c4575f80fd5b83356152cf81614eff565b92506152dd60208501614eb7565b91506152eb60408501614eb7565b90509250925092565b5f805f8060808587031215615307575f80fd5b61531085614eb7565b935061531e60208601614eb7565b925060408501356001600160401b03811115615338575f80fd5b61534487828801614fcf565b925050606085013561535581615120565b939692955090935050565b5f805f60608486031215615372575f80fd5b83359250602084013561538481614eff565b9150604084013561511581614eff565b5f602082840312156153a4575f80fd5b81356001600160401b038116811461388e575f80fd5b5f805f606084860312156153cc575f80fd5b83356153d781615120565b9250602084013561ffff81168114615384575f80fd5b60ff81168114614e3d575f80fd5b5f805f805f805f60e0888a031215615411575f80fd5b873561541c81614eff565b9650602088013561542c81614eff565b95506040880135945060608801359350608088013561544a816153ed565b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215615478575f80fd5b823561548381614eff565b9150602083013561515781614eff565b5f805f805f805f806080898b0312156154aa575f80fd5b88356001600160401b03808211156154c0575f80fd5b6154cc8c838d016151e4565b909a50985060208b01359150808211156154e4575f80fd5b6154f08c838d016151e4565b909850965060408b0135915080821115615508575f80fd5b6155148c838d016151e4565b909650945060608b013591508082111561552c575f80fd5b818b0191508b601f83011261553f575f80fd5b81358181111561554d575f80fd5b8c602082850101111561555e575f80fd5b6020830194508093505050509295985092959890939650565b6020808252600a90820152695245454e5452414e435960b01b604082015260600190565b600181811c908216806155af57607f821691505b6020821081036155cd57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561111c5761111c6155d3565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561111c5761111c6155d3565b5f6001600160401b0382111561563957615639614f3d565b5060051b60200190565b5f615650614fec84615621565b8381529050602080820190600585901b84018681111561566e575f80fd5b845b81811015615751576001600160401b03808235111561568d575f80fd5b813587016040818b0312156156a0575f80fd5b6156a8614f51565b6156b28235614eff565b8135815285820135838111156156c6575f80fd5b8083019250508a601f8301126156da575f80fd5b81356156e8614fec82615621565b81815260059190911b8301870190878101908d831115615706575f80fd5b8885015b8381101561573b57868135111561571f575f80fd5b61572e8f8b8335890101614fcf565b835291890191890161570a565b5083890152505086525050928201928201615670565b505050509392505050565b5f61388e368484615643565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f602082840312156157a5575f80fd5b815161388e81615120565b5f805f606084860312156157c2575f80fd5b83516157cd81614eff565b60208501519093506157de81615120565b60408501519092506001600160401b038111156157f9575f80fd5b8401601f81018613615809575f80fd5b8051615817614fec82614fa9565b81815287602083850101111561582b575f80fd5b61583c826020830160208601614e58565b8093505050509250925092565b601f8211156127b6575f81815260208120601f850160051c8101602086101561586f5750805b601f850160051c820191505b81811015612b865782815560010161587b565b81516001600160401b038111156158a7576158a7614f3d565b6158bb816158b5845461559b565b84615849565b602080601f8311600181146158ee575f84156158d75750858301515b5f19600386901b1c1916600185901b178555612b86565b5f85815260208120601f198616915b8281101561591c578886015182559484019460019091019084016158fd565b508582101561593957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f808335601e1984360301811261595e575f80fd5b8301803591506001600160401b03821115615977575f80fd5b602001915036819003821315615224575f80fd5b5f6001820161599c5761599c6155d3565b5060010190565b61ffff8281168282160390808211156159be576159be6155d3565b5092915050565b61ffff8181168382160190808211156159be576159be6155d3565b5f602082840312156159f0575f80fd5b81356001600160401b03811115615a05575f80fd5b8201601f81018413615a15575f80fd5b6110ae84823560208401615643565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b5f60208284031215615a5a575f80fd5b815161388e816153ed565b5f60208284031215615a75575f80fd5b815161388e81614eff565b5f8151808452602080850194508084015f5b83811015615ab75781516001600160a01b031687529582019590820190600101615a92565b509495945050505050565b5f8151808452602080850194508084015f5b83811015615ab757815187529582019590820190600101615ad4565b606081525f615b026060830186615a80565b8281036020840152615b148186615ac2565b91505060018060a01b0383166040830152949350505050565b5f60208284031215615b3d575f80fd5b5051919050565b60a081525f615b5660a0830188615a80565b8281036020840152615b688188615ac2565b90508281036040840152615b7c8187615a80565b90508281036060840152615b908186615ac2565b91505060018060a01b03831660808301529695505050505050565b5f8154615bb78161559b565b808552602060018381168015615bd45760018114615bee57615c19565b60ff1985168884015283151560051b880183019550615c19565b865f52825f205f5b85811015615c115781548a8201860152908301908401615bf6565b890184019650505b505050505092915050565b602081525f61388e6020830184615bab565b5f805f60608486031215615c48575f80fd5b8351925060208401519150604084015161511581615120565b600181815b80851115615c9b57815f1904821115615c8157615c816155d3565b80851615615c8e57918102915b93841c9390800290615c66565b509250929050565b5f82615cb15750600161111c565b81615cbd57505f61111c565b8160018114615cd35760028114615cdd57615cf9565b600191505061111c565b60ff841115615cee57615cee6155d3565b50506001821b61111c565b5060208310610133831016604e8410600b8410161715615d1c575081810a61111c565b615d268383615c61565b805f1904821115615d3957615d396155d3565b029392505050565b5f61388e60ff841683615ca3565b63ffffffff8281168282160390808211156159be576159be6155d3565b5f808354615d798161559b565b60018281168015615d915760018114615da657615dd2565b60ff1984168752821515830287019450615dd2565b875f526020805f205f5b85811015615dc95781548a820152908401908201615db0565b50505082870194505b50929695505050505050565b6001600160a01b03831681526040602082018190525f906110ae90830184614e7a565b5f81615e0f57615e0f6155d3565b505f190190565b604081525f615e286040830185615bab565b8281036020840152615e3a8185615bab565b95945050505050565b634e487b7160e01b5f52603160045260245ffd5b5f8251615e68818460208701614e58565b9190910192915050565b808202811582820484141761111c5761111c6155d3565b5f82615ea357634e487b7160e01b5f52601260045260245ffd5b500490565b838152606060208201525f615ec06060830185615bab565b82810360408401526119598185615bab565b8481526001600160a01b03841660208201526080604082018190525f90615efb90830185615bab565b8281036060840152611f708185615bab56fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122001ee3b7a5e5b203fe12552069e6757861290b0f372c1673e65521345b9de750b64736f6c63430008150033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000002322ba43eff1542b6a7baed35e66099ea0d12bd100000000000000000000000037912f4c0f0d916890ebd755bf6d1f0a0e059bbd000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c8000000000000000000000000000000000000000000000000000000000000001045746865722e66692d4c69717569643100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4c5149444554484649563100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : _owner (address): 0x2322ba43eFF1542b6A7bAeD35e66099Ea0d12Bd1
Arg [1] : _registry (address): 0x37912f4c0F0d916890eBD755BF6d1f0A0e059BbD
Arg [2] : _asset (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : _name (string): Ether.fi-Liquid1
Arg [4] : _symbol (string): LQIDETHFIV1
Arg [5] : _holdingPosition (uint32): 1
Arg [6] : _holdingPositionConfig (bytes): 0x0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : _initialDeposit (uint256): 100000000000000
Arg [8] : _strategistPlatformCut (uint64): 500000000000000000
Arg [9] : _shareSupplyCap (uint192): 6277101735386680763835789423207666416102355444464034512895
Arg [10] : _balancerVault (address): 0xBA12222222228d8Ba445958a75a0704d566BF2C8

-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 0000000000000000000000002322ba43eff1542b6a7baed35e66099ea0d12bd1
Arg [1] : 00000000000000000000000037912f4c0f0d916890ebd755bf6d1f0a0e059bbd
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [7] : 00000000000000000000000000000000000000000000000000005af3107a4000
Arg [8] : 00000000000000000000000000000000000000000000000006f05b59d3b20000
Arg [9] : 0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff
Arg [10] : 000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c8
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [12] : 45746865722e66692d4c69717569643100000000000000000000000000000000
Arg [13] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [14] : 4c51494445544846495631000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000001


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.