Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
Vault
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 100 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.25;import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";import "@openzeppelin/contracts/interfaces/IERC20Metadata.sol";import "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol";import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC4626Upgradeable.sol";import "../../interfaces/IRedeemOperator.sol";import "../../interfaces/IStrategy.sol";import "../../interfaces/IVault.sol";import "../libraries/StorageSlot.sol";import "../libraries/Errors.sol";import "../common/Constants.sol";import "./StrategyFactory.sol";/*** @title Vault contract* @author Naturelab* @dev This contract is the logical implementation of the vault,* and its main purpose is to provide users with a gateway for depositing* and withdrawing funds and to manage user shares.*/contract Vault isConstants,IVault,
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)pragma solidity ^0.8.20;import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";import {Initializable} from "../proxy/utils/Initializable.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.** The initial owner is set to the address provided by the deployer. 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 OwnableUpgradeable is Initializable, ContextUpgradeable {/// @custom:storage-location erc7201:openzeppelin.storage.Ownablestruct OwnableStorage {address _owner;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)pragma solidity ^0.8.20;/*** @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.** The initialization functions use a version number. Once a version number is used, it is consumed and cannot be* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in* case an upgrade adds a module that needs to be initialized.** For example:** [.hljs-theme-light.nopadding]* ```solidity* contract MyToken is ERC20Upgradeable {* function initialize() initializer public {* __ERC20_init("MyToken", "MTK");* }* }** contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)pragma solidity ^0.8.20;import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";import {ContextUpgradeable} from "../../utils/ContextUpgradeable.sol";import {IERC20Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol";import {Initializable} from "../../proxy/utils/Initializable.sol";/*** @dev Implementation of the {IERC20} interface.** This implementation is agnostic to the way tokens are created. This means* that a supply mechanism has to be added in a derived contract using {_mint}.** TIP: For a detailed writeup see our guide* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How* to implement supply mechanisms].** The default value of {decimals} is 18. To change this, you should override* this function so it returns a different value.** We have followed general OpenZeppelin Contracts guidelines: functions revert* instead returning `false` on failure. This behavior is nonetheless
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC4626.sol)pragma solidity ^0.8.20;import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";import {ERC20Upgradeable} from "../ERC20Upgradeable.sol";import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol";import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";import {Initializable} from "../../../proxy/utils/Initializable.sol";/*** @dev Implementation of the ERC4626 "Tokenized Vault Standard" as defined in* https://eips.ethereum.org/EIPS/eip-4626[EIP-4626].** This extension allows the minting and burning of "shares" (represented using the ERC20 inheritance) in exchange for* underlying "assets" through standardized {deposit}, {mint}, {redeem} and {burn} workflows. This contract extends* the ERC20 standard. Any additional extensions included along it would affect the "shares" token represented by this* contract and not the "assets" token which is an independent contract.** [CAUTION]* ====* In empty (or nearly empty) ERC-4626 vaults, deposits are at high risk of being stolen through frontrunning* with a "donation" to the vault that inflates the price of a share. This is variously known as a donation or inflation
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)pragma solidity ^0.8.20;import {Initializable} from "../proxy/utils/Initializable.sol";/*** @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 ContextUpgradeable is Initializable {function __Context_init() internal onlyInitializing {}function __Context_init_unchained() internal onlyInitializing {}function _msgSender() internal view virtual returns (address) {return msg.sender;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)pragma solidity ^0.8.20;import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";import {Initializable} from "../proxy/utils/Initializable.sol";/*** @dev Contract module which allows children to implement an emergency stop* mechanism that can be triggered by an authorized account.** This module is used through inheritance. It will make available the* modifiers `whenNotPaused` and `whenPaused`, which can be applied to* the functions of your contract. Note that they will not be pausable by* simply including this module, only once the modifiers are put in place.*/abstract contract PausableUpgradeable is Initializable, ContextUpgradeable {/// @custom:storage-location erc7201:openzeppelin.storage.Pausablestruct PausableStorage {bool _paused;}// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Pausable")) - 1)) & ~bytes32(uint256(0xff))bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)pragma solidity ^0.8.20;import {Initializable} from "../proxy/utils/Initializable.sol";/*** @dev Contract module that helps prevent reentrant calls to a function.** Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier* available, which can be applied to functions to make sure there are no nested* (reentrant) calls to them.** Note that because there is a single `nonReentrant` guard, functions marked as* `nonReentrant` may not call one another. This can be worked around by making* those functions `private`, and then adding `external` `nonReentrant` entry* points to them.** TIP: If you would like to learn more about reentrancy and alternative ways* to protect against it, check out our blog post* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].*/abstract contract ReentrancyGuardUpgradeable is Initializable {// Booleans are more expensive than uint256 or any type that takes up a full// word because each write operation emits an extra SLOAD to first read the// slot's contents, replace the bits taken up by the boolean, and then write
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)pragma solidity ^0.8.20;import {Context} from "../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.** The initial owner is set to the address provided by the deployer. 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;/*** @dev The caller account is not authorized to perform an operation.*/error OwnableUnauthorizedAccount(address account);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)pragma solidity ^0.8.20;/*** @dev Standard ERC20 Errors* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.*/interface IERC20Errors {/*** @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.* @param sender Address whose tokens are being transferred.* @param balance Current balance for the interacting account.* @param needed Minimum amount required to perform a transfer.*/error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);/*** @dev Indicates a failure with the token `sender`. Used in transfers.* @param sender Address whose tokens are being transferred.*/error ERC20InvalidSender(address sender);/*** @dev Indicates a failure with the token `receiver`. Used in transfers.* @param receiver Address to which tokens are being transferred.
123456789101112131415161718192021222324// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)pragma solidity ^0.8.20;/*** @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.*/interface IERC1967 {/*** @dev Emitted when the implementation is upgraded.*/event Upgraded(address indexed implementation);/*** @dev Emitted when the admin account has changed.*/event AdminChanged(address previousAdmin, address newAdmin);/*** @dev Emitted when the beacon is changed.*/event BeaconUpgraded(address indexed beacon);}
123456// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20Metadata.sol)pragma solidity ^0.8.20;import {IERC20Metadata} from "../token/ERC20/extensions/IERC20Metadata.sol";
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4626.sol)pragma solidity ^0.8.20;import {IERC20} from "../token/ERC20/IERC20.sol";import {IERC20Metadata} from "../token/ERC20/extensions/IERC20Metadata.sol";/*** @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in* https://eips.ethereum.org/EIPS/eip-4626[ERC-4626].*/interface IERC4626 is IERC20, IERC20Metadata {event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);event Withdraw(address indexed sender,address indexed receiver,address indexed owner,uint256 assets,uint256 shares);/*** @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.*
12345678910111213141516// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)pragma solidity ^0.8.20;/*** @dev This is the interface that {BeaconProxy} expects of its beacon.*/interface IBeacon {/*** @dev Must return an address that can be used as a delegate call target.** {UpgradeableBeacon} will check that this address is a contract.*/function implementation() external view returns (address);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Proxy.sol)pragma solidity ^0.8.20;import {Proxy} from "../Proxy.sol";import {ERC1967Utils} from "./ERC1967Utils.sol";/*** @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an* implementation address that can be changed. This address is stored in storage in the location specified by* https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the* implementation behind the proxy.*/contract ERC1967Proxy is Proxy {/*** @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`.** If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an* encoded function call, and allows initializing the storage of the proxy like a Solidity constructor.** Requirements:** - If `data` is empty, `msg.value` must be zero.*/constructor(address implementation, bytes memory _data) payable {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol)pragma solidity ^0.8.20;import {IBeacon} from "../beacon/IBeacon.sol";import {Address} from "../../utils/Address.sol";import {StorageSlot} from "../../utils/StorageSlot.sol";/*** @dev This abstract contract provides getters and event emitting update functions for* https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.*/library ERC1967Utils {// We re-declare ERC-1967 events here because they can't be used directly from IERC1967.// This will be fixed in Solidity 0.8.21. At that point we should remove these events./*** @dev Emitted when the implementation is upgraded.*/event Upgraded(address indexed implementation);/*** @dev Emitted when the admin account has changed.*/event AdminChanged(address previousAdmin, address newAdmin);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)pragma solidity ^0.8.20;/*** @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM* instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to* be specified by overriding the virtual {_implementation} function.** Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a* different contract through the {_delegate} function.** The success and return data of the delegated call will be returned back to the caller of the proxy.*/abstract contract Proxy {/*** @dev Delegates the current call to `implementation`.** This function does not return to its internal call site, it will return directly to the external caller.*/function _delegate(address implementation) internal virtual {assembly {// Copy msg.data. We take full control of memory in this inline assembly// block because it will not return to Solidity code. We overwrite the// Solidity scratch pad at memory position 0.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (proxy/transparent/ProxyAdmin.sol)pragma solidity ^0.8.20;import {ITransparentUpgradeableProxy} from "./TransparentUpgradeableProxy.sol";import {Ownable} from "../../access/Ownable.sol";/*** @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an* explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.*/contract ProxyAdmin is Ownable {/*** @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgrade(address)`* and `upgradeAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,* while `upgradeAndCall` will invoke the `receive` function if the second argument is the empty byte string.* If the getter returns `"5.0.0"`, only `upgradeAndCall(address,bytes)` is present, and the second argument must* be the empty byte string if no function should be called, making it impossible to invoke the `receive` function* during an upgrade.*/string public constant UPGRADE_INTERFACE_VERSION = "5.0.0";/*** @dev Sets the initial owner who can perform upgrades.*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (proxy/transparent/TransparentUpgradeableProxy.sol)pragma solidity ^0.8.20;import {ERC1967Utils} from "../ERC1967/ERC1967Utils.sol";import {ERC1967Proxy} from "../ERC1967/ERC1967Proxy.sol";import {IERC1967} from "../../interfaces/IERC1967.sol";import {ProxyAdmin} from "./ProxyAdmin.sol";/*** @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}* does not implement this interface directly, and its upgradeability mechanism is implemented by an internal dispatch* mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not* include them in the ABI so this interface must be used to interact with it.*/interface ITransparentUpgradeableProxy is IERC1967 {function upgradeToAndCall(address, bytes calldata) external payable;}/*** @dev This contract implements a proxy that is upgradeable through an associated {ProxyAdmin} instance.** To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector* clashing], which can potentially be used in an attack, this contract uses the* https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)pragma solidity ^0.8.20;import {IERC20} from "../IERC20.sol";/*** @dev Interface for the optional metadata functions from the ERC20 standard.*/interface IERC20Metadata is IERC20 {/*** @dev Returns the name of the token.*/function name() external view returns (string memory);/*** @dev Returns the symbol of the token.*/function symbol() external view returns (string memory);/*** @dev Returns the decimals places of the token.*/function decimals() external view returns (uint8);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)pragma solidity ^0.8.20;/*** @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].** Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't* need to send a transaction, and thus is not required to hold Ether at all.** ==== Security Considerations** There are two important considerations concerning the use of `permit`. The first is that a valid permit signature* expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be* considered as an intention to spend the allowance in any specific way. The second is that because permits have* built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should* take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be* generally recommended is:** ```solidity* function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {* try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}* doThing(..., value);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)pragma solidity ^0.8.20;/*** @dev Interface of the ERC20 standard as defined in the EIP.*/interface IERC20 {/*** @dev Emitted when `value` tokens are moved from one account (`from`) to* another (`to`).** Note that `value` may be zero.*/event Transfer(address indexed from, address indexed to, uint256 value);/*** @dev Emitted when the allowance of a `spender` for an `owner` is set by* a call to {approve}. `value` is the new allowance.*/event Approval(address indexed owner, address indexed spender, uint256 value);/*** @dev Returns the value of tokens in existence.*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)pragma solidity ^0.8.20;import {IERC20} from "../IERC20.sol";import {IERC20Permit} from "../extensions/IERC20Permit.sol";import {Address} from "../../../utils/Address.sol";/*** @title SafeERC20* @dev Wrappers around ERC20 operations that throw on failure (when the token* contract returns false). Tokens that return no value (and instead revert or* throw on failure) are also supported, non-reverting calls are assumed to be* successful.* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.*/library SafeERC20 {using Address for address;/*** @dev An operation with an ERC20 token failed.*/error SafeERC20FailedOperation(address token);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)pragma solidity ^0.8.20;/*** @dev Collection of functions related to the address type*/library Address {/*** @dev The ETH balance of the account is not enough to perform the operation.*/error AddressInsufficientBalance(address account);/*** @dev There's no code at `target` (it is not a contract).*/error AddressEmptyCode(address target);/*** @dev A call to an address target failed. The target may have reverted.*/error FailedInnerCall();/*** @dev Replacement for Solidity's `transfer`: sends `amount` wei to
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)pragma solidity ^0.8.20;/*** @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;}function _contextSuffixLength() internal view virtual returns (uint256) {return 0;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)pragma solidity ^0.8.20;/*** @dev Standard math utilities missing in the Solidity language.*/library Math {/*** @dev Muldiv operation overflow.*/error MathOverflowedMulDiv();enum Rounding {Floor, // Toward negative infinityCeil, // Toward positive infinityTrunc, // Toward zeroExpand // Away from zero}/*** @dev Returns the addition of two unsigned integers, with an overflow flag.*/function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {unchecked {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.pragma solidity ^0.8.20;/*** @dev Library for reading and writing primitive types to specific storage slots.** Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.* This library helps with reading and writing to such slots without the need for inline assembly.** The functions in this library return Slot structs that contain a `value` member that can be used to read or write.** Example usage to set ERC1967 implementation slot:* ```solidity* contract ERC1967 {* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;** function _getImplementation() internal view returns (address) {* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;* }** function _setImplementation(address newImplementation) internal {* require(newImplementation.code.length > 0);* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/structs/EnumerableSet.sol)// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.pragma solidity ^0.8.20;/*** @dev Library for managing* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive* types.** Sets have the following properties:** - Elements are added, removed, and checked for existence in constant time* (O(1)).* - Elements are enumerated in O(n). No guarantees are made on the ordering.** ```solidity* contract Example {* // Add the library methods* using EnumerableSet for EnumerableSet.AddressSet;** // Declare a set state variable* EnumerableSet.AddressSet private mySet;* }* ```
123456789101112131415161718192021// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.25;interface IRedeemOperator {// Events for logging actionsevent RegisterWithdrawal(address indexed user, uint256 shares);event ConfirmWithdrawal(address[] users);event UpdateOperator(address oldOperator, address newOperator);event UpdateFeeReceiver(address oldFeeReceiver, address newFeeReceiver);event Sweep(address token);function registerWithdrawal(address _user, uint256 _shares) external;function pendingWithdrawersCount() external view returns (uint256);function pendingWithdrawers(uint256 _limit, uint256 _offset) external view returns (address[] memory result_);function allPendingWithdrawers() external view returns (address[] memory);function confirmWithdrawal(address[] calldata _Users, uint256 _totalGasLimit) external;}
12345678// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.25;interface IStrategy {function getNetAssets() external returns (uint256);function onTransferIn(address token, uint256 amount) external returns (bool);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.25;interface IVault {event UpdateMarketCapacity(uint256 oldCapacityLimit, uint256 newCapacityLimit);event UpdateManagementFee(uint256 oldManagementFee, uint256 newManagementFee);event UpdateManagementFeeClaimPeriod(uint256 oldManagementFeeClaimPeriod, uint256 newManagementFeeClaimPeriod);event UpdateMaxPriceUpdatePeriod(uint256 oldMaxPriceUpdatePeriod, uint256 newMaxPriceUpdatePeriod);event UpdateRevenueRate(uint256 oldRevenueRate, uint256 newRevenueRate);event UpdateExitFeeRate(uint256 oldExitFeeRate, uint256 newExitFeeRate);event UpdateRebalancer(address oldRebalancer, address newRebalancer);event UpdateFeeReceiver(address oldFeeReceiver, address newFeeReceiver);event UpdateRedeemOperator(address oldRedeemOperator, address newRedeemOperator);event UpdateExchangePrice(uint256 newExchangePrice, uint256 newRevenue);event TransferToStrategy(address token, uint256 amount, uint256 strategyIndex);event OptionalRedeem(address token, uint256 shares, address receiver, address owner);event RequestRedeem(address user, uint256 shares, address token);event CollectManagementFee(uint256 assets);event CollectRevenue(uint256 revenue);event Sweep(address token);event OptionalDeposit(address sender, address token, uint256 assets, address receiver, address referral);/*** @dev Parameters for initializing the vault contract.* @param underlyingToken The address of the underlying token for the vault.* @param name The name of the vault token.
123456789// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.25;abstract contract Constants {address public constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;address public constant WBTC = 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599;address public constant FBTC = 0xC96dE26018A54D51c097160568752c4E3BD6C364;address public constant PumpBTC = 0xF469fBD2abcd6B9de8E169d128226C0Fc90a012e;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.25;library Errors {// Revert Errors:error CallerNotOperator(); // 0xa5523ee5error CallerNotRebalancer(); // 0xbd72e291error CallerNotVault(); // 0xedd7338ferror ExitFeeRateTooHigh(); // 0xf4d1caaberror FlashloanInProgress(); // 0x772ac4e8error IncorrectState(); // 0x508c9390error InfoExpired(); // 0x4ddf4a65error InvalidAccount(); // 0x6d187b28error InvalidAdapter(); // 0xfbf66df1error InvalidAdmin(); // 0xb5eba9f0error InvalidAsset(); // 0xc891add2error InvalidCaller(); // 0x48f5c3ederror InvalidClaimTime(); // 0x1221b97berror InvalidFeeReceiver(); // 0xd200485cerror InvalidFlashloanCall(); // 0xd2208d52error InvalidFlashloanHelper(); // 0x8690f016error InvalidFlashloanProvider(); // 0xb6b48551error InvalidGasLimit(); // 0x98bdb2e0error InvalidInitiator(); // 0xbfda1f28error InvalidLength(); // 0x947d5a84error InvalidLimit(); // 0xe55fb509
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.pragma solidity ^0.8.25;/*** @dev Library for reading and writing primitive types to specific storage slots.** Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.* This library helps with reading and writing to such slots without the need for inline assembly.** The functions in this library return Slot structs that contain a `value` member that can be used to read or write.** Example usage to set ERC-1967 implementation slot:* ```solidity* contract ERC1967 {* // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;** function _getImplementation() internal view returns (address) {* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;* }** function _setImplementation(address newImplementation) internal {* require(newImplementation.code.length > 0);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.25;import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";import "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol";import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";import "../../interfaces/IRedeemOperator.sol";import "../../interfaces/IStrategy.sol";import "../libraries/Errors.sol";/*** @title StrategyFactory contract* @author Naturelab* @dev This contract is responsible for managing strategies in a vault.* It allows the owner to create, remove, and interact with different strategies.*/abstract contract StrategyFactory is OwnableUpgradeable {using SafeERC20 for IERC20;using EnumerableSet for EnumerableSet.AddressSet;uint256 public constant MAX_POSITION_LIMIT = 10000; // 10000/10000 = 100%// Set to keep track of the addresses of strategies
1234567891011121314151617181920{"optimizer": {"enabled": true,"runs": 100},"evmVersion": "cancun","outputSelection": {"*": {"*": ["evm.bytecode","evm.deployedBytecode","devdoc","userdoc","metadata","abi"]}},"libraries": {}}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"CallerNotRebalancer","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxDeposit","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxMint","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxRedeem","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ERC4626ExceededMaxWithdraw","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExitFeeRateTooHigh","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"IncorrectState","type":"error"},{"inputs":[],"name":"InvalidAdmin","type":"error"},{"inputs":[],"name":"InvalidClaimTime","type":"error"},{"inputs":[],"name":"InvalidFeeReceiver","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"InvalidLimit","type":"error"},{"inputs":[],"name":"InvalidRebalancer","type":"error"},{"inputs":[],"name":"InvalidRedeemOperator","type":"error"},{"inputs":[],"name":"InvalidUnderlyingToken","type":"error"},{"inputs":[],"name":"ManagementFeeClaimPeriodTooShort","type":"error"},{"inputs":[],"name":"ManagementFeeRateTooHigh","type":"error"},{"inputs":[],"name":"MathOverflowedMulDiv","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"NotSupportedYet","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"PriceNotUpdated","type":"error"},{"inputs":[],"name":"PriceUpdatePeriodTooLong","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"RevenueFeeRateTooHigh","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UnSupportedOperation","type":"error"},{"inputs":[],"name":"UnsupportedToken","type":"error"},{"inputs":[],"name":"WithdrawZero","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"}],"name":"CollectManagementFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"revenue","type":"uint256"}],"name":"CollectRevenue","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"address","name":"impl","type":"address"}],"name":"CreateStrategy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","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":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"referral","type":"address"}],"name":"OptionalDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OptionalRedeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"strategy","type":"address"}],"name":"RemoveStrategy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"RequestRedeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"Sweep","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"strategyIndex","type":"uint256"}],"name":"TransferToStrategy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newExchangePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRevenue","type":"uint256"}],"name":"UpdateExchangePrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldExitFeeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newExitFeeRate","type":"uint256"}],"name":"UpdateExitFeeRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldFeeReceiver","type":"address"},{"indexed":false,"internalType":"address","name":"newFeeReceiver","type":"address"}],"name":"UpdateFeeReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldManagementFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newManagementFee","type":"uint256"}],"name":"UpdateManagementFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldManagementFeeClaimPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newManagementFeeClaimPeriod","type":"uint256"}],"name":"UpdateManagementFeeClaimPeriod","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldCapacityLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newCapacityLimit","type":"uint256"}],"name":"UpdateMarketCapacity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMaxPriceUpdatePeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxPriceUpdatePeriod","type":"uint256"}],"name":"UpdateMaxPriceUpdatePeriod","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOperator","type":"address"},{"indexed":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"UpdateOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldRebalancer","type":"address"},{"indexed":false,"internalType":"address","name":"newRebalancer","type":"address"}],"name":"UpdateRebalancer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldRedeemOperator","type":"address"},{"indexed":false,"internalType":"address","name":"newRedeemOperator","type":"address"}],"name":"UpdateRedeemOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldRevenueRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRevenueRate","type":"uint256"}],"name":"UpdateRevenueRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"UpdateStrategyLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","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":"ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FBTC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_POSITION_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PumpBTC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WBTC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectManagementFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectRevenue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_impl","type":"address"},{"internalType":"bytes","name":"_initBytes","type":"bytes"},{"internalType":"uint256","name":"_positionLimit","type":"uint256"}],"name":"createStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","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":[],"name":"exchangePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaultParams","outputs":[{"components":[{"internalType":"address","name":"underlyingToken","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"marketCapacity","type":"uint256"},{"internalType":"uint256","name":"managementFeeRate","type":"uint256"},{"internalType":"uint256","name":"managementFeeClaimPeriod","type":"uint256"},{"internalType":"uint256","name":"maxPriceUpdatePeriod","type":"uint256"},{"internalType":"uint256","name":"revenueRate","type":"uint256"},{"internalType":"uint256","name":"exitFeeRate","type":"uint256"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"rebalancer","type":"address"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"address","name":"redeemOperator","type":"address"}],"internalType":"struct IVault.VaultParams","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaultState","outputs":[{"components":[{"internalType":"uint256","name":"exchangePrice","type":"uint256"},{"internalType":"uint256","name":"revenueExchangePrice","type":"uint256"},{"internalType":"uint256","name":"revenue","type":"uint256"},{"internalType":"uint256","name":"lastClaimMngFeeTime","type":"uint256"},{"internalType":"uint256","name":"lastUpdatePriceTime","type":"uint256"}],"internalType":"struct IVault.VaultState","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assetAmount","type":"uint256"}],"name":"getWithdrawFee","outputs":[{"internalType":"uint256","name":"withdrawFee_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_initBytes","type":"bytes"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastExchangePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"maxAssets_","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_assets","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_referral","type":"address"}],"name":"optionalDeposit","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_cutPercentage","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"optionalRedeem","outputs":[{"internalType":"uint256","name":"assetsAfterFee_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"positionLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"remainingUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"removeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"requestRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revenue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revenueExchangePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategies","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategiesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"}],"name":"strategyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"}],"name":"strategyAssets","outputs":[{"internalType":"uint256","name":"totalAssets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStrategiesAssets","outputs":[{"internalType":"uint256","name":"totalAssets_","type":"uint256"}],"stateMutability":"nonpayable","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":"value","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":"value","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":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_strategyIndex","type":"uint256"}],"name":"transferToStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlyingTvl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateExchangePrice","outputs":[{"internalType":"uint256","name":"newExchangePrice","type":"uint256"},{"internalType":"uint256","name":"newRevenue","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newExitFeeRate","type":"uint256"}],"name":"updateExitFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFeeReceiver","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newManagementFeeRate","type":"uint256"}],"name":"updateManagementFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmanagementFeeClaimPeriod","type":"uint256"}],"name":"updateManagementFeeClaimPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCapacityLimit","type":"uint256"}],"name":"updateMarketCapacity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxPriceUpdatePeriod","type":"uint256"}],"name":"updateMaxPriceUpdatePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRebalancer","type":"address"}],"name":"updateRebalancer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRedeemOperator","type":"address"}],"name":"updateRedeemOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRevenueRate","type":"uint256"}],"name":"updateRevenueRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_newPositionLimit","type":"uint256"}],"name":"updateStrategyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052348015600e575f80fd5b5061535d8061001c5f395ff3fe6080604052600436106103b0575f3560e01c80638152cd18116101f3578063b2db983a1161011a578063c6e6f592116100b3578063ed14d17e11610078578063ed14d17e14610bbe578063ef8b30f714610b21578063f2fde38b14610bd2578063f4ad878814610bf1578063ffa1ad7414610c06575f80fd5b8063c6e6f59214610b21578063ce96cb7714610b40578063d905777e14610b5f578063d9f9027f14610b7e578063dd62ed3e14610b9f575f80fd5b8063b2db983a14610a1f578063b3d7f6b914610a3e578063b460af9414610a5d578063ba08765214610a5d578063ba8bfa2a14610a7c578063bf6590a414610a9b578063c0587a9514610aaf578063c63d75b614610ae2578063c69bebe414610b02575f80fd5b80639c016ffd1161018c5780639c016ffd1461090a5780639e65741e1461091e578063a7b7325414610932578063a9059cbb14610951578063aa2f892d14610970578063ad35530b1461098f578063b046a449146109ae578063b0caa891146109cd578063b2c1e382146109f8575f80fd5b80638152cd181461080d5780638322fff21461082c5780638456cb59146108535780638602f0241461086757806388bb4f601461088e5780638da5cb5b146108af57806394bf804d146108c357806395d89b41146108e257806398e1862c146108f6575f80fd5b806338d52e0f116102d75780634b59b82e116102705780634b59b82e146107235780634cdad506146104575780634dede3de146107425780635c975abb146107695780636e553f651461077d57806370a082311461079c578063715018a6146107bb5780637a825e07146107cf5780637f6c81b7146107ee575f80fd5b806338d52e0f146105eb5780633b0426db1461060c5780633bfaa7e3146106205780633c5280e4146106495780633e9491a2146106685780633f4ba83a1461067c578063402d267d14610690578063439fab91146106af5780634a8c110a146106ce575f80fd5b806318160ddd1161034957806318160ddd146104e357806323b872dd146104f75780632489f7f71461051657806325bd41421461052a578063266f8dc91461054957806329c23e4a14610568578063313ce5671461058757806332507a5f146105ad57806334069157146105cc575f80fd5b806301681a62146103bb57806301e1d114146103dc578063030d624a1461040357806306fdde0314610422578063079c3b881461044357806307a2d13a14610457578063095ea7b3146104765780630a28a477146104a5578063175188e8146104c4575f80fd5b366103b757005b5f80fd5b3480156103c6575f80fd5b506103da6103d5366004613ab4565b610c34565b005b3480156103e7575f80fd5b506103f0610d45565b6040519081526020015b60405180910390f35b34801561040e575f80fd5b506103da61041d366004613acd565b610da0565b34801561042d575f80fd5b50610436610e0b565b6040516103fa9190613b12565b34801561044e575f80fd5b506103f0610ea9565b348015610462575f80fd5b506103f0610471366004613acd565b611049565b348015610481575f80fd5b50610495610490366004613b24565b61105a565b60405190151581526020016103fa565b3480156104b0575f80fd5b506103f06104bf366004613acd565b611071565b3480156104cf575f80fd5b506103da6104de366004613ab4565b61107d565b3480156104ee575f80fd5b506103f0611166565b348015610502575f80fd5b50610495610511366004613b4c565b61117a565b348015610521575f80fd5b506103f061119f565b348015610535575f80fd5b506103da610544366004613acd565b6111a9565b348015610554575f80fd5b506103da610563366004613acd565b611214565b348015610573575f80fd5b506103f0610582366004613acd565b611280565b348015610592575f80fd5b5061059b61129d565b60405160ff90911681526020016103fa565b3480156105b8575f80fd5b506103f06105c7366004613b85565b6112c6565b3480156105d7575f80fd5b506103da6105e6366004613acd565b611433565b3480156105f6575f80fd5b506105ff6114a0565b6040516103fa9190613bcf565b348015610617575f80fd5b506103f06114ba565b34801561062b575f80fd5b506106346114ed565b604080519283526020830191909152016103fa565b348015610654575f80fd5b506103da610663366004613acd565b6116d3565b348015610673575f80fd5b506012546103f0565b348015610687575f80fd5b506103da611740565b34801561069b575f80fd5b506103f06106aa366004613ab4565b611752565b3480156106ba575f80fd5b506103da6106c9366004613c27565b611768565b3480156106d9575f80fd5b506106e2611bc0565b6040516103fa91905f60a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b34801561072e575f80fd5b506105ff61073d366004613acd565b611c22565b34801561074d575f80fd5b506105ff732260fac5e5542a773aa44fbcfedf7c193bc2c59981565b348015610774575f80fd5b50610495611c2d565b348015610788575f80fd5b506103f0610797366004613c65565b611c41565b3480156107a7575f80fd5b506103f06107b6366004613ab4565b611ce3565b3480156107c6575f80fd5b506103da611d0c565b3480156107da575f80fd5b506103da6107e9366004613ab4565b611d1d565b3480156107f9575f80fd5b506103da610808366004613acd565b611db5565b348015610818575f80fd5b506103da610827366004613c8f565b611e20565b348015610837575f80fd5b506105ff73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b34801561085e575f80fd5b506103da611ece565b348015610872575f80fd5b506105ff73f469fbd2abcd6b9de8e169d128226c0fc90a012e81565b348015610899575f80fd5b506108a2611f28565b6040516103fa9190613caf565b3480156108ba575f80fd5b506105ff612172565b3480156108ce575f80fd5b506103f06108dd366004613c65565b61219a565b3480156108ed575f80fd5b506104366121b5565b348015610901575f80fd5b506011546103f0565b348015610915575f80fd5b506103da6121d1565b348015610929575f80fd5b506010546103f0565b34801561093d575f80fd5b506103f061094c366004613db9565b6122bb565b34801561095c575f80fd5b5061049561096b366004613b24565b6122ee565b34801561097b575f80fd5b506103da61098a366004613acd565b6122fb565b34801561099a575f80fd5b506103da6109a9366004613e0c565b612402565b3480156109b9575f80fd5b506103da6109c8366004613ab4565b6124d6565b3480156109d8575f80fd5b506103f06109e7366004613ab4565b60026020525f908152604090205481565b348015610a03575f80fd5b506105ff73c96de26018a54d51c097160568752c4e3bd6c36481565b348015610a2a575f80fd5b506103f0610a39366004613acd565b612571565b348015610a49575f80fd5b506103f0610a58366004613acd565b6125dc565b348015610a68575f80fd5b506103f0610a77366004613e61565b6125e8565b348015610a87575f80fd5b506103da610a96366004613e9a565b612602565b348015610aa6575f80fd5b506103f06127bb565b348015610aba575f80fd5b507f4995646f72fa9a270ffc094641ab616ce576b2e3eab25eaf05c15caa4f0e595d5c6103f0565b348015610aed575f80fd5b506103f0610afc366004613ab4565b505f1990565b348015610b0d575f80fd5b506103da610b1c366004613ab4565b612870565b348015610b2c575f80fd5b506103f0610b3b366004613acd565b612908565b348015610b4b575f80fd5b506103f0610b5a366004613ab4565b612913565b348015610b6a575f80fd5b506103f0610b79366004613ab4565b612926565b348015610b89575f80fd5b50610b92612930565b6040516103fa9190613eca565b348015610baa575f80fd5b506103f0610bb9366004613f16565b61293b565b348015610bc9575f80fd5b506103da612975565b348015610bdd575f80fd5b506103da610bec366004613ab4565b6129f8565b348015610bfc575f80fd5b506103f061271081565b348015610c11575f80fd5b50610436604051806040016040528060038152602001620322e360ec1b81525081565b610c3c612a32565b610c446114a0565b6001600160a01b0316816001600160a01b031603610c755760405163350b944160e11b815260040160405180910390fd5b6040516370a0823160e01b81525f906001600160a01b038316906370a0823190610ca3903090600401613bcf565b602060405180830381865afa158015610cbe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce29190613f3e565b9050610cf86001600160a01b0383163383612a64565b478015610d0957610d093382612ac1565b7f807273efecfbeb7ae7d3a2189d1ed5a7db80074eed86e7d80b10bb925cd1db7383604051610d389190613bcf565b60405180910390a1505050565b6009546014545f9190610d589042613f69565b1115610d7757604051631f4bcb2b60e01b815260040160405180910390fd5b6305f5e100610d84611166565b601054610d919190613f7c565b610d9b9190613fa7565b905090565b610da8612a32565b6004811115610dca576040516309aa66eb60e01b815260040160405180910390fd5b60075460408051918252602082018390527f29b9d7a7d8a7a3ac22c295e4517723bc4e386eea60173e59e6da1dbd460cb409910160405180910390a1600755565b60605f610e16612b54565b9050806003018054610e2790613fba565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5390613fba565b8015610e9e5780601f10610e7557610100808354040283529160200191610e9e565b820191905f5260205f20905b815481529060010190602001808311610e8157829003601f168201915b505050505091505090565b5f80610eb36114a0565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610ede9190613bcf565b602060405180830381865afa158015610ef9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1d9190613f3e565b6040516370a0823160e01b8152732260fac5e5542a773aa44fbcfedf7c193bc2c599906370a0823190610f54903090600401613bcf565b602060405180830381865afa158015610f6f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f939190613f3e565b6040516370a0823160e01b815273c96de26018a54d51c097160568752c4e3bd6c364906370a0823190610fca903090600401613bcf565b602060405180830381865afa158015610fe5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110099190613f3e565b6110139190613ff2565b61101d9190613ff2565b90505f6110286127bb565b6012549091506110388383613ff2565b6110429190613f69565b9250505090565b5f611054825f612b78565b92915050565b5f33611067818585612bb5565b5060019392505050565b5f611054826001612bc2565b611085612a32565b5f816001600160a01b03166308bb5fb06040518163ffffffff1660e01b81526004016020604051808303815f875af11580156110c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e79190613f3e565b11156111065760405163e9ec812960e01b815260040160405180910390fd5b6111105f82612bf6565b506001600160a01b0381165f9081526002602052604080822091909155517fd3281a40d50ae838fe77dc627744037b8f0fc6a5711d66119a9b670c5cde41af9061115b908390613bcf565b60405180910390a150565b5f80611170612b54565b6002015492915050565b5f33611187858285612c0a565b611192858585612c5a565b60019150505b9392505050565b5f610d9b5f612cb7565b6111b1612a32565b60788111156111d35760405163f4d1caab60e01b815260040160405180910390fd5b600b5460408051918252602082018390527f394967f6fe403cda0905b23e81b928c5ca79107000b1404c6b3185442f05213c910160405180910390a1600b55565b61121c612a32565b6105dc81111561123f57604051630674143f60e01b815260040160405180910390fd5b600a5460408051918252602082018390527f63058ed61801434ac6bfe39e74400bed7f3ba09b7cb6294092974450727eb753910160405180910390a1600a55565b600b545f90612710906112939084613f7c565b6110549190613fa7565b5f806112a7612cc0565b90505f81546112c09190600160a01b900460ff16614005565b91505090565b5f6112cf612ce4565b6112d7612d2e565b6001600160a01b038516732260fac5e5542a773aa44fbcfedf7c193bc2c599148061131e57506001600160a01b03851673c96de26018a54d51c097160568752c4e3bd6c364145b80611341575061132c6114a0565b6001600160a01b0316856001600160a01b0316145b156113605761135b6001600160a01b038616333087612d54565b611379565b60405163350b944160e11b815260040160405180910390fd5b5f61138384611752565b9050808511156113b557838582604051633c8097d960e11b81526004016113ac9392919061401e565b60405180910390fd5b6113be85612908565b91506113ca8483612d8d565b604080513381526001600160a01b03888116602083015281830188905286811660608301528516608082015290517f308d36d8f61bd4393536b6557142f55554c34d4ea2a3dbf54fe782b98889dfb29181900360a00190a15061142b612dc5565b949350505050565b61143b612a32565b6203f48081111561145f5760405163e88d3ecb60e01b815260040160405180910390fd5b60095460408051918252602082018390527fcc5a4a7c466fc20af4119a7a26048791fdb55cbd401aff36ef2bfc639662b2e2910160405180910390a1600955565b5f806114aa612cc0565b546001600160a01b031692915050565b6014545f9081906114cb9042613f69565b905080600360060154116114df575f6112c0565b6009546112c0908290613f69565b600d545f9081906001600160a01b0316331461151c5760405163bd72e29160e01b815260040160405180910390fd5b60105461154a907f4995646f72fa9a270ffc094641ab616ce576b2e3eab25eaf05c15caa4f0e595d90612deb565b426014555f611557611166565b9050805f0361156f5750506010546012549091509091565b5f611578610ea9565b9050816115896305f5e10083613f7c565b6115939190613fa7565b60115490945084111561168f576011545f036115bd57505050601181905560108190556012549091565b5f6305f5e100836010600101546115d49190613f7c565b6115de9190613fa7565b6115e89083613f69565b600a54909150612710906115fc9083613f7c565b6116069190613fa7565b93508360106002015f82825461161c9190613ff2565b909155508390506305f5e1006116328685613f69565b61163c9190613f7c565b6116469190613fa7565b6010819055601181905560408051918252602082018690527f83d2ad38a3d31bbc70811535dd8943b0140df344c23e6e167ee1ca32f9a1a459910160405180910390a1506116cd565b6010849055604080518581525f60208201527f83d2ad38a3d31bbc70811535dd8943b0140df344c23e6e167ee1ca32f9a1a459910160405180910390a15b50509091565b6116db612a32565b62093a808110156116ff57604051632011727b60e11b815260040160405180910390fd5b60085460408051918252602082018390527fcdbf56e2a82365307f9691ad933e9762726485d202543fe224f47447d79feaf0910160405180910390a1600855565b611748612a32565b611750612df2565b565b5f61175b610d45565b6006546110549190613f69565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156117ac5750825b90505f826001600160401b031660011480156117c75750303b155b9050811580156117d5575080155b156117f35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561181d57845460ff60401b1916600160401b1785555b5f61182a87890189614104565b9050611834612e3d565b61183c612e4d565b61184e81602001518260400151612e5d565b80516001600160a01b0316611876576040516317dc37cb60e11b815260040160405180910390fd5b6101408101516001600160a01b03166118a5576040516001626bbab960e11b0319815260040160405180910390fd5b6101208101516001600160a01b03166118d157604051630b5eba9f60e41b815260040160405180910390fd5b6101608101516001600160a01b03166118fd57604051633480121760e21b815260040160405180910390fd5b600481608001511115611923576040516309aa66eb60e01b815260040160405180910390fd5b62093a808160a00151101561194b57604051632011727b60e11b815260040160405180910390fd5b6203f4808160c0015111156119735760405163e88d3ecb60e01b815260040160405180910390fd5b6105dc8160e00151111561199a57604051630674143f60e01b815260040160405180910390fd5b607881610100015111156119c15760405163f4d1caab60e01b815260040160405180910390fd5b6305f5e100815f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a299190614231565b611a3490600a614331565b14611a525760405163350b944160e11b815260040160405180910390fd5b611a60816101200151612e6f565b8051611a6b90612e80565b4260138190556014556305f5e1006010558051600380546001600160a01b0319166001600160a01b039092169190911781556020820151829190600490611ab29082614383565b5060408201516002820190611ac79082614383565b50606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e0820151600782015561010082015160088201556101208201516009820180546001600160a01b03199081166001600160a01b0393841617909155610140840151600a840180548316918416919091179055610160840151600b84018054831691841691909117905561018090930151600c90920180549093169116179055508315611bb757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b611bed6040518060a001604052805f81526020015f81526020015f81526020015f81526020015f81525090565b506040805160a08101825260105481526011546020820152601254918101919091526013546060820152601454608082015290565b5f6110548183612e91565b5f80611c37612e9c565b5460ff1692915050565b5f611c4a612ce4565b611c52612d2e565b5f198303611ccf57611c626114a0565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401611c8d9190613bcf565b602060405180830381865afa158015611ca8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ccc9190613f3e565b92505b611cd98383612ec0565b9050611054612dc5565b5f80611ced612b54565b6001600160a01b039093165f9081526020939093525050604090205490565b611d14612a32565b6117505f612f0c565b611d25612a32565b6001600160a01b038116611d4c5760405163d214a59760e01b815260040160405180910390fd5b600f546040517fe74dd8b1f5f3d5328df682e649c08b085f09c2ce77b68e54329e8d30e2642f7891611d8b916001600160a01b03909116908490614442565b60405180910390a1600f80546001600160a01b0319166001600160a01b0392909216919091179055565b611dbd612a32565b6006548111611ddf5760405163e9ec812960e01b815260040160405180910390fd5b60065460408051918252602082018390527f7f3306669f28a6aa13d0f709be2bd4f3e21d2f37aee9358846a50e1988ee4832910160405180910390a1600655565b611e28612a32565b801580611e36575061271081115b15611e545760405163e55fb50960e01b815260040160405180910390fd5b5f611e5f8184612e91565b6001600160a01b0381165f908152600260209081526040918290205482519081529081018590529192507f7cd01dd3533c6dc08821cd303814de60aba1901f1531c3cbcd95d26ed924e9cf910160405180910390a16001600160a01b03165f9081526002602052604090205550565b611ed6612172565b6001600160a01b0316336001600160a01b031614158015611f025750600d546001600160a01b03163314155b15611f205760405163e9ec812960e01b815260040160405180910390fd5b611750612f7c565b611fb5604051806101a001604052805f6001600160a01b0316815260200160608152602001606081526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681525090565b604080516101a08101909152600380546001600160a01b0316825260048054602084019190611fe390613fba565b80601f016020809104026020016040519081016040528092919081815260200182805461200f90613fba565b801561205a5780601f106120315761010080835404028352916020019161205a565b820191905f5260205f20905b81548152906001019060200180831161203d57829003601f168201915b5050505050815260200160028201805461207390613fba565b80601f016020809104026020016040519081016040528092919081815260200182805461209f90613fba565b80156120ea5780601f106120c1576101008083540402835291602001916120ea565b820191905f5260205f20905b8154815290600101906020018083116120cd57829003601f168201915b505050918352505060038201546020820152600482015460408201526005820154606082015260068201546080820152600782015460a0820152600882015460c082015260098201546001600160a01b0390811660e0830152600a8301548116610100830152600b8301548116610120830152600c9092015490911661014090910152919050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993006114aa565b5f6121a3612ce4565b6121ab612d2e565b611cd98383612fc2565b60605f6121c0612b54565b9050806004018054610e2790613fba565b600e546001600160a01b031633146121fc57604051633480121760e21b815260040160405180910390fd5b60085460135442919061220f9083613f69565b101561222e57604051631221b97b60e01b815260040160405180910390fd5b60138190556007545f9061271090612244610d45565b61224e9190613f7c565b6122589190613fa7565b600e54909150612284906001600160a01b0316826122746114a0565b6001600160a01b03169190612a64565b6040518181527f55ce6141cc7099e5baac44c64543a6d7fc4e37ebba0fcaa65fa1f2a9996ec5a59060200160405180910390a15050565b5f6122c4612ce4565b6122cc612d2e565b60405163e9ec812960e01b815260040160405180910390fd5b95945050505050565b5f33611067818585612c5a565b612303612ce4565b61230b612d2e565b805f0361232b57604051637ea773a960e01b815260040160405180910390fd5b600f546123439033906001600160a01b031683612c5a565b600f546040516336c69b5d60e11b81526001600160a01b0390911690636d8d36ba90612375903390859060040161445c565b5f604051808303815f87803b15801561238c575f80fd5b505af115801561239e573d5f803e3d5ffd5b505050507ff9fd31dd1a61b95c600dd5aa1a6330f6c5cbe70a39a660edc081daf217db3cfb33826123cd6114a0565b604080516001600160a01b039485168152602081019390935292168183015290519081900360600190a16123ff612dc5565b50565b61240a612a32565b801580612418575061271081115b156124365760405163e55fb50960e01b815260040160405180910390fd5b5f8433858560405161244790613a8c565b6124549493929190614475565b604051809103905ff08015801561246d573d5f803e3d5ffd5b506001600160a01b0381165f9081526002602052604081208490559091506124959082612fdd565b507f0803371633b57311f58d10924711080d2dae75ab17c5c0c262af3887cfca00bb81866040516124c7929190614442565b60405180910390a15050505050565b6124de612a32565b6001600160a01b038116612508576040516001626bbab960e11b0319815260040160405180910390fd5b600d546040517fe2eeab472f89ac267be30e463da684fb96f56cc8e947839361fdf45bf6a3458e91612547916001600160a01b03909116908490614442565b60405180910390a1600d80546001600160a01b0319166001600160a01b0392909216919091179055565b5f61257c8183612e91565b6001600160a01b03166308bb5fb06040518163ffffffff1660e01b81526004016020604051808303815f875af11580156125b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110549190613f3e565b5f611054826001612b78565b5f604051637dc4dd1560e11b815260040160405180910390fd5b61260a612a32565b5f61261482611c22565b6001600160a01b0381165f818152600260209081526040808320548151628bb5fb60e41b81529151959650949293926308bb5fb092600480840193919291829003018187875af115801561266a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061268e9190613f3e565b90506127108261269c610d45565b6126a69190613f7c565b6126b09190613fa7565b6126ba8683613ff2565b11156126d95760405163e55fb50960e01b815260040160405180910390fd5b6126ed6001600160a01b0387168487612ff1565b6040516356f4edaf60e01b81526001600160a01b038416906356f4edaf9061271b908990899060040161445c565b6020604051808303815f875af1158015612737573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061275b91906144bf565b61277857604051630508c93960e41b815260040160405180910390fd5b7f921f9e77ef648025190d46d8b7f3d22a5546367ff7aaa883b1f39ffd2a2d325d8686866040516127ab9392919061401e565b60405180910390a1505050505050565b5f806127c561119f565b90505f6127d0612930565b90505f5b8281101561286a578181815181106127ee576127ee6144de565b60200260200101516001600160a01b03166308bb5fb06040518163ffffffff1660e01b81526004016020604051808303815f875af1158015612832573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128569190613f3e565b6128609085613ff2565b93506001016127d4565b50505090565b612878612a32565b6001600160a01b03811661289f57604051633480121760e21b815260040160405180910390fd5b600e546040517f2861448678f0be67f11bfb5481b3e3b4cfeb3acc6126ad60a05f95bfc6530666916128de916001600160a01b03909116908490614442565b60405180910390a1600e80546001600160a01b0319166001600160a01b0392909216919091179055565b5f611054825f612bc2565b5f61105461292083611ce3565b5f612b78565b5f61105482611ce3565b6060610d9b5f613076565b5f80612945612b54565b6001600160a01b039485165f90815260019190910160209081526040808320959096168252939093525050205490565b600e546001600160a01b031633146129a057604051633480121760e21b815260040160405180910390fd5b600e546012546129bc916001600160a01b0316906122746114a0565b6012546040519081527f8a2034f45f83800eed1750a670ad845ceee6add62106ca5326598842cfbd6ea79060200160405180910390a15f601255565b612a00612a32565b6001600160a01b038116612a29575f604051631e4fbdf760e01b81526004016113ac9190613bcf565b6123ff81612f0c565b33612a3b612172565b6001600160a01b031614611750573360405163118cdaa760e01b81526004016113ac9190613bcf565b612abc83846001600160a01b031663a9059cbb8585604051602401612a8a92919061445c565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613082565b505050565b80471015612ae4573060405163cd78605960e01b81526004016113ac9190613bcf565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612b2d576040519150601f19603f3d011682016040523d82523d5f602084013e612b32565b606091505b5050905080612abc57604051630a12f52160e11b815260040160405180910390fd5b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0090565b5f611198612b84610d45565b612b8f906001613ff2565b612b9a5f600a614331565b612ba2611166565b612bac9190613ff2565b859190856130da565b612abc8383836001613127565b5f611198612bd182600a614331565b612bd9611166565b612be39190613ff2565b612beb610d45565b612bac906001613ff2565b5f611198836001600160a01b038416613208565b5f612c15848461293b565b90505f198114612c545781811015612c4657828183604051637dc7a0d960e11b81526004016113ac9392919061401e565b612c5484848484035f613127565b50505050565b6001600160a01b038316612c83575f604051634b637e8f60e11b81526004016113ac9190613bcf565b6001600160a01b038216612cac575f60405163ec442f0560e01b81526004016113ac9190613bcf565b612abc8383836132eb565b5f611054825490565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901612d2857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b612d36611c2d565b156117505760405163d93c066560e01b815260040160405180910390fd5b6040516001600160a01b038481166024830152838116604483015260648201839052612c549186918216906323b872dd90608401612a8a565b6001600160a01b038216612db6575f60405163ec442f0560e01b81526004016113ac9190613bcf565b612dc15f83836132eb565b5050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b80825d5050565b612dfa61340e565b5f612e03612e9c565b805460ff1916815590507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405161115b9190613bcf565b612e45613433565b61175061347c565b612e55613433565b611750613498565b612e65613433565b612dc182826134a0565b612e77613433565b6123ff816134d0565b612e88613433565b6123ff816134d8565b5f6111988383613545565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330090565b5f80612ecb83611752565b905080841115612ef457828482604051633c8097d960e11b81526004016113ac9392919061401e565b5f612efe85612908565b905061142b3385878461356b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b612f84612d2e565b5f612f8d612e9c565b805460ff1916600117815590507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e303390565b5f5f195f612fcf856125dc565b905061142b3385838861356b565b5f611198836001600160a01b0384166135e6565b604051636eb1769f60e11b81525f906001600160a01b0385169063dd62ed3e906130219030908790600401614442565b602060405180830381865afa15801561303c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130609190613f3e565b9050612c5484846130718585613ff2565b613632565b60605f611198836136c2565b5f6130966001600160a01b0384168361371b565b905080515f141580156130ba5750808060200190518101906130b891906144bf565b155b15612abc5782604051635274afe760e01b81526004016113ac9190613bcf565b5f806130e7868686613728565b90506130f2836137e7565b801561310d57505f848061310857613108613f93565b868809115b156122e55761311d600182613ff2565b9695505050505050565b5f613130612b54565b90506001600160a01b03851661315b575f60405163e602df0560e01b81526004016113ac9190613bcf565b6001600160a01b038416613184575f604051634a1406b160e11b81526004016113ac9190613bcf565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561320157836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516131f891815260200190565b60405180910390a35b5050505050565b5f81815260018301602052604081205480156132e2575f61322a600183613f69565b85549091505f9061323d90600190613f69565b905080821461329c575f865f01828154811061325b5761325b6144de565b905f5260205f200154905080875f01848154811061327b5761327b6144de565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806132ad576132ad6144f2565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611054565b5f915050611054565b5f6132f4612b54565b90506001600160a01b0384166133225781816002015f8282546133179190613ff2565b9091555061337f9050565b6001600160a01b0384165f90815260208290526040902054828110156133615784818460405163391434e360e21b81526004016113ac9392919061401e565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b03831661339d5760028101805483900390556133bb565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161340091815260200190565b60405180910390a350505050565b613416611c2d565b61175057604051638dfc202b60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661175057604051631afcd79f60e31b815260040160405180910390fd5b613484613433565b5f61348d612e9c565b805460ff1916905550565b612dc5613433565b6134a8613433565b5f6134b1612b54565b9050600381016134c18482614383565b5060048101612c548382614383565b612a00613433565b6134e0613433565b5f6134e9612cc0565b90505f806134f684613813565b9150915081613506576012613508565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b5f825f01828154811061355a5761355a6144de565b905f5260205f200154905092915050565b5f613574612cc0565b805490915061358e906001600160a01b0316863086612d54565b6135988483612d8d565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d785856040516131f8929190918252602082015260400190565b5f81815260018301602052604081205461362b57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611054565b505f611054565b5f836001600160a01b031663095ea7b3848460405160240161365592919061445c565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050905061368e84826138e9565b612c54576136b884856001600160a01b031663095ea7b3865f604051602401612a8a92919061445c565b612c548482613082565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561370f57602002820191905f5260205f20905b8154815260200190600101908083116136fb575b50505050509050919050565b606061119883835f613986565b5f838302815f1985870982811083820303915050805f0361375c5783828161375257613752613f93565b0492505050611198565b80841161377c5760405163227bc15360e01b815260040160405180910390fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f60028260038111156137fc576137fc614506565b613806919061451a565b60ff166001149050919050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b038716916138599161453b565b5f60405180830381855afa9150503d805f8114613891576040519150601f19603f3d011682016040523d82523d5f602084013e613896565b606091505b50915091508180156138aa57506020815110155b156138dd575f818060200190518101906138c49190613f3e565b905060ff81116138db576001969095509350505050565b505b505f9485945092505050565b5f805f846001600160a01b031684604051613904919061453b565b5f604051808303815f865af19150503d805f811461393d576040519150601f19603f3d011682016040523d82523d5f602084013e613942565b606091505b509150915081801561396c57508051158061396c57508080602001905181019061396c91906144bf565b80156122e55750505050506001600160a01b03163b151590565b6060814710156139ab573060405163cd78605960e01b81526004016113ac9190613bcf565b5f80856001600160a01b031684866040516139c6919061453b565b5f6040518083038185875af1925050503d805f8114613a00576040519150601f19603f3d011682016040523d82523d5f602084013e613a05565b606091505b509150915061311d868383606082613a2557613a2082613a63565b611198565b8151158015613a3c57506001600160a01b0384163b155b15613a5c5783604051639996b31560e01b81526004016113ac9190613bcf565b5080611198565b805115613a735780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b610dd68061455283390190565b80356001600160a01b0381168114613aaf575f80fd5b919050565b5f60208284031215613ac4575f80fd5b61119882613a99565b5f60208284031215613add575f80fd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6111986020830184613ae4565b5f8060408385031215613b35575f80fd5b613b3e83613a99565b946020939093013593505050565b5f805f60608486031215613b5e575f80fd5b613b6784613a99565b9250613b7560208501613a99565b9150604084013590509250925092565b5f805f8060808587031215613b98575f80fd5b613ba185613a99565b935060208501359250613bb660408601613a99565b9150613bc460608601613a99565b905092959194509250565b6001600160a01b0391909116815260200190565b5f8083601f840112613bf3575f80fd5b5081356001600160401b03811115613c09575f80fd5b602083019150836020828501011115613c20575f80fd5b9250929050565b5f8060208385031215613c38575f80fd5b82356001600160401b03811115613c4d575f80fd5b613c5985828601613be3565b90969095509350505050565b5f8060408385031215613c76575f80fd5b82359150613c8660208401613a99565b90509250929050565b5f8060408385031215613ca0575f80fd5b50508035926020909101359150565b60208152613cc96020820183516001600160a01b03169052565b5f60208301516101a0806040850152613ce66101c0850183613ae4565b91506040850151601f19858403016060860152613d038382613ae4565b92505060608501516080850152608085015160a085015260a085015160c085015260c085015160e085015260e0850151610100818187015280870151915050610120818187015280870151915050610140613d68818701836001600160a01b03169052565b8601519050610160613d84868201836001600160a01b03169052565b8601519050610180613da0868201836001600160a01b03169052565b909501516001600160a01b031693019290925250919050565b5f805f805f60a08688031215613dcd575f80fd5b613dd686613a99565b94506020860135935060408601359250613df260608701613a99565b9150613e0060808701613a99565b90509295509295909350565b5f805f8060608587031215613e1f575f80fd5b613e2885613a99565b935060208501356001600160401b03811115613e42575f80fd5b613e4e87828801613be3565b9598909750949560400135949350505050565b5f805f60608486031215613e73575f80fd5b83359250613e8360208501613a99565b9150613e9160408501613a99565b90509250925092565b5f805f60608486031215613eac575f80fd5b613eb584613a99565b95602085013595506040909401359392505050565b602080825282518282018190525f9190848201906040850190845b81811015613f0a5783516001600160a01b031683529284019291840191600101613ee5565b50909695505050505050565b5f8060408385031215613f27575f80fd5b613f3083613a99565b9150613c8660208401613a99565b5f60208284031215613f4e575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561105457611054613f55565b808202811582820484141761105457611054613f55565b634e487b7160e01b5f52601260045260245ffd5b5f82613fb557613fb5613f93565b500490565b600181811c90821680613fce57607f821691505b602082108103613fec57634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561105457611054613f55565b60ff818116838216019081111561105457611054613f55565b6001600160a01b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52604160045260245ffd5b6040516101a081016001600160401b03811182821017156140765761407661403f565b60405290565b5f82601f83011261408b575f80fd5b81356001600160401b03808211156140a5576140a561403f565b604051601f8301601f19908116603f011681019082821181831017156140cd576140cd61403f565b816040528381528660208588010111156140e5575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215614114575f80fd5b81356001600160401b038082111561412a575f80fd5b908301906101a0828603121561413e575f80fd5b614146614053565b61414f83613a99565b8152602083013582811115614162575f80fd5b61416e8782860161407c565b602083015250604083013582811115614185575f80fd5b6141918782860161407c565b604083015250606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e08201526101009150818301358282015261012091506141e6828401613a99565b8282015261014091506141fa828401613a99565b82820152610160915061420e828401613a99565b828201526101809150614222828401613a99565b91810191909152949350505050565b5f60208284031215614241575f80fd5b815160ff81168114611198575f80fd5b600181815b8085111561428b57815f190482111561427157614271613f55565b8085161561427e57918102915b93841c9390800290614256565b509250929050565b5f826142a157506001611054565b816142ad57505f611054565b81600181146142c357600281146142cd576142e9565b6001915050611054565b60ff8411156142de576142de613f55565b50506001821b611054565b5060208310610133831016604e8410600b841016171561430c575081810a611054565b6143168383614251565b805f190482111561432957614329613f55565b029392505050565b5f61119860ff841683614293565b601f821115612abc57805f5260205f20601f840160051c810160208510156143645750805b601f840160051c820191505b81811015613201575f8155600101614370565b81516001600160401b0381111561439c5761439c61403f565b6143b0816143aa8454613fba565b8461433f565b602080601f8311600181146143e3575f84156143cc5750858301515b5f19600386901b1c1916600185901b17855561443a565b5f85815260208120601f198616915b82811015614411578886015182559484019460019091019084016143f2565b508582101561442e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385811682528416602082015260606040820181905281018290525f828460808401375f608084840101526080601f19601f850116830101905095945050505050565b5f602082840312156144cf575f80fd5b81518015158114611198575f80fd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60ff83168061452c5761452c613f93565b8060ff84160691505092915050565b5f82518060208501845e5f92019182525091905056fe60a0604052604051610dd6380380610dd68339810160408190526100229161036a565b828161002e828261008c565b50508160405161003d9061032e565b6001600160a01b039091168152602001604051809103905ff080158015610066573d5f803e3d5ffd5b506001600160a01b031660805261008461007f60805190565b6100ea565b50505061044b565b61009582610157565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100de576100d982826101d5565b505050565b6100e6610248565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6101295f80516020610db6833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161015481610269565b50565b806001600160a01b03163b5f0361019157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101f19190610435565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b50909250905061023f8583836102a6565b95945050505050565b34156102675760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661029257604051633173bdd160e11b81525f6004820152602401610188565b805f80516020610db68339815191526101b4565b6060826102bb576102b682610305565b6102fe565b81511580156102d257506001600160a01b0384163b155b156102fb57604051639996b31560e01b81526001600160a01b0385166004820152602401610188565b50805b9392505050565b8051156103155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b610501806108b583390190565b80516001600160a01b0381168114610351575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f805f6060848603121561037c575f80fd5b6103858461033b565b92506103936020850161033b565b60408501519092506001600160401b03808211156103af575f80fd5b818601915086601f8301126103c2575f80fd5b8151818111156103d4576103d4610356565b604051601f8201601f19908116603f011681019083821181831017156103fc576103fc610356565b81604052828152896020848701011115610414575f80fd5b8260208601602083015e5f6020848301015280955050505050509250925092565b5f82518060208501845e5f920191825250919050565b6080516104536104625f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220117f216494c9098d12bbff87c8d584f4d545471f7a95c3c910c20d7f0d1a105964736f6c63430008190033608060405234801561000f575f80fd5b5060405161050138038061050183398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b61040c806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d14610090578063ad3cb1cc146100a3578063f2fde38b146100e0575b5f80fd5b348015610058575f80fd5b506100616100ff565b005b34801561006e575f80fd5b505f546001600160a01b0316604051610087919061023e565b60405180910390f35b61006161009e36600461027a565b610112565b3480156100ae575f80fd5b506100d3604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100879190610377565b3480156100eb575f80fd5b506100616100fa366004610390565b61017d565b6101076101c3565b6101105f6101ef565b565b61011a6101c3565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014a90869086906004016103ab565b5f604051808303818588803b158015610161575f80fd5b505af1158015610173573d5f803e3d5ffd5b5050505050505050565b6101856101c3565b6001600160a01b0381166101b7575f604051631e4fbdf760e01b81526004016101ae919061023e565b60405180910390fd5b6101c0816101ef565b50565b5f546001600160a01b03163314610110573360405163118cdaa760e01b81526004016101ae919061023e565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101c0575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f6060848603121561028c575f80fd5b833561029781610252565b925060208401356102a781610252565b9150604084013567ffffffffffffffff808211156102c3575f80fd5b818601915086601f8301126102d6575f80fd5b8135818111156102e8576102e8610266565b604051601f8201601f19908116603f0116810190838211818310171561031057610310610266565b81604052828152896020848701011115610328575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6103896020830184610349565b9392505050565b5f602082840312156103a0575f80fd5b813561038981610252565b6001600160a01b03831681526040602082018190525f906103ce90830184610349565b94935050505056fea2646970667358221220497e1225d21503b2c0e72feef0d5216fe1525afb4c43c9fa065eef75c65856e264736f6c63430008190033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a26469706673582212201d6803c412564c1603527d07f759121e611575d90f61540f7b202d3c05a5712264736f6c63430008190033
Deployed Bytecode
0x6080604052600436106103b0575f3560e01c80638152cd18116101f3578063b2db983a1161011a578063c6e6f592116100b3578063ed14d17e11610078578063ed14d17e14610bbe578063ef8b30f714610b21578063f2fde38b14610bd2578063f4ad878814610bf1578063ffa1ad7414610c06575f80fd5b8063c6e6f59214610b21578063ce96cb7714610b40578063d905777e14610b5f578063d9f9027f14610b7e578063dd62ed3e14610b9f575f80fd5b8063b2db983a14610a1f578063b3d7f6b914610a3e578063b460af9414610a5d578063ba08765214610a5d578063ba8bfa2a14610a7c578063bf6590a414610a9b578063c0587a9514610aaf578063c63d75b614610ae2578063c69bebe414610b02575f80fd5b80639c016ffd1161018c5780639c016ffd1461090a5780639e65741e1461091e578063a7b7325414610932578063a9059cbb14610951578063aa2f892d14610970578063ad35530b1461098f578063b046a449146109ae578063b0caa891146109cd578063b2c1e382146109f8575f80fd5b80638152cd181461080d5780638322fff21461082c5780638456cb59146108535780638602f0241461086757806388bb4f601461088e5780638da5cb5b146108af57806394bf804d146108c357806395d89b41146108e257806398e1862c146108f6575f80fd5b806338d52e0f116102d75780634b59b82e116102705780634b59b82e146107235780634cdad506146104575780634dede3de146107425780635c975abb146107695780636e553f651461077d57806370a082311461079c578063715018a6146107bb5780637a825e07146107cf5780637f6c81b7146107ee575f80fd5b806338d52e0f146105eb5780633b0426db1461060c5780633bfaa7e3146106205780633c5280e4146106495780633e9491a2146106685780633f4ba83a1461067c578063402d267d14610690578063439fab91146106af5780634a8c110a146106ce575f80fd5b806318160ddd1161034957806318160ddd146104e357806323b872dd146104f75780632489f7f71461051657806325bd41421461052a578063266f8dc91461054957806329c23e4a14610568578063313ce5671461058757806332507a5f146105ad57806334069157146105cc575f80fd5b806301681a62146103bb57806301e1d114146103dc578063030d624a1461040357806306fdde0314610422578063079c3b881461044357806307a2d13a14610457578063095ea7b3146104765780630a28a477146104a5578063175188e8146104c4575f80fd5b366103b757005b5f80fd5b3480156103c6575f80fd5b506103da6103d5366004613ab4565b610c34565b005b3480156103e7575f80fd5b506103f0610d45565b6040519081526020015b60405180910390f35b34801561040e575f80fd5b506103da61041d366004613acd565b610da0565b34801561042d575f80fd5b50610436610e0b565b6040516103fa9190613b12565b34801561044e575f80fd5b506103f0610ea9565b348015610462575f80fd5b506103f0610471366004613acd565b611049565b348015610481575f80fd5b50610495610490366004613b24565b61105a565b60405190151581526020016103fa565b3480156104b0575f80fd5b506103f06104bf366004613acd565b611071565b3480156104cf575f80fd5b506103da6104de366004613ab4565b61107d565b3480156104ee575f80fd5b506103f0611166565b348015610502575f80fd5b50610495610511366004613b4c565b61117a565b348015610521575f80fd5b506103f061119f565b348015610535575f80fd5b506103da610544366004613acd565b6111a9565b348015610554575f80fd5b506103da610563366004613acd565b611214565b348015610573575f80fd5b506103f0610582366004613acd565b611280565b348015610592575f80fd5b5061059b61129d565b60405160ff90911681526020016103fa565b3480156105b8575f80fd5b506103f06105c7366004613b85565b6112c6565b3480156105d7575f80fd5b506103da6105e6366004613acd565b611433565b3480156105f6575f80fd5b506105ff6114a0565b6040516103fa9190613bcf565b348015610617575f80fd5b506103f06114ba565b34801561062b575f80fd5b506106346114ed565b604080519283526020830191909152016103fa565b348015610654575f80fd5b506103da610663366004613acd565b6116d3565b348015610673575f80fd5b506012546103f0565b348015610687575f80fd5b506103da611740565b34801561069b575f80fd5b506103f06106aa366004613ab4565b611752565b3480156106ba575f80fd5b506103da6106c9366004613c27565b611768565b3480156106d9575f80fd5b506106e2611bc0565b6040516103fa91905f60a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b34801561072e575f80fd5b506105ff61073d366004613acd565b611c22565b34801561074d575f80fd5b506105ff732260fac5e5542a773aa44fbcfedf7c193bc2c59981565b348015610774575f80fd5b50610495611c2d565b348015610788575f80fd5b506103f0610797366004613c65565b611c41565b3480156107a7575f80fd5b506103f06107b6366004613ab4565b611ce3565b3480156107c6575f80fd5b506103da611d0c565b3480156107da575f80fd5b506103da6107e9366004613ab4565b611d1d565b3480156107f9575f80fd5b506103da610808366004613acd565b611db5565b348015610818575f80fd5b506103da610827366004613c8f565b611e20565b348015610837575f80fd5b506105ff73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b34801561085e575f80fd5b506103da611ece565b348015610872575f80fd5b506105ff73f469fbd2abcd6b9de8e169d128226c0fc90a012e81565b348015610899575f80fd5b506108a2611f28565b6040516103fa9190613caf565b3480156108ba575f80fd5b506105ff612172565b3480156108ce575f80fd5b506103f06108dd366004613c65565b61219a565b3480156108ed575f80fd5b506104366121b5565b348015610901575f80fd5b506011546103f0565b348015610915575f80fd5b506103da6121d1565b348015610929575f80fd5b506010546103f0565b34801561093d575f80fd5b506103f061094c366004613db9565b6122bb565b34801561095c575f80fd5b5061049561096b366004613b24565b6122ee565b34801561097b575f80fd5b506103da61098a366004613acd565b6122fb565b34801561099a575f80fd5b506103da6109a9366004613e0c565b612402565b3480156109b9575f80fd5b506103da6109c8366004613ab4565b6124d6565b3480156109d8575f80fd5b506103f06109e7366004613ab4565b60026020525f908152604090205481565b348015610a03575f80fd5b506105ff73c96de26018a54d51c097160568752c4e3bd6c36481565b348015610a2a575f80fd5b506103f0610a39366004613acd565b612571565b348015610a49575f80fd5b506103f0610a58366004613acd565b6125dc565b348015610a68575f80fd5b506103f0610a77366004613e61565b6125e8565b348015610a87575f80fd5b506103da610a96366004613e9a565b612602565b348015610aa6575f80fd5b506103f06127bb565b348015610aba575f80fd5b507f4995646f72fa9a270ffc094641ab616ce576b2e3eab25eaf05c15caa4f0e595d5c6103f0565b348015610aed575f80fd5b506103f0610afc366004613ab4565b505f1990565b348015610b0d575f80fd5b506103da610b1c366004613ab4565b612870565b348015610b2c575f80fd5b506103f0610b3b366004613acd565b612908565b348015610b4b575f80fd5b506103f0610b5a366004613ab4565b612913565b348015610b6a575f80fd5b506103f0610b79366004613ab4565b612926565b348015610b89575f80fd5b50610b92612930565b6040516103fa9190613eca565b348015610baa575f80fd5b506103f0610bb9366004613f16565b61293b565b348015610bc9575f80fd5b506103da612975565b348015610bdd575f80fd5b506103da610bec366004613ab4565b6129f8565b348015610bfc575f80fd5b506103f061271081565b348015610c11575f80fd5b50610436604051806040016040528060038152602001620322e360ec1b81525081565b610c3c612a32565b610c446114a0565b6001600160a01b0316816001600160a01b031603610c755760405163350b944160e11b815260040160405180910390fd5b6040516370a0823160e01b81525f906001600160a01b038316906370a0823190610ca3903090600401613bcf565b602060405180830381865afa158015610cbe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce29190613f3e565b9050610cf86001600160a01b0383163383612a64565b478015610d0957610d093382612ac1565b7f807273efecfbeb7ae7d3a2189d1ed5a7db80074eed86e7d80b10bb925cd1db7383604051610d389190613bcf565b60405180910390a1505050565b6009546014545f9190610d589042613f69565b1115610d7757604051631f4bcb2b60e01b815260040160405180910390fd5b6305f5e100610d84611166565b601054610d919190613f7c565b610d9b9190613fa7565b905090565b610da8612a32565b6004811115610dca576040516309aa66eb60e01b815260040160405180910390fd5b60075460408051918252602082018390527f29b9d7a7d8a7a3ac22c295e4517723bc4e386eea60173e59e6da1dbd460cb409910160405180910390a1600755565b60605f610e16612b54565b9050806003018054610e2790613fba565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5390613fba565b8015610e9e5780601f10610e7557610100808354040283529160200191610e9e565b820191905f5260205f20905b815481529060010190602001808311610e8157829003601f168201915b505050505091505090565b5f80610eb36114a0565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610ede9190613bcf565b602060405180830381865afa158015610ef9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1d9190613f3e565b6040516370a0823160e01b8152732260fac5e5542a773aa44fbcfedf7c193bc2c599906370a0823190610f54903090600401613bcf565b602060405180830381865afa158015610f6f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f939190613f3e565b6040516370a0823160e01b815273c96de26018a54d51c097160568752c4e3bd6c364906370a0823190610fca903090600401613bcf565b602060405180830381865afa158015610fe5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110099190613f3e565b6110139190613ff2565b61101d9190613ff2565b90505f6110286127bb565b6012549091506110388383613ff2565b6110429190613f69565b9250505090565b5f611054825f612b78565b92915050565b5f33611067818585612bb5565b5060019392505050565b5f611054826001612bc2565b611085612a32565b5f816001600160a01b03166308bb5fb06040518163ffffffff1660e01b81526004016020604051808303815f875af11580156110c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e79190613f3e565b11156111065760405163e9ec812960e01b815260040160405180910390fd5b6111105f82612bf6565b506001600160a01b0381165f9081526002602052604080822091909155517fd3281a40d50ae838fe77dc627744037b8f0fc6a5711d66119a9b670c5cde41af9061115b908390613bcf565b60405180910390a150565b5f80611170612b54565b6002015492915050565b5f33611187858285612c0a565b611192858585612c5a565b60019150505b9392505050565b5f610d9b5f612cb7565b6111b1612a32565b60788111156111d35760405163f4d1caab60e01b815260040160405180910390fd5b600b5460408051918252602082018390527f394967f6fe403cda0905b23e81b928c5ca79107000b1404c6b3185442f05213c910160405180910390a1600b55565b61121c612a32565b6105dc81111561123f57604051630674143f60e01b815260040160405180910390fd5b600a5460408051918252602082018390527f63058ed61801434ac6bfe39e74400bed7f3ba09b7cb6294092974450727eb753910160405180910390a1600a55565b600b545f90612710906112939084613f7c565b6110549190613fa7565b5f806112a7612cc0565b90505f81546112c09190600160a01b900460ff16614005565b91505090565b5f6112cf612ce4565b6112d7612d2e565b6001600160a01b038516732260fac5e5542a773aa44fbcfedf7c193bc2c599148061131e57506001600160a01b03851673c96de26018a54d51c097160568752c4e3bd6c364145b80611341575061132c6114a0565b6001600160a01b0316856001600160a01b0316145b156113605761135b6001600160a01b038616333087612d54565b611379565b60405163350b944160e11b815260040160405180910390fd5b5f61138384611752565b9050808511156113b557838582604051633c8097d960e11b81526004016113ac9392919061401e565b60405180910390fd5b6113be85612908565b91506113ca8483612d8d565b604080513381526001600160a01b03888116602083015281830188905286811660608301528516608082015290517f308d36d8f61bd4393536b6557142f55554c34d4ea2a3dbf54fe782b98889dfb29181900360a00190a15061142b612dc5565b949350505050565b61143b612a32565b6203f48081111561145f5760405163e88d3ecb60e01b815260040160405180910390fd5b60095460408051918252602082018390527fcc5a4a7c466fc20af4119a7a26048791fdb55cbd401aff36ef2bfc639662b2e2910160405180910390a1600955565b5f806114aa612cc0565b546001600160a01b031692915050565b6014545f9081906114cb9042613f69565b905080600360060154116114df575f6112c0565b6009546112c0908290613f69565b600d545f9081906001600160a01b0316331461151c5760405163bd72e29160e01b815260040160405180910390fd5b60105461154a907f4995646f72fa9a270ffc094641ab616ce576b2e3eab25eaf05c15caa4f0e595d90612deb565b426014555f611557611166565b9050805f0361156f5750506010546012549091509091565b5f611578610ea9565b9050816115896305f5e10083613f7c565b6115939190613fa7565b60115490945084111561168f576011545f036115bd57505050601181905560108190556012549091565b5f6305f5e100836010600101546115d49190613f7c565b6115de9190613fa7565b6115e89083613f69565b600a54909150612710906115fc9083613f7c565b6116069190613fa7565b93508360106002015f82825461161c9190613ff2565b909155508390506305f5e1006116328685613f69565b61163c9190613f7c565b6116469190613fa7565b6010819055601181905560408051918252602082018690527f83d2ad38a3d31bbc70811535dd8943b0140df344c23e6e167ee1ca32f9a1a459910160405180910390a1506116cd565b6010849055604080518581525f60208201527f83d2ad38a3d31bbc70811535dd8943b0140df344c23e6e167ee1ca32f9a1a459910160405180910390a15b50509091565b6116db612a32565b62093a808110156116ff57604051632011727b60e11b815260040160405180910390fd5b60085460408051918252602082018390527fcdbf56e2a82365307f9691ad933e9762726485d202543fe224f47447d79feaf0910160405180910390a1600855565b611748612a32565b611750612df2565b565b5f61175b610d45565b6006546110549190613f69565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156117ac5750825b90505f826001600160401b031660011480156117c75750303b155b9050811580156117d5575080155b156117f35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561181d57845460ff60401b1916600160401b1785555b5f61182a87890189614104565b9050611834612e3d565b61183c612e4d565b61184e81602001518260400151612e5d565b80516001600160a01b0316611876576040516317dc37cb60e11b815260040160405180910390fd5b6101408101516001600160a01b03166118a5576040516001626bbab960e11b0319815260040160405180910390fd5b6101208101516001600160a01b03166118d157604051630b5eba9f60e41b815260040160405180910390fd5b6101608101516001600160a01b03166118fd57604051633480121760e21b815260040160405180910390fd5b600481608001511115611923576040516309aa66eb60e01b815260040160405180910390fd5b62093a808160a00151101561194b57604051632011727b60e11b815260040160405180910390fd5b6203f4808160c0015111156119735760405163e88d3ecb60e01b815260040160405180910390fd5b6105dc8160e00151111561199a57604051630674143f60e01b815260040160405180910390fd5b607881610100015111156119c15760405163f4d1caab60e01b815260040160405180910390fd5b6305f5e100815f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a299190614231565b611a3490600a614331565b14611a525760405163350b944160e11b815260040160405180910390fd5b611a60816101200151612e6f565b8051611a6b90612e80565b4260138190556014556305f5e1006010558051600380546001600160a01b0319166001600160a01b039092169190911781556020820151829190600490611ab29082614383565b5060408201516002820190611ac79082614383565b50606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e0820151600782015561010082015160088201556101208201516009820180546001600160a01b03199081166001600160a01b0393841617909155610140840151600a840180548316918416919091179055610160840151600b84018054831691841691909117905561018090930151600c90920180549093169116179055508315611bb757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b611bed6040518060a001604052805f81526020015f81526020015f81526020015f81526020015f81525090565b506040805160a08101825260105481526011546020820152601254918101919091526013546060820152601454608082015290565b5f6110548183612e91565b5f80611c37612e9c565b5460ff1692915050565b5f611c4a612ce4565b611c52612d2e565b5f198303611ccf57611c626114a0565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401611c8d9190613bcf565b602060405180830381865afa158015611ca8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ccc9190613f3e565b92505b611cd98383612ec0565b9050611054612dc5565b5f80611ced612b54565b6001600160a01b039093165f9081526020939093525050604090205490565b611d14612a32565b6117505f612f0c565b611d25612a32565b6001600160a01b038116611d4c5760405163d214a59760e01b815260040160405180910390fd5b600f546040517fe74dd8b1f5f3d5328df682e649c08b085f09c2ce77b68e54329e8d30e2642f7891611d8b916001600160a01b03909116908490614442565b60405180910390a1600f80546001600160a01b0319166001600160a01b0392909216919091179055565b611dbd612a32565b6006548111611ddf5760405163e9ec812960e01b815260040160405180910390fd5b60065460408051918252602082018390527f7f3306669f28a6aa13d0f709be2bd4f3e21d2f37aee9358846a50e1988ee4832910160405180910390a1600655565b611e28612a32565b801580611e36575061271081115b15611e545760405163e55fb50960e01b815260040160405180910390fd5b5f611e5f8184612e91565b6001600160a01b0381165f908152600260209081526040918290205482519081529081018590529192507f7cd01dd3533c6dc08821cd303814de60aba1901f1531c3cbcd95d26ed924e9cf910160405180910390a16001600160a01b03165f9081526002602052604090205550565b611ed6612172565b6001600160a01b0316336001600160a01b031614158015611f025750600d546001600160a01b03163314155b15611f205760405163e9ec812960e01b815260040160405180910390fd5b611750612f7c565b611fb5604051806101a001604052805f6001600160a01b0316815260200160608152602001606081526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681525090565b604080516101a08101909152600380546001600160a01b0316825260048054602084019190611fe390613fba565b80601f016020809104026020016040519081016040528092919081815260200182805461200f90613fba565b801561205a5780601f106120315761010080835404028352916020019161205a565b820191905f5260205f20905b81548152906001019060200180831161203d57829003601f168201915b5050505050815260200160028201805461207390613fba565b80601f016020809104026020016040519081016040528092919081815260200182805461209f90613fba565b80156120ea5780601f106120c1576101008083540402835291602001916120ea565b820191905f5260205f20905b8154815290600101906020018083116120cd57829003601f168201915b505050918352505060038201546020820152600482015460408201526005820154606082015260068201546080820152600782015460a0820152600882015460c082015260098201546001600160a01b0390811660e0830152600a8301548116610100830152600b8301548116610120830152600c9092015490911661014090910152919050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993006114aa565b5f6121a3612ce4565b6121ab612d2e565b611cd98383612fc2565b60605f6121c0612b54565b9050806004018054610e2790613fba565b600e546001600160a01b031633146121fc57604051633480121760e21b815260040160405180910390fd5b60085460135442919061220f9083613f69565b101561222e57604051631221b97b60e01b815260040160405180910390fd5b60138190556007545f9061271090612244610d45565b61224e9190613f7c565b6122589190613fa7565b600e54909150612284906001600160a01b0316826122746114a0565b6001600160a01b03169190612a64565b6040518181527f55ce6141cc7099e5baac44c64543a6d7fc4e37ebba0fcaa65fa1f2a9996ec5a59060200160405180910390a15050565b5f6122c4612ce4565b6122cc612d2e565b60405163e9ec812960e01b815260040160405180910390fd5b95945050505050565b5f33611067818585612c5a565b612303612ce4565b61230b612d2e565b805f0361232b57604051637ea773a960e01b815260040160405180910390fd5b600f546123439033906001600160a01b031683612c5a565b600f546040516336c69b5d60e11b81526001600160a01b0390911690636d8d36ba90612375903390859060040161445c565b5f604051808303815f87803b15801561238c575f80fd5b505af115801561239e573d5f803e3d5ffd5b505050507ff9fd31dd1a61b95c600dd5aa1a6330f6c5cbe70a39a660edc081daf217db3cfb33826123cd6114a0565b604080516001600160a01b039485168152602081019390935292168183015290519081900360600190a16123ff612dc5565b50565b61240a612a32565b801580612418575061271081115b156124365760405163e55fb50960e01b815260040160405180910390fd5b5f8433858560405161244790613a8c565b6124549493929190614475565b604051809103905ff08015801561246d573d5f803e3d5ffd5b506001600160a01b0381165f9081526002602052604081208490559091506124959082612fdd565b507f0803371633b57311f58d10924711080d2dae75ab17c5c0c262af3887cfca00bb81866040516124c7929190614442565b60405180910390a15050505050565b6124de612a32565b6001600160a01b038116612508576040516001626bbab960e11b0319815260040160405180910390fd5b600d546040517fe2eeab472f89ac267be30e463da684fb96f56cc8e947839361fdf45bf6a3458e91612547916001600160a01b03909116908490614442565b60405180910390a1600d80546001600160a01b0319166001600160a01b0392909216919091179055565b5f61257c8183612e91565b6001600160a01b03166308bb5fb06040518163ffffffff1660e01b81526004016020604051808303815f875af11580156125b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110549190613f3e565b5f611054826001612b78565b5f604051637dc4dd1560e11b815260040160405180910390fd5b61260a612a32565b5f61261482611c22565b6001600160a01b0381165f818152600260209081526040808320548151628bb5fb60e41b81529151959650949293926308bb5fb092600480840193919291829003018187875af115801561266a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061268e9190613f3e565b90506127108261269c610d45565b6126a69190613f7c565b6126b09190613fa7565b6126ba8683613ff2565b11156126d95760405163e55fb50960e01b815260040160405180910390fd5b6126ed6001600160a01b0387168487612ff1565b6040516356f4edaf60e01b81526001600160a01b038416906356f4edaf9061271b908990899060040161445c565b6020604051808303815f875af1158015612737573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061275b91906144bf565b61277857604051630508c93960e41b815260040160405180910390fd5b7f921f9e77ef648025190d46d8b7f3d22a5546367ff7aaa883b1f39ffd2a2d325d8686866040516127ab9392919061401e565b60405180910390a1505050505050565b5f806127c561119f565b90505f6127d0612930565b90505f5b8281101561286a578181815181106127ee576127ee6144de565b60200260200101516001600160a01b03166308bb5fb06040518163ffffffff1660e01b81526004016020604051808303815f875af1158015612832573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128569190613f3e565b6128609085613ff2565b93506001016127d4565b50505090565b612878612a32565b6001600160a01b03811661289f57604051633480121760e21b815260040160405180910390fd5b600e546040517f2861448678f0be67f11bfb5481b3e3b4cfeb3acc6126ad60a05f95bfc6530666916128de916001600160a01b03909116908490614442565b60405180910390a1600e80546001600160a01b0319166001600160a01b0392909216919091179055565b5f611054825f612bc2565b5f61105461292083611ce3565b5f612b78565b5f61105482611ce3565b6060610d9b5f613076565b5f80612945612b54565b6001600160a01b039485165f90815260019190910160209081526040808320959096168252939093525050205490565b600e546001600160a01b031633146129a057604051633480121760e21b815260040160405180910390fd5b600e546012546129bc916001600160a01b0316906122746114a0565b6012546040519081527f8a2034f45f83800eed1750a670ad845ceee6add62106ca5326598842cfbd6ea79060200160405180910390a15f601255565b612a00612a32565b6001600160a01b038116612a29575f604051631e4fbdf760e01b81526004016113ac9190613bcf565b6123ff81612f0c565b33612a3b612172565b6001600160a01b031614611750573360405163118cdaa760e01b81526004016113ac9190613bcf565b612abc83846001600160a01b031663a9059cbb8585604051602401612a8a92919061445c565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613082565b505050565b80471015612ae4573060405163cd78605960e01b81526004016113ac9190613bcf565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612b2d576040519150601f19603f3d011682016040523d82523d5f602084013e612b32565b606091505b5050905080612abc57604051630a12f52160e11b815260040160405180910390fd5b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0090565b5f611198612b84610d45565b612b8f906001613ff2565b612b9a5f600a614331565b612ba2611166565b612bac9190613ff2565b859190856130da565b612abc8383836001613127565b5f611198612bd182600a614331565b612bd9611166565b612be39190613ff2565b612beb610d45565b612bac906001613ff2565b5f611198836001600160a01b038416613208565b5f612c15848461293b565b90505f198114612c545781811015612c4657828183604051637dc7a0d960e11b81526004016113ac9392919061401e565b612c5484848484035f613127565b50505050565b6001600160a01b038316612c83575f604051634b637e8f60e11b81526004016113ac9190613bcf565b6001600160a01b038216612cac575f60405163ec442f0560e01b81526004016113ac9190613bcf565b612abc8383836132eb565b5f611054825490565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901612d2857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b612d36611c2d565b156117505760405163d93c066560e01b815260040160405180910390fd5b6040516001600160a01b038481166024830152838116604483015260648201839052612c549186918216906323b872dd90608401612a8a565b6001600160a01b038216612db6575f60405163ec442f0560e01b81526004016113ac9190613bcf565b612dc15f83836132eb565b5050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b80825d5050565b612dfa61340e565b5f612e03612e9c565b805460ff1916815590507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405161115b9190613bcf565b612e45613433565b61175061347c565b612e55613433565b611750613498565b612e65613433565b612dc182826134a0565b612e77613433565b6123ff816134d0565b612e88613433565b6123ff816134d8565b5f6111988383613545565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330090565b5f80612ecb83611752565b905080841115612ef457828482604051633c8097d960e11b81526004016113ac9392919061401e565b5f612efe85612908565b905061142b3385878461356b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b612f84612d2e565b5f612f8d612e9c565b805460ff1916600117815590507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e303390565b5f5f195f612fcf856125dc565b905061142b3385838861356b565b5f611198836001600160a01b0384166135e6565b604051636eb1769f60e11b81525f906001600160a01b0385169063dd62ed3e906130219030908790600401614442565b602060405180830381865afa15801561303c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130609190613f3e565b9050612c5484846130718585613ff2565b613632565b60605f611198836136c2565b5f6130966001600160a01b0384168361371b565b905080515f141580156130ba5750808060200190518101906130b891906144bf565b155b15612abc5782604051635274afe760e01b81526004016113ac9190613bcf565b5f806130e7868686613728565b90506130f2836137e7565b801561310d57505f848061310857613108613f93565b868809115b156122e55761311d600182613ff2565b9695505050505050565b5f613130612b54565b90506001600160a01b03851661315b575f60405163e602df0560e01b81526004016113ac9190613bcf565b6001600160a01b038416613184575f604051634a1406b160e11b81526004016113ac9190613bcf565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561320157836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516131f891815260200190565b60405180910390a35b5050505050565b5f81815260018301602052604081205480156132e2575f61322a600183613f69565b85549091505f9061323d90600190613f69565b905080821461329c575f865f01828154811061325b5761325b6144de565b905f5260205f200154905080875f01848154811061327b5761327b6144de565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806132ad576132ad6144f2565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611054565b5f915050611054565b5f6132f4612b54565b90506001600160a01b0384166133225781816002015f8282546133179190613ff2565b9091555061337f9050565b6001600160a01b0384165f90815260208290526040902054828110156133615784818460405163391434e360e21b81526004016113ac9392919061401e565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b03831661339d5760028101805483900390556133bb565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161340091815260200190565b60405180910390a350505050565b613416611c2d565b61175057604051638dfc202b60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661175057604051631afcd79f60e31b815260040160405180910390fd5b613484613433565b5f61348d612e9c565b805460ff1916905550565b612dc5613433565b6134a8613433565b5f6134b1612b54565b9050600381016134c18482614383565b5060048101612c548382614383565b612a00613433565b6134e0613433565b5f6134e9612cc0565b90505f806134f684613813565b9150915081613506576012613508565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b5f825f01828154811061355a5761355a6144de565b905f5260205f200154905092915050565b5f613574612cc0565b805490915061358e906001600160a01b0316863086612d54565b6135988483612d8d565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d785856040516131f8929190918252602082015260400190565b5f81815260018301602052604081205461362b57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611054565b505f611054565b5f836001600160a01b031663095ea7b3848460405160240161365592919061445c565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050905061368e84826138e9565b612c54576136b884856001600160a01b031663095ea7b3865f604051602401612a8a92919061445c565b612c548482613082565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561370f57602002820191905f5260205f20905b8154815260200190600101908083116136fb575b50505050509050919050565b606061119883835f613986565b5f838302815f1985870982811083820303915050805f0361375c5783828161375257613752613f93565b0492505050611198565b80841161377c5760405163227bc15360e01b815260040160405180910390fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f60028260038111156137fc576137fc614506565b613806919061451a565b60ff166001149050919050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b038716916138599161453b565b5f60405180830381855afa9150503d805f8114613891576040519150601f19603f3d011682016040523d82523d5f602084013e613896565b606091505b50915091508180156138aa57506020815110155b156138dd575f818060200190518101906138c49190613f3e565b905060ff81116138db576001969095509350505050565b505b505f9485945092505050565b5f805f846001600160a01b031684604051613904919061453b565b5f604051808303815f865af19150503d805f811461393d576040519150601f19603f3d011682016040523d82523d5f602084013e613942565b606091505b509150915081801561396c57508051158061396c57508080602001905181019061396c91906144bf565b80156122e55750505050506001600160a01b03163b151590565b6060814710156139ab573060405163cd78605960e01b81526004016113ac9190613bcf565b5f80856001600160a01b031684866040516139c6919061453b565b5f6040518083038185875af1925050503d805f8114613a00576040519150601f19603f3d011682016040523d82523d5f602084013e613a05565b606091505b509150915061311d868383606082613a2557613a2082613a63565b611198565b8151158015613a3c57506001600160a01b0384163b155b15613a5c5783604051639996b31560e01b81526004016113ac9190613bcf565b5080611198565b805115613a735780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b610dd68061455283390190565b80356001600160a01b0381168114613aaf575f80fd5b919050565b5f60208284031215613ac4575f80fd5b61119882613a99565b5f60208284031215613add575f80fd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6111986020830184613ae4565b5f8060408385031215613b35575f80fd5b613b3e83613a99565b946020939093013593505050565b5f805f60608486031215613b5e575f80fd5b613b6784613a99565b9250613b7560208501613a99565b9150604084013590509250925092565b5f805f8060808587031215613b98575f80fd5b613ba185613a99565b935060208501359250613bb660408601613a99565b9150613bc460608601613a99565b905092959194509250565b6001600160a01b0391909116815260200190565b5f8083601f840112613bf3575f80fd5b5081356001600160401b03811115613c09575f80fd5b602083019150836020828501011115613c20575f80fd5b9250929050565b5f8060208385031215613c38575f80fd5b82356001600160401b03811115613c4d575f80fd5b613c5985828601613be3565b90969095509350505050565b5f8060408385031215613c76575f80fd5b82359150613c8660208401613a99565b90509250929050565b5f8060408385031215613ca0575f80fd5b50508035926020909101359150565b60208152613cc96020820183516001600160a01b03169052565b5f60208301516101a0806040850152613ce66101c0850183613ae4565b91506040850151601f19858403016060860152613d038382613ae4565b92505060608501516080850152608085015160a085015260a085015160c085015260c085015160e085015260e0850151610100818187015280870151915050610120818187015280870151915050610140613d68818701836001600160a01b03169052565b8601519050610160613d84868201836001600160a01b03169052565b8601519050610180613da0868201836001600160a01b03169052565b909501516001600160a01b031693019290925250919050565b5f805f805f60a08688031215613dcd575f80fd5b613dd686613a99565b94506020860135935060408601359250613df260608701613a99565b9150613e0060808701613a99565b90509295509295909350565b5f805f8060608587031215613e1f575f80fd5b613e2885613a99565b935060208501356001600160401b03811115613e42575f80fd5b613e4e87828801613be3565b9598909750949560400135949350505050565b5f805f60608486031215613e73575f80fd5b83359250613e8360208501613a99565b9150613e9160408501613a99565b90509250925092565b5f805f60608486031215613eac575f80fd5b613eb584613a99565b95602085013595506040909401359392505050565b602080825282518282018190525f9190848201906040850190845b81811015613f0a5783516001600160a01b031683529284019291840191600101613ee5565b50909695505050505050565b5f8060408385031215613f27575f80fd5b613f3083613a99565b9150613c8660208401613a99565b5f60208284031215613f4e575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561105457611054613f55565b808202811582820484141761105457611054613f55565b634e487b7160e01b5f52601260045260245ffd5b5f82613fb557613fb5613f93565b500490565b600181811c90821680613fce57607f821691505b602082108103613fec57634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561105457611054613f55565b60ff818116838216019081111561105457611054613f55565b6001600160a01b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52604160045260245ffd5b6040516101a081016001600160401b03811182821017156140765761407661403f565b60405290565b5f82601f83011261408b575f80fd5b81356001600160401b03808211156140a5576140a561403f565b604051601f8301601f19908116603f011681019082821181831017156140cd576140cd61403f565b816040528381528660208588010111156140e5575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215614114575f80fd5b81356001600160401b038082111561412a575f80fd5b908301906101a0828603121561413e575f80fd5b614146614053565b61414f83613a99565b8152602083013582811115614162575f80fd5b61416e8782860161407c565b602083015250604083013582811115614185575f80fd5b6141918782860161407c565b604083015250606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e08201526101009150818301358282015261012091506141e6828401613a99565b8282015261014091506141fa828401613a99565b82820152610160915061420e828401613a99565b828201526101809150614222828401613a99565b91810191909152949350505050565b5f60208284031215614241575f80fd5b815160ff81168114611198575f80fd5b600181815b8085111561428b57815f190482111561427157614271613f55565b8085161561427e57918102915b93841c9390800290614256565b509250929050565b5f826142a157506001611054565b816142ad57505f611054565b81600181146142c357600281146142cd576142e9565b6001915050611054565b60ff8411156142de576142de613f55565b50506001821b611054565b5060208310610133831016604e8410600b841016171561430c575081810a611054565b6143168383614251565b805f190482111561432957614329613f55565b029392505050565b5f61119860ff841683614293565b601f821115612abc57805f5260205f20601f840160051c810160208510156143645750805b601f840160051c820191505b81811015613201575f8155600101614370565b81516001600160401b0381111561439c5761439c61403f565b6143b0816143aa8454613fba565b8461433f565b602080601f8311600181146143e3575f84156143cc5750858301515b5f19600386901b1c1916600185901b17855561443a565b5f85815260208120601f198616915b82811015614411578886015182559484019460019091019084016143f2565b508582101561442e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385811682528416602082015260606040820181905281018290525f828460808401375f608084840101526080601f19601f850116830101905095945050505050565b5f602082840312156144cf575f80fd5b81518015158114611198575f80fd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60ff83168061452c5761452c613f93565b8060ff84160691505092915050565b5f82518060208501845e5f92019182525091905056fe60a0604052604051610dd6380380610dd68339810160408190526100229161036a565b828161002e828261008c565b50508160405161003d9061032e565b6001600160a01b039091168152602001604051809103905ff080158015610066573d5f803e3d5ffd5b506001600160a01b031660805261008461007f60805190565b6100ea565b50505061044b565b61009582610157565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100de576100d982826101d5565b505050565b6100e6610248565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6101295f80516020610db6833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161015481610269565b50565b806001600160a01b03163b5f0361019157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101f19190610435565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b50909250905061023f8583836102a6565b95945050505050565b34156102675760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661029257604051633173bdd160e11b81525f6004820152602401610188565b805f80516020610db68339815191526101b4565b6060826102bb576102b682610305565b6102fe565b81511580156102d257506001600160a01b0384163b155b156102fb57604051639996b31560e01b81526001600160a01b0385166004820152602401610188565b50805b9392505050565b8051156103155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b610501806108b583390190565b80516001600160a01b0381168114610351575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f805f6060848603121561037c575f80fd5b6103858461033b565b92506103936020850161033b565b60408501519092506001600160401b03808211156103af575f80fd5b818601915086601f8301126103c2575f80fd5b8151818111156103d4576103d4610356565b604051601f8201601f19908116603f011681019083821181831017156103fc576103fc610356565b81604052828152896020848701011115610414575f80fd5b8260208601602083015e5f6020848301015280955050505050509250925092565b5f82518060208501845e5f920191825250919050565b6080516104536104625f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220117f216494c9098d12bbff87c8d584f4d545471f7a95c3c910c20d7f0d1a105964736f6c63430008190033608060405234801561000f575f80fd5b5060405161050138038061050183398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b61040c806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d14610090578063ad3cb1cc146100a3578063f2fde38b146100e0575b5f80fd5b348015610058575f80fd5b506100616100ff565b005b34801561006e575f80fd5b505f546001600160a01b0316604051610087919061023e565b60405180910390f35b61006161009e36600461027a565b610112565b3480156100ae575f80fd5b506100d3604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100879190610377565b3480156100eb575f80fd5b506100616100fa366004610390565b61017d565b6101076101c3565b6101105f6101ef565b565b61011a6101c3565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014a90869086906004016103ab565b5f604051808303818588803b158015610161575f80fd5b505af1158015610173573d5f803e3d5ffd5b5050505050505050565b6101856101c3565b6001600160a01b0381166101b7575f604051631e4fbdf760e01b81526004016101ae919061023e565b60405180910390fd5b6101c0816101ef565b50565b5f546001600160a01b03163314610110573360405163118cdaa760e01b81526004016101ae919061023e565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101c0575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f6060848603121561028c575f80fd5b833561029781610252565b925060208401356102a781610252565b9150604084013567ffffffffffffffff808211156102c3575f80fd5b818601915086601f8301126102d6575f80fd5b8135818111156102e8576102e8610266565b604051601f8201601f19908116603f0116810190838211818310171561031057610310610266565b81604052828152896020848701011115610328575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6103896020830184610349565b9392505050565b5f602082840312156103a0575f80fd5b813561038981610252565b6001600160a01b03831681526040602082018190525f906103ce90830184610349565b94935050505056fea2646970667358221220497e1225d21503b2c0e72feef0d5216fe1525afb4c43c9fa065eef75c65856e264736f6c63430008190033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a26469706673582212201d6803c412564c1603527d07f759121e611575d90f61540f7b202d3c05a5712264736f6c63430008190033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.