Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
StrategyDeFive
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-26 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.12; // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @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); } // OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ 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]. * * CAUTION: See Security Considerations above. */ 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); } // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @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 * * 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); } } } // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ 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)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ 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"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ 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"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation 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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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); } } // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @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. */ constructor() { _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()); } } interface IStrategy { // Total want tokens managed by strategy function wantLockedTotal() external view returns (uint256); // Sum of all shares of users to wantLockedTotal function sharesTotal() external view returns (uint256); function wantAddress() external view returns (address); function token0Address() external view returns (address); function token1Address() external view returns (address); function earnedAddress() external view returns (address); function getPricePerFullShare() external view returns (uint256); // Main want token compounding function function earn() external; // Transfer want tokens autoFarm -> strategy function deposit(address _userAddress, uint256 _wantAmt) external returns (uint256); // Transfer want tokens strategy -> autoFarm function withdraw(address _userAddress, uint256 _wantAmt) external returns (uint256); function migrateFrom(address _oldStrategy, uint256 _oldWantLockedTotal, uint256 _oldSharesTotal) external; function inCaseTokensGetStuck(address _token, uint256 _amount) external; function inFarmBalance() external view returns (uint256); function totalBalance() external view returns (uint256); } interface IFarmChef { function deposit(uint256 _pid, uint256 _amount) external; function withdraw(uint256 _pid, uint256 _amount) external; function pendingFive(uint256 _pid, address _user) external view returns (uint256); function userInfo(uint256 _pid, address _user) external view returns (uint256 amount, uint256 rewardDebt); } interface IRouter { function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForS( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); } contract StrategyDeFive is IStrategy, Ownable, ReentrancyGuard, Pausable { using SafeMath for uint256; using SafeERC20 for IERC20; address public farmContractAddress; uint256 public pid; address public override wantAddress; address public override token0Address; address public override token1Address; address public override earnedAddress; address public dexRouterAddress; // mapping(address => mapping(address => address[])) public tokenPaths; address public constant WS = address(0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38); address public controller; address public strategist; address public timelock; uint256 public lastEarnTime = 0; uint256 public autoEarnLimit = 10 * 1e18; // 10 S uint256 public override wantLockedTotal = 0; uint256 public override sharesTotal = 0; uint256 public totalEarned = 0; uint256 public controllerFee = 50; //5% uint256 public constant controllerFeeMax = 100; // 10% address public treasuryAddress; event Deposit(uint256 amount); event Withdraw(uint256 amount); event Farm(uint256 amount); event Compound(address token0Address, uint256 token0Amt, address token1Address, uint256 token1Amt); event Earned(address earnedAddress, uint256 earnedAmt); event InCaseTokensGetStuck(address tokenAddress, uint256 tokenAmt, address receiver); event ExecuteTransaction(address indexed target, uint256 value, string signature, bytes data); constructor( address _controller, address _timelock, address _treasuryAddress, address _farmContractAddress, address _dexRouterAddress, uint256 _pid, address _wantAddress, address _earnedAddress, address _token0, address _token1 ) { controller = _controller; strategist = msg.sender; timelock = _timelock; treasuryAddress = _treasuryAddress; // to call earn if public not allowed farmContractAddress = _farmContractAddress; dexRouterAddress = _dexRouterAddress; wantAddress = _wantAddress; token0Address = _token0; token1Address = _token1; pid = _pid; earnedAddress = _earnedAddress; } modifier onlyController() { require(controller == msg.sender, "caller is not the controller"); _; } modifier onlyStrategist() { require(strategist == msg.sender || owner() == msg.sender, "Strategy: caller is not the strategist"); _; } modifier onlyTimelock() { require(timelock == msg.sender, "Strategy: caller is not timelock"); _; } function autoEarn() internal { uint256 _pendingHarvestSValue = pendingHarvestSValue(); require(_pendingHarvestSValue >= autoEarnLimit, "too small"); earn(); } function inFarmBalance() public override view returns (uint256) { (uint256 amount,) = IFarmChef(farmContractAddress).userInfo(pid, address(this)); return amount; } function totalBalance() external override view returns (uint256) { return IERC20(wantAddress).balanceOf(address(this)) + inFarmBalance(); } function getPricePerFullShare() external override view returns (uint256) { return (sharesTotal == 0) ? 1e18 : wantLockedTotal.mul(1e18).div(sharesTotal); } function increaseAllowance(address token, address spender, uint256 addedValue) internal { // increase allowance IERC20(token).safeIncreaseAllowance(spender, addedValue); } // Receives new deposits from user function deposit(address, uint256 _wantAmt) external override onlyController nonReentrant whenNotPaused returns (uint256) { autoEarn(); IERC20(wantAddress).safeTransferFrom(address(msg.sender), address(this), _wantAmt); uint256 sharesAdded = _wantAmt; if (wantLockedTotal > 0 && sharesTotal > 0) { sharesAdded = _wantAmt.mul(sharesTotal).div(wantLockedTotal); } sharesTotal = sharesTotal.add(sharesAdded); _farm(); emit Deposit(_wantAmt); return sharesAdded; } function farm() public onlyOwner { _farm(); } function harvestReward() public onlyOwner { _harvest(); } function compound() public onlyOwner { _compound(); } function payFees() public onlyOwner { _payFees(); } function _farm() internal { IERC20 _want = IERC20(wantAddress); uint256 wantAmt = _want.balanceOf(address(this)); wantLockedTotal = wantLockedTotal.add(wantAmt); if (wantAmt > 0) { increaseAllowance(wantAddress, farmContractAddress, wantAmt); IFarmChef(farmContractAddress).deposit(pid, wantAmt); emit Farm(wantAmt); } } function withdraw(address, uint256 _wantAmt) external override onlyController nonReentrant returns (uint256) { autoEarn(); require(_wantAmt > 0, "Strategy: !_wantAmt"); IFarmChef(farmContractAddress).withdraw(pid, _wantAmt); uint256 wantAmt = IERC20(wantAddress).balanceOf(address(this)); if (_wantAmt > wantAmt) { _wantAmt = wantAmt; } if (wantLockedTotal < _wantAmt) { _wantAmt = wantLockedTotal; } uint256 sharesRemoved = _wantAmt.mul(sharesTotal).div(wantLockedTotal); if (sharesRemoved > sharesTotal) { sharesRemoved = sharesTotal; } sharesTotal = sharesTotal.sub(sharesRemoved); wantLockedTotal = wantLockedTotal.sub(_wantAmt); IERC20(wantAddress).safeTransfer(address(msg.sender), _wantAmt); emit Withdraw(_wantAmt); return sharesRemoved; } function _harvest() internal { // Harvest farm tokens IFarmChef(farmContractAddress).deposit(pid, 0); } function _payFees() internal { uint256 earnedAmount = IERC20(earnedAddress).balanceOf(address(this)); if (earnedAmount <= 0) { return; } emit Earned(earnedAddress, earnedAmount); //Swap token to S for controller fee _swapTokenToS(earnedAddress, earnedAmount.mul(controllerFee).div(1000), treasuryAddress); } function _compound() internal { //1. Convert earned token into want token uint256 earnedAmount = IERC20(earnedAddress).balanceOf(address(this)); // track totalEarned in S totalEarned = totalEarned.add(exchangeRate(earnedAddress, WS, earnedAmount)); if (earnedAddress != token0Address) { _swapTokenToToken(earnedAddress, token0Address, earnedAmount.div(2), address(this)); } if (earnedAddress != token1Address) { _swapTokenToToken(earnedAddress, token1Address, earnedAmount.div(2), address(this)); } // Get want tokens, ie. add liquidity uint256 token0Amt = IERC20(token0Address).balanceOf(address(this)); uint256 token1Amt = IERC20(token1Address).balanceOf(address(this)); if (token0Amt > 0 && token1Amt > 0) { _addLiquidity(token0Address, token1Address, token0Amt, token1Amt); emit Compound(token0Address, token0Amt, token1Address, token1Amt); } } // 1. Harvest farm tokens // 2. Converts farm tokens into want tokens // 3. Deposits want tokens function earn() public override nonReentrant whenNotPaused { _harvest(); _payFees(); _compound(); _farm(); lastEarnTime = block.timestamp; } function exchangeRate(address _inputToken, address _outputToken, uint256 _tokenAmount) public view returns (uint256) { uint256[] memory amounts = IRouter(dexRouterAddress).getAmountsOut(_tokenAmount, tokenPaths[_inputToken][_outputToken]); return amounts[amounts.length - 1]; } function pendingHarvest() public view returns (uint256) { uint256 _earnedBal = IERC20(earnedAddress).balanceOf(address(this)); return IFarmChef(farmContractAddress).pendingFive(pid, address(this)).add(_earnedBal); } function pendingHarvestSValue() public view returns (uint256) { uint256 _pending = pendingHarvest(); return (_pending == 0) ? 0 : exchangeRate(earnedAddress, WS, _pending); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function setStrategist(address _strategist) external onlyOwner { strategist = _strategist; } function setFees(uint256 _controllerFee) external onlyOwner { require(_controllerFee <= controllerFeeMax, "Strategy: value too high"); controllerFee = _controllerFee; } function setTreasuryAddress(address _treasuryAddress) external onlyOwner { require(_treasuryAddress != address(0), "zero"); treasuryAddress = _treasuryAddress; } function setDexRouterAddress(address _routerAddress) external onlyOwner { require(_routerAddress != address(0), "zero"); dexRouterAddress = _routerAddress; } function setAutoEarnLimit(uint256 _autoEarnLimit) external onlyOwner { autoEarnLimit = _autoEarnLimit; } function setMainPaths( address[] memory _earnedToToken0Path, address[] memory _earnedToToken1Path, address[] memory _earnedToSPath ) external onlyOwner { tokenPaths[earnedAddress][token0Address] = _earnedToToken0Path; tokenPaths[earnedAddress][token1Address] = _earnedToToken1Path; tokenPaths[earnedAddress][WS] = _earnedToSPath; } function setPaths(address _inputToken, address _outputToken, address[] memory _path) external onlyOwner { tokenPaths[_inputToken][_outputToken] = _path; } function _swapTokenToS(address _inputToken, uint256 _amount, address to) internal { increaseAllowance(_inputToken, dexRouterAddress, _amount); if (_inputToken != WS) { IRouter(dexRouterAddress).swapExactTokensForS(_amount, 0, tokenPaths[_inputToken][WS], to, block.timestamp.add(1800)); } } function _swapTokenToToken(address _inputToken, address _outputToken, uint256 _amount, address to) internal { increaseAllowance(_inputToken, dexRouterAddress, _amount); if (_inputToken != _outputToken) { IRouter(dexRouterAddress).swapExactTokensForTokens(_amount, 0, tokenPaths[_inputToken][_outputToken], to, block.timestamp.add(1800)); } } function _addLiquidity(address _tokenA, address _tokenB, uint256 _amountADesired, uint256 _amountBDesired) internal { increaseAllowance(_tokenA, dexRouterAddress, _amountADesired); increaseAllowance(_tokenB, dexRouterAddress, _amountBDesired); IRouter(dexRouterAddress).addLiquidity(_tokenA, _tokenB, _amountADesired, _amountBDesired, 0, 0, address(this), block.timestamp.add(1800)); } function inCaseTokensGetStuck(address _token, uint256 _amount) external override onlyOwner { require(_token != earnedAddress, "!safe"); require(_token != wantAddress, "!safe"); address _controller = controller; IERC20(_token).safeTransfer(_controller, _amount); emit InCaseTokensGetStuck(_token, _amount, _controller); } function togglePause() external onlyOwner { if (paused()) _unpause(); else _pause(); } function migrateFrom(address, uint256, uint256) external override onlyController { } /* ========== EMERGENCY ========== */ function setController(address _controller) external { require(_controller != address(0), "invalidAddress"); require(controller == msg.sender || timelock == msg.sender, "caller is not the controller nor timelock"); controller = _controller; } function setTimelock(address _timelock) external { require(timelock == msg.sender || (timelock == address(0) && owner() == msg.sender), "!timelock"); timelock = _timelock; } /** * @dev This is from Timelock contract. */ function executeTransaction(address target, uint256 value, string memory signature, bytes memory data) external onlyTimelock returns (bytes memory) { bytes memory callData; if (bytes(signature).length == 0) { callData = data; } else { callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data); } // solium-disable-next-line security/no-call-value (bool success, bytes memory returnData) = target.call{value : value}(callData); require(success, "Strategy::executeTransaction: Transaction execution reverted."); emit ExecuteTransaction(target, value, signature, data); return returnData; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_timelock","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"address","name":"_farmContractAddress","type":"address"},{"internalType":"address","name":"_dexRouterAddress","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_wantAddress","type":"address"},{"internalType":"address","name":"_earnedAddress","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token0Address","type":"address"},{"indexed":false,"internalType":"uint256","name":"token0Amt","type":"uint256"},{"indexed":false,"internalType":"address","name":"token1Address","type":"address"},{"indexed":false,"internalType":"uint256","name":"token1Amt","type":"uint256"}],"name":"Compound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"earnedAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"earnedAmt","type":"uint256"}],"name":"Earned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"signature","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"ExecuteTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Farm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmt","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"InCaseTokensGetStuck","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":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"WS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoEarnLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controllerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controllerFeeMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_wantAmt","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earnedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputToken","type":"address"},{"internalType":"address","name":"_outputToken","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farmContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inFarmBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastEarnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"migrateFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pendingHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingHarvestSValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_autoEarnLimit","type":"uint256"}],"name":"setAutoEarnLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerAddress","type":"address"}],"name":"setDexRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controllerFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_earnedToToken0Path","type":"address[]"},{"internalType":"address[]","name":"_earnedToToken1Path","type":"address[]"},{"internalType":"address[]","name":"_earnedToSPath","type":"address[]"}],"name":"setMainPaths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_inputToken","type":"address"},{"internalType":"address","name":"_outputToken","type":"address"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"setPaths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharesTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenPaths","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wantAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wantLockedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_wantAmt","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600d55678ac7230489e80000600e556000600f556000601055600060115560326012553480156200003657600080fd5b5060405162002d8b38038062002d8b833981016040819052620000599162000197565b62000064336200012a565b6001805560028054600a80546001600160a01b039d8e166001600160a01b031991821617909155600b8054821633179055600c80549c8e169c82169c909c17909b55601380549a8d169a8c169a909a17909955968a16610100026001600160a81b03199098169790971790955560088054948916948816949094179093556004805491881691871691909117905560058054938716938616939093179092556006805493861693851693909317909255600355600780549190931691161790556200025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200019257600080fd5b919050565b6000806000806000806000806000806101408b8d031215620001b857600080fd5b620001c38b6200017a565b9950620001d360208c016200017a565b9850620001e360408c016200017a565b9750620001f360608c016200017a565b96506200020360808c016200017a565b955060a08b015194506200021a60c08c016200017a565b93506200022a60e08c016200017a565b92506200023b6101008c016200017a565b91506200024c6101208c016200017a565b90509295989b9194979a5092959850565b612b1e806200026d6000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c80638da5cb5b1161019d578063c7b9d530116100e9578063e7a03679116100a2578063f2fde38b1161007c578063f2fde38b14610609578063f3fef3a31461061c578063f69e20461461062f578063f77c47911461063757600080fd5b8063e7a03679146105da578063e7f67fb1146105ed578063f10684541461060057600080fd5b8063c7b9d5301461057e578063d33219b414610591578063d389800f146105a4578063d7cb416f146105ac578063db7a3c0f146105bf578063e7198474146105c757600080fd5b8063bb97517e11610156578063c11b61c711610130578063c11b61c71461053d578063c4ae316814610550578063c5f956af14610558578063c6d758cb1461056b57600080fd5b8063bb97517e1461050f578063bdacb30314610517578063c0762e5e1461052a57600080fd5b80638da5cb5b146104b957806392eefe9b146104ca5780639fc33a9f146104dd578063a0fab119146104f5578063ad7a672f146104fe578063ba0c108f1461050657600080fd5b80635d4093591161025c57806370a3cb111161021557806377c7b8fc116101ef57806377c7b8fc1461048d5780637ff36fbe146104955780638456cb59146104a857806385f02dd6146104b057600080fd5b806370a3cb111461045f578063715018a61461047257806376f2892f1461047a57600080fd5b80635d4093591461040557806362779e15146104205780636605bfda1461042857806367d03db81461043b5780636dfa8d9914610443578063701f66041461044c57600080fd5b80633d18678e116102c957806344a3955e116102a357806344a3955e146103cb57806347e7ef24146103d45780635a34928e146103e75780635c975abb146103ef57600080fd5b80633d18678e146103a75780633f4ba83a146103ba57806342da4eb3146103c257600080fd5b80631fe4a686146103115780632224fa251461034157806325baef53146103615780632717eff31461037657806327d9e85e1461038c57806336e9332d1461039f575b600080fd5b600b54610324906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61035461034f36600461248f565b61064a565b6040516103389190612590565b61037461036f3660046125a3565b610813565b005b61037e606481565b604051908152602001610338565b61037461039a36600461266c565b610842565b61037461090f565b6103746103b53660046126f4565b610921565b61037461097f565b61037e600f5481565b61037e60105481565b61037e6103e236600461270d565b61098f565b610374610a86565b60025460ff166040519015158152602001610338565b61032473039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b610374610a96565b610374610436366004612737565b610aa6565b61037e610b0f565b61037e60115481565b61037e61045a366004612752565b610b5b565b61037461046d3660046126f4565b610c24565b610374610c31565b61037461048836600461278e565b610c43565b61037e610c80565b600554610324906001600160a01b031681565b610374610cc1565b61037e60125481565b6000546001600160a01b0316610324565b6103746104d8366004612737565b610cd1565b6002546103249061010090046001600160a01b031681565b61037e600e5481565b61037e610dbb565b61037e600d5481565b61037e610e3c565b610374610525366004612737565b610ec2565b610374610538366004612737565b610f62565b61032461054b366004612752565b610fcb565b610374611010565b601354610324906001600160a01b031681565b61037461057936600461270d565b61102b565b61037461058c366004612737565b61112f565b600c54610324906001600160a01b031681565b610374611159565b600654610324906001600160a01b031681565b61037e611196565b600754610324906001600160a01b031681565b600454610324906001600160a01b031681565b600854610324906001600160a01b031681565b61037e60035481565b610374610617366004612737565b611290565b61037e61062a36600461270d565b611309565b61037461152b565b600a54610324906001600160a01b031681565b600c546060906001600160a01b031633146106ac5760405162461bcd60e51b815260206004820181905260248201527f53747261746567793a2063616c6c6572206973206e6f742074696d656c6f636b60448201526064015b60405180910390fd5b60608351600014156106bf5750816106eb565b8380519060200120836040516020016106d99291906127e2565b60405160208183030381529060405290505b600080876001600160a01b031687846040516107079190612813565b60006040518083038185875af1925050503d8060008114610744576040519150601f19603f3d011682016040523d82523d6000602084013e610749565b606091505b5091509150816107c15760405162461bcd60e51b815260206004820152603d60248201527f53747261746567793a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e20657865637574696f6e2072657665727465642e00000060648201526084016106a3565b876001600160a01b03167f88405ca50016c636e025868e263efe5a9f63bf11cc45404f7616394c7dc389d08888886040516107fe9392919061282f565b60405180910390a2925050505b949350505050565b600a546001600160a01b0316331461083d5760405162461bcd60e51b81526004016106a390612864565b505050565b61084a61153b565b6007546001600160a01b039081166000908152600960209081526040808320600554909416835292815291902084516108859286019061235a565b506007546001600160a01b039081166000908152600960209081526040808320600654909416835292815291902083516108c19285019061235a565b506007546001600160a01b0316600090815260096020908152604080832073039e2fb66102314ce7b64ce5ce3e5183bc94ad388452825290912082516109099284019061235a565b50505050565b61091761153b565b61091f611595565b565b61092961153b565b606481111561097a5760405162461bcd60e51b815260206004820152601860248201527f53747261746567793a2076616c756520746f6f2068696768000000000000000060448201526064016106a3565b601255565b61098761153b565b61091f6116ed565b600a546000906001600160a01b031633146109bc5760405162461bcd60e51b81526004016106a390612864565b6109c461173f565b6109cc611799565b6109d46117df565b6004546109ec906001600160a01b0316333085611831565b600f54829015801590610a0157506000601054115b15610a2a57610a27600f54610a216010548661189c90919063ffffffff16565b906118af565b90505b601054610a3790826118bb565b601055610a42611595565b6040518381527f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384269060200160405180910390a19050610a8060018055565b92915050565b610a8e61153b565b61091f6118c7565b610a9e61153b565b61091f611930565b610aae61153b565b6001600160a01b038116610aed5760405162461bcd60e51b81526004016106a3906020808252600490820152637a65726f60e01b604082015260600190565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600080610b1a611196565b90508015610b5257600754610b4d906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3883610b5b565b610b55565b60005b91505090565b6008546001600160a01b0384811660009081526009602090815260408083208785168452909152808220905163d06ca61f60e01b815291938493169163d06ca61f91610bac918791906004016128e4565b600060405180830381865afa158015610bc9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf191908101906128fd565b90508060018251610c029190612999565b81518110610c1257610c126129b0565b60200260200101519150509392505050565b610c2c61153b565b600e55565b610c3961153b565b61091f6000611a28565b610c4b61153b565b6001600160a01b038084166000908152600960209081526040808320938616835292815291902082516109099284019061235a565b6000601054600014610cb457610caf601054610a21670de0b6b3a7640000600f5461189c90919063ffffffff16565b905090565b50670de0b6b3a764000090565b610cc961153b565b61091f611a78565b6001600160a01b038116610d185760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69644164647265737360901b60448201526064016106a3565b600a546001600160a01b0316331480610d3b5750600c546001600160a01b031633145b610d995760405162461bcd60e51b815260206004820152602960248201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c6572206e6f726044820152682074696d656c6f636b60b81b60648201526084016106a3565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610dc5610e3c565b600480546040516370a0823160e01b815230928101929092526001600160a01b0316906370a0823190602401602060405180830381865afa158015610e0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3291906129c6565b610caf91906129df565b6002546003546040516393f1a40b60e01b8152600481019190915230602482015260009182916101009091046001600160a01b0316906393f1a40b906044016040805180830381865afa158015610e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebb91906129f7565b5092915050565b600c546001600160a01b0316331480610f085750600c546001600160a01b0316158015610f08575033610efd6000546001600160a01b031690565b6001600160a01b0316145b610f405760405162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b60448201526064016106a3565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b610f6a61153b565b6001600160a01b038116610fa95760405162461bcd60e51b81526004016106a3906020808252600490820152637a65726f60e01b604082015260600190565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60096020528260005260406000206020528160005260406000208181548110610ff357600080fd5b6000918252602090912001546001600160a01b0316925083915050565b61101861153b565b60025460ff1615610cc95761091f6116ed565b61103361153b565b6007546001600160a01b03838116911614156110795760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b60448201526064016106a3565b6004546001600160a01b03838116911614156110bf5760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b60448201526064016106a3565b600a546001600160a01b03908116906110db9084168284611ab5565b604080516001600160a01b038086168252602082018590528316918101919091527f22f92dfb4f608ea5db1e9bb08c0b4f5518af93b1259d335fe05900056096ab2c906060015b60405180910390a1505050565b61113761153b565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b61116161173f565b611169611799565b6111716118c7565b611179611930565b611181611ae5565b611189611595565b42600d5561091f60018055565b6007546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156111e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120791906129c6565b600254600354604051631503a8cb60e31b81526004810191909152306024820152919250610b5591839161010090046001600160a01b03169063a81d465890604401602060405180830381865afa158015611266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128a91906129c6565b906118bb565b61129861153b565b6001600160a01b0381166112fd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a3565b61130681611a28565b50565b600a546000906001600160a01b031633146113365760405162461bcd60e51b81526004016106a390612864565b61133e61173f565b6113466117df565b6000821161138c5760405162461bcd60e51b815260206004820152601360248201527214dd1c985d1959de4e880857ddd85b9d105b5d606a1b60448201526064016106a3565b600254600354604051630441a3e760e41b81526004810191909152602481018490526101009091046001600160a01b03169063441a3e7090604401600060405180830381600087803b1580156113e157600080fd5b505af11580156113f5573d6000803e3d6000fd5b5050600480546040516370a0823160e01b81523092810192909252600093506001600160a01b031691506370a0823190602401602060405180830381865afa158015611445573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146991906129c6565b905080831115611477578092505b82600f54101561148757600f5492505b60006114a4600f54610a216010548761189c90919063ffffffff16565b90506010548111156114b557506010545b6010546114c29082611d75565b601055600f546114d29085611d75565b600f556004546114ec906001600160a01b03163386611ab5565b6040518481527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a1915050610a8060018055565b61153361153b565b61091f611ae5565b6000546001600160a01b0316331461091f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106a3565b600480546040516370a0823160e01b815230928101929092526001600160a01b03169060009082906370a0823190602401602060405180830381865afa1580156115e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160791906129c6565b600f5490915061161790826118bb565b600f5580156116e957600454600254611642916001600160a01b039081169161010090041683611d81565b600254600354604051631c57762b60e31b81526004810191909152602481018390526101009091046001600160a01b03169063e2bbb15890604401600060405180830381600087803b15801561169757600080fd5b505af11580156116ab573d6000803e3d6000fd5b505050507fc217459869eed80bfbe5c11e78ab58912eedfd106342671821b6e96d1615dc7f816040516116e091815260200190565b60405180910390a15b5050565b6116f5611d95565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260015414156117925760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a3565b6002600155565b60025460ff161561091f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106a3565b60006117e9610b0f565b9050600e548110156118295760405162461bcd60e51b81526020600482015260096024820152681d1bdbc81cdb585b1b60ba1b60448201526064016106a3565b611306611159565b6040516001600160a01b03808516602483015283166044820152606481018290526109099085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611dde565b60006118a88284612a1b565b9392505050565b60006118a88284612a3a565b60006118a882846129df565b600254600354604051631c57762b60e31b81526004810191909152600060248201526101009091046001600160a01b03169063e2bbb15890604401600060405180830381600087803b15801561191c57600080fd5b505af1158015610909573d6000803e3d6000fd5b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199d91906129c6565b9050600081116119aa5750565b600754604080516001600160a01b039092168252602082018390527f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a910160405180910390a1600754601254611306916001600160a01b031690611a17906103e890610a2190869061189c565b6013546001600160a01b0316611eb3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611a80611799565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586117223390565b6040516001600160a01b03831660248201526044810182905261083d90849063a9059cbb60e01b90606401611865565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611b2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5291906129c6565b600754909150611b8d90611b84906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3884610b5b565b601154906118bb565b6011556005546007546001600160a01b03908116911614611bd057600754600554611bd0916001600160a01b039081169116611bca8460026118af565b30611fac565b6006546007546001600160a01b03908116911614611c0a57600754600654611c0a916001600160a01b039081169116611bca8460026118af565b6005546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7791906129c6565b6006546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611cc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce991906129c6565b9050600082118015611cfb5750600081115b1561083d57600554600654611d1e916001600160a01b039081169116848461208f565b600554600654604080516001600160a01b039384168152602081018690529290911690820152606081018290527f44552da03f807ace3e5f27e98e694712dfe668c743514b28d4d9f5ab70574b0f90608001611122565b60006118a88284612999565b61083d6001600160a01b038416838361218d565b60025460ff1661091f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106a3565b6000611e33826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661223a9092919063ffffffff16565b9050805160001480611e54575080806020019051810190611e549190612a5c565b61083d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a3565b600854611ecb9084906001600160a01b031684611d81565b6001600160a01b03831673039e2fb66102314ce7b64ce5ce3e5183bc94ad381461083d576008546001600160a01b03848116600090815260096020908152604080832073039e2fb66102314ce7b64ce5ce3e5183bc94ad3884529091528120919092169163ee2b38369185919085611f45426107086118bb565b6040518663ffffffff1660e01b8152600401611f65959493929190612a7e565b6000604051808303816000875af1158015611f84573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261090991908101906128fd565b600854611fc49085906001600160a01b031684611d81565b826001600160a01b0316846001600160a01b031614610909576008546001600160a01b0385811660009081526009602090815260408083208885168452909152812091909216916338ed17399185919085612021426107086118bb565b6040518663ffffffff1660e01b8152600401612041959493929190612a7e565b6000604051808303816000875af1158015612060573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261208891908101906128fd565b5050505050565b6008546120a79085906001600160a01b031684611d81565b6008546120bf9084906001600160a01b031683611d81565b6008546001600160a01b031663e8e3370085858585600080306120e4426107086118bb565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1158015612160573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121849190612aba565b50505050505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa1580156121dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220191906129c6565b90506109098463095ea7b360e01b8561221a86866129df565b6040516001600160a01b0390921660248301526044820152606401611865565b606061080b848460008585600080866001600160a01b031685876040516122619190612813565b60006040518083038185875af1925050503d806000811461229e576040519150601f19603f3d011682016040523d82523d6000602084013e6122a3565b606091505b50915091506122b4878383876122bf565b979650505050505050565b6060831561232b578251612324576001600160a01b0385163b6123245760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a3565b508161080b565b61080b83838151156123405781518083602001fd5b8060405162461bcd60e51b81526004016106a39190612590565b8280548282559060005260206000209081019282156123af579160200282015b828111156123af57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061237a565b506123bb9291506123bf565b5090565b5b808211156123bb57600081556001016123c0565b80356001600160a01b03811681146123eb57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561242f5761242f6123f0565b604052919050565b600067ffffffffffffffff831115612451576124516123f0565b612464601f8401601f1916602001612406565b905082815283838301111561247857600080fd5b828260208301376000602084830101529392505050565b600080600080608085870312156124a557600080fd5b6124ae856123d4565b935060208501359250604085013567ffffffffffffffff808211156124d257600080fd5b818701915087601f8301126124e657600080fd5b6124f588833560208501612437565b9350606087013591508082111561250b57600080fd5b508501601f8101871361251d57600080fd5b61252c87823560208401612437565b91505092959194509250565b60005b8381101561255357818101518382015260200161253b565b838111156109095750506000910152565b6000815180845261257c816020860160208601612538565b601f01601f19169290920160200192915050565b6020815260006118a86020830184612564565b6000806000606084860312156125b857600080fd5b6125c1846123d4565b95602085013595506040909401359392505050565b600067ffffffffffffffff8211156125f0576125f06123f0565b5060051b60200190565b600082601f83011261260b57600080fd5b8135602061262061261b836125d6565b612406565b82815260059290921b8401810191818101908684111561263f57600080fd5b8286015b8481101561266157612654816123d4565b8352918301918301612643565b509695505050505050565b60008060006060848603121561268157600080fd5b833567ffffffffffffffff8082111561269957600080fd5b6126a5878388016125fa565b945060208601359150808211156126bb57600080fd5b6126c7878388016125fa565b935060408601359150808211156126dd57600080fd5b506126ea868287016125fa565b9150509250925092565b60006020828403121561270657600080fd5b5035919050565b6000806040838503121561272057600080fd5b612729836123d4565b946020939093013593505050565b60006020828403121561274957600080fd5b6118a8826123d4565b60008060006060848603121561276757600080fd5b612770846123d4565b925061277e602085016123d4565b9150604084013590509250925092565b6000806000606084860312156127a357600080fd5b6127ac846123d4565b92506127ba602085016123d4565b9150604084013567ffffffffffffffff8111156127d657600080fd5b6126ea868287016125fa565b6001600160e01b0319831681528151600090612805816004850160208701612538565b919091016004019392505050565b60008251612825818460208701612538565b9190910192915050565b8381526060602082015260006128486060830185612564565b828103604084015261285a8185612564565b9695505050505050565b6020808252601c908201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c657200000000604082015260600190565b6000815480845260208085019450836000528060002060005b838110156128d95781546001600160a01b0316875295820195600191820191016128b4565b509495945050505050565b82815260406020820152600061080b604083018461289b565b6000602080838503121561291057600080fd5b825167ffffffffffffffff81111561292757600080fd5b8301601f8101851361293857600080fd5b805161294661261b826125d6565b81815260059190911b8201830190838101908783111561296557600080fd5b928401925b828410156122b45783518252928401929084019061296a565b634e487b7160e01b600052601160045260246000fd5b6000828210156129ab576129ab612983565b500390565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156129d857600080fd5b5051919050565b600082198211156129f2576129f2612983565b500190565b60008060408385031215612a0a57600080fd5b505080516020909101519092909150565b6000816000190483118215151615612a3557612a35612983565b500290565b600082612a5757634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612a6e57600080fd5b815180151581146118a857600080fd5b85815284602082015260a060408201526000612a9d60a083018661289b565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215612acf57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212203ce208d10739146a60da21cd276a2e66eb0957075982ebc7a57daf69c15082e164736f6c634300080c0033000000000000000000000000ead049d2544e9b3d637d49a89f2669f109ab4e5800000000000000000000000071fd21a764ef295fb7bfbdf4d2ebffe862e76fbf000000000000000000000000c547e8dd3844fb5bc178120a121b365ea790774e0000000000000000000000004ade5608127594cd9ea131f0826aea02fe517461000000000000000000000000c159d904ca8c2449df0ae4836197278f2f68c72500000000000000000000000000000000000000000000000000000000000000010000000000000000000000006eb32c8db5ff2878acbcb6a1ec5e301f60884da4000000000000000000000000b0695ce12c56aae40894235e2d1888d0b62dd11000000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061030c5760003560e01c80638da5cb5b1161019d578063c7b9d530116100e9578063e7a03679116100a2578063f2fde38b1161007c578063f2fde38b14610609578063f3fef3a31461061c578063f69e20461461062f578063f77c47911461063757600080fd5b8063e7a03679146105da578063e7f67fb1146105ed578063f10684541461060057600080fd5b8063c7b9d5301461057e578063d33219b414610591578063d389800f146105a4578063d7cb416f146105ac578063db7a3c0f146105bf578063e7198474146105c757600080fd5b8063bb97517e11610156578063c11b61c711610130578063c11b61c71461053d578063c4ae316814610550578063c5f956af14610558578063c6d758cb1461056b57600080fd5b8063bb97517e1461050f578063bdacb30314610517578063c0762e5e1461052a57600080fd5b80638da5cb5b146104b957806392eefe9b146104ca5780639fc33a9f146104dd578063a0fab119146104f5578063ad7a672f146104fe578063ba0c108f1461050657600080fd5b80635d4093591161025c57806370a3cb111161021557806377c7b8fc116101ef57806377c7b8fc1461048d5780637ff36fbe146104955780638456cb59146104a857806385f02dd6146104b057600080fd5b806370a3cb111461045f578063715018a61461047257806376f2892f1461047a57600080fd5b80635d4093591461040557806362779e15146104205780636605bfda1461042857806367d03db81461043b5780636dfa8d9914610443578063701f66041461044c57600080fd5b80633d18678e116102c957806344a3955e116102a357806344a3955e146103cb57806347e7ef24146103d45780635a34928e146103e75780635c975abb146103ef57600080fd5b80633d18678e146103a75780633f4ba83a146103ba57806342da4eb3146103c257600080fd5b80631fe4a686146103115780632224fa251461034157806325baef53146103615780632717eff31461037657806327d9e85e1461038c57806336e9332d1461039f575b600080fd5b600b54610324906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61035461034f36600461248f565b61064a565b6040516103389190612590565b61037461036f3660046125a3565b610813565b005b61037e606481565b604051908152602001610338565b61037461039a36600461266c565b610842565b61037461090f565b6103746103b53660046126f4565b610921565b61037461097f565b61037e600f5481565b61037e60105481565b61037e6103e236600461270d565b61098f565b610374610a86565b60025460ff166040519015158152602001610338565b61032473039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b610374610a96565b610374610436366004612737565b610aa6565b61037e610b0f565b61037e60115481565b61037e61045a366004612752565b610b5b565b61037461046d3660046126f4565b610c24565b610374610c31565b61037461048836600461278e565b610c43565b61037e610c80565b600554610324906001600160a01b031681565b610374610cc1565b61037e60125481565b6000546001600160a01b0316610324565b6103746104d8366004612737565b610cd1565b6002546103249061010090046001600160a01b031681565b61037e600e5481565b61037e610dbb565b61037e600d5481565b61037e610e3c565b610374610525366004612737565b610ec2565b610374610538366004612737565b610f62565b61032461054b366004612752565b610fcb565b610374611010565b601354610324906001600160a01b031681565b61037461057936600461270d565b61102b565b61037461058c366004612737565b61112f565b600c54610324906001600160a01b031681565b610374611159565b600654610324906001600160a01b031681565b61037e611196565b600754610324906001600160a01b031681565b600454610324906001600160a01b031681565b600854610324906001600160a01b031681565b61037e60035481565b610374610617366004612737565b611290565b61037e61062a36600461270d565b611309565b61037461152b565b600a54610324906001600160a01b031681565b600c546060906001600160a01b031633146106ac5760405162461bcd60e51b815260206004820181905260248201527f53747261746567793a2063616c6c6572206973206e6f742074696d656c6f636b60448201526064015b60405180910390fd5b60608351600014156106bf5750816106eb565b8380519060200120836040516020016106d99291906127e2565b60405160208183030381529060405290505b600080876001600160a01b031687846040516107079190612813565b60006040518083038185875af1925050503d8060008114610744576040519150601f19603f3d011682016040523d82523d6000602084013e610749565b606091505b5091509150816107c15760405162461bcd60e51b815260206004820152603d60248201527f53747261746567793a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e20657865637574696f6e2072657665727465642e00000060648201526084016106a3565b876001600160a01b03167f88405ca50016c636e025868e263efe5a9f63bf11cc45404f7616394c7dc389d08888886040516107fe9392919061282f565b60405180910390a2925050505b949350505050565b600a546001600160a01b0316331461083d5760405162461bcd60e51b81526004016106a390612864565b505050565b61084a61153b565b6007546001600160a01b039081166000908152600960209081526040808320600554909416835292815291902084516108859286019061235a565b506007546001600160a01b039081166000908152600960209081526040808320600654909416835292815291902083516108c19285019061235a565b506007546001600160a01b0316600090815260096020908152604080832073039e2fb66102314ce7b64ce5ce3e5183bc94ad388452825290912082516109099284019061235a565b50505050565b61091761153b565b61091f611595565b565b61092961153b565b606481111561097a5760405162461bcd60e51b815260206004820152601860248201527f53747261746567793a2076616c756520746f6f2068696768000000000000000060448201526064016106a3565b601255565b61098761153b565b61091f6116ed565b600a546000906001600160a01b031633146109bc5760405162461bcd60e51b81526004016106a390612864565b6109c461173f565b6109cc611799565b6109d46117df565b6004546109ec906001600160a01b0316333085611831565b600f54829015801590610a0157506000601054115b15610a2a57610a27600f54610a216010548661189c90919063ffffffff16565b906118af565b90505b601054610a3790826118bb565b601055610a42611595565b6040518381527f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384269060200160405180910390a19050610a8060018055565b92915050565b610a8e61153b565b61091f6118c7565b610a9e61153b565b61091f611930565b610aae61153b565b6001600160a01b038116610aed5760405162461bcd60e51b81526004016106a3906020808252600490820152637a65726f60e01b604082015260600190565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600080610b1a611196565b90508015610b5257600754610b4d906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3883610b5b565b610b55565b60005b91505090565b6008546001600160a01b0384811660009081526009602090815260408083208785168452909152808220905163d06ca61f60e01b815291938493169163d06ca61f91610bac918791906004016128e4565b600060405180830381865afa158015610bc9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf191908101906128fd565b90508060018251610c029190612999565b81518110610c1257610c126129b0565b60200260200101519150509392505050565b610c2c61153b565b600e55565b610c3961153b565b61091f6000611a28565b610c4b61153b565b6001600160a01b038084166000908152600960209081526040808320938616835292815291902082516109099284019061235a565b6000601054600014610cb457610caf601054610a21670de0b6b3a7640000600f5461189c90919063ffffffff16565b905090565b50670de0b6b3a764000090565b610cc961153b565b61091f611a78565b6001600160a01b038116610d185760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69644164647265737360901b60448201526064016106a3565b600a546001600160a01b0316331480610d3b5750600c546001600160a01b031633145b610d995760405162461bcd60e51b815260206004820152602960248201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c6572206e6f726044820152682074696d656c6f636b60b81b60648201526084016106a3565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610dc5610e3c565b600480546040516370a0823160e01b815230928101929092526001600160a01b0316906370a0823190602401602060405180830381865afa158015610e0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3291906129c6565b610caf91906129df565b6002546003546040516393f1a40b60e01b8152600481019190915230602482015260009182916101009091046001600160a01b0316906393f1a40b906044016040805180830381865afa158015610e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebb91906129f7565b5092915050565b600c546001600160a01b0316331480610f085750600c546001600160a01b0316158015610f08575033610efd6000546001600160a01b031690565b6001600160a01b0316145b610f405760405162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b60448201526064016106a3565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b610f6a61153b565b6001600160a01b038116610fa95760405162461bcd60e51b81526004016106a3906020808252600490820152637a65726f60e01b604082015260600190565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60096020528260005260406000206020528160005260406000208181548110610ff357600080fd5b6000918252602090912001546001600160a01b0316925083915050565b61101861153b565b60025460ff1615610cc95761091f6116ed565b61103361153b565b6007546001600160a01b03838116911614156110795760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b60448201526064016106a3565b6004546001600160a01b03838116911614156110bf5760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b60448201526064016106a3565b600a546001600160a01b03908116906110db9084168284611ab5565b604080516001600160a01b038086168252602082018590528316918101919091527f22f92dfb4f608ea5db1e9bb08c0b4f5518af93b1259d335fe05900056096ab2c906060015b60405180910390a1505050565b61113761153b565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b61116161173f565b611169611799565b6111716118c7565b611179611930565b611181611ae5565b611189611595565b42600d5561091f60018055565b6007546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156111e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120791906129c6565b600254600354604051631503a8cb60e31b81526004810191909152306024820152919250610b5591839161010090046001600160a01b03169063a81d465890604401602060405180830381865afa158015611266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128a91906129c6565b906118bb565b61129861153b565b6001600160a01b0381166112fd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a3565b61130681611a28565b50565b600a546000906001600160a01b031633146113365760405162461bcd60e51b81526004016106a390612864565b61133e61173f565b6113466117df565b6000821161138c5760405162461bcd60e51b815260206004820152601360248201527214dd1c985d1959de4e880857ddd85b9d105b5d606a1b60448201526064016106a3565b600254600354604051630441a3e760e41b81526004810191909152602481018490526101009091046001600160a01b03169063441a3e7090604401600060405180830381600087803b1580156113e157600080fd5b505af11580156113f5573d6000803e3d6000fd5b5050600480546040516370a0823160e01b81523092810192909252600093506001600160a01b031691506370a0823190602401602060405180830381865afa158015611445573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146991906129c6565b905080831115611477578092505b82600f54101561148757600f5492505b60006114a4600f54610a216010548761189c90919063ffffffff16565b90506010548111156114b557506010545b6010546114c29082611d75565b601055600f546114d29085611d75565b600f556004546114ec906001600160a01b03163386611ab5565b6040518481527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a1915050610a8060018055565b61153361153b565b61091f611ae5565b6000546001600160a01b0316331461091f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106a3565b600480546040516370a0823160e01b815230928101929092526001600160a01b03169060009082906370a0823190602401602060405180830381865afa1580156115e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160791906129c6565b600f5490915061161790826118bb565b600f5580156116e957600454600254611642916001600160a01b039081169161010090041683611d81565b600254600354604051631c57762b60e31b81526004810191909152602481018390526101009091046001600160a01b03169063e2bbb15890604401600060405180830381600087803b15801561169757600080fd5b505af11580156116ab573d6000803e3d6000fd5b505050507fc217459869eed80bfbe5c11e78ab58912eedfd106342671821b6e96d1615dc7f816040516116e091815260200190565b60405180910390a15b5050565b6116f5611d95565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260015414156117925760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a3565b6002600155565b60025460ff161561091f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106a3565b60006117e9610b0f565b9050600e548110156118295760405162461bcd60e51b81526020600482015260096024820152681d1bdbc81cdb585b1b60ba1b60448201526064016106a3565b611306611159565b6040516001600160a01b03808516602483015283166044820152606481018290526109099085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611dde565b60006118a88284612a1b565b9392505050565b60006118a88284612a3a565b60006118a882846129df565b600254600354604051631c57762b60e31b81526004810191909152600060248201526101009091046001600160a01b03169063e2bbb15890604401600060405180830381600087803b15801561191c57600080fd5b505af1158015610909573d6000803e3d6000fd5b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199d91906129c6565b9050600081116119aa5750565b600754604080516001600160a01b039092168252602082018390527f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a910160405180910390a1600754601254611306916001600160a01b031690611a17906103e890610a2190869061189c565b6013546001600160a01b0316611eb3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611a80611799565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586117223390565b6040516001600160a01b03831660248201526044810182905261083d90849063a9059cbb60e01b90606401611865565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611b2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5291906129c6565b600754909150611b8d90611b84906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3884610b5b565b601154906118bb565b6011556005546007546001600160a01b03908116911614611bd057600754600554611bd0916001600160a01b039081169116611bca8460026118af565b30611fac565b6006546007546001600160a01b03908116911614611c0a57600754600654611c0a916001600160a01b039081169116611bca8460026118af565b6005546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7791906129c6565b6006546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611cc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce991906129c6565b9050600082118015611cfb5750600081115b1561083d57600554600654611d1e916001600160a01b039081169116848461208f565b600554600654604080516001600160a01b039384168152602081018690529290911690820152606081018290527f44552da03f807ace3e5f27e98e694712dfe668c743514b28d4d9f5ab70574b0f90608001611122565b60006118a88284612999565b61083d6001600160a01b038416838361218d565b60025460ff1661091f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106a3565b6000611e33826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661223a9092919063ffffffff16565b9050805160001480611e54575080806020019051810190611e549190612a5c565b61083d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a3565b600854611ecb9084906001600160a01b031684611d81565b6001600160a01b03831673039e2fb66102314ce7b64ce5ce3e5183bc94ad381461083d576008546001600160a01b03848116600090815260096020908152604080832073039e2fb66102314ce7b64ce5ce3e5183bc94ad3884529091528120919092169163ee2b38369185919085611f45426107086118bb565b6040518663ffffffff1660e01b8152600401611f65959493929190612a7e565b6000604051808303816000875af1158015611f84573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261090991908101906128fd565b600854611fc49085906001600160a01b031684611d81565b826001600160a01b0316846001600160a01b031614610909576008546001600160a01b0385811660009081526009602090815260408083208885168452909152812091909216916338ed17399185919085612021426107086118bb565b6040518663ffffffff1660e01b8152600401612041959493929190612a7e565b6000604051808303816000875af1158015612060573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261208891908101906128fd565b5050505050565b6008546120a79085906001600160a01b031684611d81565b6008546120bf9084906001600160a01b031683611d81565b6008546001600160a01b031663e8e3370085858585600080306120e4426107086118bb565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1158015612160573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121849190612aba565b50505050505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa1580156121dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220191906129c6565b90506109098463095ea7b360e01b8561221a86866129df565b6040516001600160a01b0390921660248301526044820152606401611865565b606061080b848460008585600080866001600160a01b031685876040516122619190612813565b60006040518083038185875af1925050503d806000811461229e576040519150601f19603f3d011682016040523d82523d6000602084013e6122a3565b606091505b50915091506122b4878383876122bf565b979650505050505050565b6060831561232b578251612324576001600160a01b0385163b6123245760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a3565b508161080b565b61080b83838151156123405781518083602001fd5b8060405162461bcd60e51b81526004016106a39190612590565b8280548282559060005260206000209081019282156123af579160200282015b828111156123af57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061237a565b506123bb9291506123bf565b5090565b5b808211156123bb57600081556001016123c0565b80356001600160a01b03811681146123eb57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561242f5761242f6123f0565b604052919050565b600067ffffffffffffffff831115612451576124516123f0565b612464601f8401601f1916602001612406565b905082815283838301111561247857600080fd5b828260208301376000602084830101529392505050565b600080600080608085870312156124a557600080fd5b6124ae856123d4565b935060208501359250604085013567ffffffffffffffff808211156124d257600080fd5b818701915087601f8301126124e657600080fd5b6124f588833560208501612437565b9350606087013591508082111561250b57600080fd5b508501601f8101871361251d57600080fd5b61252c87823560208401612437565b91505092959194509250565b60005b8381101561255357818101518382015260200161253b565b838111156109095750506000910152565b6000815180845261257c816020860160208601612538565b601f01601f19169290920160200192915050565b6020815260006118a86020830184612564565b6000806000606084860312156125b857600080fd5b6125c1846123d4565b95602085013595506040909401359392505050565b600067ffffffffffffffff8211156125f0576125f06123f0565b5060051b60200190565b600082601f83011261260b57600080fd5b8135602061262061261b836125d6565b612406565b82815260059290921b8401810191818101908684111561263f57600080fd5b8286015b8481101561266157612654816123d4565b8352918301918301612643565b509695505050505050565b60008060006060848603121561268157600080fd5b833567ffffffffffffffff8082111561269957600080fd5b6126a5878388016125fa565b945060208601359150808211156126bb57600080fd5b6126c7878388016125fa565b935060408601359150808211156126dd57600080fd5b506126ea868287016125fa565b9150509250925092565b60006020828403121561270657600080fd5b5035919050565b6000806040838503121561272057600080fd5b612729836123d4565b946020939093013593505050565b60006020828403121561274957600080fd5b6118a8826123d4565b60008060006060848603121561276757600080fd5b612770846123d4565b925061277e602085016123d4565b9150604084013590509250925092565b6000806000606084860312156127a357600080fd5b6127ac846123d4565b92506127ba602085016123d4565b9150604084013567ffffffffffffffff8111156127d657600080fd5b6126ea868287016125fa565b6001600160e01b0319831681528151600090612805816004850160208701612538565b919091016004019392505050565b60008251612825818460208701612538565b9190910192915050565b8381526060602082015260006128486060830185612564565b828103604084015261285a8185612564565b9695505050505050565b6020808252601c908201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c657200000000604082015260600190565b6000815480845260208085019450836000528060002060005b838110156128d95781546001600160a01b0316875295820195600191820191016128b4565b509495945050505050565b82815260406020820152600061080b604083018461289b565b6000602080838503121561291057600080fd5b825167ffffffffffffffff81111561292757600080fd5b8301601f8101851361293857600080fd5b805161294661261b826125d6565b81815260059190911b8201830190838101908783111561296557600080fd5b928401925b828410156122b45783518252928401929084019061296a565b634e487b7160e01b600052601160045260246000fd5b6000828210156129ab576129ab612983565b500390565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156129d857600080fd5b5051919050565b600082198211156129f2576129f2612983565b500190565b60008060408385031215612a0a57600080fd5b505080516020909101519092909150565b6000816000190483118215151615612a3557612a35612983565b500290565b600082612a5757634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612a6e57600080fd5b815180151581146118a857600080fd5b85815284602082015260a060408201526000612a9d60a083018661289b565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215612acf57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212203ce208d10739146a60da21cd276a2e66eb0957075982ebc7a57daf69c15082e164736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ead049d2544e9b3d637d49a89f2669f109ab4e5800000000000000000000000071fd21a764ef295fb7bfbdf4d2ebffe862e76fbf000000000000000000000000c547e8dd3844fb5bc178120a121b365ea790774e0000000000000000000000004ade5608127594cd9ea131f0826aea02fe517461000000000000000000000000c159d904ca8c2449df0ae4836197278f2f68c72500000000000000000000000000000000000000000000000000000000000000010000000000000000000000006eb32c8db5ff2878acbcb6a1ec5e301f60884da4000000000000000000000000b0695ce12c56aae40894235e2d1888d0b62dd11000000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
-----Decoded View---------------
Arg [0] : _controller (address): 0xEAd049d2544e9b3d637D49A89F2669F109ab4E58
Arg [1] : _timelock (address): 0x71FD21a764eF295fB7BFBdf4D2EBfFE862e76fBf
Arg [2] : _treasuryAddress (address): 0xc547E8dD3844fb5BC178120a121b365Ea790774E
Arg [3] : _farmContractAddress (address): 0x4aDe5608127594CD9eA131f0826AEA02FE517461
Arg [4] : _dexRouterAddress (address): 0xC159D904cA8C2449df0AE4836197278f2f68C725
Arg [5] : _pid (uint256): 1
Arg [6] : _wantAddress (address): 0x6eB32C8dB5Ff2878acbCB6a1Ec5e301F60884dA4
Arg [7] : _earnedAddress (address): 0xb0695ce12c56AAe40894235e2d1888D0b62Dd110
Arg [8] : _token0 (address): 0x29219dd400f2Bf60E5a23d13Be72B486D4038894
Arg [9] : _token1 (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 000000000000000000000000ead049d2544e9b3d637d49a89f2669f109ab4e58
Arg [1] : 00000000000000000000000071fd21a764ef295fb7bfbdf4d2ebffe862e76fbf
Arg [2] : 000000000000000000000000c547e8dd3844fb5bc178120a121b365ea790774e
Arg [3] : 0000000000000000000000004ade5608127594cd9ea131f0826aea02fe517461
Arg [4] : 000000000000000000000000c159d904ca8c2449df0ae4836197278f2f68c725
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 0000000000000000000000006eb32c8db5ff2878acbcb6a1ec5e301f60884da4
Arg [7] : 000000000000000000000000b0695ce12c56aae40894235e2d1888d0b62dd110
Arg [8] : 00000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
Arg [9] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode Sourcemap
41793:13229:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42419:25;;;;;-1:-1:-1;;;;;42419:25:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;42419:25:0;;;;;;;;54299:720;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;53608:89::-;;;;;;:::i;:::-;;:::i;:::-;;42758:46;;42801:3;42758:46;;;;;3392:25:1;;;3380:2;3365:18;42758:46:0;3246:177:1;51370:395:0;;;;;;:::i;:::-;;:::i;46103:59::-;;;:::i;50665:191::-;;;;;;:::i;:::-;;:::i;50476:67::-;;;:::i;42578:43::-;;;;;;42628:39;;;;;;45526:569;;;;;;:::i;:::-;;:::i;46170:71::-;;;:::i;38230:86::-;38301:7;;;;38230:86;;5724:14:1;;5717:22;5699:41;;5687:2;5672:18;38230:86:0;5559:187:1;42298:80:0;;42335:42;42298:80;;46324:65;;;:::i;50864:184::-;;;;;;:::i;:::-;;:::i;50200:197::-;;;:::i;42674:30::-;;;;;;49646:300;;;;;;:::i;:::-;;:::i;51244:118::-;;;;;;:::i;:::-;;:::i;32683:103::-;;;:::i;51773:168::-;;;;;;:::i;:::-;;:::i;45107:169::-;;;:::i;42049:37::-;;;;;-1:-1:-1;;;;;42049:37:0;;;50405:63;;;:::i;42713:33::-;;;;;;32042:87;32088:7;32115:6;-1:-1:-1;;;;;32115:6:0;32042:87;;53750:274;;;;;;:::i;:::-;;:::i;41941:34::-;;;;;;;;-1:-1:-1;;;;;41941:34:0;;;42521:40;;;;;;44946:153;;;:::i;42483:31::-;;;;;;44752:186;;;:::i;54032:196::-;;;;;;:::i;:::-;;:::i;51056:180::-;;;;;;:::i;:::-;;:::i;42222:67::-;;;;;;:::i;:::-;;:::i;53491:109::-;;;:::i;42820:30::-;;;;;-1:-1:-1;;;;;42820:30:0;;;53113:370;;;;;;:::i;:::-;;:::i;50551:106::-;;;;;;:::i;:::-;;:::i;42451:23::-;;;;;-1:-1:-1;;;;;42451:23:0;;;49440:198;;;:::i;42093:37::-;;;;;-1:-1:-1;;;;;42093:37:0;;;49954:238;;;:::i;42137:37::-;;;;;-1:-1:-1;;;;;42137:37:0;;;42007:35;;;;;-1:-1:-1;;;;;42007:35:0;;;42181:31;;;;;-1:-1:-1;;;;;42181:31:0;;;41982:18;;;;;;32941:201;;;;;;:::i;:::-;;:::i;46814:949::-;;;;;;:::i;:::-;;:::i;46249:67::-;;;:::i;42387:25::-;;;;;-1:-1:-1;;;;;42387:25:0;;;54299:720;44467:8;;54433:12;;-1:-1:-1;;;;;44467:8:0;44479:10;44467:22;44459:67;;;;-1:-1:-1;;;44459:67:0;;6978:2:1;44459:67:0;;;6960:21:1;;;6997:18;;;6990:30;7056:34;7036:18;;;7029:62;7108:18;;44459:67:0;;;;;;;;;54458:21:::1;54502:9;54496:23;54523:1;54496:28;54492:179;;;-1:-1:-1::0;54552:4:0;54492:179:::1;;;54640:9;54624:27;;;;;;54654:4;54600:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54589:70;;54492:179;54744:12;54758:23:::0;54785:6:::1;-1:-1:-1::0;;;;;54785:11:0::1;54805:5;54812:8;54785:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54743:78;;;;54840:7;54832:81;;;::::0;-1:-1:-1;;;54832:81:0;;7994:2:1;54832:81:0::1;::::0;::::1;7976:21:1::0;8033:2;8013:18;;;8006:30;8072:34;8052:18;;;8045:62;8143:31;8123:18;;;8116:59;8192:19;;54832:81:0::1;7792:425:1::0;54832:81:0::1;54950:6;-1:-1:-1::0;;;;;54931:50:0::1;;54958:5;54965:9;54976:4;54931:50;;;;;;;;:::i;:::-;;;;;;;;55001:10:::0;-1:-1:-1;;;44537:1:0::1;54299:720:::0;;;;;;:::o;53608:89::-;44174:10;;-1:-1:-1;;;;;44174:10:0;44188;44174:24;44166:65;;;;-1:-1:-1;;;44166:65:0;;;;;;;:::i;:::-;53608:89;;;:::o;51370:395::-;31928:13;:11;:13::i;:::-;51576::::1;::::0;-1:-1:-1;;;;;51576:13:0;;::::1;51565:25;::::0;;;:10:::1;:25;::::0;;;;;;;51591:13:::1;::::0;;;::::1;51565:40:::0;;;;;;;;:62;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;51649:13:0::1;::::0;-1:-1:-1;;;;;51649:13:0;;::::1;51638:25;::::0;;;:10:::1;:25;::::0;;;;;;;51664:13:::1;::::0;;;::::1;51638:40:::0;;;;;;;;:62;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;51722:13:0::1;::::0;-1:-1:-1;;;;;51722:13:0::1;51711:25;::::0;;;:10:::1;:25;::::0;;;;;;;42335:42:::1;51711:29:::0;;;;;;;:46;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;51370:395:::0;;;:::o;46103:59::-;31928:13;:11;:13::i;:::-;46147:7:::1;:5;:7::i;:::-;46103:59::o:0;50665:191::-;31928:13;:11;:13::i;:::-;42801:3:::1;50744:14;:34;;50736:71;;;::::0;-1:-1:-1;;;50736:71:0;;9236:2:1;50736:71:0::1;::::0;::::1;9218:21:1::0;9275:2;9255:18;;;9248:30;9314:26;9294:18;;;9287:54;9358:18;;50736:71:0::1;9034:348:1::0;50736:71:0::1;50818:13;:30:::0;50665:191::o;50476:67::-;31928:13;:11;:13::i;:::-;50525:10:::1;:8;:10::i;45526:569::-:0;44174:10;;45639:7;;-1:-1:-1;;;;;44174:10:0;44188;44174:24;44166:65;;;;-1:-1:-1;;;44166:65:0;;;;;;;:::i;:::-;35751:21:::1;:19;:21::i;:::-;37835:19:::2;:17;:19::i;:::-;45659:10:::3;:8;:10::i;:::-;45689:11;::::0;45682:82:::3;::::0;-1:-1:-1;;;;;45689:11:0::3;45727:10;45748:4;45755:8:::0;45682:36:::3;:82::i;:::-;45822:15;::::0;45799:8;;45822:19;;;;:38:::3;;;45859:1;45845:11;;:15;45822:38;45818:131;;;45891:46;45921:15;;45891:25;45904:11;;45891:8;:12;;:25;;;;:::i;:::-;:29:::0;::::3;:46::i;:::-;45877:60;;45818:131;45973:11;::::0;:28:::3;::::0;45989:11;45973:15:::3;:28::i;:::-;45959:11;:42:::0;46014:7:::3;:5;:7::i;:::-;46039:17;::::0;3392:25:1;;;46039:17:0::3;::::0;3380:2:1;3365:18;46039:17:0::3;;;;;;;46076:11:::0;-1:-1:-1;35795:20:0::1;35189:1:::0;36315:22;;36132:213;35795:20:::1;45526:569:::0;;;;:::o;46170:71::-;31928:13;:11;:13::i;:::-;46223:10:::1;:8;:10::i;46324:65::-:0;31928:13;:11;:13::i;:::-;46371:10:::1;:8;:10::i;50864:184::-:0;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;50956:30:0;::::1;50948:47;;;;-1:-1:-1::0;;;50948:47:0::1;;;;;;9589:2:1::0;9571:21;;;9628:1;9608:18;;;9601:29;-1:-1:-1;;;9661:2:1;9646:18;;9639:34;9705:2;9690:18;;9387:327;50948:47:0::1;51006:15;:34:::0;;-1:-1:-1;;;;;;51006:34:0::1;-1:-1:-1::0;;;;;51006:34:0;;;::::1;::::0;;;::::1;::::0;;50864:184::o;50200:197::-;50253:7;50273:16;50292;:14;:16::i;:::-;50273:35;-1:-1:-1;50327:13:0;;50326:63;;50361:13;;50348:41;;-1:-1:-1;;;;;50361:13:0;42335:42;50380:8;50348:12;:41::i;:::-;50326:63;;;50344:1;50326:63;50319:70;;;50200:197;:::o;49646:300::-;49809:16;;-1:-1:-1;;;;;49855:23:0;;;49754:7;49855:23;;;:10;:23;;;;;;;;:37;;;;;;;;;;;49801:92;;-1:-1:-1;;;49801:92:0;;49754:7;;;;49809:16;;49801:39;;:92;;49841:12;;49855:37;49801:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49801:92:0;;;;;;;;;;;;:::i;:::-;49774:119;;49911:7;49936:1;49919:7;:14;:18;;;;:::i;:::-;49911:27;;;;;;;;:::i;:::-;;;;;;;49904:34;;;49646:300;;;;;:::o;51244:118::-;31928:13;:11;:13::i;:::-;51324::::1;:30:::0;51244:118::o;32683:103::-;31928:13;:11;:13::i;:::-;32748:30:::1;32775:1;32748:18;:30::i;51773:168::-:0;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;51888:23:0;;::::1;;::::0;;;:10:::1;:23;::::0;;;;;;;:37;;::::1;::::0;;;;;;;;:45;;::::1;::::0;;::::1;::::0;::::1;:::i;45107:169::-:0;45171:7;45199:11;;45214:1;45199:16;45198:70;;45226:42;45256:11;;45226:25;45246:4;45226:15;;:19;;:25;;;;:::i;:42::-;45191:77;;45107:169;:::o;45198:70::-;-1:-1:-1;45219:4:0;;45107:169::o;50405:63::-;31928:13;:11;:13::i;:::-;50452:8:::1;:6;:8::i;53750:274::-:0;-1:-1:-1;;;;;53822:25:0;;53814:52;;;;-1:-1:-1;;;53814:52:0;;12043:2:1;53814:52:0;;;12025:21:1;12082:2;12062:18;;;12055:30;-1:-1:-1;;;12101:18:1;;;12094:44;12155:18;;53814:52:0;11841:338:1;53814:52:0;53885:10;;-1:-1:-1;;;;;53885:10:0;53899;53885:24;;:50;;-1:-1:-1;53913:8:0;;-1:-1:-1;;;;;53913:8:0;53925:10;53913:22;53885:50;53877:104;;;;-1:-1:-1;;;53877:104:0;;12386:2:1;53877:104:0;;;12368:21:1;12425:2;12405:18;;;12398:30;12464:34;12444:18;;;12437:62;-1:-1:-1;;;12515:18:1;;;12508:39;12564:19;;53877:104:0;12184:405:1;53877:104:0;53992:10;:24;;-1:-1:-1;;;;;;53992:24:0;-1:-1:-1;;;;;53992:24:0;;;;;;;;;;53750:274::o;44946:153::-;45002:7;45076:15;:13;:15::i;:::-;45036:11;;;45029:44;;-1:-1:-1;;;45029:44:0;;45067:4;45029:44;;;160:51:1;;;;-1:-1:-1;;;;;45036:11:0;;45029:29;;133:18:1;;45029:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;44752:186::-;44857:19;;44887:3;;44847:59;;-1:-1:-1;;;44847:59:0;;;;;13090:25:1;;;;44900:4:0;13131:18:1;;;13124:60;44807:7:0;;;;44857:19;;;;-1:-1:-1;;;;;44857:19:0;;44847:39;;13063:18:1;;44847:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;44827:79:0;44752:186;-1:-1:-1;;44752:186:0:o;54032:196::-;54100:8;;-1:-1:-1;;;;;54100:8:0;54112:10;54100:22;;:75;;-1:-1:-1;54127:8:0;;-1:-1:-1;;;;;54127:8:0;:22;:47;;;;-1:-1:-1;54164:10:0;54153:7;32088;32115:6;-1:-1:-1;;;;;32115:6:0;;32042:87;54153:7;-1:-1:-1;;;;;54153:21:0;;54127:47;54092:97;;;;-1:-1:-1;;;54092:97:0;;13647:2:1;54092:97:0;;;13629:21:1;13686:1;13666:18;;;13659:29;-1:-1:-1;;;13704:18:1;;;13697:39;13753:18;;54092:97:0;13445:332:1;54092:97:0;54200:8;:20;;-1:-1:-1;;;;;;54200:20:0;-1:-1:-1;;;;;54200:20:0;;;;;;;;;;54032:196::o;51056:180::-;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;51147:28:0;::::1;51139:45;;;;-1:-1:-1::0;;;51139:45:0::1;;;;;;9589:2:1::0;9571:21;;;9628:1;9608:18;;;9601:29;-1:-1:-1;;;9661:2:1;9646:18;;9639:34;9705:2;9690:18;;9387:327;51139:45:0::1;51195:16;:33:::0;;-1:-1:-1;;;;;;51195:33:0::1;-1:-1:-1::0;;;;;51195:33:0;;;::::1;::::0;;;::::1;::::0;;51056:180::o;42222:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42222:67:0;;-1:-1:-1;42222:67:0;;-1:-1:-1;;42222:67:0:o;53491:109::-;31928:13;:11;:13::i;:::-;38301:7;;;;53544:48:::1;;;53558:10;:8;:10::i;53113:370::-:0;31928:13;:11;:13::i;:::-;53233::::1;::::0;-1:-1:-1;;;;;53223:23:0;;::::1;53233:13:::0;::::1;53223:23;;53215:41;;;::::0;-1:-1:-1;;;53215:41:0;;13984:2:1;53215:41:0::1;::::0;::::1;13966:21:1::0;14023:1;14003:18;;;13996:29;-1:-1:-1;;;14041:18:1;;;14034:35;14086:18;;53215:41:0::1;13782:328:1::0;53215:41:0::1;53285:11;::::0;-1:-1:-1;;;;;53275:21:0;;::::1;53285:11:::0;::::1;53275:21;;53267:39;;;::::0;-1:-1:-1;;;53267:39:0;;13984:2:1;53267:39:0::1;::::0;::::1;13966:21:1::0;14023:1;14003:18;;;13996:29;-1:-1:-1;;;14041:18:1;;;14034:35;14086:18;;53267:39:0::1;13782:328:1::0;53267:39:0::1;53339:10;::::0;-1:-1:-1;;;;;53339:10:0;;::::1;::::0;53360:49:::1;::::0;:27;::::1;53339:10:::0;53401:7;53360:27:::1;:49::i;:::-;53425:50;::::0;;-1:-1:-1;;;;;14373:15:1;;;14355:34;;14420:2;14405:18;;14398:34;;;14468:15;;14448:18;;;14441:43;;;;53425:50:0::1;::::0;14305:2:1;14290:18;53425:50:0::1;;;;;;;;53204:279;53113:370:::0;;:::o;50551:106::-;31928:13;:11;:13::i;:::-;50625:10:::1;:24:::0;;-1:-1:-1;;;;;;50625:24:0::1;-1:-1:-1::0;;;;;50625:24:0;;;::::1;::::0;;;::::1;::::0;;50551:106::o;49440:198::-;35751:21;:19;:21::i;:::-;37835:19:::1;:17;:19::i;:::-;49510:10:::2;:8;:10::i;:::-;49533;:8;:10::i;:::-;49556:11;:9;:11::i;:::-;49580:7;:5;:7::i;:::-;49615:15;49600:12;:30:::0;35795:20;35189:1;36315:22;;36132:213;49954:238;50049:13;;50042:46;;-1:-1:-1;;;50042:46:0;;50082:4;50042:46;;;160:51:1;50001:7:0;;;;-1:-1:-1;;;;;50049:13:0;;;;50042:31;;133:18:1;;50042:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50116:19;;50149:3;;50106:62;;-1:-1:-1;;;50106:62:0;;;;;13090:25:1;;;;50162:4:0;13131:18:1;;;13124:60;50021:67:0;;-1:-1:-1;50106:78:0;;50021:67;;50116:19;;;-1:-1:-1;;;;;50116:19:0;;50106:42;;13063:18:1;;50106:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;:78::i;32941:201::-;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;33030:22:0;::::1;33022:73;;;::::0;-1:-1:-1;;;33022:73:0;;14697:2:1;33022:73:0::1;::::0;::::1;14679:21:1::0;14736:2;14716:18;;;14709:30;14775:34;14755:18;;;14748:62;-1:-1:-1;;;14826:18:1;;;14819:36;14872:19;;33022:73:0::1;14495:402:1::0;33022:73:0::1;33106:28;33125:8;33106:18;:28::i;:::-;32941:201:::0;:::o;46814:949::-;44174:10;;46914:7;;-1:-1:-1;;;;;44174:10:0;44188;44174:24;44166:65;;;;-1:-1:-1;;;44166:65:0;;;;;;;:::i;:::-;35751:21:::1;:19;:21::i;:::-;46934:10:::2;:8;:10::i;:::-;46974:1;46963:8;:12;46955:44;;;::::0;-1:-1:-1;;;46955:44:0;;15104:2:1;46955:44:0::2;::::0;::::2;15086:21:1::0;15143:2;15123:18;;;15116:30;-1:-1:-1;;;15162:18:1;;;15155:49;15221:18;;46955:44:0::2;14902:343:1::0;46955:44:0::2;47022:19;::::0;47052:3:::2;::::0;47012:54:::2;::::0;-1:-1:-1;;;47012:54:0;;::::2;::::0;::::2;15424:25:1::0;;;;15465:18;;;15458:34;;;47022:19:0::2;::::0;;::::2;-1:-1:-1::0;;;;;47022:19:0::2;::::0;47012:39:::2;::::0;15397:18:1;;47012:54:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;47104:11:0::2;::::0;;47097:44:::2;::::0;-1:-1:-1;;;47097:44:0;;47135:4:::2;47097:44:::0;;::::2;160:51:1::0;;;;47079:15:0::2;::::0;-1:-1:-1;;;;;;47104:11:0::2;::::0;-1:-1:-1;47097:29:0::2;::::0;133:18:1;;47097:44:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47079:62;;47167:7;47156:8;:18;47152:69;;;47202:7;47191:18;;47152:69;47255:8;47237:15;;:26;47233:85;;;47291:15;;47280:26;;47233:85;47330:21;47354:46;47384:15;;47354:25;47367:11;;47354:8;:12;;:25;;;;:::i;:46::-;47330:70;;47431:11;;47415:13;:27;47411:87;;;-1:-1:-1::0;47475:11:0::2;::::0;47411:87:::2;47522:11;::::0;:30:::2;::::0;47538:13;47522:15:::2;:30::i;:::-;47508:11;:44:::0;47581:15:::2;::::0;:29:::2;::::0;47601:8;47581:19:::2;:29::i;:::-;47563:15;:47:::0;47630:11:::2;::::0;47623:63:::2;::::0;-1:-1:-1;;;;;47630:11:0::2;47664:10;47677:8:::0;47623:32:::2;:63::i;:::-;47704:18;::::0;3392:25:1;;;47704:18:0::2;::::0;3380:2:1;3365:18;47704::0::2;;;;;;;47742:13:::0;-1:-1:-1;;35795:20:0::1;35189:1:::0;36315:22;;36132:213;46249:67;31928:13;:11;:13::i;:::-;46297:11:::1;:9;:11::i;32207:132::-:0;32088:7;32115:6;-1:-1:-1;;;;;32115:6:0;30652:10;32271:23;32263:68;;;;-1:-1:-1;;;32263:68:0;;15705:2:1;32263:68:0;;;15687:21:1;;;15724:18;;;15717:30;15783:34;15763:18;;;15756:62;15835:18;;32263:68:0;15503:356:1;46397:409:0;46456:11;;;46497:30;;-1:-1:-1;;;46497:30:0;;46521:4;46497:30;;;160:51:1;;;;-1:-1:-1;;;;;46456:11:0;;46434:12;;46456:11;;46497:15;;133:18:1;;46497:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46556:15;;46479:48;;-1:-1:-1;46556:28:0;;46479:48;46556:19;:28::i;:::-;46538:15;:46;46599:11;;46595:204;;46645:11;;46658:19;;46627:60;;-1:-1:-1;;;;;46645:11:0;;;;;46658:19;;;46679:7;46627:17;:60::i;:::-;46712:19;;46741:3;;46702:52;;-1:-1:-1;;;46702:52:0;;;;;15424:25:1;;;;15465:18;;;15458:34;;;46712:19:0;;;;-1:-1:-1;;;;;46712:19:0;;46702:38;;15397:18:1;;46702:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46774:13;46779:7;46774:13;;;;3392:25:1;;3380:2;3365:18;;3246:177;46774:13:0;;;;;;;;46595:204;46423:383;;46397:409::o;39085:120::-;38094:16;:14;:16::i;:::-;39144:7:::1;:15:::0;;-1:-1:-1;;39144:15:0::1;::::0;;39175:22:::1;30652:10:::0;39184:12:::1;39175:22;::::0;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;39175:22:0::1;;;;;;;39085:120::o:0;35831:293::-;35233:1;35965:7;;:19;;35957:63;;;;-1:-1:-1;;;35957:63:0;;16066:2:1;35957:63:0;;;16048:21:1;16105:2;16085:18;;;16078:30;16144:33;16124:18;;;16117:61;16195:18;;35957:63:0;15864:355:1;35957:63:0;35233:1;36098:7;:18;35831:293::o;38389:108::-;38301:7;;;;38459:9;38451:38;;;;-1:-1:-1;;;38451:38:0;;16426:2:1;38451:38:0;;;16408:21:1;16465:2;16445:18;;;16438:30;-1:-1:-1;;;16484:18:1;;;16477:46;16540:18;;38451:38:0;16224:340:1;44554:190:0;44594:29;44626:22;:20;:22::i;:::-;44594:54;;44692:13;;44667:21;:38;;44659:60;;;;-1:-1:-1;;;44659:60:0;;16771:2:1;44659:60:0;;;16753:21:1;16810:1;16790:18;;;16783:29;-1:-1:-1;;;16828:18:1;;;16821:39;16877:18;;44659:60:0;16569:332:1;44659:60:0;44730:6;:4;:6::i;17420:205::-;17548:68;;-1:-1:-1;;;;;17164:15:1;;;17548:68:0;;;17146:34:1;17216:15;;17196:18;;;17189:43;17248:18;;;17241:34;;;17521:96:0;;17541:5;;-1:-1:-1;;;17571:27:0;17081:18:1;;17548:68:0;;;;-1:-1:-1;;17548:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;17548:68:0;-1:-1:-1;;;;;;17548:68:0;;;;;;;;;;17521:19;:96::i;26636:98::-;26694:7;26721:5;26725:1;26721;:5;:::i;:::-;26714:12;26636:98;-1:-1:-1;;;26636:98:0:o;27035:::-;27093:7;27120:5;27124:1;27120;:5;:::i;25898:98::-;25956:7;25983:5;25987:1;25983;:5;:::i;47769:126::-;47851:19;;47880:3;;47841:46;;-1:-1:-1;;;47841:46:0;;;;;15424:25:1;;;;47885:1:0;15465:18:1;;;15458:34;47851:19:0;;;;-1:-1:-1;;;;;47851:19:0;;47841:38;;15397:18:1;;47841:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47903:381;47973:13;;47966:46;;-1:-1:-1;;;47966:46:0;;48006:4;47966:46;;;160:51:1;47943:20:0;;-1:-1:-1;;;;;47973:13:0;;47966:31;;133:18:1;;47966:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47943:69;;48043:1;48027:12;:17;48023:56;;48061:7;47903:381::o;48023:56::-;48101:13;;48094:35;;;-1:-1:-1;;;;;48101:13:0;;;18116:51:1;;18198:2;18183:18;;18176:34;;;48094:35:0;;18089:18:1;48094:35:0;;;;;;;48202:13;;48234;;48188:88;;-1:-1:-1;;;;;48202:13:0;;48217:41;;48253:4;;48217:31;;:12;;:16;:31::i;:41::-;48260:15;;-1:-1:-1;;;;;48260:15:0;48188:13;:88::i;33302:191::-;33376:16;33395:6;;-1:-1:-1;;;;;33412:17:0;;;-1:-1:-1;;;;;;33412:17:0;;;;;;33445:40;;33395:6;;;;;;;33445:40;;33376:16;33445:40;33365:128;33302:191;:::o;38826:118::-;37835:19;:17;:19::i;:::-;38886:7:::1;:14:::0;;-1:-1:-1;;38886:14:0::1;38896:4;38886:14;::::0;;38916:20:::1;38923:12;30652:10:::0;;30572:98;16998:177;17108:58;;-1:-1:-1;;;;;18134:32:1;;17108:58:0;;;18116:51:1;18183:18;;;18176:34;;;17081:86:0;;17101:5;;-1:-1:-1;;;17131:23:0;18089:18:1;;17108:58:0;17942:274:1;48292:1030:0;48414:13;;48407:46;;-1:-1:-1;;;48407:46:0;;48447:4;48407:46;;;160:51:1;48384:20:0;;-1:-1:-1;;;;;48414:13:0;;48407:31;;133:18:1;;48407:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48544:13;;48384:69;;-1:-1:-1;48515:62:0;;48531:45;;-1:-1:-1;;;;;48544:13:0;42335:42;48384:69;48531:12;:45::i;:::-;48515:11;;;:15;:62::i;:::-;48501:11;:76;48611:13;;48594;;-1:-1:-1;;;;;48594:13:0;;;48611;;48594:30;48590:146;;48659:13;;48674;;48641:83;;-1:-1:-1;;;;;48659:13:0;;;;48674;48689:19;:12;48706:1;48689:16;:19::i;:::-;48718:4;48641:17;:83::i;:::-;48769:13;;48752;;-1:-1:-1;;;;;48752:13:0;;;48769;;48752:30;48748:146;;48817:13;;48832;;48799:83;;-1:-1:-1;;;;;48817:13:0;;;;48832;48847:19;:12;48864:1;48847:16;:19::i;48799:83::-;48980:13;;48973:46;;-1:-1:-1;;;48973:46:0;;49013:4;48973:46;;;160:51:1;48953:17:0;;-1:-1:-1;;;;;48980:13:0;;48973:31;;133:18:1;;48973:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49057:13;;49050:46;;-1:-1:-1;;;49050:46:0;;49090:4;49050:46;;;160:51:1;48953:66:0;;-1:-1:-1;49030:17:0;;-1:-1:-1;;;;;49057:13:0;;;;49050:31;;133:18:1;;49050:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49030:66;;49123:1;49111:9;:13;:30;;;;;49140:1;49128:9;:13;49111:30;49107:208;;;49172:13;;49187;;49158:65;;-1:-1:-1;;;;;49172:13:0;;;;49187;49202:9;49213;49158:13;:65::i;:::-;49252:13;;49278;;49243:60;;;-1:-1:-1;;;;;49252:13:0;;;18490:34:1;;18555:2;18540:18;;18533:34;;;49278:13:0;;;;18583:18:1;;;18576:43;18650:2;18635:18;;18628:34;;;49243:60:0;;18439:3:1;18424:19;49243:60:0;18221:447:1;26279:98:0;26337:7;26364:5;26368:1;26364;:5;:::i;45284:194::-;45414:56;-1:-1:-1;;;;;45414:35:0;;45450:7;45459:10;45414:35;:56::i;38574:108::-;38301:7;;;;38633:41;;;;-1:-1:-1;;;38633:41:0;;18875:2:1;38633:41:0;;;18857:21:1;18914:2;18894:18;;;18887:30;-1:-1:-1;;;18933:18:1;;;18926:50;18993:18;;38633:41:0;18673:344:1;21344:649:0;21768:23;21794:69;21822:4;21794:69;;;;;;;;;;;;;;;;;21802:5;-1:-1:-1;;;;;21794:27:0;;;:69;;;;;:::i;:::-;21768:95;;21882:10;:17;21903:1;21882:22;:56;;;;21919:10;21908:30;;;;;;;;;;;;:::i;:::-;21874:111;;;;-1:-1:-1;;;21874:111:0;;19506:2:1;21874:111:0;;;19488:21:1;19545:2;19525:18;;;19518:30;19584:34;19564:18;;;19557:62;-1:-1:-1;;;19635:18:1;;;19628:40;19685:19;;21874:111:0;19304:406:1;51951:335:0;52075:16;;52044:57;;52062:11;;-1:-1:-1;;;;;52075:16:0;52093:7;52044:17;:57::i;:::-;-1:-1:-1;;;;;52116:17:0;;42335:42;52116:17;52112:167;;52158:16;;-1:-1:-1;;;;;52208:23:0;;;52158:16;52208:23;;;:10;:23;;;;;;;;42335:42;52208:27;;;;;;;52158:16;;;;;52150:45;;52196:7;;52158:16;52237:2;52241:25;:15;52261:4;52241:19;:25::i;:::-;52150:117;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52150:117:0;;;;;;;;;;;;:::i;52294:386::-;52444:16;;52413:57;;52431:11;;-1:-1:-1;;;;;52444:16:0;52462:7;52413:17;:57::i;:::-;52500:12;-1:-1:-1;;;;;52485:27:0;:11;-1:-1:-1;;;;;52485:27:0;;52481:192;;52537:16;;-1:-1:-1;;;;;52592:23:0;;;52537:16;52592:23;;;:10;:23;;;;;;;;:37;;;;;;;;;;52537:16;;;;;52529:50;;52580:7;;52537:16;52631:2;52635:25;:15;52655:4;52635:19;:25::i;:::-;52529:132;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52529:132:0;;;;;;;;;;;;:::i;:::-;;52294:386;;;;:::o;52688:417::-;52842:16;;52815:61;;52833:7;;-1:-1:-1;;;;;52842:16:0;52860:15;52815:17;:61::i;:::-;52914:16;;52887:61;;52905:7;;-1:-1:-1;;;;;52914:16:0;52932:15;52887:17;:61::i;:::-;52967:16;;-1:-1:-1;;;;;52967:16:0;52959:38;52998:7;53007;53016:15;53033;52967:16;;53064:4;53071:25;:15;53091:4;53071:19;:25::i;:::-;52959:138;;;;;;-1:-1:-1;;;;;;52959:138:0;;;-1:-1:-1;;;;;20722:15:1;;;52959:138:0;;;20704:34:1;20774:15;;;20754:18;;;20747:43;20806:18;;;20799:34;;;;20849:18;;;20842:34;;;;20892:19;;;20885:35;;;;20936:19;;;20929:35;21001:15;;;20980:19;;;20973:44;21033:19;;;21026:35;;;;20638:19;;52959:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;52688:417;;;;:::o;18673:283::-;18793:39;;-1:-1:-1;;;18793:39:0;;18817:4;18793:39;;;21595:34:1;-1:-1:-1;;;;;21665:15:1;;;21645:18;;;21638:43;18770:20:0;;18793:15;;;;;;21530:18:1;;18793:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18770:62;-1:-1:-1;18843:105:0;18863:5;-1:-1:-1;;;18917:7:0;18926:20;18941:5;18770:62;18926:20;:::i;:::-;18870:77;;-1:-1:-1;;;;;18134:32:1;;;18870:77:0;;;18116:51:1;18183:18;;;18176:34;18089:18;;18870:77:0;17942:274:1;10795:229:0;10932:12;10964:52;10986:6;10994:4;11000:1;11003:12;10932;12169;12183:23;12210:6;-1:-1:-1;;;;;12210:11:0;12229:5;12236:4;12210:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12168:73;;;;12259:69;12286:6;12294:7;12303:10;12315:12;12259:26;:69::i;:::-;12252:76;11881:455;-1:-1:-1;;;;;;;11881:455:0:o;14454:644::-;14639:12;14668:7;14664:427;;;14696:17;;14692:290;;-1:-1:-1;;;;;8335:19:0;;;14906:60;;;;-1:-1:-1;;;14906:60:0;;22301:2:1;14906:60:0;;;22283:21:1;22340:2;22320:18;;;22313:30;22379:31;22359:18;;;22352:59;22428:18;;14906:60:0;22099:353:1;14906:60:0;-1:-1:-1;15003:10:0;14996:17;;14664:427;15046:33;15054:10;15066:12;15801:17;;:21;15797:388;;16033:10;16027:17;16090:15;16077:10;16073:2;16069:19;16062:44;15797:388;16160:12;16153:20;;-1:-1:-1;;;16153:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;222:173:1;290:20;;-1:-1:-1;;;;;339:31:1;;329:42;;319:70;;385:1;382;375:12;319:70;222:173;;;:::o;400:127::-;461:10;456:3;452:20;449:1;442:31;492:4;489:1;482:15;516:4;513:1;506:15;532:275;603:2;597:9;668:2;649:13;;-1:-1:-1;;645:27:1;633:40;;703:18;688:34;;724:22;;;685:62;682:88;;;750:18;;:::i;:::-;786:2;779:22;532:275;;-1:-1:-1;532:275:1:o;812:407::-;877:5;911:18;903:6;900:30;897:56;;;933:18;;:::i;:::-;971:57;1016:2;995:15;;-1:-1:-1;;991:29:1;1022:4;987:40;971:57;:::i;:::-;962:66;;1051:6;1044:5;1037:21;1091:3;1082:6;1077:3;1073:16;1070:25;1067:45;;;1108:1;1105;1098:12;1067:45;1157:6;1152:3;1145:4;1138:5;1134:16;1121:43;1211:1;1204:4;1195:6;1188:5;1184:18;1180:29;1173:40;812:407;;;;;:::o;1224:943::-;1329:6;1337;1345;1353;1406:3;1394:9;1385:7;1381:23;1377:33;1374:53;;;1423:1;1420;1413:12;1374:53;1446:29;1465:9;1446:29;:::i;:::-;1436:39;;1522:2;1511:9;1507:18;1494:32;1484:42;;1577:2;1566:9;1562:18;1549:32;1600:18;1641:2;1633:6;1630:14;1627:34;;;1657:1;1654;1647:12;1627:34;1695:6;1684:9;1680:22;1670:32;;1740:7;1733:4;1729:2;1725:13;1721:27;1711:55;;1762:1;1759;1752:12;1711:55;1785:74;1851:7;1846:2;1833:16;1828:2;1824;1820:11;1785:74;:::i;:::-;1775:84;;1912:2;1901:9;1897:18;1884:32;1868:48;;1941:2;1931:8;1928:16;1925:36;;;1957:1;1954;1947:12;1925:36;-1:-1:-1;1980:24:1;;2035:4;2027:13;;2023:27;-1:-1:-1;2013:55:1;;2064:1;2061;2054:12;2013:55;2087:74;2153:7;2148:2;2135:16;2130:2;2126;2122:11;2087:74;:::i;:::-;2077:84;;;1224:943;;;;;;;:::o;2172:258::-;2244:1;2254:113;2268:6;2265:1;2262:13;2254:113;;;2344:11;;;2338:18;2325:11;;;2318:39;2290:2;2283:10;2254:113;;;2385:6;2382:1;2379:13;2376:48;;;-1:-1:-1;;2420:1:1;2402:16;;2395:27;2172:258::o;2435:257::-;2476:3;2514:5;2508:12;2541:6;2536:3;2529:19;2557:63;2613:6;2606:4;2601:3;2597:14;2590:4;2583:5;2579:16;2557:63;:::i;:::-;2674:2;2653:15;-1:-1:-1;;2649:29:1;2640:39;;;;2681:4;2636:50;;2435:257;-1:-1:-1;;2435:257:1:o;2697:217::-;2844:2;2833:9;2826:21;2807:4;2864:44;2904:2;2893:9;2889:18;2881:6;2864:44;:::i;2919:322::-;2996:6;3004;3012;3065:2;3053:9;3044:7;3040:23;3036:32;3033:52;;;3081:1;3078;3071:12;3033:52;3104:29;3123:9;3104:29;:::i;:::-;3094:39;3180:2;3165:18;;3152:32;;-1:-1:-1;3231:2:1;3216:18;;;3203:32;;2919:322;-1:-1:-1;;;2919:322:1:o;3428:183::-;3488:4;3521:18;3513:6;3510:30;3507:56;;;3543:18;;:::i;:::-;-1:-1:-1;3588:1:1;3584:14;3600:4;3580:25;;3428:183::o;3616:668::-;3670:5;3723:3;3716:4;3708:6;3704:17;3700:27;3690:55;;3741:1;3738;3731:12;3690:55;3777:6;3764:20;3803:4;3827:60;3843:43;3883:2;3843:43;:::i;:::-;3827:60;:::i;:::-;3921:15;;;4007:1;4003:10;;;;3991:23;;3987:32;;;3952:12;;;;4031:15;;;4028:35;;;4059:1;4056;4049:12;4028:35;4095:2;4087:6;4083:15;4107:148;4123:6;4118:3;4115:15;4107:148;;;4189:23;4208:3;4189:23;:::i;:::-;4177:36;;4233:12;;;;4140;;4107:148;;;-1:-1:-1;4273:5:1;3616:668;-1:-1:-1;;;;;;3616:668:1:o;4289:821::-;4441:6;4449;4457;4510:2;4498:9;4489:7;4485:23;4481:32;4478:52;;;4526:1;4523;4516:12;4478:52;4566:9;4553:23;4595:18;4636:2;4628:6;4625:14;4622:34;;;4652:1;4649;4642:12;4622:34;4675:61;4728:7;4719:6;4708:9;4704:22;4675:61;:::i;:::-;4665:71;;4789:2;4778:9;4774:18;4761:32;4745:48;;4818:2;4808:8;4805:16;4802:36;;;4834:1;4831;4824:12;4802:36;4857:63;4912:7;4901:8;4890:9;4886:24;4857:63;:::i;:::-;4847:73;;4973:2;4962:9;4958:18;4945:32;4929:48;;5002:2;4992:8;4989:16;4986:36;;;5018:1;5015;5008:12;4986:36;;5041:63;5096:7;5085:8;5074:9;5070:24;5041:63;:::i;:::-;5031:73;;;4289:821;;;;;:::o;5115:180::-;5174:6;5227:2;5215:9;5206:7;5202:23;5198:32;5195:52;;;5243:1;5240;5233:12;5195:52;-1:-1:-1;5266:23:1;;5115:180;-1:-1:-1;5115:180:1:o;5300:254::-;5368:6;5376;5429:2;5417:9;5408:7;5404:23;5400:32;5397:52;;;5445:1;5442;5435:12;5397:52;5468:29;5487:9;5468:29;:::i;:::-;5458:39;5544:2;5529:18;;;;5516:32;;-1:-1:-1;;;5300:254:1:o;5751:186::-;5810:6;5863:2;5851:9;5842:7;5838:23;5834:32;5831:52;;;5879:1;5876;5869:12;5831:52;5902:29;5921:9;5902:29;:::i;5942:328::-;6019:6;6027;6035;6088:2;6076:9;6067:7;6063:23;6059:32;6056:52;;;6104:1;6101;6094:12;6056:52;6127:29;6146:9;6127:29;:::i;:::-;6117:39;;6175:38;6209:2;6198:9;6194:18;6175:38;:::i;:::-;6165:48;;6260:2;6249:9;6245:18;6232:32;6222:42;;5942:328;;;;;:::o;6275:496::-;6377:6;6385;6393;6446:2;6434:9;6425:7;6421:23;6417:32;6414:52;;;6462:1;6459;6452:12;6414:52;6485:29;6504:9;6485:29;:::i;:::-;6475:39;;6533:38;6567:2;6556:9;6552:18;6533:38;:::i;:::-;6523:48;;6622:2;6611:9;6607:18;6594:32;6649:18;6641:6;6638:30;6635:50;;;6681:1;6678;6671:12;6635:50;6704:61;6757:7;6748:6;6737:9;6733:22;6704:61;:::i;7137:371::-;-1:-1:-1;;;;;;7322:33:1;;7310:46;;7379:13;;7292:3;;7401:61;7379:13;7451:1;7442:11;;7435:4;7423:17;;7401:61;:::i;:::-;7482:16;;;;7500:1;7478:24;;7137:371;-1:-1:-1;;;7137:371:1:o;7513:274::-;7642:3;7680:6;7674:13;7696:53;7742:6;7737:3;7730:4;7722:6;7718:17;7696:53;:::i;:::-;7765:16;;;;;7513:274;-1:-1:-1;;7513:274:1:o;8222:450::-;8445:6;8434:9;8427:25;8488:2;8483;8472:9;8468:18;8461:30;8408:4;8514:44;8554:2;8543:9;8539:18;8531:6;8514:44;:::i;:::-;8606:9;8598:6;8594:22;8589:2;8578:9;8574:18;8567:50;8634:32;8659:6;8651;8634:32;:::i;:::-;8626:40;8222:450;-1:-1:-1;;;;;;8222:450:1:o;8677:352::-;8879:2;8861:21;;;8918:2;8898:18;;;8891:30;8957;8952:2;8937:18;;8930:58;9020:2;9005:18;;8677:352::o;9719:495::-;9780:3;9818:5;9812:12;9845:6;9840:3;9833:19;9871:4;9900:2;9895:3;9891:12;9884:19;;9922:5;9919:1;9912:16;9964:2;9961:1;9951:16;9985:1;9995:194;10009:6;10006:1;10003:13;9995:194;;;10074:13;;-1:-1:-1;;;;;10070:39:1;10058:52;;10130:12;;;;10106:1;10165:14;;;;10024:9;9995:194;;;-1:-1:-1;10205:3:1;;9719:495;-1:-1:-1;;;;;9719:495:1:o;10219:337::-;10423:6;10412:9;10405:25;10466:2;10461;10450:9;10446:18;10439:30;10386:4;10486:64;10546:2;10535:9;10531:18;10523:6;10486:64;:::i;10561:881::-;10656:6;10687:2;10730;10718:9;10709:7;10705:23;10701:32;10698:52;;;10746:1;10743;10736:12;10698:52;10779:9;10773:16;10812:18;10804:6;10801:30;10798:50;;;10844:1;10841;10834:12;10798:50;10867:22;;10920:4;10912:13;;10908:27;-1:-1:-1;10898:55:1;;10949:1;10946;10939:12;10898:55;10978:2;10972:9;11001:60;11017:43;11057:2;11017:43;:::i;11001:60::-;11095:15;;;11177:1;11173:10;;;;11165:19;;11161:28;;;11126:12;;;;11201:19;;;11198:39;;;11233:1;11230;11223:12;11198:39;11257:11;;;;11277:135;11293:6;11288:3;11285:15;11277:135;;;11359:10;;11347:23;;11310:12;;;;11390;;;;11277:135;;11447:127;11508:10;11503:3;11499:20;11496:1;11489:31;11539:4;11536:1;11529:15;11563:4;11560:1;11553:15;11579:125;11619:4;11647:1;11644;11641:8;11638:34;;;11652:18;;:::i;:::-;-1:-1:-1;11689:9:1;;11579:125::o;11709:127::-;11770:10;11765:3;11761:20;11758:1;11751:31;11801:4;11798:1;11791:15;11825:4;11822:1;11815:15;12594:184;12664:6;12717:2;12705:9;12696:7;12692:23;12688:32;12685:52;;;12733:1;12730;12723:12;12685:52;-1:-1:-1;12756:16:1;;12594:184;-1:-1:-1;12594:184:1:o;12783:128::-;12823:3;12854:1;12850:6;12847:1;12844:13;12841:39;;;12860:18;;:::i;:::-;-1:-1:-1;12896:9:1;;12783:128::o;13195:245::-;13274:6;13282;13335:2;13323:9;13314:7;13310:23;13306:32;13303:52;;;13351:1;13348;13341:12;13303:52;-1:-1:-1;;13374:16:1;;13430:2;13415:18;;;13409:25;13374:16;;13409:25;;-1:-1:-1;13195:245:1:o;17286:168::-;17326:7;17392:1;17388;17384:6;17380:14;17377:1;17374:21;17369:1;17362:9;17355:17;17351:45;17348:71;;;17399:18;;:::i;:::-;-1:-1:-1;17439:9:1;;17286:168::o;17459:217::-;17499:1;17525;17515:132;;17569:10;17564:3;17560:20;17557:1;17550:31;17604:4;17601:1;17594:15;17632:4;17629:1;17622:15;17515:132;-1:-1:-1;17661:9:1;;17459:217::o;19022:277::-;19089:6;19142:2;19130:9;19121:7;19117:23;19113:32;19110:52;;;19158:1;19155;19148:12;19110:52;19190:9;19184:16;19243:5;19236:13;19229:21;19222:5;19219:32;19209:60;;19265:1;19262;19255:12;19715:587;20011:6;20000:9;19993:25;20054:6;20049:2;20038:9;20034:18;20027:34;20097:3;20092:2;20081:9;20077:18;20070:31;19974:4;20118:65;20178:3;20167:9;20163:19;20155:6;20118:65;:::i;:::-;-1:-1:-1;;;;;20219:32:1;;;;20214:2;20199:18;;20192:60;-1:-1:-1;20283:3:1;20268:19;20261:35;20110:73;19715:587;-1:-1:-1;;;19715:587:1:o;21072:306::-;21160:6;21168;21176;21229:2;21217:9;21208:7;21204:23;21200:32;21197:52;;;21245:1;21242;21235:12;21197:52;21274:9;21268:16;21258:26;;21324:2;21313:9;21309:18;21303:25;21293:35;;21368:2;21357:9;21353:18;21347:25;21337:35;;21072:306;;;;;:::o
Swarm Source
ipfs://3ce208d10739146a60da21cd276a2e66eb0957075982ebc7a57daf69c15082e1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.