Source Code
Latest 25 from a total of 515 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Harvest | 28300839 | 17 hrs ago | IN | 0 ETH | 0.00004153 | ||||
| Harvest | 28267318 | 38 hrs ago | IN | 0 ETH | 0.00004153 | ||||
| Harvest | 28232954 | 2 days ago | IN | 0 ETH | 0.00004165 | ||||
| Harvest | 28196932 | 3 days ago | IN | 0 ETH | 0.00003581 | ||||
| Harvest | 28158604 | 4 days ago | IN | 0 ETH | 0.00003873 | ||||
| Harvest | 28120616 | 5 days ago | IN | 0 ETH | 0.00004153 | ||||
| Harvest | 28082535 | 6 days ago | IN | 0 ETH | 0.00003668 | ||||
| Harvest | 28044205 | 6 days ago | IN | 0 ETH | 0.00003647 | ||||
| Harvest | 28006597 | 7 days ago | IN | 0 ETH | 0.00003668 | ||||
| Harvest | 27968055 | 8 days ago | IN | 0 ETH | 0.00003393 | ||||
| Harvest | 27929922 | 9 days ago | IN | 0 ETH | 0.00003144 | ||||
| Harvest | 27891583 | 10 days ago | IN | 0 ETH | 0.00003144 | ||||
| Harvest | 27853049 | 11 days ago | IN | 0 ETH | 0.00003144 | ||||
| Harvest | 27814528 | 12 days ago | IN | 0 ETH | 0.00003133 | ||||
| Harvest | 27775990 | 13 days ago | IN | 0 ETH | 0.00003144 | ||||
| Harvest | 27737487 | 14 days ago | IN | 0 ETH | 0.00003144 | ||||
| Harvest | 27699172 | 15 days ago | IN | 0 ETH | 0.00003144 | ||||
| Harvest | 27660661 | 15 days ago | IN | 0 ETH | 0.00003144 | ||||
| Harvest | 27622191 | 16 days ago | IN | 0 ETH | 0.00003133 | ||||
| Harvest | 27582897 | 17 days ago | IN | 0 ETH | 0.00003133 | ||||
| Harvest | 27545204 | 18 days ago | IN | 0 ETH | 0.00003647 | ||||
| Harvest | 27507400 | 19 days ago | IN | 0 ETH | 0.00003401 | ||||
| Harvest | 27470072 | 20 days ago | IN | 0 ETH | 0.00003658 | ||||
| Harvest | 27433414 | 21 days ago | IN | 0 ETH | 0.00003668 | ||||
| Harvest | 27398823 | 22 days ago | IN | 0 ETH | 0.00003647 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 28314132 | 8 hrs ago | 0 ETH | ||||
| 28312118 | 9 hrs ago | 0 ETH | ||||
| 28303939 | 15 hrs ago | 0 ETH | ||||
| 28302391 | 16 hrs ago | 0 ETH | ||||
| 28301707 | 16 hrs ago | 0 ETH | ||||
| 28301637 | 16 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28300839 | 17 hrs ago | 0 ETH | ||||
| 28280708 | 29 hrs ago | 0 ETH | ||||
| 28279119 | 30 hrs ago | 0 ETH | ||||
| 28269928 | 36 hrs ago | 0 ETH | ||||
| 28268707 | 37 hrs ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
StrategyMendi
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/**
*Submitted for verification at lineascan.build/ on 2024-06-12
*/
// File contracts/BIFI/interfaces/common/IComptroller.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IComptroller {
function claimComp(address holder, address[] calldata _iTokens) external;
function claimComp(address holder) external;
function compAccrued(address holder) view external returns (uint256 comp);
function enterMarkets(address[] memory _iTokens) external;
function pendingComptrollerImplementation() view external returns (address implementation);
}
// File contracts/BIFI/interfaces/common/IFeeConfig.sol
pragma solidity ^0.8.0;
interface IFeeConfig {
struct FeeCategory {
uint256 total;
uint256 beefy;
uint256 call;
uint256 strategist;
string label;
bool active;
}
struct AllFees {
FeeCategory performance;
uint256 deposit;
uint256 withdraw;
}
function getFees(address strategy) external view returns (FeeCategory memory);
function stratFeeId(address strategy) external view returns (uint256);
function setStratFeeId(uint256 feeId) external;
}
// File @openzeppelin/contracts-upgradeable/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
// File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
/**
* @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 {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
* constructor.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: setting the version to 255 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized != type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}
// File @openzeppelin/contracts-upgradeable/utils/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}
// File @openzeppelin/contracts-upgradeable/access/[email protected]
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}
// File @openzeppelin/contracts-upgradeable/security/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
/**
* @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 {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
function __Pausable_init() internal onlyInitializing {
__Pausable_init_unchained();
}
function __Pausable_init_unchained() internal onlyInitializing {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}
// File contracts/BIFI/strategies/Common/StratFeeManagerInitializable.sol
pragma solidity ^0.8.0;
contract StratFeeManagerInitializable is OwnableUpgradeable, PausableUpgradeable {
struct CommonAddresses {
address vault;
address unirouter;
address keeper;
address strategist;
address beefyFeeRecipient;
address beefyFeeConfig;
}
// common addresses for the strategy
address public vault;
address public unirouter;
address public keeper;
address public strategist;
address public beefyFeeRecipient;
IFeeConfig public beefyFeeConfig;
uint256 constant DIVISOR = 1 ether;
uint256 constant public WITHDRAWAL_FEE_CAP = 50;
uint256 constant public WITHDRAWAL_MAX = 10000;
uint256 internal withdrawalFee;
event SetStratFeeId(uint256 feeId);
event SetWithdrawalFee(uint256 withdrawalFee);
event SetVault(address vault);
event SetUnirouter(address unirouter);
event SetKeeper(address keeper);
event SetStrategist(address strategist);
event SetBeefyFeeRecipient(address beefyFeeRecipient);
event SetBeefyFeeConfig(address beefyFeeConfig);
function __StratFeeManager_init(CommonAddresses calldata _commonAddresses) internal onlyInitializing {
__Ownable_init();
__Pausable_init();
vault = _commonAddresses.vault;
unirouter = _commonAddresses.unirouter;
keeper = _commonAddresses.keeper;
strategist = _commonAddresses.strategist;
beefyFeeRecipient = _commonAddresses.beefyFeeRecipient;
beefyFeeConfig = IFeeConfig(_commonAddresses.beefyFeeConfig);
withdrawalFee = 10;
}
// checks that caller is either owner or keeper.
modifier onlyManager() {
_checkManager();
_;
}
function _checkManager() internal view {
require(msg.sender == owner() || msg.sender == keeper, "!manager");
}
// fetch fees from config contract
function getFees() internal view returns (IFeeConfig.FeeCategory memory) {
return beefyFeeConfig.getFees(address(this));
}
// fetch fees from config contract and dynamic deposit/withdraw fees
function getAllFees() external view returns (IFeeConfig.AllFees memory) {
return IFeeConfig.AllFees(getFees(), depositFee(), withdrawFee());
}
function getStratFeeId() external view returns (uint256) {
return beefyFeeConfig.stratFeeId(address(this));
}
function setStratFeeId(uint256 _feeId) external onlyManager {
beefyFeeConfig.setStratFeeId(_feeId);
emit SetStratFeeId(_feeId);
}
// adjust withdrawal fee
function setWithdrawalFee(uint256 _fee) public onlyManager {
require(_fee <= WITHDRAWAL_FEE_CAP, "!cap");
withdrawalFee = _fee;
emit SetWithdrawalFee(_fee);
}
// set new vault (only for strategy upgrades)
function setVault(address _vault) external onlyOwner {
vault = _vault;
emit SetVault(_vault);
}
// set new unirouter
function setUnirouter(address _unirouter) external onlyOwner {
unirouter = _unirouter;
emit SetUnirouter(_unirouter);
}
// set new keeper to manage strat
function setKeeper(address _keeper) external onlyManager {
keeper = _keeper;
emit SetKeeper(_keeper);
}
// set new strategist address to receive strat fees
function setStrategist(address _strategist) external {
require(msg.sender == strategist, "!strategist");
strategist = _strategist;
emit SetStrategist(_strategist);
}
// set new beefy fee address to receive beefy fees
function setBeefyFeeRecipient(address _beefyFeeRecipient) external onlyOwner {
beefyFeeRecipient = _beefyFeeRecipient;
emit SetBeefyFeeRecipient(_beefyFeeRecipient);
}
// set new fee config address to fetch fees
function setBeefyFeeConfig(address _beefyFeeConfig) external onlyOwner {
beefyFeeConfig = IFeeConfig(_beefyFeeConfig);
emit SetBeefyFeeConfig(_beefyFeeConfig);
}
function depositFee() public virtual view returns (uint256) {
return 0;
}
function withdrawFee() public virtual view returns (uint256) {
return paused() ? 0 : withdrawalFee;
}
function beforeDeposit() external virtual {}
}
// File @openzeppelin-4/contracts/token/ERC20/[email protected]
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @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 amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
// File @openzeppelin-4/contracts/utils/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File @openzeppelin-4/contracts/token/ERC20/extensions/[email protected]
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
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);
}
// File @openzeppelin-4/contracts/token/ERC20/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.0;
/**
* @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}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
}
_balances[to] += amount;
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
// File contracts/BIFI/interfaces/common/IVToken.sol
pragma solidity ^0.8.0;
interface IVToken is IERC20 {
function underlying() external returns (address);
function mint(uint mintAmount) external returns (uint);
function redeem(uint redeemTokens) external returns (uint);
function redeemUnderlying(uint redeemAmount) external returns (uint);
function borrow(uint borrowAmount) external returns (uint);
function repayBorrow(uint repayAmount) external returns (uint);
function balanceOfUnderlying(address owner) external returns (uint);
function borrowBalanceCurrent(address account) external returns (uint);
function comptroller() external returns (address);
}
// File contracts/BIFI/interfaces/beefy/IBeefySwapper.sol
pragma solidity ^0.8.0;
interface IBeefySwapper {
function swap(
address fromToken,
address toToken,
uint256 amountIn
) external returns (uint256 amountOut);
function swap(
address fromToken,
address toToken,
uint256 amountIn,
uint256 minAmountOut
) external returns (uint256 amountOut);
function getAmountOut(
address _fromToken,
address _toToken,
uint256 _amountIn
) external view returns (uint256 amountOut);
struct SwapInfo {
address router;
bytes data;
uint256 amountIndex;
uint256 minIndex;
int8 minAmountSign;
}
}
// File contracts/BIFI/interfaces/common/IWrappedNative.sol
pragma solidity >=0.6.0 <0.9.0;
interface IWrappedNative {
function deposit() external payable;
function withdraw(uint256 wad) external;
}
// File @openzeppelin-4/contracts/token/ERC20/extensions/[email protected]
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @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.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
// File @openzeppelin-4/contracts/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File @openzeppelin-4/contracts/token/ERC20/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
/**
* @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;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File contracts/BIFI/strategies/Mendi/StrategyMendi.sol
pragma solidity ^0.8.0;
contract StrategyMendi is StratFeeManagerInitializable {
using SafeERC20 for IERC20;
// Tokens used
address public native;
address public want;
address public iToken;
address[] public rewards;
// Third party contracts
address public comptroller;
address[] public markets;
bool public harvestOnDeposit;
uint256 public lastHarvest;
uint256 public balanceOfPool;
event StratHarvest(address indexed harvester, uint256 wantHarvested, uint256 tvl);
event Deposit(uint256 tvl);
event Withdraw(uint256 tvl);
event ChargedFees(uint256 callFees, uint256 beefyFees, uint256 strategistFees);
function initialize(
address _market,
address _reward,
CommonAddresses calldata _commonAddresses
) external initializer {
__StratFeeManager_init(_commonAddresses);
iToken = _market;
markets.push(_market);
comptroller = IVToken(_market).comptroller();
want = IVToken(_market).underlying();
rewards.push(_reward);
native = 0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f;
_giveAllowances();
IComptroller(comptroller).enterMarkets(markets);
}
// puts the funds to work
function deposit() public whenNotPaused {
uint256 wantBal = balanceOfWant();
if (wantBal > 0) {
IVToken(iToken).mint(wantBal);
_updateBalance();
emit Deposit(balanceOf());
}
}
function withdraw(uint256 _amount) external {
require(msg.sender == vault, "!vault");
uint256 wantBal = balanceOfWant();
if (wantBal < _amount) {
uint err = IVToken(iToken).redeemUnderlying(_amount - wantBal);
require(err == 0, "Error while trying to redeem");
_updateBalance();
wantBal = IERC20(want).balanceOf(address(this));
}
if (wantBal > _amount) {
wantBal = _amount;
}
if (tx.origin != owner() && !paused()) {
uint256 withdrawalFeeAmount = wantBal * withdrawalFee / WITHDRAWAL_MAX;
wantBal = wantBal - withdrawalFeeAmount;
}
IERC20(want).safeTransfer(vault, wantBal);
emit Withdraw(balanceOf());
}
function beforeDeposit() external override {
if (harvestOnDeposit) {
require(msg.sender == vault, "!vault");
_harvest(tx.origin);
}
_updateBalance();
}
function harvest() external virtual {
_harvest(tx.origin);
}
function harvest(address callFeeRecipient) external virtual {
_harvest(callFeeRecipient);
}
function managerHarvest() external onlyManager {
_harvest(tx.origin);
}
// compounds earnings and charges performance fee
function _harvest(address callFeeRecipient) internal whenNotPaused {
uint256 beforeBal = balanceOfWant();
IComptroller(comptroller).claimComp(address(this), markets);
_swapToNative();
uint256 nativeBal = IERC20(native).balanceOf(address(this));
if (want == native) nativeBal -= beforeBal;
if (nativeBal > 0) {
chargeFees(callFeeRecipient, nativeBal);
_swapToWant();
uint256 wantHarvested = balanceOfWant() - beforeBal;
deposit();
lastHarvest = block.timestamp;
emit StratHarvest(msg.sender, wantHarvested, balanceOf());
}
}
// performance fees
function chargeFees(address callFeeRecipient, uint256 rewardBal) internal {
IFeeConfig.FeeCategory memory fees = getFees();
uint256 feeBal = rewardBal * fees.total / DIVISOR;
uint256 callFeeAmount = feeBal * fees.call / DIVISOR;
IERC20(native).safeTransfer(callFeeRecipient, callFeeAmount);
uint256 beefyFeeAmount = feeBal * fees.beefy / DIVISOR;
IERC20(native).safeTransfer(beefyFeeRecipient, beefyFeeAmount);
uint256 strategistFeeAmount = feeBal * fees.strategist / DIVISOR;
IERC20(native).safeTransfer(strategist, strategistFeeAmount);
emit ChargedFees(callFeeAmount, beefyFeeAmount, strategistFeeAmount);
}
function _swapToNative() internal {
for (uint i; i < rewards.length; ++i) {
address reward = rewards[i];
uint256 rewardBal = IERC20(reward).balanceOf(address(this));
if (rewardBal > 0) IBeefySwapper(unirouter).swap(reward, native, rewardBal);
}
}
function _swapToWant() internal {
if (want != native) {
uint256 nativeBal = IERC20(native).balanceOf(address(this));
IBeefySwapper(unirouter).swap(native, want, nativeBal);
}
}
function _updateBalance() internal {
balanceOfPool = IVToken(iToken).balanceOfUnderlying(address(this));
}
// calculate the total underlaying 'want' held by the strat.
function balanceOf() public view returns (uint256) {
return balanceOfWant() + balanceOfPool;
}
// it calculates how much 'want' this contract holds.
function balanceOfWant() public view returns (uint256) {
return IERC20(want).balanceOf(address(this));
}
// returns rewards unharvested
function rewardsAvailable() public returns (uint256) {
IComptroller(comptroller).claimComp(address(this), markets);
return IERC20(rewards[0]).balanceOf(address(this));
}
// native reward amount for calling harvest
function callReward() public returns (uint256) {
IFeeConfig.FeeCategory memory fees = getFees();
uint256 outputBal = rewardsAvailable();
uint256 nativeOut;
if (outputBal > 0) {
nativeOut = IBeefySwapper(unirouter).getAmountOut(rewards[0], native, outputBal);
}
return nativeOut * fees.total / DIVISOR * fees.call / DIVISOR;
}
function setHarvestOnDeposit(bool _harvestOnDeposit) external onlyManager {
harvestOnDeposit = _harvestOnDeposit;
if (harvestOnDeposit) {
super.setWithdrawalFee(0);
} else {
super.setWithdrawalFee(10);
}
}
// called as part of strat migration. Sends all the available funds back to the vault.
function retireStrat() external {
require(msg.sender == vault, "!vault");
uint err = IVToken(iToken).redeem(IERC20(iToken).balanceOf(address(this)));
require(err == 0, "Error while trying to redeem");
_updateBalance();
uint256 wantBal = IERC20(want).balanceOf(address(this));
IERC20(want).transfer(vault, wantBal);
}
// pauses deposits and withdraws all funds from third party systems.
function panic() public onlyManager {
uint err = IVToken(iToken).redeem(IERC20(iToken).balanceOf(address(this)));
require(err == 0, "Error while trying to redeem");
_updateBalance();
pause();
}
function pause() public onlyManager {
_pause();
_removeAllowances();
}
function unpause() external onlyManager {
_unpause();
_giveAllowances();
deposit();
}
function _giveAllowances() internal {
IERC20(want).safeApprove(iToken, type(uint256).max);
IERC20(native).safeApprove(unirouter, type(uint256).max);
for (uint i; i < rewards.length; ++i) {
IERC20(rewards[i]).safeApprove(unirouter, 0);
IERC20(rewards[i]).safeApprove(unirouter, type(uint256).max);
}
}
function _removeAllowances() internal {
IERC20(want).safeApprove(iToken, 0);
IERC20(native).safeApprove(unirouter, 0);
for (uint i; i < rewards.length; ++i) {
IERC20(rewards[i]).safeApprove(unirouter, 0);
}
}
function setReward(address _reward) external onlyOwner {
require(_reward != want, "reward==want");
require(_reward != iToken, "reward==iToken");
rewards.push(_reward);
IERC20(_reward).safeApprove(unirouter, type(uint256).max);
}
function resetRewards() external onlyManager {
for (uint i; i < rewards.length; ++i) {
address reward = rewards[i];
IERC20(reward).safeApprove(unirouter, 0);
}
delete rewards;
}
receive() external payable {
IWrappedNative(native).deposit{value: msg.value}();
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"callFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beefyFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"strategistFees","type":"uint256"}],"name":"ChargedFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"beefyFeeConfig","type":"address"}],"name":"SetBeefyFeeConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"beefyFeeRecipient","type":"address"}],"name":"SetBeefyFeeRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"keeper","type":"address"}],"name":"SetKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeId","type":"uint256"}],"name":"SetStratFeeId","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"strategist","type":"address"}],"name":"SetStrategist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"unirouter","type":"address"}],"name":"SetUnirouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"vault","type":"address"}],"name":"SetVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawalFee","type":"uint256"}],"name":"SetWithdrawalFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"harvester","type":"address"},{"indexed":false,"internalType":"uint256","name":"wantHarvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"StratHarvest","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":"tvl","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"WITHDRAWAL_FEE_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWAL_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beefyFeeConfig","outputs":[{"internalType":"contract IFeeConfig","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beefyFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beforeDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"callReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"comptroller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllFees","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"beefy","type":"uint256"},{"internalType":"uint256","name":"call","type":"uint256"},{"internalType":"uint256","name":"strategist","type":"uint256"},{"internalType":"string","name":"label","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct IFeeConfig.FeeCategory","name":"performance","type":"tuple"},{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"}],"internalType":"struct IFeeConfig.AllFees","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStratFeeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"callFeeRecipient","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestOnDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"iToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"address","name":"_reward","type":"address"},{"components":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"unirouter","type":"address"},{"internalType":"address","name":"keeper","type":"address"},{"internalType":"address","name":"strategist","type":"address"},{"internalType":"address","name":"beefyFeeRecipient","type":"address"},{"internalType":"address","name":"beefyFeeConfig","type":"address"}],"internalType":"struct StratFeeManagerInitializable.CommonAddresses","name":"_commonAddresses","type":"tuple"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"markets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"native","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"panic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retireStrat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beefyFeeConfig","type":"address"}],"name":"setBeefyFeeConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beefyFeeRecipient","type":"address"}],"name":"setBeefyFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_harvestOnDeposit","type":"bool"}],"name":"setHarvestOnDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_reward","type":"address"}],"name":"setReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeId","type":"uint256"}],"name":"setStratFeeId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_unirouter","type":"address"}],"name":"setUnirouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setWithdrawalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unirouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405234801561001057600080fd5b5061313f806100206000396000f3fe6080604052600436106102e85760003560e01c80638912cb8b11610190578063d0e30db0116100dc578063e941fa7811610095578063f2fde38b1161006f578063f2fde38b14610887578063f301af42146108a7578063fb617787146108c7578063fbfa77cf146108dc57600080fd5b8063e941fa781461083c578063e959c61f14610851578063f1a392da1461087157600080fd5b8063d0e30db0146107a8578063d801d946146107bd578063d92f3d73146107d2578063dfbdc437146107f2578063e5932c4014610807578063e7a7250a1461082757600080fd5b8063ac1e502511610149578063b1283e7711610123578063b1283e7714610731578063b20feaaf14610751578063c1a3d44c14610773578063c7b9d5301461078857600080fd5b8063ac1e5025146106dc578063aced1661146106fc578063ad29f5da1461071c57600080fd5b80638912cb8b1461063a5780638cfc0250146106545780638da5cb5b146106695780638e1454591461068757806397fd323d146106a7578063a68833e5146106bc57600080fd5b80634641257d1161024f5780635fe3b56711610208578063715018a6116101e2578063715018a6146105db578063722713f7146105f0578063748747e6146106055780638456cb591461062557600080fd5b80635fe3b5671461058757806367a52793146105a75780636817031b146105bb57600080fd5b80634641257d146104ee5780634700d305146105035780634746fb551461051857806354518b1a14610538578063573fef0a1461054e5780635c975abb1461056357600080fd5b80631fe4a686116102a15780631fe4a68614610439578063257ae0de146104595780632e1a7d4d146104795780633e55f932146104995780633f4ba83a146104b9578063408cfe24146104ce57600080fd5b80630e5c011e146103585780630e8fbb5a14610378578063106fdbd01461039857806311588086146103b857806311b0b42d146103e15780631f1fcd511461041957600080fd5b3661035357609e60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561033d57600080fd5b505af1158015610351573d6000803e3d6000fd5b005b600080fd5b34801561036457600080fd5b50610351610373366004612bc3565b6108fc565b34801561038457600080fd5b50610351610393366004612bee565b610908565b3480156103a457600080fd5b506103516103b3366004612bc3565b61093d565b3480156103c457600080fd5b506103ce60a65481565b6040519081526020015b60405180910390f35b3480156103ed57600080fd5b50609e54610401906001600160a01b031681565b6040516001600160a01b0390911681526020016103d8565b34801561042557600080fd5b50609f54610401906001600160a01b031681565b34801561044557600080fd5b50609a54610401906001600160a01b031681565b34801561046557600080fd5b50609854610401906001600160a01b031681565b34801561048557600080fd5b50610351610494366004612c0b565b61099a565b3480156104a557600080fd5b506103516104b4366004612c0b565b610bae565b3480156104c557600080fd5b50610351610c45565b3480156104da57600080fd5b5060a054610401906001600160a01b031681565b3480156104fa57600080fd5b50610351610c67565b34801561050f57600080fd5b50610351610c70565b34801561052457600080fd5b50609c54610401906001600160a01b031681565b34801561054457600080fd5b506103ce61271081565b34801561055a57600080fd5b50610351610d7e565b34801561056f57600080fd5b5060655460ff165b60405190151581526020016103d8565b34801561059357600080fd5b5060a254610401906001600160a01b031681565b3480156105b357600080fd5b5060006103ce565b3480156105c757600080fd5b506103516105d6366004612bc3565b610dc4565b3480156105e757600080fd5b50610351610e1a565b3480156105fc57600080fd5b506103ce610e2c565b34801561061157600080fd5b50610351610620366004612bc3565b610e48565b34801561063157600080fd5b50610351610e9e565b34801561064657600080fd5b5060a4546105779060ff1681565b34801561066057600080fd5b506103ce610eb6565b34801561067557600080fd5b506033546001600160a01b0316610401565b34801561069357600080fd5b50609b54610401906001600160a01b031681565b3480156106b357600080fd5b506103ce610f24565b3480156106c857600080fd5b506103516106d7366004612bc3565b611043565b3480156106e857600080fd5b506103516106f7366004612c0b565b611099565b34801561070857600080fd5b50609954610401906001600160a01b031681565b34801561072857600080fd5b50610351611110565b34801561073d57600080fd5b5061040161074c366004612c0b565b611182565b34801561075d57600080fd5b506107666111ac565b6040516103d89190612c74565b34801561077f57600080fd5b506103ce6111e2565b34801561079457600080fd5b506103516107a3366004612bc3565b611213565b3480156107b457600080fd5b506103516112a9565b3480156107c957600080fd5b50610351611372565b3480156107de57600080fd5b506103516107ed366004612bc3565b61137a565b3480156107fe57600080fd5b506103ce603281565b34801561081357600080fd5b50610351610822366004612bc3565b6113d0565b34801561083357600080fd5b506103ce6114d3565b34801561084857600080fd5b506103ce611585565b34801561085d57600080fd5b5061035161086c366004612cf1565b6115a4565b34801561087d57600080fd5b506103ce60a55481565b34801561089357600080fd5b506103516108a2366004612bc3565b6118e9565b3480156108b357600080fd5b506104016108c2366004612c0b565b61195f565b3480156108d357600080fd5b5061035161196f565b3480156108e857600080fd5b50609754610401906001600160a01b031681565b61090581611b84565b50565b610910611d1c565b60a4805460ff191682151590811790915560ff1615610933576109056000611099565b610905600a611099565b610945611d76565b609c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f91e28ce4210d103c13c5174847e463b836900f8dc63e9d9b42a4255169d19529906020015b60405180910390a150565b6097546001600160a01b031633146109cd5760405162461bcd60e51b81526004016109c490612d45565b60405180910390fd5b60006109d76111e2565b905081811015610af85760a0546000906001600160a01b031663852a12e36109ff8486612d7b565b6040518263ffffffff1660e01b8152600401610a1d91815260200190565b6020604051808303816000875af1158015610a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a609190612d94565b90508015610a805760405162461bcd60e51b81526004016109c490612dad565b610a88611dd0565b609f546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af49190612d94565b9150505b81811115610b035750805b6033546001600160a01b03163214801590610b21575060655460ff16155b15610b53576000612710609d5483610b399190612de4565b610b439190612dfb565b9050610b4f8183612d7b565b9150505b609754609f54610b70916001600160a01b03918216911683611e43565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d610b99610e2c565b60405190815260200160405180910390a15050565b610bb6611d1c565b609c54604051631f2afc9960e11b8152600481018390526001600160a01b0390911690633e55f93290602401600060405180830381600087803b158015610bfc57600080fd5b505af1158015610c10573d6000803e3d6000fd5b505050507f9163810ee1e29168d4ce900e48a333fb8fbd3fd070d2bef67f6d4db0846a469f8160405161098f91815260200190565b610c4d611d1c565b610c55611ea6565b610c5d611ef8565b610c656112a9565b565b610c6532611b84565b610c78611d1c565b60a0546040516370a0823160e01b81523060048201526000916001600160a01b03169063db006a759082906370a0823190602401602060405180830381865afa158015610cc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ced9190612d94565b6040518263ffffffff1660e01b8152600401610d0b91815260200190565b6020604051808303816000875af1158015610d2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4e9190612d94565b90508015610d6e5760405162461bcd60e51b81526004016109c490612dad565b610d76611dd0565b610905610e9e565b60a45460ff1615610dbc576097546001600160a01b03163314610db35760405162461bcd60e51b81526004016109c490612d45565b610dbc32611b84565b610c65611dd0565b610dcc611d76565b609780546001600160a01b0319166001600160a01b0383169081179091556040519081527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f309060200161098f565b610e22611d76565b610c656000611fc0565b600060a654610e396111e2565b610e439190612e1d565b905090565b610e50611d1c565b609980546001600160a01b0319166001600160a01b0383169081179091556040519081527fefb5cfa1a8690c124332ab93324539c5c9c4be03f28aeb8be86f2d8a0c9fb99b9060200161098f565b610ea6611d1c565b610eae612012565b610c6561204f565b609c54604051636788231160e11b81523060048201526000916001600160a01b03169063cf104622906024015b602060405180830381865afa158015610f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e439190612d94565b600080610f2f6120d0565b90506000610f3b6114d3565b905060008115610ff65760985460a180546001600160a01b0390921691634aa066529190600090610f6e57610f6e612e30565b600091825260209091200154609e5460405160e084901b6001600160e01b03191681526001600160a01b0392831660048201529116602482015260448101859052606401602060405180830381865afa158015610fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff39190612d94565b90505b670de0b6b3a76400008360400151670de0b6b3a764000085600001518461101d9190612de4565b6110279190612dfb565b6110319190612de4565b61103b9190612dfb565b935050505090565b61104b611d76565b609b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f8041329bf7057543a2c2ff4e4071d1d488a31f82ed44e169b5cd2f04f5e3ac859060200161098f565b6110a1611d1c565b60328111156110db5760405162461bcd60e51b81526004016109c4906020808252600490820152630216361760e41b604082015260600190565b609d8190556040518181527f3aa4413905e8f015896ec5880bdde24088ccb19b578f9fcf6800354d5320d4af9060200161098f565b611118611d1c565b60005b60a15481101561117557600060a1828154811061113a5761113a612e30565b60009182526020822001546098546001600160a01b0391821693506111649284929091169061217b565b5061116e81612e46565b905061111b565b50610c6560a16000612b1d565b60a3818154811061119257600080fd5b6000918252602090912001546001600160a01b0316905081565b6111b4612b3b565b60405180606001604052806111c76120d0565b8152602001600081526020016111db611585565b9052919050565b609f546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401610ee3565b609a546001600160a01b0316331461125b5760405162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b60448201526064016109c4565b609a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f46d58e3fa07bf19b1d27240f0e286b27e9f7c1b0d88933333fe833b60eec54129060200161098f565b6112b1612290565b60006112bb6111e2565b905080156109055760a05460405163140e25ad60e31b8152600481018390526001600160a01b039091169063a0712d68906024016020604051808303816000875af115801561130e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113329190612d94565b5061133b611dd0565b7f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e38426611364610e2c565b60405190815260200161098f565b610c67611d1c565b611382611d76565b609880546001600160a01b0319166001600160a01b0383169081179091556040519081527f5ca6e64c4522e68e154aa9372f2c5969cd37d9640e59f66953dc472f54ee86fa9060200161098f565b6113d8611d76565b609f546001600160a01b03908116908216036114255760405162461bcd60e51b815260206004820152600c60248201526b1c995dd85c990f4f5dd85b9d60a21b60448201526064016109c4565b60a0546001600160a01b03908116908216036114745760405162461bcd60e51b815260206004820152600e60248201526d3932bbb0b9321e9eb4aa37b5b2b760911b60448201526064016109c4565b60a180546001810182556000919091527faadc37b8ba5645e62f4546802db221593a94729ccbfc5a97d01365a88f6498780180546001600160a01b0319166001600160a01b03838116918217909255609854610905921660001961217b565b60a25460405162e1ed9760e51b81526000916001600160a01b031690631c3db2e09061150690309060a390600401612ea8565b600060405180830381600087803b15801561152057600080fd5b505af1158015611534573d6000803e3d6000fd5b5050505060a160008154811061154c5761154c612e30565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401610ee3565b600061159360655460ff1690565b61159e5750609d5490565b50600090565b600054610100900460ff16158080156115c45750600054600160ff909116105b806115de5750303b1580156115de575060005460ff166001145b6116415760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109c4565b6000805460ff191660011790558015611664576000805461ff0019166101001790555b61166d826122d6565b60a080546001600160a01b0386166001600160a01b0319918216811790925560a3805460018101825560009182527f60859188cffe297f44dde29f2d2865634621f26215049caeb304ccba566a8b17018054909216831790915560408051635fe3b56760e01b81529051635fe3b567926004808401936020939290839003909101908290875af1158015611705573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117299190612ecc565b60a260006101000a8154816001600160a01b0302191690836001600160a01b03160217905550836001600160a01b0316636f307dc36040518163ffffffff1660e01b81526004016020604051808303816000875af115801561178f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b39190612ecc565b609f80546001600160a01b039283166001600160a01b03199182161790915560a180546001810182556000919091527faadc37b8ba5645e62f4546802db221593a94729ccbfc5a97d01365a88f64987801805492861692821692909217909155609e805490911673e5d7c2a44ffddf6b295a15c148167daaaf5cf34f17905561183a611ef8565b60a254604051631853304760e31b81526001600160a01b039091169063c29982389061186b9060a390600401612ee9565b600060405180830381600087803b15801561188557600080fd5b505af1158015611899573d6000803e3d6000fd5b5050505080156118e3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6118f1611d76565b6001600160a01b0381166119565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109c4565b61090581611fc0565b60a1818154811061119257600080fd5b6097546001600160a01b031633146119995760405162461bcd60e51b81526004016109c490612d45565b60a0546040516370a0823160e01b81523060048201526000916001600160a01b03169063db006a759082906370a0823190602401602060405180830381865afa1580156119ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0e9190612d94565b6040518263ffffffff1660e01b8152600401611a2c91815260200190565b6020604051808303816000875af1158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f9190612d94565b90508015611a8f5760405162461bcd60e51b81526004016109c490612dad565b611a97611dd0565b609f546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b049190612d94565b609f5460975460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303816000875af1158015611b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7f9190612f0c565b505050565b611b8c612290565b6000611b966111e2565b60a25460405162e1ed9760e51b81529192506001600160a01b031690631c3db2e090611bc990309060a390600401612ea8565b600060405180830381600087803b158015611be357600080fd5b505af1158015611bf7573d6000803e3d6000fd5b50505050611c03612432565b609e546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c709190612d94565b609e54609f549192506001600160a01b03908116911603611c9857611c958282612d7b565b90505b8015611b7f57611ca88382612569565b611cb06126af565b600082611cbb6111e2565b611cc59190612d7b565b9050611ccf6112a9565b4260a555337f9bc239f1724cacfb88cb1d66a2dc437467699b68a8c90d7b63110cf4b6f9241082611cfe610e2c565b6040805192835260208301919091520160405180910390a250505050565b6033546001600160a01b0316331480611d3f57506099546001600160a01b031633145b610c655760405162461bcd60e51b815260206004820152600860248201526710b6b0b730b3b2b960c11b60448201526064016109c4565b6033546001600160a01b03163314610c655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c4565b60a054604051633af9e66960e01b81523060048201526001600160a01b0390911690633af9e669906024016020604051808303816000875af1158015611e1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3e9190612d94565b60a655565b6040516001600160a01b038316602482015260448101829052611b7f90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526127be565b611eae612890565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60a054609f54611f17916001600160a01b03918216911660001961217b565b609854609e54611f36916001600160a01b03918216911660001961217b565b60005b60a1548110156109055760985460a18054611f87926001600160a01b03169160009185908110611f6b57611f6b612e30565b6000918252602090912001546001600160a01b0316919061217b565b60985460a18054611fb0926001600160a01b0316916000199185908110611f6b57611f6b612e30565b611fb981612e46565b9050611f39565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61201a612290565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611edb3390565b60a054609f5461206d916001600160a01b039182169116600061217b565b609854609e5461208b916001600160a01b039182169116600061217b565b60005b60a1548110156109055760985460a180546120c0926001600160a01b03169160009185908110611f6b57611f6b612e30565b6120c981612e46565b905061208e565b61210b6040518060c0016040528060008152602001600081526020016000815260200160008152602001606081526020016000151581525090565b609c54604051639af608c960e01b81523060048201526001600160a01b0390911690639af608c990602401600060405180830381865afa158015612153573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e439190810190612f99565b8015806121f55750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156121cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f39190612d94565b155b6122605760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016109c4565b6040516001600160a01b038316602482015260448101829052611b7f90849063095ea7b360e01b90606401611e6f565b60655460ff1615610c655760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016109c4565b600054610100900460ff166122fd5760405162461bcd60e51b81526004016109c49061308f565b6123056128d9565b61230d612908565b61231a6020820182612bc3565b609780546001600160a01b0319166001600160a01b039290921691909117905561234a6040820160208301612bc3565b609880546001600160a01b0319166001600160a01b039290921691909117905561237a6060820160408301612bc3565b609980546001600160a01b0319166001600160a01b03929092169190911790556123aa6080820160608301612bc3565b609a80546001600160a01b0319166001600160a01b03929092169190911790556123da60a0820160808301612bc3565b609b80546001600160a01b0319166001600160a01b039290921691909117905561240a60c0820160a08301612bc3565b609c80546001600160a01b0319166001600160a01b039290921691909117905550600a609d55565b60005b60a15481101561090557600060a1828154811061245457612454612e30565b60009182526020822001546040516370a0823160e01b81523060048201526001600160a01b03909116925082906370a0823190602401602060405180830381865afa1580156124a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cb9190612d94565b9050801561255657609854609e54604051630df791e560e41b81526001600160a01b03858116600483015291821660248201526044810184905291169063df791e50906064016020604051808303816000875af1158015612530573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125549190612d94565b505b50508061256290612e46565b9050612435565b60006125736120d0565b90506000670de0b6b3a76400008260000151846125909190612de4565b61259a9190612dfb565b90506000670de0b6b3a76400008360400151836125b79190612de4565b6125c19190612dfb565b609e549091506125db906001600160a01b03168683611e43565b6000670de0b6b3a76400008460200151846125f69190612de4565b6126009190612dfb565b609b54609e54919250612620916001600160a01b03908116911683611e43565b6000670de0b6b3a764000085606001518561263b9190612de4565b6126459190612dfb565b609a54609e54919250612665916001600160a01b03908116911683611e43565b60408051848152602081018490529081018290527fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a9060600160405180910390a150505050505050565b609e54609f546001600160a01b03908116911614610c6557609e546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612710573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127349190612d94565b609854609e54609f54604051630df791e560e41b81526001600160a01b039283166004820152908216602482015260448101849052929350169063df791e50906064016020604051808303816000875af1158015612796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ba9190612d94565b5050565b6000612813826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129379092919063ffffffff16565b805190915015611b7f57808060200190518101906128319190612f0c565b611b7f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109c4565b60655460ff16610c655760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016109c4565b600054610100900460ff166129005760405162461bcd60e51b81526004016109c49061308f565b610c65612950565b600054610100900460ff1661292f5760405162461bcd60e51b81526004016109c49061308f565b610c65612980565b606061294684846000856129b3565b90505b9392505050565b600054610100900460ff166129775760405162461bcd60e51b81526004016109c49061308f565b610c6533611fc0565b600054610100900460ff166129a75760405162461bcd60e51b81526004016109c49061308f565b6065805460ff19169055565b606082471015612a145760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109c4565b6001600160a01b0385163b612a6b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109c4565b600080866001600160a01b03168587604051612a8791906130da565b60006040518083038185875af1925050503d8060008114612ac4576040519150601f19603f3d011682016040523d82523d6000602084013e612ac9565b606091505b5091509150612ad9828286612ae4565b979650505050505050565b60608315612af3575081612949565b825115612b035782518084602001fd5b8160405162461bcd60e51b81526004016109c491906130f6565b50805460008255906000526020600020908101906109059190612b95565b6040518060600160405280612b816040518060c0016040528060008152602001600081526020016000815260200160008152602001606081526020016000151581525090565b815260200160008152602001600081525090565b5b80821115612baa5760008155600101612b96565b5090565b6001600160a01b038116811461090557600080fd5b600060208284031215612bd557600080fd5b813561294981612bae565b801515811461090557600080fd5b600060208284031215612c0057600080fd5b813561294981612be0565b600060208284031215612c1d57600080fd5b5035919050565b60005b83811015612c3f578181015183820152602001612c27565b50506000910152565b60008151808452612c60816020860160208601612c24565b601f01601f19169290920160200192915050565b60208152600082516060602084015280516080840152602081015160a0840152604081015160c0840152606081015160e0840152608081015160c0610100850152612cc3610140850182612c48565b905060a082015115156101208501526020850151604085015260408501516060850152809250505092915050565b6000806000838503610100811215612d0857600080fd5b8435612d1381612bae565b93506020850135612d2381612bae565b925060c0603f1982011215612d3757600080fd5b506040840190509250925092565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115612d8e57612d8e612d65565b92915050565b600060208284031215612da657600080fd5b5051919050565b6020808252601c908201527f4572726f72207768696c6520747279696e6720746f2072656465656d00000000604082015260600190565b8082028115828204841417612d8e57612d8e612d65565b600082612e1857634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115612d8e57612d8e612d65565b634e487b7160e01b600052603260045260246000fd5b600060018201612e5857612e58612d65565b5060010190565b6000815480845260208085019450836000528060002060005b83811015612e9d5781546001600160a01b031687529582019560019182019101612e78565b509495945050505050565b6001600160a01b038316815260406020820181905260009061294690830184612e5f565b600060208284031215612ede57600080fd5b815161294981612bae565b6020815260006129496020830184612e5f565b8051612f0781612be0565b919050565b600060208284031215612f1e57600080fd5b815161294981612be0565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715612f6257612f62612f29565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612f9157612f91612f29565b604052919050565b60006020808385031215612fac57600080fd5b825167ffffffffffffffff80821115612fc457600080fd5b9084019060c08287031215612fd857600080fd5b612fe0612f3f565b825181528383015184820152604083015160408201526060830151606082015260808301518281111561301257600080fd5b8301601f8101881361302357600080fd5b80518381111561303557613035612f29565b613047601f8201601f19168701612f68565b9350808452888682840101111561305d57600080fd5b61306c81878601888501612c24565b505081608082015261308060a08401612efc565b60a08201529695505050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082516130ec818460208701612c24565b9190910192915050565b6020815260006129496020830184612c4856fea26469706673582212208b8d5a3013f67d72f48480ecf3b7fcec1f22fc77d3c3e4aa9cfcdf82ad3c24e764736f6c63430008130033
Deployed Bytecode
0x6080604052600436106102e85760003560e01c80638912cb8b11610190578063d0e30db0116100dc578063e941fa7811610095578063f2fde38b1161006f578063f2fde38b14610887578063f301af42146108a7578063fb617787146108c7578063fbfa77cf146108dc57600080fd5b8063e941fa781461083c578063e959c61f14610851578063f1a392da1461087157600080fd5b8063d0e30db0146107a8578063d801d946146107bd578063d92f3d73146107d2578063dfbdc437146107f2578063e5932c4014610807578063e7a7250a1461082757600080fd5b8063ac1e502511610149578063b1283e7711610123578063b1283e7714610731578063b20feaaf14610751578063c1a3d44c14610773578063c7b9d5301461078857600080fd5b8063ac1e5025146106dc578063aced1661146106fc578063ad29f5da1461071c57600080fd5b80638912cb8b1461063a5780638cfc0250146106545780638da5cb5b146106695780638e1454591461068757806397fd323d146106a7578063a68833e5146106bc57600080fd5b80634641257d1161024f5780635fe3b56711610208578063715018a6116101e2578063715018a6146105db578063722713f7146105f0578063748747e6146106055780638456cb591461062557600080fd5b80635fe3b5671461058757806367a52793146105a75780636817031b146105bb57600080fd5b80634641257d146104ee5780634700d305146105035780634746fb551461051857806354518b1a14610538578063573fef0a1461054e5780635c975abb1461056357600080fd5b80631fe4a686116102a15780631fe4a68614610439578063257ae0de146104595780632e1a7d4d146104795780633e55f932146104995780633f4ba83a146104b9578063408cfe24146104ce57600080fd5b80630e5c011e146103585780630e8fbb5a14610378578063106fdbd01461039857806311588086146103b857806311b0b42d146103e15780631f1fcd511461041957600080fd5b3661035357609e60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561033d57600080fd5b505af1158015610351573d6000803e3d6000fd5b005b600080fd5b34801561036457600080fd5b50610351610373366004612bc3565b6108fc565b34801561038457600080fd5b50610351610393366004612bee565b610908565b3480156103a457600080fd5b506103516103b3366004612bc3565b61093d565b3480156103c457600080fd5b506103ce60a65481565b6040519081526020015b60405180910390f35b3480156103ed57600080fd5b50609e54610401906001600160a01b031681565b6040516001600160a01b0390911681526020016103d8565b34801561042557600080fd5b50609f54610401906001600160a01b031681565b34801561044557600080fd5b50609a54610401906001600160a01b031681565b34801561046557600080fd5b50609854610401906001600160a01b031681565b34801561048557600080fd5b50610351610494366004612c0b565b61099a565b3480156104a557600080fd5b506103516104b4366004612c0b565b610bae565b3480156104c557600080fd5b50610351610c45565b3480156104da57600080fd5b5060a054610401906001600160a01b031681565b3480156104fa57600080fd5b50610351610c67565b34801561050f57600080fd5b50610351610c70565b34801561052457600080fd5b50609c54610401906001600160a01b031681565b34801561054457600080fd5b506103ce61271081565b34801561055a57600080fd5b50610351610d7e565b34801561056f57600080fd5b5060655460ff165b60405190151581526020016103d8565b34801561059357600080fd5b5060a254610401906001600160a01b031681565b3480156105b357600080fd5b5060006103ce565b3480156105c757600080fd5b506103516105d6366004612bc3565b610dc4565b3480156105e757600080fd5b50610351610e1a565b3480156105fc57600080fd5b506103ce610e2c565b34801561061157600080fd5b50610351610620366004612bc3565b610e48565b34801561063157600080fd5b50610351610e9e565b34801561064657600080fd5b5060a4546105779060ff1681565b34801561066057600080fd5b506103ce610eb6565b34801561067557600080fd5b506033546001600160a01b0316610401565b34801561069357600080fd5b50609b54610401906001600160a01b031681565b3480156106b357600080fd5b506103ce610f24565b3480156106c857600080fd5b506103516106d7366004612bc3565b611043565b3480156106e857600080fd5b506103516106f7366004612c0b565b611099565b34801561070857600080fd5b50609954610401906001600160a01b031681565b34801561072857600080fd5b50610351611110565b34801561073d57600080fd5b5061040161074c366004612c0b565b611182565b34801561075d57600080fd5b506107666111ac565b6040516103d89190612c74565b34801561077f57600080fd5b506103ce6111e2565b34801561079457600080fd5b506103516107a3366004612bc3565b611213565b3480156107b457600080fd5b506103516112a9565b3480156107c957600080fd5b50610351611372565b3480156107de57600080fd5b506103516107ed366004612bc3565b61137a565b3480156107fe57600080fd5b506103ce603281565b34801561081357600080fd5b50610351610822366004612bc3565b6113d0565b34801561083357600080fd5b506103ce6114d3565b34801561084857600080fd5b506103ce611585565b34801561085d57600080fd5b5061035161086c366004612cf1565b6115a4565b34801561087d57600080fd5b506103ce60a55481565b34801561089357600080fd5b506103516108a2366004612bc3565b6118e9565b3480156108b357600080fd5b506104016108c2366004612c0b565b61195f565b3480156108d357600080fd5b5061035161196f565b3480156108e857600080fd5b50609754610401906001600160a01b031681565b61090581611b84565b50565b610910611d1c565b60a4805460ff191682151590811790915560ff1615610933576109056000611099565b610905600a611099565b610945611d76565b609c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f91e28ce4210d103c13c5174847e463b836900f8dc63e9d9b42a4255169d19529906020015b60405180910390a150565b6097546001600160a01b031633146109cd5760405162461bcd60e51b81526004016109c490612d45565b60405180910390fd5b60006109d76111e2565b905081811015610af85760a0546000906001600160a01b031663852a12e36109ff8486612d7b565b6040518263ffffffff1660e01b8152600401610a1d91815260200190565b6020604051808303816000875af1158015610a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a609190612d94565b90508015610a805760405162461bcd60e51b81526004016109c490612dad565b610a88611dd0565b609f546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af49190612d94565b9150505b81811115610b035750805b6033546001600160a01b03163214801590610b21575060655460ff16155b15610b53576000612710609d5483610b399190612de4565b610b439190612dfb565b9050610b4f8183612d7b565b9150505b609754609f54610b70916001600160a01b03918216911683611e43565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d610b99610e2c565b60405190815260200160405180910390a15050565b610bb6611d1c565b609c54604051631f2afc9960e11b8152600481018390526001600160a01b0390911690633e55f93290602401600060405180830381600087803b158015610bfc57600080fd5b505af1158015610c10573d6000803e3d6000fd5b505050507f9163810ee1e29168d4ce900e48a333fb8fbd3fd070d2bef67f6d4db0846a469f8160405161098f91815260200190565b610c4d611d1c565b610c55611ea6565b610c5d611ef8565b610c656112a9565b565b610c6532611b84565b610c78611d1c565b60a0546040516370a0823160e01b81523060048201526000916001600160a01b03169063db006a759082906370a0823190602401602060405180830381865afa158015610cc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ced9190612d94565b6040518263ffffffff1660e01b8152600401610d0b91815260200190565b6020604051808303816000875af1158015610d2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4e9190612d94565b90508015610d6e5760405162461bcd60e51b81526004016109c490612dad565b610d76611dd0565b610905610e9e565b60a45460ff1615610dbc576097546001600160a01b03163314610db35760405162461bcd60e51b81526004016109c490612d45565b610dbc32611b84565b610c65611dd0565b610dcc611d76565b609780546001600160a01b0319166001600160a01b0383169081179091556040519081527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f309060200161098f565b610e22611d76565b610c656000611fc0565b600060a654610e396111e2565b610e439190612e1d565b905090565b610e50611d1c565b609980546001600160a01b0319166001600160a01b0383169081179091556040519081527fefb5cfa1a8690c124332ab93324539c5c9c4be03f28aeb8be86f2d8a0c9fb99b9060200161098f565b610ea6611d1c565b610eae612012565b610c6561204f565b609c54604051636788231160e11b81523060048201526000916001600160a01b03169063cf104622906024015b602060405180830381865afa158015610f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e439190612d94565b600080610f2f6120d0565b90506000610f3b6114d3565b905060008115610ff65760985460a180546001600160a01b0390921691634aa066529190600090610f6e57610f6e612e30565b600091825260209091200154609e5460405160e084901b6001600160e01b03191681526001600160a01b0392831660048201529116602482015260448101859052606401602060405180830381865afa158015610fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff39190612d94565b90505b670de0b6b3a76400008360400151670de0b6b3a764000085600001518461101d9190612de4565b6110279190612dfb565b6110319190612de4565b61103b9190612dfb565b935050505090565b61104b611d76565b609b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f8041329bf7057543a2c2ff4e4071d1d488a31f82ed44e169b5cd2f04f5e3ac859060200161098f565b6110a1611d1c565b60328111156110db5760405162461bcd60e51b81526004016109c4906020808252600490820152630216361760e41b604082015260600190565b609d8190556040518181527f3aa4413905e8f015896ec5880bdde24088ccb19b578f9fcf6800354d5320d4af9060200161098f565b611118611d1c565b60005b60a15481101561117557600060a1828154811061113a5761113a612e30565b60009182526020822001546098546001600160a01b0391821693506111649284929091169061217b565b5061116e81612e46565b905061111b565b50610c6560a16000612b1d565b60a3818154811061119257600080fd5b6000918252602090912001546001600160a01b0316905081565b6111b4612b3b565b60405180606001604052806111c76120d0565b8152602001600081526020016111db611585565b9052919050565b609f546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401610ee3565b609a546001600160a01b0316331461125b5760405162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b60448201526064016109c4565b609a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f46d58e3fa07bf19b1d27240f0e286b27e9f7c1b0d88933333fe833b60eec54129060200161098f565b6112b1612290565b60006112bb6111e2565b905080156109055760a05460405163140e25ad60e31b8152600481018390526001600160a01b039091169063a0712d68906024016020604051808303816000875af115801561130e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113329190612d94565b5061133b611dd0565b7f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e38426611364610e2c565b60405190815260200161098f565b610c67611d1c565b611382611d76565b609880546001600160a01b0319166001600160a01b0383169081179091556040519081527f5ca6e64c4522e68e154aa9372f2c5969cd37d9640e59f66953dc472f54ee86fa9060200161098f565b6113d8611d76565b609f546001600160a01b03908116908216036114255760405162461bcd60e51b815260206004820152600c60248201526b1c995dd85c990f4f5dd85b9d60a21b60448201526064016109c4565b60a0546001600160a01b03908116908216036114745760405162461bcd60e51b815260206004820152600e60248201526d3932bbb0b9321e9eb4aa37b5b2b760911b60448201526064016109c4565b60a180546001810182556000919091527faadc37b8ba5645e62f4546802db221593a94729ccbfc5a97d01365a88f6498780180546001600160a01b0319166001600160a01b03838116918217909255609854610905921660001961217b565b60a25460405162e1ed9760e51b81526000916001600160a01b031690631c3db2e09061150690309060a390600401612ea8565b600060405180830381600087803b15801561152057600080fd5b505af1158015611534573d6000803e3d6000fd5b5050505060a160008154811061154c5761154c612e30565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401610ee3565b600061159360655460ff1690565b61159e5750609d5490565b50600090565b600054610100900460ff16158080156115c45750600054600160ff909116105b806115de5750303b1580156115de575060005460ff166001145b6116415760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109c4565b6000805460ff191660011790558015611664576000805461ff0019166101001790555b61166d826122d6565b60a080546001600160a01b0386166001600160a01b0319918216811790925560a3805460018101825560009182527f60859188cffe297f44dde29f2d2865634621f26215049caeb304ccba566a8b17018054909216831790915560408051635fe3b56760e01b81529051635fe3b567926004808401936020939290839003909101908290875af1158015611705573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117299190612ecc565b60a260006101000a8154816001600160a01b0302191690836001600160a01b03160217905550836001600160a01b0316636f307dc36040518163ffffffff1660e01b81526004016020604051808303816000875af115801561178f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b39190612ecc565b609f80546001600160a01b039283166001600160a01b03199182161790915560a180546001810182556000919091527faadc37b8ba5645e62f4546802db221593a94729ccbfc5a97d01365a88f64987801805492861692821692909217909155609e805490911673e5d7c2a44ffddf6b295a15c148167daaaf5cf34f17905561183a611ef8565b60a254604051631853304760e31b81526001600160a01b039091169063c29982389061186b9060a390600401612ee9565b600060405180830381600087803b15801561188557600080fd5b505af1158015611899573d6000803e3d6000fd5b5050505080156118e3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6118f1611d76565b6001600160a01b0381166119565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109c4565b61090581611fc0565b60a1818154811061119257600080fd5b6097546001600160a01b031633146119995760405162461bcd60e51b81526004016109c490612d45565b60a0546040516370a0823160e01b81523060048201526000916001600160a01b03169063db006a759082906370a0823190602401602060405180830381865afa1580156119ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0e9190612d94565b6040518263ffffffff1660e01b8152600401611a2c91815260200190565b6020604051808303816000875af1158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f9190612d94565b90508015611a8f5760405162461bcd60e51b81526004016109c490612dad565b611a97611dd0565b609f546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b049190612d94565b609f5460975460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303816000875af1158015611b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7f9190612f0c565b505050565b611b8c612290565b6000611b966111e2565b60a25460405162e1ed9760e51b81529192506001600160a01b031690631c3db2e090611bc990309060a390600401612ea8565b600060405180830381600087803b158015611be357600080fd5b505af1158015611bf7573d6000803e3d6000fd5b50505050611c03612432565b609e546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c709190612d94565b609e54609f549192506001600160a01b03908116911603611c9857611c958282612d7b565b90505b8015611b7f57611ca88382612569565b611cb06126af565b600082611cbb6111e2565b611cc59190612d7b565b9050611ccf6112a9565b4260a555337f9bc239f1724cacfb88cb1d66a2dc437467699b68a8c90d7b63110cf4b6f9241082611cfe610e2c565b6040805192835260208301919091520160405180910390a250505050565b6033546001600160a01b0316331480611d3f57506099546001600160a01b031633145b610c655760405162461bcd60e51b815260206004820152600860248201526710b6b0b730b3b2b960c11b60448201526064016109c4565b6033546001600160a01b03163314610c655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c4565b60a054604051633af9e66960e01b81523060048201526001600160a01b0390911690633af9e669906024016020604051808303816000875af1158015611e1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3e9190612d94565b60a655565b6040516001600160a01b038316602482015260448101829052611b7f90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526127be565b611eae612890565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60a054609f54611f17916001600160a01b03918216911660001961217b565b609854609e54611f36916001600160a01b03918216911660001961217b565b60005b60a1548110156109055760985460a18054611f87926001600160a01b03169160009185908110611f6b57611f6b612e30565b6000918252602090912001546001600160a01b0316919061217b565b60985460a18054611fb0926001600160a01b0316916000199185908110611f6b57611f6b612e30565b611fb981612e46565b9050611f39565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61201a612290565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611edb3390565b60a054609f5461206d916001600160a01b039182169116600061217b565b609854609e5461208b916001600160a01b039182169116600061217b565b60005b60a1548110156109055760985460a180546120c0926001600160a01b03169160009185908110611f6b57611f6b612e30565b6120c981612e46565b905061208e565b61210b6040518060c0016040528060008152602001600081526020016000815260200160008152602001606081526020016000151581525090565b609c54604051639af608c960e01b81523060048201526001600160a01b0390911690639af608c990602401600060405180830381865afa158015612153573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e439190810190612f99565b8015806121f55750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156121cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f39190612d94565b155b6122605760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016109c4565b6040516001600160a01b038316602482015260448101829052611b7f90849063095ea7b360e01b90606401611e6f565b60655460ff1615610c655760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016109c4565b600054610100900460ff166122fd5760405162461bcd60e51b81526004016109c49061308f565b6123056128d9565b61230d612908565b61231a6020820182612bc3565b609780546001600160a01b0319166001600160a01b039290921691909117905561234a6040820160208301612bc3565b609880546001600160a01b0319166001600160a01b039290921691909117905561237a6060820160408301612bc3565b609980546001600160a01b0319166001600160a01b03929092169190911790556123aa6080820160608301612bc3565b609a80546001600160a01b0319166001600160a01b03929092169190911790556123da60a0820160808301612bc3565b609b80546001600160a01b0319166001600160a01b039290921691909117905561240a60c0820160a08301612bc3565b609c80546001600160a01b0319166001600160a01b039290921691909117905550600a609d55565b60005b60a15481101561090557600060a1828154811061245457612454612e30565b60009182526020822001546040516370a0823160e01b81523060048201526001600160a01b03909116925082906370a0823190602401602060405180830381865afa1580156124a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cb9190612d94565b9050801561255657609854609e54604051630df791e560e41b81526001600160a01b03858116600483015291821660248201526044810184905291169063df791e50906064016020604051808303816000875af1158015612530573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125549190612d94565b505b50508061256290612e46565b9050612435565b60006125736120d0565b90506000670de0b6b3a76400008260000151846125909190612de4565b61259a9190612dfb565b90506000670de0b6b3a76400008360400151836125b79190612de4565b6125c19190612dfb565b609e549091506125db906001600160a01b03168683611e43565b6000670de0b6b3a76400008460200151846125f69190612de4565b6126009190612dfb565b609b54609e54919250612620916001600160a01b03908116911683611e43565b6000670de0b6b3a764000085606001518561263b9190612de4565b6126459190612dfb565b609a54609e54919250612665916001600160a01b03908116911683611e43565b60408051848152602081018490529081018290527fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a9060600160405180910390a150505050505050565b609e54609f546001600160a01b03908116911614610c6557609e546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612710573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127349190612d94565b609854609e54609f54604051630df791e560e41b81526001600160a01b039283166004820152908216602482015260448101849052929350169063df791e50906064016020604051808303816000875af1158015612796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ba9190612d94565b5050565b6000612813826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129379092919063ffffffff16565b805190915015611b7f57808060200190518101906128319190612f0c565b611b7f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109c4565b60655460ff16610c655760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016109c4565b600054610100900460ff166129005760405162461bcd60e51b81526004016109c49061308f565b610c65612950565b600054610100900460ff1661292f5760405162461bcd60e51b81526004016109c49061308f565b610c65612980565b606061294684846000856129b3565b90505b9392505050565b600054610100900460ff166129775760405162461bcd60e51b81526004016109c49061308f565b610c6533611fc0565b600054610100900460ff166129a75760405162461bcd60e51b81526004016109c49061308f565b6065805460ff19169055565b606082471015612a145760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109c4565b6001600160a01b0385163b612a6b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109c4565b600080866001600160a01b03168587604051612a8791906130da565b60006040518083038185875af1925050503d8060008114612ac4576040519150601f19603f3d011682016040523d82523d6000602084013e612ac9565b606091505b5091509150612ad9828286612ae4565b979650505050505050565b60608315612af3575081612949565b825115612b035782518084602001fd5b8160405162461bcd60e51b81526004016109c491906130f6565b50805460008255906000526020600020908101906109059190612b95565b6040518060600160405280612b816040518060c0016040528060008152602001600081526020016000815260200160008152602001606081526020016000151581525090565b815260200160008152602001600081525090565b5b80821115612baa5760008155600101612b96565b5090565b6001600160a01b038116811461090557600080fd5b600060208284031215612bd557600080fd5b813561294981612bae565b801515811461090557600080fd5b600060208284031215612c0057600080fd5b813561294981612be0565b600060208284031215612c1d57600080fd5b5035919050565b60005b83811015612c3f578181015183820152602001612c27565b50506000910152565b60008151808452612c60816020860160208601612c24565b601f01601f19169290920160200192915050565b60208152600082516060602084015280516080840152602081015160a0840152604081015160c0840152606081015160e0840152608081015160c0610100850152612cc3610140850182612c48565b905060a082015115156101208501526020850151604085015260408501516060850152809250505092915050565b6000806000838503610100811215612d0857600080fd5b8435612d1381612bae565b93506020850135612d2381612bae565b925060c0603f1982011215612d3757600080fd5b506040840190509250925092565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115612d8e57612d8e612d65565b92915050565b600060208284031215612da657600080fd5b5051919050565b6020808252601c908201527f4572726f72207768696c6520747279696e6720746f2072656465656d00000000604082015260600190565b8082028115828204841417612d8e57612d8e612d65565b600082612e1857634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115612d8e57612d8e612d65565b634e487b7160e01b600052603260045260246000fd5b600060018201612e5857612e58612d65565b5060010190565b6000815480845260208085019450836000528060002060005b83811015612e9d5781546001600160a01b031687529582019560019182019101612e78565b509495945050505050565b6001600160a01b038316815260406020820181905260009061294690830184612e5f565b600060208284031215612ede57600080fd5b815161294981612bae565b6020815260006129496020830184612e5f565b8051612f0781612be0565b919050565b600060208284031215612f1e57600080fd5b815161294981612be0565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715612f6257612f62612f29565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612f9157612f91612f29565b604052919050565b60006020808385031215612fac57600080fd5b825167ffffffffffffffff80821115612fc457600080fd5b9084019060c08287031215612fd857600080fd5b612fe0612f3f565b825181528383015184820152604083015160408201526060830151606082015260808301518281111561301257600080fd5b8301601f8101881361302357600080fd5b80518381111561303557613035612f29565b613047601f8201601f19168701612f68565b9350808452888682840101111561305d57600080fd5b61306c81878601888501612c24565b505081608082015261308060a08401612efc565b60a08201529695505050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082516130ec818460208701612c24565b9190910192915050565b6020815260006129496020830184612c4856fea26469706673582212208b8d5a3013f67d72f48480ecf3b7fcec1f22fc77d3c3e4aa9cfcdf82ad3c24e764736f6c63430008130033
Deployed Bytecode Sourcemap
64673:8631:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73258:6;;;;;;;;;-1:-1:-1;;;;;73258:6:0;-1:-1:-1;;;;;73243:30:0;;73281:9;73243:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64673:8631;;;;67308:105;;;;;;;;;;-1:-1:-1;67308:105:0;;;;;:::i;:::-;;:::i;70721:274::-;;;;;;;;;;-1:-1:-1;70721:274:0;;;;;:::i;:::-;;:::i;29460:184::-;;;;;;;;;;-1:-1:-1;29460:184:0;;;;;:::i;:::-;;:::i;65069:28::-;;;;;;;;;;;;;;;;;;;917:25:1;;;905:2;890:18;65069:28:0;;;;;;;;64790:21;;;;;;;;;;-1:-1:-1;64790:21:0;;;;-1:-1:-1;;;;;64790:21:0;;;;;;-1:-1:-1;;;;;1117:32:1;;;1099:51;;1087:2;1072:18;64790:21:0;953:203:1;64818:19:0;;;;;;;;;;-1:-1:-1;64818:19:0;;;;-1:-1:-1;;;;;64818:19:0;;;25972:25;;;;;;;;;;-1:-1:-1;25972:25:0;;;;-1:-1:-1;;;;;25972:25:0;;;25913:24;;;;;;;;;;-1:-1:-1;25913:24:0;;;;-1:-1:-1;;;;;25913:24:0;;;66201:800;;;;;;;;;;-1:-1:-1;66201:800:0;;;;;:::i;:::-;;:::i;27981:152::-;;;;;;;;;;-1:-1:-1;27981:152:0;;;;;:::i;:::-;;:::i;71903:121::-;;;;;;;;;;;;;:::i;64844:21::-;;;;;;;;;;-1:-1:-1;64844:21:0;;;;-1:-1:-1;;;;;64844:21:0;;;67226:74;;;;;;;;;;;;;:::i;71556:236::-;;;;;;;;;;;;;:::i;26043:32::-;;;;;;;;;;-1:-1:-1;26043:32:0;;;;-1:-1:-1;;;;;26043:32:0;;;26179:46;;;;;;;;;;;;26220:5;26179:46;;67009:209;;;;;;;;;;;;;:::i;24146:86::-;;;;;;;;;;-1:-1:-1;24217:7:0;;;;24146:86;;;1736:14:1;;1729:22;1711:41;;1699:2;1684:18;24146:86:0;1571:187:1;64935:26:0;;;;;;;;;;-1:-1:-1;64935:26:0;;;;-1:-1:-1;;;;;64935:26:0;;;29652:87;;;;;;;;;;-1:-1:-1;29703:7:0;29652:87;;28420:118;;;;;;;;;;-1:-1:-1;28420:118:0;;;;;:::i;:::-;;:::i;21134:103::-;;;;;;;;;;;;;:::i;69728:108::-;;;;;;;;;;;;;:::i;28761:126::-;;;;;;;;;;-1:-1:-1;28761:126:0;;;;;:::i;:::-;;:::i;71800:95::-;;;;;;;;;;;;;:::i;65001:28::-;;;;;;;;;;-1:-1:-1;65001:28:0;;;;;;;;27850:123;;;;;;;;;;;;;:::i;20493:87::-;;;;;;;;;;-1:-1:-1;20566:6:0;;-1:-1:-1;;;;;20566:6:0;20493:87;;26004:32;;;;;;;;;;-1:-1:-1;26004:32:0;;;;-1:-1:-1;;;;;26004:32:0;;;70314:399;;;;;;;;;;;;;:::i;29213:190::-;;;;;;;;;;-1:-1:-1;29213:190:0;;;;;:::i;:::-;;:::i;28171:::-;;;;;;;;;;-1:-1:-1;28171:190:0;;;;;:::i;:::-;;:::i;25944:21::-;;;;;;;;;;-1:-1:-1;25944:21:0;;;;-1:-1:-1;;;;;25944:21:0;;;72960:237;;;;;;;;;;;;;:::i;64968:24::-;;;;;;;;;;-1:-1:-1;64968:24:0;;;;;:::i;:::-;;:::i;27686:156::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;69903:118::-;;;;;;;;;;;;;:::i;28952:197::-;;;;;;;;;;-1:-1:-1;28952:197:0;;;;;:::i;:::-;;:::i;65945:248::-;;;;;;;;;;;;;:::i;67421:85::-;;;;;;;;;;;;;:::i;28572:142::-;;;;;;;;;;-1:-1:-1;28572:142:0;;;;;:::i;:::-;;:::i;26125:47::-;;;;;;;;;;;;26170:2;26125:47;;72681:271;;;;;;;;;;-1:-1:-1;72681:271:0;;;;;:::i;:::-;;:::i;70065:192::-;;;;;;;;;;;;;:::i;29747:115::-;;;;;;;;;;;;;:::i;65348:558::-;;;;;;;;;;-1:-1:-1;65348:558:0;;;;;:::i;:::-;;:::i;65036:26::-;;;;;;;;;;;;;;;;21392:201;;;;;;;;;;-1:-1:-1;21392:201:0;;;;;:::i;:::-;;:::i;64872:24::-;;;;;;;;;;-1:-1:-1;64872:24:0;;;;;:::i;:::-;;:::i;71095:379::-;;;;;;;;;;;;;:::i;25886:20::-;;;;;;;;;;-1:-1:-1;25886:20:0;;;;-1:-1:-1;;;;;25886:20:0;;;67308:105;67379:26;67388:16;67379:8;:26::i;:::-;67308:105;:::o;70721:274::-;27253:15;:13;:15::i;:::-;70806:16:::1;:36:::0;;-1:-1:-1;;70806:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;::::1;70859:16:::0;70855:133:::1;;;70892:25;70915:1;70892:22;:25::i;70855:133::-;70950:26;70973:2;70950:22;:26::i;29460:184::-:0;20379:13;:11;:13::i;:::-;29542:14:::1;:44:::0;;-1:-1:-1;;;;;;29542:44:0::1;-1:-1:-1::0;;;;;29542:44:0;::::1;::::0;;::::1;::::0;;;29602:34:::1;::::0;1099:51:1;;;29602:34:0::1;::::0;1087:2:1;1072:18;29602:34:0::1;;;;;;;;29460:184:::0;:::o;66201:800::-;66278:5;;-1:-1:-1;;;;;66278:5:0;66264:10;:19;66256:38;;;;-1:-1:-1;;;66256:38:0;;;;;;;:::i;:::-;;;;;;;;;66307:15;66325;:13;:15::i;:::-;66307:33;;66367:7;66357;:17;66353:269;;;66410:6;;66391:8;;-1:-1:-1;;;;;66410:6:0;66402:32;66435:17;66445:7;66435;:17;:::i;:::-;66402:51;;;;;;;;;;;;;917:25:1;;905:2;890:18;;771:177;66402:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66391:62;-1:-1:-1;66476:8:0;;66468:49;;;;-1:-1:-1;;;66468:49:0;;;;;;;:::i;:::-;66532:16;:14;:16::i;:::-;66580:4;;66573:37;;-1:-1:-1;;;66573:37:0;;66604:4;66573:37;;;1099:51:1;-1:-1:-1;;;;;66580:4:0;;;;66573:22;;1072:18:1;;66573:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66563:47;;66376:246;66353:269;66648:7;66638;:17;66634:67;;;-1:-1:-1;66682:7:0;66634:67;20566:6;;-1:-1:-1;;;;;20566:6:0;66717:9;:20;;;;:33;;-1:-1:-1;24217:7:0;;;;66741:9;66717:33;66713:190;;;66767:27;26220:5;66807:13;;66797:7;:23;;;;:::i;:::-;:40;;;;:::i;:::-;66767:70;-1:-1:-1;66862:29:0;66767:70;66862:7;:29;:::i;:::-;66852:39;;66752:151;66713:190;66941:5;;66922:4;;66915:41;;-1:-1:-1;;;;;66922:4:0;;;;66941:5;66948:7;66915:25;:41::i;:::-;66972:21;66981:11;:9;:11::i;:::-;66972:21;;917:25:1;;;905:2;890:18;66972:21:0;;;;;;;66245:756;66201:800;:::o;27981:152::-;27253:15;:13;:15::i;:::-;28052:14:::1;::::0;:36:::1;::::0;-1:-1:-1;;;28052:36:0;;::::1;::::0;::::1;917:25:1::0;;;-1:-1:-1;;;;;28052:14:0;;::::1;::::0;:28:::1;::::0;890:18:1;;28052:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28104:21;28118:6;28104:21;;;;917:25:1::0;;905:2;890:18;;771:177;71903:121:0;27253:15;:13;:15::i;:::-;71954:10:::1;:8;:10::i;:::-;71977:17;:15;:17::i;:::-;72007:9;:7;:9::i;:::-;71903:121::o:0;67226:74::-;67273:19;67282:9;67273:8;:19::i;71556:236::-;27253:15;:13;:15::i;:::-;71622:6:::1;::::0;71637:39:::1;::::0;-1:-1:-1;;;71637:39:0;;71670:4:::1;71637:39;::::0;::::1;1099:51:1::0;71603:8:0::1;::::0;-1:-1:-1;;;;;71622:6:0::1;::::0;71614:22:::1;::::0;71622:6;;71637:24:::1;::::0;1072:18:1;;71637:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71614:63;;;;;;;;;;;;;917:25:1::0;;905:2;890:18;;771:177;71614:63:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71603:74:::0;-1:-1:-1;71696:8:0;;71688:49:::1;;;;-1:-1:-1::0;;;71688:49:0::1;;;;;;;:::i;:::-;71748:16;:14;:16::i;:::-;71777:7;:5;:7::i;67009:209::-:0;67067:16;;;;67063:121;;;67122:5;;-1:-1:-1;;;;;67122:5:0;67108:10;:19;67100:38;;;;-1:-1:-1;;;67100:38:0;;;;;;;:::i;:::-;67153:19;67162:9;67153:8;:19::i;:::-;67194:16;:14;:16::i;28420:118::-;20379:13;:11;:13::i;:::-;28484:5:::1;:14:::0;;-1:-1:-1;;;;;;28484:14:0::1;-1:-1:-1::0;;;;;28484:14:0;::::1;::::0;;::::1;::::0;;;28514:16:::1;::::0;1099:51:1;;;28514:16:0::1;::::0;1087:2:1;1072:18;28514:16:0::1;953:203:1::0;21134:103:0;20379:13;:11;:13::i;:::-;21199:30:::1;21226:1;21199:18;:30::i;69728:108::-:0;69770:7;69815:13;;69797:15;:13;:15::i;:::-;:31;;;;:::i;:::-;69790:38;;69728:108;:::o;28761:126::-;27253:15;:13;:15::i;:::-;28829:6:::1;:16:::0;;-1:-1:-1;;;;;;28829:16:0::1;-1:-1:-1::0;;;;;28829:16:0;::::1;::::0;;::::1;::::0;;;28861:18:::1;::::0;1099:51:1;;;28861:18:0::1;::::0;1087:2:1;1072:18;28861::0::1;953:203:1::0;71800:95:0;27253:15;:13;:15::i;:::-;71847:8:::1;:6;:8::i;:::-;71868:19;:17;:19::i;27850:123::-:0;27925:14;;:40;;-1:-1:-1;;;27925:40:0;;27959:4;27925:40;;;1099:51:1;27898:7:0;;-1:-1:-1;;;;;27925:14:0;;:25;;1072:18:1;;27925:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;70314:399::-;70352:7;70372:34;70409:9;:7;:9::i;:::-;70372:46;;70429:17;70449:18;:16;:18::i;:::-;70429:38;-1:-1:-1;70478:17:0;70510:13;;70506:126;;70566:9;;70590:7;:10;;-1:-1:-1;;;;;70566:9:0;;;;70552:37;;70590:7;70566:9;;70590:10;;;;:::i;:::-;;;;;;;;;;;70602:6;;70552:68;;;;;;-1:-1:-1;;;;;;70552:68:0;;;-1:-1:-1;;;;;70590:10:0;;;70552:68;;;5835:34:1;70602:6:0;;5885:18:1;;;5878:43;5937:18;;;5930:34;;;5770:18;;70552:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70540:80;;70506:126;26111:7;70686:4;:9;;;26111:7;70663:4;:10;;;70651:9;:22;;;;:::i;:::-;:32;;;;:::i;:::-;:44;;;;:::i;:::-;:54;;;;:::i;:::-;70644:61;;;;;70314:399;:::o;29213:190::-;20379:13;:11;:13::i;:::-;29301:17:::1;:38:::0;;-1:-1:-1;;;;;;29301:38:0::1;-1:-1:-1::0;;;;;29301:38:0;::::1;::::0;;::::1;::::0;;;29355:40:::1;::::0;1099:51:1;;;29355:40:0::1;::::0;1087:2:1;1072:18;29355:40:0::1;953:203:1::0;28171:190:0;27253:15;:13;:15::i;:::-;26170:2:::1;28249:4;:26;;28241:43;;;;-1:-1:-1::0;;;28241:43:0::1;;;;;;6177:2:1::0;6159:21;;;6216:1;6196:18;;;6189:29;-1:-1:-1;;;6249:2:1;6234:18;;6227:34;6293:2;6278:18;;5975:327;28241:43:0::1;28295:13;:20:::0;;;28331:22:::1;::::0;917:25:1;;;28331:22:0::1;::::0;905:2:1;890:18;28331:22:0::1;771:177:1::0;72960:237:0;27253:15;:13;:15::i;:::-;73021:6:::1;73016:147;73033:7;:14:::0;73029:18;::::1;73016:147;;;73069:14;73086:7;73094:1;73086:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;73138:9:::1;::::0;-1:-1:-1;;;;;73086:10:0;;::::1;::::0;-1:-1:-1;73111:40:0::1;::::0;73086:10;;73138:9;;::::1;::::0;73111:26:::1;:40::i;:::-;-1:-1:-1::0;73049:3:0::1;::::0;::::1;:::i;:::-;;;73016:147;;;-1:-1:-1::0;73175:14:0::1;73182:7;;73175:14;:::i;64968:24::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64968:24:0;;-1:-1:-1;64968:24:0;:::o;27686:156::-;27731:25;;:::i;:::-;27776:58;;;;;;;;27795:9;:7;:9::i;:::-;27776:58;;;;29703:7;27776:58;;;;27820:13;:11;:13::i;:::-;27776:58;;27769:65;27686:156;-1:-1:-1;27686:156:0:o;69903:118::-;69983:4;;69976:37;;-1:-1:-1;;;69976:37:0;;70007:4;69976:37;;;1099:51:1;69949:7:0;;-1:-1:-1;;;;;69983:4:0;;69976:22;;1072:18:1;;69976:37:0;953:203:1;28952:197:0;29038:10;;-1:-1:-1;;;;;29038:10:0;29024;:24;29016:48;;;;-1:-1:-1;;;29016:48:0;;6649:2:1;29016:48:0;;;6631:21:1;6688:2;6668:18;;;6661:30;-1:-1:-1;;;6707:18:1;;;6700:41;6758:18;;29016:48:0;6447:335:1;29016:48:0;29075:10;:24;;-1:-1:-1;;;;;;29075:24:0;-1:-1:-1;;;;;29075:24:0;;;;;;;;29115:26;;1099:51:1;;;29115:26:0;;1087:2:1;1072:18;29115:26:0;953:203:1;65945:248:0;23751:19;:17;:19::i;:::-;65996:15:::1;66014;:13;:15::i;:::-;65996:33:::0;-1:-1:-1;66046:11:0;;66042:144:::1;;66082:6;::::0;66074:29:::1;::::0;-1:-1:-1;;;66074:29:0;;::::1;::::0;::::1;917:25:1::0;;;-1:-1:-1;;;;;66082:6:0;;::::1;::::0;66074:20:::1;::::0;890:18:1;;66074:29:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;66118:16;:14;:16::i;:::-;66154:20;66162:11;:9;:11::i;:::-;66154:20;::::0;917:25:1;;;905:2;890:18;66154:20:0::1;771:177:1::0;67421:85:0;27253:15;:13;:15::i;28572:142::-;20379:13;:11;:13::i;:::-;28644:9:::1;:22:::0;;-1:-1:-1;;;;;;28644:22:0::1;-1:-1:-1::0;;;;;28644:22:0;::::1;::::0;;::::1;::::0;;;28682:24:::1;::::0;1099:51:1;;;28682:24:0::1;::::0;1087:2:1;1072:18;28682:24:0::1;953:203:1::0;72681:271:0;20379:13;:11;:13::i;:::-;72766:4:::1;::::0;-1:-1:-1;;;;;72766:4:0;;::::1;72755:15:::0;;::::1;::::0;72747:40:::1;;;::::0;-1:-1:-1;;;72747:40:0;;6989:2:1;72747:40:0::1;::::0;::::1;6971:21:1::0;7028:2;7008:18;;;7001:30;-1:-1:-1;;;7047:18:1;;;7040:42;7099:18;;72747:40:0::1;6787:336:1::0;72747:40:0::1;72817:6;::::0;-1:-1:-1;;;;;72817:6:0;;::::1;72806:17:::0;;::::1;::::0;72798:44:::1;;;::::0;-1:-1:-1;;;72798:44:0;;7330:2:1;72798:44:0::1;::::0;::::1;7312:21:1::0;7369:2;7349:18;;;7342:30;-1:-1:-1;;;7388:18:1;;;7381:44;7442:18;;72798:44:0::1;7128:338:1::0;72798:44:0::1;72855:7;:21:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;72855:21:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;72855:21:0::1;-1:-1:-1::0;;;;;72855:21:0;;::::1;::::0;;::::1;::::0;;;72915:9:::1;::::0;72887:57:::1;::::0;72915:9:::1;-1:-1:-1::0;;72887:27:0::1;:57::i;70065:192::-:0;70142:11;;70129:59;;-1:-1:-1;;;70129:59:0;;70109:7;;-1:-1:-1;;;;;70142:11:0;;70129:35;;:59;;70173:4;;70180:7;;70129:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70213:7;70221:1;70213:10;;;;;;;;:::i;:::-;;;;;;;;;;;70206:43;;-1:-1:-1;;;70206:43:0;;70243:4;70206:43;;;1099:51:1;-1:-1:-1;;;;;70213:10:0;;;;70206:28;;1072:18:1;;70206:43:0;953:203:1;29747:115:0;29799:7;29826:8;24217:7;;;;;24146:86;29826:8;:28;;-1:-1:-1;29841:13:0;;;69728:108::o;29826:28::-;-1:-1:-1;29837:1:0;;29747:115::o;65348:558::-;14197:19;14220:13;;;;;;14219:14;;14267:34;;;;-1:-1:-1;14285:12:0;;14300:1;14285:12;;;;:16;14267:34;14266:108;;;-1:-1:-1;14346:4:0;2963:19;:23;;;14307:66;;-1:-1:-1;14356:12:0;;;;;:17;14307:66;14244:204;;;;-1:-1:-1;;;14244:204:0;;8541:2:1;14244:204:0;;;8523:21:1;8580:2;8560:18;;;8553:30;8619:34;8599:18;;;8592:62;-1:-1:-1;;;8670:18:1;;;8663:44;8724:19;;14244:204:0;8339:410:1;14244:204:0;14459:12;:16;;-1:-1:-1;;14459:16:0;14474:1;14459:16;;;14486:67;;;;14521:13;:20;;-1:-1:-1;;14521:20:0;;;;;14486:67;65511:40:::1;65534:16;65511:22;:40::i;:::-;65564:6;:16:::0;;-1:-1:-1;;;;;65564:16:0;::::1;-1:-1:-1::0;;;;;;65564:16:0;;::::1;::::0;::::1;::::0;;;65591:7:::1;:21:::0;;65564:16;65591:21;::::1;::::0;;65564:6:::1;65591:21:::0;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;65637:30:::1;::::0;;-1:-1:-1;;;65637:30:0;;;;:28:::1;::::0;:30:::1;::::0;;::::1;::::0;65591:21:::1;::::0;65637:30;;;;;;;;;;;65564:16;65637:30:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65623:11;;:44;;;;;-1:-1:-1::0;;;;;65623:44:0::1;;;;;-1:-1:-1::0;;;;;65623:44:0::1;;;;;;65693:7;-1:-1:-1::0;;;;;65685:27:0::1;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65678:4;:36:::0;;-1:-1:-1;;;;;65678:36:0;;::::1;-1:-1:-1::0;;;;;;65678:36:0;;::::1;;::::0;;;65727:7:::1;:21:::0;;65678:36;65727:21;::::1;::::0;;65678:4:::1;65727:21:::0;;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;65759:6:::1;:51:::0;;;;::::1;65768:42;65759:51;::::0;;65823:17:::1;:15;:17::i;:::-;65864:11;::::0;65851:47:::1;::::0;-1:-1:-1;;;65851:47:0;;-1:-1:-1;;;;;65864:11:0;;::::1;::::0;65851:38:::1;::::0;:47:::1;::::0;65890:7:::1;::::0;65851:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;14579:14:::0;14575:102;;;14626:5;14610:21;;-1:-1:-1;;14610:21:0;;;14651:14;;-1:-1:-1;9433:36:1;;14651:14:0;;9421:2:1;9406:18;14651:14:0;;;;;;;14575:102;14186:498;65348:558;;;:::o;21392:201::-;20379:13;:11;:13::i;:::-;-1:-1:-1;;;;;21481:22:0;::::1;21473:73;;;::::0;-1:-1:-1;;;21473:73:0;;9682:2:1;21473:73:0::1;::::0;::::1;9664:21:1::0;9721:2;9701:18;;;9694:30;9760:34;9740:18;;;9733:62;-1:-1:-1;;;9811:18:1;;;9804:36;9857:19;;21473:73:0::1;9480:402:1::0;21473:73:0::1;21557:28;21576:8;21557:18;:28::i;64872:24::-:0;;;;;;;;;;;;71095:379;71160:5;;-1:-1:-1;;;;;71160:5:0;71146:10;:19;71138:38;;;;-1:-1:-1;;;71138:38:0;;;;;;;:::i;:::-;71208:6;;71223:39;;-1:-1:-1;;;71223:39:0;;71256:4;71223:39;;;1099:51:1;71189:8:0;;-1:-1:-1;;;;;71208:6:0;;71200:22;;71208:6;;71223:24;;1072:18:1;;71223:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71200:63;;;;;;;;;;;;;917:25:1;;905:2;890:18;;771:177;71200:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71189:74;-1:-1:-1;71282:8:0;;71274:49;;;;-1:-1:-1;;;71274:49:0;;;;;;;:::i;:::-;71334:16;:14;:16::i;:::-;71388:4;;71381:37;;-1:-1:-1;;;71381:37:0;;71412:4;71381:37;;;1099:51:1;71363:15:0;;-1:-1:-1;;;;;71388:4:0;;71381:22;;1072:18:1;;71381:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71436:4;;71451:5;;71429:37;;-1:-1:-1;;;71429:37:0;;-1:-1:-1;;;;;71451:5:0;;;71429:37;;;10061:51:1;10128:18;;;10121:34;;;71363:55:0;;-1:-1:-1;71436:4:0;;71429:21;;10034:18:1;;71429:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;71127:347;;71095:379::o;67569:671::-;23751:19;:17;:19::i;:::-;67647:17:::1;67667:15;:13;:15::i;:::-;67706:11;::::0;67693:59:::1;::::0;-1:-1:-1;;;67693:59:0;;67647:35;;-1:-1:-1;;;;;;67706:11:0::1;::::0;67693:35:::1;::::0;:59:::1;::::0;67737:4:::1;::::0;67744:7:::1;::::0;67693:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;67763:15;:13;:15::i;:::-;67816:6;::::0;67809:39:::1;::::0;-1:-1:-1;;;67809:39:0;;67842:4:::1;67809:39;::::0;::::1;1099:51:1::0;67789:17:0::1;::::0;-1:-1:-1;;;;;67816:6:0::1;::::0;67809:24:::1;::::0;1072:18:1;;67809:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67871:6;::::0;67863:4:::1;::::0;67789:59;;-1:-1:-1;;;;;;67871:6:0;;::::1;67863:4:::0;::::1;:14:::0;67859:42:::1;;67879:22;67892:9:::0;67879:22;::::1;:::i;:::-;;;67859:42;67916:13:::0;;67912:321:::1;;67946:39;67957:16;67975:9;67946:10;:39::i;:::-;68000:13;:11;:13::i;:::-;68028:21;68070:9;68052:15;:13;:15::i;:::-;:27;;;;:::i;:::-;68028:51;;68094:9;:7;:9::i;:::-;68134:15;68120:11;:29:::0;68182:10:::1;68169:52;68194:13:::0;68209:11:::1;:9;:11::i;:::-;68169:52;::::0;;10727:25:1;;;10783:2;10768:18;;10761:34;;;;10700:18;68169:52:0::1;;;;;;;67931:302;67636:604;;67569:671:::0;:::o;27296:124::-;20566:6;;-1:-1:-1;;;;;20566:6:0;27354:10;:21;;:45;;-1:-1:-1;27393:6:0;;-1:-1:-1;;;;;27393:6:0;27379:10;:20;27354:45;27346:66;;;;-1:-1:-1;;;27346:66:0;;11008:2:1;27346:66:0;;;10990:21:1;11047:1;11027:18;;;11020:29;-1:-1:-1;;;11065:18:1;;;11058:38;11113:18;;27346:66:0;10806:331:1;20658:132:0;20566:6;;-1:-1:-1;;;;;20566:6:0;18605:10;20722:23;20714:68;;;;-1:-1:-1;;;20714:68:0;;11344:2:1;20714:68:0;;;11326:21:1;;;11363:18;;;11356:30;11422:34;11402:18;;;11395:62;11474:18;;20714:68:0;11142:356:1;69534:120:0;69604:6;;69596:50;;-1:-1:-1;;;69596:50:0;;69640:4;69596:50;;;1099:51:1;-1:-1:-1;;;;;69604:6:0;;;;69596:35;;1072:18:1;;69596:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69580:13;:66;69534:120::o;60779:211::-;60923:58;;-1:-1:-1;;;;;10079:32:1;;60923:58:0;;;10061:51:1;10128:18;;;10121:34;;;60896:86:0;;60916:5;;-1:-1:-1;;;60946:23:0;10034:18:1;;60923:58:0;;;;-1:-1:-1;;60923:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;60923:58:0;-1:-1:-1;;;;;;60923:58:0;;;;;;;;;;60896:19;:86::i;25001:120::-;24010:16;:14;:16::i;:::-;25060:7:::1;:15:::0;;-1:-1:-1;;25060:15:0::1;::::0;;25091:22:::1;18605:10:::0;25100:12:::1;25091:22;::::0;-1:-1:-1;;;;;1117:32:1;;;1099:51;;1087:2;1072:18;25091:22:0::1;;;;;;;25001:120::o:0;72032:369::-;72104:6;;72086:4;;72079:51;;-1:-1:-1;;;;;72086:4:0;;;;72104:6;-1:-1:-1;;72079:24:0;:51::i;:::-;72168:9;;72148:6;;72141:56;;-1:-1:-1;;;;;72148:6:0;;;;72168:9;-1:-1:-1;;72141:26:0;:56::i;:::-;72215:6;72210:184;72227:7;:14;72223:18;;72210:184;;;72294:9;;72270:7;:10;;72263:44;;-1:-1:-1;;;;;72294:9:0;;;;72278:1;;72270:10;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;72270:10:0;;72263:44;:30;:44::i;:::-;72353:9;;72329:7;:10;;72322:60;;-1:-1:-1;;;;;72353:9:0;;-1:-1:-1;;72364:17:0;72337:1;;72329:10;;;;;;:::i;72322:60::-;72243:3;;;:::i;:::-;;;72210:184;;21753:191;21846:6;;;-1:-1:-1;;;;;21863:17:0;;;-1:-1:-1;;;;;;21863:17:0;;;;;;;21896:40;;21846:6;;;21863:17;21846:6;;21896:40;;21827:16;;21896:40;21816:128;21753:191;:::o;24742:118::-;23751:19;:17;:19::i;:::-;24802:7:::1;:14:::0;;-1:-1:-1;;24802:14:0::1;24812:4;24802:14;::::0;;24832:20:::1;24839:12;18605:10:::0;;18525:98;72409:264;72483:6;;72465:4;;72458:35;;-1:-1:-1;;;;;72465:4:0;;;;72483:6;;72458:24;:35::i;:::-;72531:9;;72511:6;;72504:40;;-1:-1:-1;;;;;72511:6:0;;;;72531:9;;72504:26;:40::i;:::-;72562:6;72557:109;72574:7;:14;72570:18;;72557:109;;;72641:9;;72617:7;:10;;72610:44;;-1:-1:-1;;;;;72641:9:0;;;;72625:1;;72617:10;;;;;;:::i;72610:44::-;72590:3;;;:::i;:::-;;;72557:109;;27468:136;27510:29;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27510:29:0;27559:14;;:37;;-1:-1:-1;;;27559:37:0;;27590:4;27559:37;;;1099:51:1;-1:-1:-1;;;;;27559:14:0;;;;:22;;1072:18:1;;27559:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27559:37:0;;;;;;;;;;;;:::i;61515:616::-;61879:10;;;61878:62;;-1:-1:-1;61895:39:0;;-1:-1:-1;;;61895:39:0;;61919:4;61895:39;;;13671:34:1;-1:-1:-1;;;;;13741:15:1;;;13721:18;;;13714:43;61895:15:0;;;;;13606:18:1;;61895:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;61878:62;61856:166;;;;-1:-1:-1;;;61856:166:0;;13970:2:1;61856:166:0;;;13952:21:1;14009:2;13989:18;;;13982:30;14048:34;14028:18;;;14021:62;-1:-1:-1;;;14099:18:1;;;14092:52;14161:19;;61856:166:0;13768:418:1;61856:166:0;62060:62;;-1:-1:-1;;;;;10079:32:1;;62060:62:0;;;10061:51:1;10128:18;;;10121:34;;;62033:90:0;;62053:5;;-1:-1:-1;;;62083:22:0;10034:18:1;;62060:62:0;9887:274:1;24305:108:0;24217:7;;;;24375:9;24367:38;;;;-1:-1:-1;;;24367:38:0;;14393:2:1;24367:38:0;;;14375:21:1;14432:2;14412:18;;;14405:30;-1:-1:-1;;;14451:18:1;;;14444:46;14507:18;;24367:38:0;14191:340:1;26644:513:0;16340:13;;;;;;;16332:69;;;;-1:-1:-1;;;16332:69:0;;;;;;;:::i;:::-;26756:16:::1;:14;:16::i;:::-;26783:17;:15;:17::i;:::-;26819:22;;::::0;::::1;:16:::0;:22:::1;:::i;:::-;26811:5;:30:::0;;-1:-1:-1;;;;;;26811:30:0::1;-1:-1:-1::0;;;;;26811:30:0;;;::::1;::::0;;;::::1;::::0;;26864:26:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;26852:9;:38:::0;;-1:-1:-1;;;;;;26852:38:0::1;-1:-1:-1::0;;;;;26852:38:0;;;::::1;::::0;;;::::1;::::0;;26910:23:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;26901:6;:32:::0;;-1:-1:-1;;;;;;26901:32:0::1;-1:-1:-1::0;;;;;26901:32:0;;;::::1;::::0;;;::::1;::::0;;26957:27:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;26944:10;:40:::0;;-1:-1:-1;;;;;;26944:40:0::1;-1:-1:-1::0;;;;;26944:40:0;;;::::1;::::0;;;::::1;::::0;;27015:34:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;26995:17;:54:::0;;-1:-1:-1;;;;;;26995:54:0::1;-1:-1:-1::0;;;;;26995:54:0;;;::::1;::::0;;;::::1;::::0;;27088:31:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;27060:14;:60:::0;;-1:-1:-1;;;;;;27060:60:0::1;-1:-1:-1::0;;;;;27060:60:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;27147:2:0::1;27131:13;:18:::0;26644:513::o;68985:308::-;69035:6;69030:256;69047:7;:14;69043:18;;69030:256;;;69083:14;69100:7;69108:1;69100:10;;;;;;;;:::i;:::-;;;;;;;;;;69145:39;;-1:-1:-1;;;69145:39:0;;69178:4;69145:39;;;1099:51:1;-1:-1:-1;;;;;69100:10:0;;;;-1:-1:-1;69100:10:0;;69145:24;;1072:18:1;;69145:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69125:59;-1:-1:-1;69203:13:0;;69199:75;;69232:9;;69256:6;;69218:56;;-1:-1:-1;;;69218:56:0;;-1:-1:-1;;;;;5853:15:1;;;69218:56:0;;;5835:34:1;69256:6:0;;;5885:18:1;;;5878:43;5937:18;;;5930:34;;;69232:9:0;;;69218:29;;5770:18:1;;69218:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;69199:75;69068:218;;69063:3;;;;:::i;:::-;;;69030:256;;68273:704;68358:34;68395:9;:7;:9::i;:::-;68358:46;;68415:14;26111:7;68444:4;:10;;;68432:9;:22;;;;:::i;:::-;:32;;;;:::i;:::-;68415:49;;68477:21;26111:7;68510:4;:9;;;68501:6;:18;;;;:::i;:::-;:28;;;;:::i;:::-;68547:6;;68477:52;;-1:-1:-1;68540:60:0;;-1:-1:-1;;;;;68547:6:0;68568:16;68477:52;68540:27;:60::i;:::-;68613:22;26111:7;68647:4;:10;;;68638:6;:19;;;;:::i;:::-;:29;;;;:::i;:::-;68706:17;;68685:6;;68613:54;;-1:-1:-1;68678:62:0;;-1:-1:-1;;;;;68685:6:0;;;;68706:17;68613:54;68678:27;:62::i;:::-;68753:27;26111:7;68792:4;:15;;;68783:6;:24;;;;:::i;:::-;:34;;;;:::i;:::-;68856:10;;68835:6;;68753:64;;-1:-1:-1;68828:60:0;;-1:-1:-1;;;;;68835:6:0;;;;68856:10;68753:64;68828:27;:60::i;:::-;68906:63;;;15150:25:1;;;15206:2;15191:18;;15184:34;;;15234:18;;;15227:34;;;68906:63:0;;15138:2:1;15123:18;68906:63:0;;;;;;;68347:630;;;;;68273:704;;:::o;69301:225::-;69356:6;;69348:4;;-1:-1:-1;;;;;69348:4:0;;;69356:6;;69348:14;69344:175;;69406:6;;69399:39;;-1:-1:-1;;;69399:39:0;;69432:4;69399:39;;;1099:51:1;69379:17:0;;-1:-1:-1;;;;;69406:6:0;;69399:24;;1072:18:1;;69399:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69467:9;;69483:6;;69491:4;;69453:54;;-1:-1:-1;;;69453:54:0;;-1:-1:-1;;;;;69483:6:0;;;69453:54;;;5835:34:1;69491:4:0;;;5885:18:1;;;5878:43;5937:18;;;5930:34;;;69379:59:0;;-1:-1:-1;69467:9:0;;69453:29;;5770:18:1;;69453:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;69364:155;69301:225::o;63846:716::-;64270:23;64296:69;64324:4;64296:69;;;;;;;;;;;;;;;;;64304:5;-1:-1:-1;;;;;64296:27:0;;;:69;;;;;:::i;:::-;64380:17;;64270:95;;-1:-1:-1;64380:21:0;64376:179;;64477:10;64466:30;;;;;;;;;;;;:::i;:::-;64458:85;;;;-1:-1:-1;;;64458:85:0;;15474:2:1;64458:85:0;;;15456:21:1;15513:2;15493:18;;;15486:30;15552:34;15532:18;;;15525:62;-1:-1:-1;;;15603:18:1;;;15596:40;15653:19;;64458:85:0;15272:406:1;24490:108:0;24217:7;;;;24549:41;;;;-1:-1:-1;;;24549:41:0;;15885:2:1;24549:41:0;;;15867:21:1;15924:2;15904:18;;;15897:30;-1:-1:-1;;;15943:18:1;;;15936:50;16003:18;;24549:41:0;15683:344:1;20036:97:0;16340:13;;;;;;;16332:69;;;;-1:-1:-1;;;16332:69:0;;;;;;;:::i;:::-;20099:26:::1;:24;:26::i;23316:99::-:0;16340:13;;;;;;;16332:69;;;;-1:-1:-1;;;16332:69:0;;;;;;;:::i;:::-;23380:27:::1;:25;:27::i;55482:229::-:0;55619:12;55651:52;55673:6;55681:4;55687:1;55690:12;55651:21;:52::i;:::-;55644:59;;55482:229;;;;;;:::o;20141:113::-;16340:13;;;;;;;16332:69;;;;-1:-1:-1;;;16332:69:0;;;;;;;:::i;:::-;20214:32:::1;18605:10:::0;20214:18:::1;:32::i;23423:97::-:0;16340:13;;;;;;;16332:69;;;;-1:-1:-1;;;16332:69:0;;;;;;;:::i;:::-;23497:7:::1;:15:::0;;-1:-1:-1;;23497:15:0::1;::::0;;23423:97::o;56602:510::-;56772:12;56830:5;56805:21;:30;;56797:81;;;;-1:-1:-1;;;56797:81:0;;16234:2:1;56797:81:0;;;16216:21:1;16273:2;16253:18;;;16246:30;16312:34;16292:18;;;16285:62;-1:-1:-1;;;16363:18:1;;;16356:36;16409:19;;56797:81:0;16032:402:1;56797:81:0;-1:-1:-1;;;;;2963:19:0;;;56889:60;;;;-1:-1:-1;;;56889:60:0;;16641:2:1;56889:60:0;;;16623:21:1;16680:2;16660:18;;;16653:30;16719:31;16699:18;;;16692:59;16768:18;;56889:60:0;16439:353:1;56889:60:0;56963:12;56977:23;57004:6;-1:-1:-1;;;;;57004:11:0;57023:5;57030:4;57004:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56962:73;;;;57053:51;57070:7;57079:10;57091:12;57053:16;:51::i;:::-;57046:58;56602:510;-1:-1:-1;;;;;;;56602:510:0:o;59288:762::-;59438:12;59467:7;59463:580;;;-1:-1:-1;59498:10:0;59491:17;;59463:580;59612:17;;:21;59608:424;;59860:10;59854:17;59921:15;59908:10;59904:2;59900:19;59893:44;59608:424;60003:12;59996:20;;-1:-1:-1;;;59996:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:118::-;488:5;481:13;474:21;467:5;464:32;454:60;;510:1;507;500:12;525:241;581:6;634:2;622:9;613:7;609:23;605:32;602:52;;;650:1;647;640:12;602:52;689:9;676:23;708:28;730:5;708:28;:::i;1161:180::-;1220:6;1273:2;1261:9;1252:7;1248:23;1244:32;1241:52;;;1289:1;1286;1279:12;1241:52;-1:-1:-1;1312:23:1;;1161:180;-1:-1:-1;1161:180:1:o;1763:250::-;1848:1;1858:113;1872:6;1869:1;1866:13;1858:113;;;1948:11;;;1942:18;1929:11;;;1922:39;1894:2;1887:10;1858:113;;;-1:-1:-1;;2005:1:1;1987:16;;1980:27;1763:250::o;2018:271::-;2060:3;2098:5;2092:12;2125:6;2120:3;2113:19;2141:76;2210:6;2203:4;2198:3;2194:14;2187:4;2180:5;2176:16;2141:76;:::i;:::-;2271:2;2250:15;-1:-1:-1;;2246:29:1;2237:39;;;;2278:4;2233:50;;2018:271;-1:-1:-1;;2018:271:1:o;2294:936::-;2469:2;2458:9;2451:21;2432:4;2507:6;2501:13;2550:4;2545:2;2534:9;2530:18;2523:32;2598:12;2592:19;2586:3;2575:9;2571:19;2564:48;2673:2;2659:12;2655:21;2649:28;2643:3;2632:9;2628:19;2621:57;2740:4;2726:12;2722:23;2716:30;2709:4;2698:9;2694:20;2687:60;2808:4;2794:12;2790:23;2784:30;2778:3;2767:9;2763:19;2756:59;2870:3;2856:12;2852:22;2846:29;2912:4;2906:3;2895:9;2891:19;2884:33;2940:54;2989:3;2978:9;2974:19;2958:14;2940:54;:::i;:::-;2926:68;;3069:3;3055:12;3051:22;3045:29;3038:37;3031:45;3025:3;3014:9;3010:19;3003:74;3133:2;3125:6;3121:15;3115:22;3108:4;3097:9;3093:20;3086:52;3194:4;3186:6;3182:17;3176:24;3169:4;3158:9;3154:20;3147:54;3218:6;3210:14;;;;2294:936;;;;:::o;3235:553::-;3346:6;3354;3362;3406:9;3397:7;3393:23;3436:3;3432:2;3428:12;3425:32;;;3453:1;3450;3443:12;3425:32;3492:9;3479:23;3511:31;3536:5;3511:31;:::i;:::-;3561:5;-1:-1:-1;3618:2:1;3603:18;;3590:32;3631:33;3590:32;3631:33;:::i;:::-;3683:7;-1:-1:-1;3724:3:1;-1:-1:-1;;3706:16:1;;3702:26;3699:46;;;3741:1;3738;3731:12;3699:46;;3779:2;3768:9;3764:18;3754:28;;3235:553;;;;;:::o;3793:329::-;3995:2;3977:21;;;4034:1;4014:18;;;4007:29;-1:-1:-1;;;4067:2:1;4052:18;;4045:36;4113:2;4098:18;;3793:329::o;4127:127::-;4188:10;4183:3;4179:20;4176:1;4169:31;4219:4;4216:1;4209:15;4243:4;4240:1;4233:15;4259:128;4326:9;;;4347:11;;;4344:37;;;4361:18;;:::i;:::-;4259:128;;;;:::o;4392:184::-;4462:6;4515:2;4503:9;4494:7;4490:23;4486:32;4483:52;;;4531:1;4528;4521:12;4483:52;-1:-1:-1;4554:16:1;;4392:184;-1:-1:-1;4392:184:1:o;4581:352::-;4783:2;4765:21;;;4822:2;4802:18;;;4795:30;4861;4856:2;4841:18;;4834:58;4924:2;4909:18;;4581:352::o;4938:168::-;5011:9;;;5042;;5059:15;;;5053:22;;5039:37;5029:71;;5080:18;;:::i;5111:217::-;5151:1;5177;5167:132;;5221:10;5216:3;5212:20;5209:1;5202:31;5256:4;5253:1;5246:15;5284:4;5281:1;5274:15;5167:132;-1:-1:-1;5313:9:1;;5111:217::o;5333:125::-;5398:9;;;5419:10;;;5416:36;;;5432:18;;:::i;5463:127::-;5524:10;5519:3;5515:20;5512:1;5505:31;5555:4;5552:1;5545:15;5579:4;5576:1;5569:15;6307:135;6346:3;6367:17;;;6364:43;;6387:18;;:::i;:::-;-1:-1:-1;6434:1:1;6423:13;;6307:135::o;7471:495::-;7532:3;7570:5;7564:12;7597:6;7592:3;7585:19;7623:4;7652:2;7647:3;7643:12;7636:19;;7674:5;7671:1;7664:16;7716:2;7713:1;7703:16;7737:1;7747:194;7761:6;7758:1;7755:13;7747:194;;;7826:13;;-1:-1:-1;;;;;7822:39:1;7810:52;;7882:12;;;;7858:1;7917:14;;;;7776:9;7747:194;;;-1:-1:-1;7957:3:1;;7471:495;-1:-1:-1;;;;;7471:495:1:o;7971:363::-;-1:-1:-1;;;;;8175:32:1;;8157:51;;8244:2;8239;8224:18;;8217:30;;;-1:-1:-1;;8264:64:1;;8309:18;;8301:6;8264:64;:::i;8754:251::-;8824:6;8877:2;8865:9;8856:7;8852:23;8848:32;8845:52;;;8893:1;8890;8883:12;8845:52;8925:9;8919:16;8944:31;8969:5;8944:31;:::i;9010:266::-;9186:2;9175:9;9168:21;9149:4;9206:64;9266:2;9255:9;9251:18;9243:6;9206:64;:::i;10166:132::-;10242:13;;10264:28;10242:13;10264:28;:::i;:::-;10166:132;;;:::o;10303:245::-;10370:6;10423:2;10411:9;10402:7;10398:23;10394:32;10391:52;;;10439:1;10436;10429:12;10391:52;10471:9;10465:16;10490:28;10512:5;10490:28;:::i;11503:127::-;11564:10;11559:3;11555:20;11552:1;11545:31;11595:4;11592:1;11585:15;11619:4;11616:1;11609:15;11635:253;11707:2;11701:9;11749:4;11737:17;;11784:18;11769:34;;11805:22;;;11766:62;11763:88;;;11831:18;;:::i;:::-;11867:2;11860:22;11635:253;:::o;11893:275::-;11964:2;11958:9;12029:2;12010:13;;-1:-1:-1;;12006:27:1;11994:40;;12064:18;12049:34;;12085:22;;;12046:62;12043:88;;;12111:18;;:::i;:::-;12147:2;12140:22;11893:275;;-1:-1:-1;11893:275:1:o;12173:1281::-;12270:6;12301:2;12344;12332:9;12323:7;12319:23;12315:32;12312:52;;;12360:1;12357;12350:12;12312:52;12393:9;12387:16;12422:18;12463:2;12455:6;12452:14;12449:34;;;12479:1;12476;12469:12;12449:34;12502:22;;;;12558:4;12540:16;;;12536:27;12533:47;;;12576:1;12573;12566:12;12533:47;12602:22;;:::i;:::-;12653:2;12647:9;12640:5;12633:24;12703:2;12699;12695:11;12689:18;12684:2;12677:5;12673:14;12666:42;12754:2;12750;12746:11;12740:18;12735:2;12728:5;12724:14;12717:42;12805:2;12801;12797:11;12791:18;12786:2;12779:5;12775:14;12768:42;12849:3;12845:2;12841:12;12835:19;12879:2;12869:8;12866:16;12863:36;;;12895:1;12892;12885:12;12863:36;12918:17;;12966:4;12958:13;;12954:27;-1:-1:-1;12944:55:1;;12995:1;12992;12985:12;12944:55;13024:2;13018:9;13046:2;13042;13039:10;13036:36;;;13052:18;;:::i;:::-;13094:53;13137:2;13118:13;;-1:-1:-1;;13114:27:1;13110:36;;13094:53;:::i;:::-;13081:66;;13170:2;13163:5;13156:17;13210:7;13205:2;13200;13196;13192:11;13188:20;13185:33;13182:53;;;13231:1;13228;13221:12;13182:53;13244:67;13308:2;13303;13296:5;13292:14;13287:2;13283;13279:11;13244:67;:::i;:::-;;;13344:5;13338:3;13331:5;13327:15;13320:30;13383:40;13418:3;13414:2;13410:12;13383:40;:::i;:::-;13377:3;13366:15;;13359:65;13370:5;12173:1281;-1:-1:-1;;;;;;12173:1281:1:o;14536:407::-;14738:2;14720:21;;;14777:2;14757:18;;;14750:30;14816:34;14811:2;14796:18;;14789:62;-1:-1:-1;;;14882:2:1;14867:18;;14860:41;14933:3;14918:19;;14536:407::o;16797:287::-;16926:3;16964:6;16958:13;16980:66;17039:6;17034:3;17027:4;17019:6;17015:17;16980:66;:::i;:::-;17062:16;;;;;16797:287;-1:-1:-1;;16797:287:1:o;17089:220::-;17238:2;17227:9;17220:21;17201:4;17258:45;17299:2;17288:9;17284:18;17276:6;17258:45;:::i
Swarm Source
ipfs://8b8d5a3013f67d72f48480ecf3b7fcec1f22fc77d3c3e4aa9cfcdf82ad3c24e7
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
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.