Overview
ETH Balance
ETH Value
$0.00Latest 25 from a total of 61 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Harvest | 350426347 | 166 days ago | IN | 0 ETH | 0.00001069 | ||||
| Harvest | 350073596 | 167 days ago | IN | 0 ETH | 0.00000262 | ||||
| Harvest | 349724238 | 168 days ago | IN | 0 ETH | 0.0000009 | ||||
| Harvest | 349289322 | 169 days ago | IN | 0 ETH | 0.0000009 | ||||
| Harvest | 348594381 | 171 days ago | IN | 0 ETH | 0.00000135 | ||||
| Harvest | 347895877 | 173 days ago | IN | 0 ETH | 0.0000009 | ||||
| Harvest | 347545196 | 174 days ago | IN | 0 ETH | 0.00000088 | ||||
| Harvest | 347195290 | 175 days ago | IN | 0 ETH | 0.00000089 | ||||
| Harvest | 346844947 | 176 days ago | IN | 0 ETH | 0.00000092 | ||||
| Harvest | 346493238 | 177 days ago | IN | 0 ETH | 0.00000093 | ||||
| Harvest | 346137736 | 178 days ago | IN | 0 ETH | 0.00000092 | ||||
| Harvest | 345782002 | 180 days ago | IN | 0 ETH | 0.0000009 | ||||
| Harvest | 345435489 | 181 days ago | IN | 0 ETH | 0.00000089 | ||||
| Harvest | 345087546 | 182 days ago | IN | 0 ETH | 0.0000009 | ||||
| Harvest | 283662840 | 360 days ago | IN | 0 ETH | 0.00000323 | ||||
| Harvest | 282636166 | 363 days ago | IN | 0 ETH | 0.00000128 | ||||
| Harvest | 281947312 | 365 days ago | IN | 0 ETH | 0.00000377 | ||||
| Harvest | 281602697 | 366 days ago | IN | 0 ETH | 0.00000275 | ||||
| Harvest | 281257403 | 367 days ago | IN | 0 ETH | 0.00000255 | ||||
| Harvest | 280914671 | 368 days ago | IN | 0 ETH | 0.00000211 | ||||
| Harvest | 280571631 | 369 days ago | IN | 0 ETH | 0.00000205 | ||||
| Harvest | 280228213 | 370 days ago | IN | 0 ETH | 0.00000137 | ||||
| Harvest | 279883894 | 371 days ago | IN | 0 ETH | 0.00000124 | ||||
| Harvest | 279540054 | 372 days ago | IN | 0 ETH | 0.00000122 | ||||
| Harvest | 277480535 | 378 days ago | IN | 0 ETH | 0.00000435 |
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 70804222 | 995 days ago | 0 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity)
/**
*Submitted for verification at Arbiscan.io on 2023-03-14
*/
// Sources flattened with hardhat v2.10.1-gzeon-c8fe47dd4 https://hardhat.org
// File contracts/lib/safe-math.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @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) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @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 sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @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) {
// 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 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts 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) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts 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 mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File contracts/lib/context.sol
pragma solidity 0.8.4;
/*
* @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 GSN 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 payable) {
return payable(msg.sender);
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File contracts/lib/erc20.sol
// File: contracts/GSN/Context.sol
pragma solidity 0.8.4;
// File: contracts/token/ERC20/IERC20.sol
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);
/**
* @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);
}
// File: contracts/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
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: contracts/token/ERC20/ERC20.sol
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
using Address for address;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20};
*
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal {
_decimals = decimals_;
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
/**
* @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 SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File contracts/interfaces/uniswapv2.sol
pragma solidity 0.8.4;
interface UniswapRouterV2 {
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external 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 addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) external pure returns (uint256 amountB);
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountOut);
function getAmountsOut(uint256 amountIn, address[] calldata path)
external
view
returns (uint256[] memory amounts);
function getAmountsIn(uint256 amountOut, address[] calldata path)
external
view
returns (uint256[] memory amounts);
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapExactETHForTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable returns (uint256[] memory amounts);
}
interface IUniswapV2Pair {
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event Transfer(address indexed from, address indexed to, uint256 value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint256);
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
event Mint(address indexed sender, uint256 amount0, uint256 amount1);
event Burn(
address indexed sender,
uint256 amount0,
uint256 amount1,
address indexed to
);
event Swap(
address indexed sender,
uint256 amount0In,
uint256 amount1In,
uint256 amount0Out,
uint256 amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint256);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves()
external
view
returns (
uint112 reserve0,
uint112 reserve1,
uint32 blockTimestampLast
);
function price0CumulativeLast() external view returns (uint256);
function price1CumulativeLast() external view returns (uint256);
function kLast() external view returns (uint256);
function mint(address to) external returns (uint256 liquidity);
function burn(address to)
external
returns (uint256 amount0, uint256 amount1);
function swap(
uint256 amount0Out,
uint256 amount1Out,
address to,
bytes calldata data
) external;
function skim(address to) external;
function sync() external;
}
interface IUniswapV2Factory {
event PairCreated(
address indexed token0,
address indexed token1,
address pair,
uint256
);
function getPair(address tokenA, address tokenB)
external
view
returns (address pair);
function allPairs(uint256) external view returns (address pair);
function allPairsLength() external view returns (uint256);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function createPair(address tokenA, address tokenB)
external
returns (address pair);
}
// File contracts/interfaces/staking-rewards.sol
pragma solidity 0.8.4;
interface IStakingRewards {
function balanceOf(address account) external view returns (uint256);
function balances(address account) external view returns (uint256);
function earned(address account) external view returns (uint256);
function exit() external;
function getReward() external;
function getRewardForDuration() external view returns (uint256);
function lastTimeRewardApplicable() external view returns (uint256);
function lastUpdateTime() external view returns (uint256);
function notifyRewardAmount(uint256 reward) external;
function periodFinish() external view returns (uint256);
function rewardPerToken() external view returns (uint256);
function rewardPerTokenStored() external view returns (uint256);
function rewardRate() external view returns (uint256);
function rewards(address) external view returns (uint256);
function rewardsDistribution() external view returns (address);
function rewardsDuration() external view returns (uint256);
function rewardsToken() external view returns (address);
function stake(uint256 amount) external;
function deposit(uint256 amount) external;
function stakeWithPermit(
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function stakingToken() external view returns (address);
function totalSupply() external view returns (uint256);
function userRewardPerTokenPaid(address) external view returns (uint256);
function withdraw(uint256 amount) external;
}
interface IStakingRewardsFactory {
function deploy(address stakingToken, uint256 rewardAmount) external;
function isOwner() external view returns (bool);
function notifyRewardAmount(address stakingToken) external;
function notifyRewardAmounts() external;
function owner() external view returns (address);
function renounceOwnership() external;
function rewardsToken() external view returns (address);
function stakingRewardsGenesis() external view returns (uint256);
function stakingRewardsInfoByStakingToken(address)
external
view
returns (address stakingRewards, uint256 rewardAmount);
function stakingTokens(uint256) external view returns (address);
function transferOwnership(address newOwner) external;
}
// File contracts/interfaces/vault.sol
pragma solidity 0.8.4;
interface IVault is IERC20 {
function token() external view returns (address);
function reward() external view returns (address);
function claimInsurance() external; // NOTE: Only yDelegatedVault implements this
function getRatio() external view returns (uint256);
function depositAll() external;
function balance() external view returns (uint256);
function deposit(uint256) external;
function withdrawAll() external;
function withdraw(uint256) external;
function earn() external;
function decimals() external view returns (uint8);
}
// File contracts/interfaces/controller.sol
pragma solidity 0.8.4;
interface IController {
function vaults(address) external view returns (address);
function rewards() external view returns (address);
function devfund() external view returns (address);
function treasury() external view returns (address);
function balanceOf(address) external view returns (uint256);
function withdraw(address, uint256) external;
function earn(address, uint256) external;
// For Big Green Button:
function setVault(address _token, address _vault) external;
function approveStrategy(address _token, address _strategy) external;
function revokeStrategy(address _token, address _strategy) external;
function setStrategy(address _token, address _strategy) external;
function setStrategist(address _strategist) external;
function setGovernance(address _governance) external;
function setTimelock(address _timelock) external;
}
// File contracts/strategies/strategy-base.sol
pragma solidity 0.8.4;
/**
* The is the Strategy Base that most LPs will inherit
*/
abstract contract StrategyBase {
using SafeERC20 for IERC20;
using Address for address;
using SafeMath for uint256;
// Tokens
address public want;
address public constant weth = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1;
address public constant uni = 0xd4d42F0b6DEF4CE0383636770eF773390d85c61A;
// Dex
address public univ2Router2 = 0xE54Ca86531e17Ef3616d22Ca28b0D458b6C89106;
address public feeDistributor = 0xAd86ef5fD2eBc25bb9Db41A1FE8d0f2a322c7839;
// Perfomance fees - start with 10%
uint256 public performanceTreasuryFee = 1000;
uint256 public constant performanceTreasuryMax = 10000;
uint256 public performanceDevFee = 0;
uint256 public constant performanceDevMax = 10000;
// Withdrawal fee 0%
// - 0% to treasury
// - 0% to dev fund
uint256 public withdrawalTreasuryFee = 0;
uint256 public constant withdrawalTreasuryMax = 100000;
uint256 public withdrawalDevFundFee = 0;
uint256 public constant withdrawalDevFundMax = 100000;
// User accounts
address public governance;
address public controller;
address public strategist;
address public timelock;
// Dex
address public sushiRouter = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506;
mapping(address => bool) public harvesters;
constructor(
address _want,
address _governance,
address _strategist,
address _controller,
address _timelock
) {
require(_want != address(0));
require(_governance != address(0));
require(_strategist != address(0));
require(_controller != address(0));
require(_timelock != address(0));
want = _want;
governance = _governance;
strategist = _strategist;
controller = _controller;
timelock = _timelock;
}
// **** Modifiers **** //
modifier onlyBenevolent {
require(
harvesters[msg.sender] ||
msg.sender == governance ||
msg.sender == strategist
);
_;
}
// **** Views **** //
function balanceOfWant() public view returns (uint256) {
return IERC20(want).balanceOf(address(this));
}
function balanceOfPool() public virtual view returns (uint256);
function balanceOf() public view returns (uint256) {
return balanceOfWant().add(balanceOfPool());
}
function getName() external virtual pure returns (string memory);
// **** Setters **** //
function whitelistHarvester(address _harvester) external {
require(msg.sender == governance ||
msg.sender == strategist || harvesters[msg.sender], "not authorized");
harvesters[_harvester] = true;
}
function revokeHarvester(address _harvester) external {
require(msg.sender == governance ||
msg.sender == strategist, "not authorized");
harvesters[_harvester] = false;
}
function setFeeDistributor(address _feeDistributor) external {
require(msg.sender == governance, "not authorized");
feeDistributor = _feeDistributor;
}
function setWithdrawalDevFundFee(uint256 _withdrawalDevFundFee) external {
require(msg.sender == timelock, "!timelock");
withdrawalDevFundFee = _withdrawalDevFundFee;
}
function setWithdrawalTreasuryFee(uint256 _withdrawalTreasuryFee) external {
require(msg.sender == timelock, "!timelock");
withdrawalTreasuryFee = _withdrawalTreasuryFee;
}
function setPerformanceDevFee(uint256 _performanceDevFee) external {
require(msg.sender == timelock, "!timelock");
performanceDevFee = _performanceDevFee;
}
function setPerformanceTreasuryFee(uint256 _performanceTreasuryFee)
external
{
require(msg.sender == timelock, "!timelock");
performanceTreasuryFee = _performanceTreasuryFee;
}
function setStrategist(address _strategist) external {
require(msg.sender == governance, "!governance");
strategist = _strategist;
}
function setGovernance(address _governance) external {
require(msg.sender == governance, "!governance");
governance = _governance;
}
function setTimelock(address _timelock) external {
require(msg.sender == timelock, "!timelock");
timelock = _timelock;
}
function setController(address _controller) external {
require(msg.sender == timelock, "!timelock");
controller = _controller;
}
// **** State mutations **** //
function deposit() public virtual;
// Controller only function for creating additional rewards from dust
function withdraw(IERC20 _asset) external returns (uint256 balance) {
require(msg.sender == controller, "!controller");
require(want != address(_asset), "want");
balance = _asset.balanceOf(address(this));
_asset.safeTransfer(controller, balance);
}
// Withdraw partial funds, normally used with a vault withdrawal
function withdraw(uint256 _amount) external {
require(msg.sender == controller, "!controller");
uint256 _balance = IERC20(want).balanceOf(address(this));
if (_balance < _amount) {
_amount = _withdrawSome(_amount.sub(_balance));
_amount = _amount.add(_balance);
}
uint256 _feeDev = _amount.mul(withdrawalDevFundFee).div(
withdrawalDevFundMax
);
IERC20(want).safeTransfer(IController(controller).devfund(), _feeDev);
uint256 _feeTreasury = _amount.mul(withdrawalTreasuryFee).div(
withdrawalTreasuryMax
);
IERC20(want).safeTransfer(
IController(controller).treasury(),
_feeTreasury
);
address _vault = IController(controller).vaults(address(want));
require(_vault != address(0), "!vault"); // additional protection so we don't burn the funds
IERC20(want).safeTransfer(_vault, _amount.sub(_feeDev).sub(_feeTreasury));
}
// Withdraw funds, used to swap between strategies
function withdrawForSwap(uint256 _amount)
external
returns (uint256 balance)
{
require(msg.sender == controller, "!controller");
_withdrawSome(_amount);
balance = IERC20(want).balanceOf(address(this));
address _vault = IController(controller).vaults(address(want));
require(_vault != address(0), "!vault");
IERC20(want).safeTransfer(_vault, balance);
}
// Withdraw all funds, normally used when migrating strategies
function withdrawAll() external returns (uint256 balance) {
require(msg.sender == controller, "!controller");
_withdrawAll();
balance = IERC20(want).balanceOf(address(this));
address _vault = IController(controller).vaults(address(want));
require(_vault != address(0), "!vault"); // additional protection so we don't burn the funds
IERC20(want).safeTransfer(_vault, balance);
}
function _withdrawAll() internal {
_withdrawSome(balanceOfPool());
}
function _withdrawSome(uint256 _amount) internal virtual returns (uint256);
function harvest() public virtual;
// **** Emergency functions ****
function execute(address _target, bytes memory _data)
public
payable
returns (bytes memory response)
{
require(msg.sender == timelock, "!timelock");
require(_target != address(0), "!target");
// call contract in current context
assembly {
let succeeded := delegatecall(
sub(gas(), 5000),
_target,
add(_data, 0x20),
mload(_data),
0,
0
)
let size := returndatasize()
response := mload(0x40)
mstore(
0x40,
add(response, and(add(add(size, 0x20), 0x1f), not(0x1f)))
)
mstore(response, size)
returndatacopy(add(response, 0x20), 0, size)
switch iszero(succeeded)
case 1 {
// throw if delegatecall failed
revert(add(response, 0x20), size)
}
}
}
// **** Internal functions ****
function _swapSushiswap(
address _from,
address _to,
uint256 _amount
) internal {
require(_to != address(0));
address[] memory path;
if (_from == weth || _to == weth) {
path = new address[](2);
path[0] = _from;
path[1] = _to;
} else {
path = new address[](3);
path[0] = _from;
path[1] = weth;
path[2] = _to;
}
IERC20(_from).safeApprove(sushiRouter, 0);
IERC20(_from).safeApprove(sushiRouter, _amount);
UniswapRouterV2(sushiRouter).swapExactTokensForTokens(
_amount,
0,
path,
address(this),
block.timestamp.add(60)
);
}
function _swapSushiswapWithPath(
address[] memory path,
uint256 _amount
) internal {
require(path[1] != address(0));
IERC20(path[0]).safeApprove(sushiRouter, 0);
IERC20(path[0]).safeApprove(sushiRouter, _amount);
UniswapRouterV2(sushiRouter).swapExactTokensForTokens(
_amount,
0,
path,
address(this),
block.timestamp.add(60)
);
}
function _distributePerformanceFeesAndDeposit() internal {
uint256 _want = IERC20(want).balanceOf(address(this));
if (_want > 0) {
// Treasury fees
IERC20(want).safeTransfer(
IController(controller).treasury(),
_want.mul(performanceTreasuryFee).div(performanceTreasuryMax)
);
// Performance fee
IERC20(want).safeTransfer(
IController(controller).devfund(),
_want.mul(performanceDevFee).div(performanceDevMax)
);
deposit();
}
}
function _distributePerformanceFeesBasedAmountAndDeposit(uint256 _amount) internal {
uint256 _want = IERC20(want).balanceOf(address(this));
if (_amount > _want) {
_amount = _want;
}
if (_amount > 0) {
// Treasury fees
IERC20(want).safeTransfer(
IController(controller).treasury(),
_amount.mul(performanceTreasuryFee).div(performanceTreasuryMax)
);
// Performance fee
IERC20(want).safeTransfer(
IController(controller).devfund(),
_amount.mul(performanceDevFee).div(performanceDevMax)
);
deposit();
}
}
}
// File contracts/interfaces/plutus.sol
pragma solidity 0.8.4;
interface IDpxDepositor {
function deposit(uint256 _amount) external;
}
interface IPlsDpxChef {
function userInfo(address) external view returns (
uint96 amount,
int128 plsRewardDebt,
int128 plsDpxRewardDebt,
int128 plsJonesRewardDebt,
int128 dpxRewardDebt
);
function deposit(uint96 _amount) external;
function withdraw(uint96 _amount) external;
function harvest() external;
function pendingRewards(address _user)
external
view
returns (
uint256 _pendingPls,
uint256 _pendingPlsDpx,
uint256 _pendingPlsJones,
uint256 _pendingDpx
);
}
interface IPlutusChef {
function userInfo(address) external view returns (
uint96 amount,
int128 plsRewardDebt
);
function pendingRewards(address _user) external view returns (uint256 _pendingPls);
function deposit(uint96 _amount) external;
function harvest() external;
function withdraw(uint96 _amount) external;
}
interface IPlutusMasterChef {
function deposit(uint256 _pid, uint256 _amount) external;
function userInfo(uint256, address) external view returns (
uint256 amount,
uint256 rewardDebt
);
function pendingPls(uint256 _pid, address _user) external view returns (uint256);
function withdraw(uint256 _pid, uint256 _amount) external;
}
// File contracts/strategies/plutus/plutus-farm-bases/strategy-plutus-lp-farm-base2.sol
pragma solidity 0.8.4;
abstract contract StrategyPlutusFarmBase is StrategyBase {
using SafeERC20 for IERC20;
using Address for address;
using SafeMath for uint256;
address public constant pls = 0x51318B7D00db7ACc4026C88c3952B66278B6A67F;
address public constant plutusMasterChef = 0x5593473e318F0314Eb2518239c474e183c4cBED5;
// How much tokens to keep?
uint256 public keep = 1000;
uint256 public keepReward = 1000;
uint256 public constant keepMax = 10000;
address rewardToken;
uint256 public poolId;
constructor(
uint256 _poolId,
address _want,
address _governance,
address _strategist,
address _controller,
address _timelock
)
StrategyBase(_want, _governance, _strategist, _controller, _timelock)
{
poolId = _poolId;
}
function balanceOfPool() public view override returns (uint256) {
(uint256 amount, ) = IPlutusMasterChef(plutusMasterChef).userInfo(poolId, address(this));
return amount;
}
function getHarvestable() external view returns (uint256) {
uint256 _pendingPls = IPlutusMasterChef(plutusMasterChef).pendingPls(poolId, address(this));
return (_pendingPls);
}
function deposit() public override {
uint256 _want = IERC20(want).balanceOf(address(this));
if (_want > 0) {
IERC20(want).safeApprove(plutusMasterChef, 0);
IERC20(want).safeApprove(plutusMasterChef, _want);
IPlutusMasterChef(plutusMasterChef).deposit(poolId, _want);
}
}
function _withdrawSome(uint256 _amount) internal override returns (uint256) {
IPlutusMasterChef(plutusMasterChef).withdraw(poolId, _amount);
return _amount;
}
// **** Setters ****
function setKeep(uint256 _keep) external {
require(msg.sender == timelock, "!timelock");
keep = _keep;
}
function setKeepReward(uint256 _keepReward) external {
require(msg.sender == timelock, "!timelock");
keepReward = _keepReward;
}
function setRewardToken(address _rewardToken) external {
require(
msg.sender == timelock || msg.sender == strategist,
"!timelock"
);
rewardToken = _rewardToken;
}
// Declare a Harvest Event
event Harvest(uint _timestamp, uint _value);
function harvest() public override onlyBenevolent {
IPlutusMasterChef(plutusMasterChef).deposit(poolId, 0);
uint256 _pls = IERC20(pls).balanceOf(address(this));
if(_pls > 0) {
// 10% is locked up for future gov
uint256 _keepPls = _pls.mul(keep).div(keepMax);
IERC20(pls).safeTransfer(
IController(controller).treasury(),
_keepPls
);
_pls = IERC20(pls).balanceOf(address(this));
_swapSushiswap(pls, weth, _pls.div(2));
}
uint256 _weth = IERC20(weth).balanceOf(address(this));
_pls = IERC20(pls).balanceOf(address(this));
// Adds in liquidity for token0/token1
if (_pls > 0 && _weth > 0) {
IERC20(pls).safeApprove(sushiRouter, 0);
IERC20(pls).safeApprove(sushiRouter, _pls);
IERC20(weth).safeApprove(sushiRouter, 0);
IERC20(weth).safeApprove(sushiRouter, _weth);
UniswapRouterV2(sushiRouter).addLiquidity(
pls,
weth,
_pls,
_weth,
0,
0,
address(this),
block.timestamp.add(60)
);
_pls = IERC20(pls).balanceOf(address(this));
_weth = IERC20(weth).balanceOf(address(this));
// Donates DUST
if(_pls > 0) {
IERC20(pls).transfer(
IController(controller).treasury(),
_pls
);
}
if(_weth > 0) {
IERC20(weth).safeTransfer(
IController(controller).treasury(),
_weth
);
}
}
uint256 _want = IERC20(want).balanceOf(address(this));
emit Harvest(block.timestamp, _want);
_distributePerformanceFeesAndDeposit();
}
}
// File contracts/strategies/plutus/strategy-plutus-pls-weth.sol
pragma solidity 0.8.4;
contract StrategyPlutusPlsWeth is StrategyPlutusFarmBase {
address public pls_weth = 0x6CC0D643C7b8709F468f58F363d73Af6e4971515;
uint256 pls_weth_poolId = 0;
constructor(
address _governance,
address _strategist,
address _controller,
address _timelock
)
StrategyPlutusFarmBase(
pls_weth_poolId,
pls_weth,
_governance,
_strategist,
_controller,
_timelock
)
{}
// **** Views ****
function getName() external override pure returns (string memory) {
return "StrategyPlutusPlsWeth";
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_timelock","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Harvest","type":"event"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeDistributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHarvestable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"harvesters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceDevMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceTreasuryMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pls","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pls_weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"plutusMasterChef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_harvester","type":"address"}],"name":"revokeHarvester","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeDistributor","type":"address"}],"name":"setFeeDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_keep","type":"uint256"}],"name":"setKeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_keepReward","type":"uint256"}],"name":"setKeepReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceDevFee","type":"uint256"}],"name":"setPerformanceDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceTreasuryFee","type":"uint256"}],"name":"setPerformanceTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"setRewardToken","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":"uint256","name":"_withdrawalDevFundFee","type":"uint256"}],"name":"setWithdrawalDevFundFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawalTreasuryFee","type":"uint256"}],"name":"setWithdrawalTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiRouter","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":"uni","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"univ2Router2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_harvester","type":"address"}],"name":"whitelistHarvester","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_asset","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawForSwap","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalDevFundFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalDevFundMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalTreasuryMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6080604052600180546001600160a01b031990811673e54ca86531e17ef3616d22ca28b0d458b6c891061790915560028054821673ad86ef5fd2ebc25bb9db41a1fe8d0f2a322c78391790556103e860038190556000600481905560058190556006819055600b80548416731b02da8cb0d097eb8d57a175b88c7d8b47997506179055600d829055600e9190915560118054909216736cc0d643c7b8709f468f58f363d73af6e497151517909155601255348015620000bd57600080fd5b506040516200326638038062003266833981016040819052620000e091620001e3565b6012546011546001600160a01b0316858585858484848484846200010357600080fd5b6001600160a01b0384166200011757600080fd5b6001600160a01b0383166200012b57600080fd5b6001600160a01b0382166200013f57600080fd5b6001600160a01b0381166200015357600080fd5b600080546001600160a01b03199081166001600160a01b03978816179091556007805482169587169590951790945560098054851693861693909317909255600880548416918516919091179055600a80549092169216919091179055505050601092909255506200023f945050505050565b80516001600160a01b0381168114620001de57600080fd5b919050565b60008060008060808587031215620001f9578384fd5b6200020485620001c6565b93506200021460208601620001c6565b92506200022460408601620001c6565b91506200023460608601620001c6565b905092959194509250565b613017806200024f6000396000f3fe6080604052600436106102ff5760003560e01c80636d13582c11610190578063bdacb303116100dc578063ccfc2e8d11610095578063e4d06d821161006f578063e4d06d82146108a7578063edc9af95146108bd578063f77c4791146108e5578063fe1f8f7a1461050657600080fd5b8063ccfc2e8d14610852578063d0e30db014610872578063d33219b41461088757600080fd5b8063bdacb303146107a7578063c1a3d44c146107c7578063c39d4334146107dc578063c6223e26146107f2578063c65e324214610812578063c7b9d5301461083257600080fd5b80638aee812711610149578063ab033ea911610123578063ab033ea914610727578063ab73e43314610747578063b9e3748914610767578063ba40273d1461078757600080fd5b80638aee8127146106d15780638ccdbb70146106f157806392eefe9b1461070757600080fd5b80636d13582c14610611578063722713f7146106315780638237859414610646578063853828b614610666578063879765831461067b57806388993f22146106bb57600080fd5b80633e0dc34e1161024f5780634fe809cc1161020857806354df7b63116101e257806354df7b631461059b57806359739ec4146105bb5780635aa6e675146105d1578063610df068146105f157600080fd5b80634fe809cc1461032c57806351cff8d91461056557806351f3d0b81461058557600080fd5b80633e0dc34e146104b35780633fc8cef3146104c95780634641257d146104f1578063479119be146105065780634ac838d31461051d5780634c2798ad1461054557600080fd5b80631cff79cd116102bc578063223e5a9d11610296578063223e5a9d1461044b578063249fb9b41461047357806326e886c61461032c5780632e1a7d4d1461049357600080fd5b80631cff79cd146103f85780631f1fcd511461040b5780631fe4a6861461042b57600080fd5b80630547104d146103045780630975d8d81461032c5780630d43e8ad14610342578063115880861461037a57806317d7de7c1461038f57806318eb0e0b146103d6575b600080fd5b34801561031057600080fd5b50610319610905565b6040519081526020015b60405180910390f35b34801561033857600080fd5b5061031961271081565b34801561034e57600080fd5b50600254610362906001600160a01b031681565b6040516001600160a01b039091168152602001610323565b34801561038657600080fd5b5061031961099d565b34801561039b57600080fd5b506040805180820190915260158152740a6e8e4c2e8cacef2a0d8eae8eae6a0d8e6aecae8d605b1b60208201525b6040516103239190612dbe565b3480156103e257600080fd5b506103f66103f1366004612b54565b610a35565b005b6103c9610406366004612b8c565b610a9e565b34801561041757600080fd5b50600054610362906001600160a01b031681565b34801561043757600080fd5b50600954610362906001600160a01b031681565b34801561045757600080fd5b506103627351318b7d00db7acc4026c88c3952b66278b6a67f81565b34801561047f57600080fd5b506103f661048e366004612cf6565b610b5b565b34801561049f57600080fd5b506103f66104ae366004612cf6565b610b8a565b3480156104bf57600080fd5b5061031960105481565b3480156104d557600080fd5b506103627382af49447d8a07e3bd95bd0d56f35241523fbab181565b3480156104fd57600080fd5b506103f6610e69565b34801561051257600080fd5b50610319620186a081565b34801561052957600080fd5b50610362735593473e318f0314eb2518239c474e183c4cbed581565b34801561055157600080fd5b506103f6610560366004612cf6565b6117a3565b34801561057157600080fd5b50610319610580366004612b54565b6117d2565b34801561059157600080fd5b5061031960065481565b3480156105a757600080fd5b506103f66105b6366004612b54565b6118df565b3480156105c757600080fd5b5061031960035481565b3480156105dd57600080fd5b50600754610362906001600160a01b031681565b3480156105fd57600080fd5b50601154610362906001600160a01b031681565b34801561061d57600080fd5b50600b54610362906001600160a01b031681565b34801561063d57600080fd5b5061031961195c565b34801561065257600080fd5b506103f6610661366004612cf6565b61197c565b34801561067257600080fd5b506103196119ab565b34801561068757600080fd5b506106ab610696366004612b54565b600c6020526000908152604090205460ff1681565b6040519015158152602001610323565b3480156106c757600080fd5b5061031960045481565b3480156106dd57600080fd5b506103f66106ec366004612b54565b611b23565b3480156106fd57600080fd5b5061031960055481565b34801561071357600080fd5b506103f6610722366004612b54565b611b84565b34801561073357600080fd5b506103f6610742366004612b54565b611bd0565b34801561075357600080fd5b506103f6610762366004612cf6565b611c3a565b34801561077357600080fd5b50600154610362906001600160a01b031681565b34801561079357600080fd5b506103f66107a2366004612cf6565b611c69565b3480156107b357600080fd5b506103f66107c2366004612b54565b611c98565b3480156107d357600080fd5b50610319611ce4565b3480156107e857600080fd5b50610319600e5481565b3480156107fe57600080fd5b5061031961080d366004612cf6565b611d60565b34801561081e57600080fd5b506103f661082d366004612cf6565b611edc565b34801561083e57600080fd5b506103f661084d366004612b54565b611f0b565b34801561085e57600080fd5b506103f661086d366004612b54565b611f75565b34801561087e57600080fd5b506103f6611fc1565b34801561089357600080fd5b50600a54610362906001600160a01b031681565b3480156108b357600080fd5b50610319600d5481565b3480156108c957600080fd5b5061036273d4d42f0b6def4ce0383636770ef773390d85c61a81565b3480156108f157600080fd5b50600854610362906001600160a01b031681565b60105460405163c4443f2760e01b815260048101919091523060248201526000908190735593473e318f0314eb2518239c474e183c4cbed59063c4443f279060440160206040518083038186803b15801561095f57600080fd5b505afa158015610973573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109979190612d0e565b92915050565b6010546040516393f1a40b60e01b815260048101919091523060248201526000908190735593473e318f0314eb2518239c474e183c4cbed5906393f1a40b90604401604080518083038186803b1580156109f657600080fd5b505afa158015610a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2e9190612d26565b5092915050565b6007546001600160a01b0316331480610a5857506009546001600160a01b031633145b610a7d5760405162461bcd60e51b8152600401610a7490612df6565b60405180910390fd5b6001600160a01b03166000908152600c60205260409020805460ff19169055565b600a546060906001600160a01b03163314610acb5760405162461bcd60e51b8152600401610a7490612e3e565b6001600160a01b038316610b0b5760405162461bcd60e51b8152602060048201526007602482015266085d185c99d95d60ca1b6044820152606401610a74565b600080835160208501866113885a03f43d6040519250601f19601f6020830101168301604052808352806000602085013e811560018114610b4b57610b52565b8160208501fd5b50505092915050565b600a546001600160a01b03163314610b855760405162461bcd60e51b8152600401610a7490612e3e565b600355565b6008546001600160a01b03163314610bb45760405162461bcd60e51b8152600401610a7490612dd1565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610bf857600080fd5b505afa158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c309190612d0e565b905081811015610c5b57610c4c610c47838361210e565b612157565b9150610c5882826121d5565b91505b6000610c7f620186a0610c796006548661223490919063ffffffff16565b906122b3565b9050610d1d600860009054906101000a90046001600160a01b03166001600160a01b0316638d8f1e676040518163ffffffff1660e01b815260040160206040518083038186803b158015610cd257600080fd5b505afa158015610ce6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0a9190612b70565b6000546001600160a01b031690836122f5565b6000610d3b620186a0610c796005548761223490919063ffffffff16565b9050610d8e600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b158015610cd257600080fd5b60085460008054604051632988bb9f60e21b81526001600160a01b0391821660048201529192169063a622ee7c9060240160206040518083038186803b158015610dd757600080fd5b505afa158015610deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0f9190612b70565b90506001600160a01b038116610e375760405162461bcd60e51b8152600401610a7490612e1e565b610e6281610e4f84610e49898861210e565b9061210e565b6000546001600160a01b031691906122f5565b5050505050565b336000908152600c602052604090205460ff1680610e9157506007546001600160a01b031633145b80610ea657506009546001600160a01b031633145b610eaf57600080fd5b601054604051631c57762b60e31b8152600481019190915260006024820152735593473e318f0314eb2518239c474e183c4cbed59063e2bbb15890604401600060405180830381600087803b158015610f0757600080fd5b505af1158015610f1b573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507351318b7d00db7acc4026c88c3952b66278b6a67f91506370a082319060240160206040518083038186803b158015610f6c57600080fd5b505afa158015610f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa49190612d0e565b90508015611133576000610fc9612710610c79600d548561223490919063ffffffff16565b9050611070600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b15801561101c57600080fd5b505afa158015611030573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110549190612b70565b7351318b7d00db7acc4026c88c3952b66278b6a67f90836122f5565b6040516370a0823160e01b81523060048201527351318b7d00db7acc4026c88c3952b66278b6a67f906370a082319060240160206040518083038186803b1580156110ba57600080fd5b505afa1580156110ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f29190612d0e565b91506111317351318b7d00db7acc4026c88c3952b66278b6a67f7382af49447d8a07e3bd95bd0d56f35241523fbab161112c8560026122b3565b612358565b505b6040516370a0823160e01b81523060048201526000907382af49447d8a07e3bd95bd0d56f35241523fbab1906370a082319060240160206040518083038186803b15801561118057600080fd5b505afa158015611194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b89190612d0e565b6040516370a0823160e01b81523060048201529091507351318b7d00db7acc4026c88c3952b66278b6a67f906370a082319060240160206040518083038186803b15801561120557600080fd5b505afa158015611219573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123d9190612d0e565b915060008211801561124f5750600081115b156116de57600b54611281907351318b7d00db7acc4026c88c3952b66278b6a67f906001600160a01b0316600061262a565b600b546112ad907351318b7d00db7acc4026c88c3952b66278b6a67f906001600160a01b03168461262a565b600b546112da907382af49447d8a07e3bd95bd0d56f35241523fbab1906001600160a01b0316600061262a565b600b54611306907382af49447d8a07e3bd95bd0d56f35241523fbab1906001600160a01b03168361262a565b600b546001600160a01b031663e8e337007351318b7d00db7acc4026c88c3952b66278b6a67f7382af49447d8a07e3bd95bd0d56f35241523fbab185856000803061135242603c6121d5565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e481019190915261010401606060405180830381600087803b1580156113c957600080fd5b505af11580156113dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114019190612d49565b50506040516370a0823160e01b81523060048201527351318b7d00db7acc4026c88c3952b66278b6a67f91506370a082319060240160206040518083038186803b15801561144e57600080fd5b505afa158015611462573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114869190612d0e565b6040516370a0823160e01b81523060048201529092507382af49447d8a07e3bd95bd0d56f35241523fbab1906370a082319060240160206040518083038186803b1580156114d357600080fd5b505afa1580156114e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150b9190612d0e565b9050811561163e577351318b7d00db7acc4026c88c3952b66278b6a67f6001600160a01b031663a9059cbb600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b15801561158457600080fd5b505afa158015611598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bc9190612b70565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401602060405180830381600087803b15801561160457600080fd5b505af1158015611618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163c9190612cd6565b505b80156116de57600854604080516361d027b360e01b815290516116de926001600160a01b0316916361d027b3916004808301926020929190829003018186803b15801561168a57600080fd5b505afa15801561169e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c29190612b70565b7382af49447d8a07e3bd95bd0d56f35241523fbab190836122f5565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561172257600080fd5b505afa158015611736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175a9190612d0e565b60408051428152602081018390529192507f6c8433a8e155f0af04dba058d4e4695f7da554578963d876bdf4a6d8d6399d9c910160405180910390a161179e61274e565b505050565b600a546001600160a01b031633146117cd5760405162461bcd60e51b8152600401610a7490612e3e565b600e55565b6008546000906001600160a01b031633146117ff5760405162461bcd60e51b8152600401610a7490612dd1565b6000546001600160a01b03838116911614156118465760405162461bcd60e51b8152600401610a74906020808252600490820152631dd85b9d60e21b604082015260600190565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b15801561188557600080fd5b505afa158015611899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bd9190612d0e565b6008549091506118da906001600160a01b038481169116836122f5565b919050565b6007546001600160a01b031633148061190257506009546001600160a01b031633145b8061191c5750336000908152600c602052604090205460ff165b6119385760405162461bcd60e51b8152600401610a7490612df6565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b600061197761196961099d565b611971611ce4565b906121d5565b905090565b600a546001600160a01b031633146119a65760405162461bcd60e51b8152600401610a7490612e3e565b600555565b6008546000906001600160a01b031633146119d85760405162461bcd60e51b8152600401610a7490612dd1565b6119e061290c565b6000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611a2357600080fd5b505afa158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b9190612d0e565b60085460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b158015611aa857600080fd5b505afa158015611abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae09190612b70565b90506001600160a01b038116611b085760405162461bcd60e51b8152600401610a7490612e1e565b600054611b1f906001600160a01b031682846122f5565b5090565b600a546001600160a01b0316331480611b4657506009546001600160a01b031633145b611b625760405162461bcd60e51b8152600401610a7490612e3e565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314611bae5760405162461bcd60e51b8152600401610a7490612e3e565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314611c185760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610a74565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314611c645760405162461bcd60e51b8152600401610a7490612e3e565b600655565b600a546001600160a01b03163314611c935760405162461bcd60e51b8152600401610a7490612e3e565b600d55565b600a546001600160a01b03163314611cc25760405162461bcd60e51b8152600401610a7490612e3e565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611d2857600080fd5b505afa158015611d3c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119779190612d0e565b6008546000906001600160a01b03163314611d8d5760405162461bcd60e51b8152600401610a7490612dd1565b611d9682612157565b506000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611dda57600080fd5b505afa158015611dee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e129190612d0e565b60085460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b158015611e5f57600080fd5b505afa158015611e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e979190612b70565b90506001600160a01b038116611ebf5760405162461bcd60e51b8152600401610a7490612e1e565b600054611ed6906001600160a01b031682846122f5565b50919050565b600a546001600160a01b03163314611f065760405162461bcd60e51b8152600401610a7490612e3e565b600455565b6007546001600160a01b03163314611f535760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610a74565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314611f9f5760405162461bcd60e51b8152600401610a7490612df6565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561200557600080fd5b505afa158015612019573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203d9190612d0e565b9050801561210b5760008054612074916001600160a01b0390911690735593473e318f0314eb2518239c474e183c4cbed59061262a565b60005461209f906001600160a01b0316735593473e318f0314eb2518239c474e183c4cbed58361262a565b601054604051631c57762b60e31b8152600481019190915260248101829052735593473e318f0314eb2518239c474e183c4cbed59063e2bbb15890604401600060405180830381600087803b1580156120f757600080fd5b505af1158015610e62573d6000803e3d6000fd5b50565b600061215083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612917565b9392505050565b601054604051630441a3e760e41b8152600091735593473e318f0314eb2518239c474e183c4cbed59163441a3e709161219d918690600401918252602082015260400190565b600060405180830381600087803b1580156121b757600080fd5b505af11580156121cb573d6000803e3d6000fd5b5093949350505050565b6000806121e28385612f02565b9050838110156121505760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a74565b60008261224357506000610997565b600061224f8385612f3a565b90508261225c8583612f1a565b146121505760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a74565b600061215083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612951565b6040516001600160a01b03831660248201526044810182905261179e90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261297f565b6001600160a01b03821661236b57600080fd5b60606001600160a01b0384167382af49447d8a07e3bd95bd0d56f35241523fbab114806123b457506001600160a01b0383167382af49447d8a07e3bd95bd0d56f35241523fbab1145b1561246257604080516002808252606082018352909160208301908036833701905050905083816000815181106123fb57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061243d57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505061255e565b60408051600380825260808201909252906020820160608036833701905050905083816000815181106124a557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507382af49447d8a07e3bd95bd0d56f35241523fbab1816001815181106124fb57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050828160028151811061253d57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600b54612579906001600160a01b038681169116600061262a565b600b54612593906001600160a01b0386811691168461262a565b600b546001600160a01b03166338ed173983600084306125b442603c6121d5565b6040518663ffffffff1660e01b81526004016125d4959493929190612e61565b600060405180830381600087803b1580156125ee57600080fd5b505af1158015612602573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e629190810190612c2e565b8015806126b35750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561267957600080fd5b505afa15801561268d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b19190612d0e565b155b61271e5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610a74565b6040516001600160a01b03831660248201526044810182905261179e90849063095ea7b360e01b90606401612321565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561279257600080fd5b505afa1580156127a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ca9190612d0e565b9050801561210b57600854604080516361d027b360e01b8152905161286b926001600160a01b0316916361d027b3916004808301926020929190829003018186803b15801561281857600080fd5b505afa15801561282c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128509190612b70565b610e4f612710610c796003548661223490919063ffffffff16565b60085460408051638d8f1e6760e01b81529051612904926001600160a01b031691638d8f1e67916004808301926020929190829003018186803b1580156128b157600080fd5b505afa1580156128c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e99190612b70565b610e4f612710610c796004548661223490919063ffffffff16565b61210b611fc1565b61210b610c4761099d565b6000818484111561293b5760405162461bcd60e51b8152600401610a749190612dbe565b5060006129488486612f59565b95945050505050565b600081836129725760405162461bcd60e51b8152600401610a749190612dbe565b5060006129488486612f1a565b60006129d4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a519092919063ffffffff16565b80519091501561179e57808060200190518101906129f29190612cd6565b61179e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a74565b6060612a608484600085612a68565b949350505050565b6060843b612ab85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a74565b600080866001600160a01b03168587604051612ad49190612da2565b60006040518083038185875af1925050503d8060008114612b11576040519150601f19603f3d011682016040523d82523d6000602084013e612b16565b606091505b50915091508115612b2a579150612a609050565b805115612b3a5780518082602001fd5b8360405162461bcd60e51b8152600401610a749190612dbe565b600060208284031215612b65578081fd5b813561215081612fcc565b600060208284031215612b81578081fd5b815161215081612fcc565b60008060408385031215612b9e578081fd5b8235612ba981612fcc565b915060208381013567ffffffffffffffff80821115612bc6578384fd5b818601915086601f830112612bd9578384fd5b813581811115612beb57612beb612fb6565b612bfd601f8201601f19168501612ed1565b91508082528784828501011115612c12578485fd5b8084840185840137810190920192909252919491935090915050565b60006020808385031215612c40578182fd5b825167ffffffffffffffff80821115612c57578384fd5b818501915085601f830112612c6a578384fd5b815181811115612c7c57612c7c612fb6565b8060051b9150612c8d848301612ed1565b8181528481019084860184860187018a1015612ca7578788fd5b8795505b83861015612cc9578051835260019590950194918601918601612cab565b5098975050505050505050565b600060208284031215612ce7578081fd5b81518015158114612150578182fd5b600060208284031215612d07578081fd5b5035919050565b600060208284031215612d1f578081fd5b5051919050565b60008060408385031215612d38578182fd5b505080516020909101519092909150565b600080600060608486031215612d5d578081fd5b8351925060208401519150604084015190509250925092565b60008151808452612d8e816020860160208601612f70565b601f01601f19169290920160200192915050565b60008251612db4818460208701612f70565b9190910192915050565b6020815260006121506020830184612d76565b6020808252600b908201526a10b1b7b73a3937b63632b960a91b604082015260600190565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600990820152682174696d656c6f636b60b81b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015612eb05784516001600160a01b031683529383019391830191600101612e8b565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612efa57612efa612fb6565b604052919050565b60008219821115612f1557612f15612fa0565b500190565b600082612f3557634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612f5457612f54612fa0565b500290565b600082821015612f6b57612f6b612fa0565b500390565b60005b83811015612f8b578181015183820152602001612f73565b83811115612f9a576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461210b57600080fdfea264697066735822122054dddfaa17ccc12ffadde50909d8500148b1e4cbc70964a4fc416d4f369809cb64736f6c63430008040033000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8000000000000000000000000afc36887ee43eddeb5773fedc877481ec97625a7000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Deployed Bytecode
0x6080604052600436106102ff5760003560e01c80636d13582c11610190578063bdacb303116100dc578063ccfc2e8d11610095578063e4d06d821161006f578063e4d06d82146108a7578063edc9af95146108bd578063f77c4791146108e5578063fe1f8f7a1461050657600080fd5b8063ccfc2e8d14610852578063d0e30db014610872578063d33219b41461088757600080fd5b8063bdacb303146107a7578063c1a3d44c146107c7578063c39d4334146107dc578063c6223e26146107f2578063c65e324214610812578063c7b9d5301461083257600080fd5b80638aee812711610149578063ab033ea911610123578063ab033ea914610727578063ab73e43314610747578063b9e3748914610767578063ba40273d1461078757600080fd5b80638aee8127146106d15780638ccdbb70146106f157806392eefe9b1461070757600080fd5b80636d13582c14610611578063722713f7146106315780638237859414610646578063853828b614610666578063879765831461067b57806388993f22146106bb57600080fd5b80633e0dc34e1161024f5780634fe809cc1161020857806354df7b63116101e257806354df7b631461059b57806359739ec4146105bb5780635aa6e675146105d1578063610df068146105f157600080fd5b80634fe809cc1461032c57806351cff8d91461056557806351f3d0b81461058557600080fd5b80633e0dc34e146104b35780633fc8cef3146104c95780634641257d146104f1578063479119be146105065780634ac838d31461051d5780634c2798ad1461054557600080fd5b80631cff79cd116102bc578063223e5a9d11610296578063223e5a9d1461044b578063249fb9b41461047357806326e886c61461032c5780632e1a7d4d1461049357600080fd5b80631cff79cd146103f85780631f1fcd511461040b5780631fe4a6861461042b57600080fd5b80630547104d146103045780630975d8d81461032c5780630d43e8ad14610342578063115880861461037a57806317d7de7c1461038f57806318eb0e0b146103d6575b600080fd5b34801561031057600080fd5b50610319610905565b6040519081526020015b60405180910390f35b34801561033857600080fd5b5061031961271081565b34801561034e57600080fd5b50600254610362906001600160a01b031681565b6040516001600160a01b039091168152602001610323565b34801561038657600080fd5b5061031961099d565b34801561039b57600080fd5b506040805180820190915260158152740a6e8e4c2e8cacef2a0d8eae8eae6a0d8e6aecae8d605b1b60208201525b6040516103239190612dbe565b3480156103e257600080fd5b506103f66103f1366004612b54565b610a35565b005b6103c9610406366004612b8c565b610a9e565b34801561041757600080fd5b50600054610362906001600160a01b031681565b34801561043757600080fd5b50600954610362906001600160a01b031681565b34801561045757600080fd5b506103627351318b7d00db7acc4026c88c3952b66278b6a67f81565b34801561047f57600080fd5b506103f661048e366004612cf6565b610b5b565b34801561049f57600080fd5b506103f66104ae366004612cf6565b610b8a565b3480156104bf57600080fd5b5061031960105481565b3480156104d557600080fd5b506103627382af49447d8a07e3bd95bd0d56f35241523fbab181565b3480156104fd57600080fd5b506103f6610e69565b34801561051257600080fd5b50610319620186a081565b34801561052957600080fd5b50610362735593473e318f0314eb2518239c474e183c4cbed581565b34801561055157600080fd5b506103f6610560366004612cf6565b6117a3565b34801561057157600080fd5b50610319610580366004612b54565b6117d2565b34801561059157600080fd5b5061031960065481565b3480156105a757600080fd5b506103f66105b6366004612b54565b6118df565b3480156105c757600080fd5b5061031960035481565b3480156105dd57600080fd5b50600754610362906001600160a01b031681565b3480156105fd57600080fd5b50601154610362906001600160a01b031681565b34801561061d57600080fd5b50600b54610362906001600160a01b031681565b34801561063d57600080fd5b5061031961195c565b34801561065257600080fd5b506103f6610661366004612cf6565b61197c565b34801561067257600080fd5b506103196119ab565b34801561068757600080fd5b506106ab610696366004612b54565b600c6020526000908152604090205460ff1681565b6040519015158152602001610323565b3480156106c757600080fd5b5061031960045481565b3480156106dd57600080fd5b506103f66106ec366004612b54565b611b23565b3480156106fd57600080fd5b5061031960055481565b34801561071357600080fd5b506103f6610722366004612b54565b611b84565b34801561073357600080fd5b506103f6610742366004612b54565b611bd0565b34801561075357600080fd5b506103f6610762366004612cf6565b611c3a565b34801561077357600080fd5b50600154610362906001600160a01b031681565b34801561079357600080fd5b506103f66107a2366004612cf6565b611c69565b3480156107b357600080fd5b506103f66107c2366004612b54565b611c98565b3480156107d357600080fd5b50610319611ce4565b3480156107e857600080fd5b50610319600e5481565b3480156107fe57600080fd5b5061031961080d366004612cf6565b611d60565b34801561081e57600080fd5b506103f661082d366004612cf6565b611edc565b34801561083e57600080fd5b506103f661084d366004612b54565b611f0b565b34801561085e57600080fd5b506103f661086d366004612b54565b611f75565b34801561087e57600080fd5b506103f6611fc1565b34801561089357600080fd5b50600a54610362906001600160a01b031681565b3480156108b357600080fd5b50610319600d5481565b3480156108c957600080fd5b5061036273d4d42f0b6def4ce0383636770ef773390d85c61a81565b3480156108f157600080fd5b50600854610362906001600160a01b031681565b60105460405163c4443f2760e01b815260048101919091523060248201526000908190735593473e318f0314eb2518239c474e183c4cbed59063c4443f279060440160206040518083038186803b15801561095f57600080fd5b505afa158015610973573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109979190612d0e565b92915050565b6010546040516393f1a40b60e01b815260048101919091523060248201526000908190735593473e318f0314eb2518239c474e183c4cbed5906393f1a40b90604401604080518083038186803b1580156109f657600080fd5b505afa158015610a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2e9190612d26565b5092915050565b6007546001600160a01b0316331480610a5857506009546001600160a01b031633145b610a7d5760405162461bcd60e51b8152600401610a7490612df6565b60405180910390fd5b6001600160a01b03166000908152600c60205260409020805460ff19169055565b600a546060906001600160a01b03163314610acb5760405162461bcd60e51b8152600401610a7490612e3e565b6001600160a01b038316610b0b5760405162461bcd60e51b8152602060048201526007602482015266085d185c99d95d60ca1b6044820152606401610a74565b600080835160208501866113885a03f43d6040519250601f19601f6020830101168301604052808352806000602085013e811560018114610b4b57610b52565b8160208501fd5b50505092915050565b600a546001600160a01b03163314610b855760405162461bcd60e51b8152600401610a7490612e3e565b600355565b6008546001600160a01b03163314610bb45760405162461bcd60e51b8152600401610a7490612dd1565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610bf857600080fd5b505afa158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c309190612d0e565b905081811015610c5b57610c4c610c47838361210e565b612157565b9150610c5882826121d5565b91505b6000610c7f620186a0610c796006548661223490919063ffffffff16565b906122b3565b9050610d1d600860009054906101000a90046001600160a01b03166001600160a01b0316638d8f1e676040518163ffffffff1660e01b815260040160206040518083038186803b158015610cd257600080fd5b505afa158015610ce6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0a9190612b70565b6000546001600160a01b031690836122f5565b6000610d3b620186a0610c796005548761223490919063ffffffff16565b9050610d8e600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b158015610cd257600080fd5b60085460008054604051632988bb9f60e21b81526001600160a01b0391821660048201529192169063a622ee7c9060240160206040518083038186803b158015610dd757600080fd5b505afa158015610deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0f9190612b70565b90506001600160a01b038116610e375760405162461bcd60e51b8152600401610a7490612e1e565b610e6281610e4f84610e49898861210e565b9061210e565b6000546001600160a01b031691906122f5565b5050505050565b336000908152600c602052604090205460ff1680610e9157506007546001600160a01b031633145b80610ea657506009546001600160a01b031633145b610eaf57600080fd5b601054604051631c57762b60e31b8152600481019190915260006024820152735593473e318f0314eb2518239c474e183c4cbed59063e2bbb15890604401600060405180830381600087803b158015610f0757600080fd5b505af1158015610f1b573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507351318b7d00db7acc4026c88c3952b66278b6a67f91506370a082319060240160206040518083038186803b158015610f6c57600080fd5b505afa158015610f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa49190612d0e565b90508015611133576000610fc9612710610c79600d548561223490919063ffffffff16565b9050611070600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b15801561101c57600080fd5b505afa158015611030573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110549190612b70565b7351318b7d00db7acc4026c88c3952b66278b6a67f90836122f5565b6040516370a0823160e01b81523060048201527351318b7d00db7acc4026c88c3952b66278b6a67f906370a082319060240160206040518083038186803b1580156110ba57600080fd5b505afa1580156110ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f29190612d0e565b91506111317351318b7d00db7acc4026c88c3952b66278b6a67f7382af49447d8a07e3bd95bd0d56f35241523fbab161112c8560026122b3565b612358565b505b6040516370a0823160e01b81523060048201526000907382af49447d8a07e3bd95bd0d56f35241523fbab1906370a082319060240160206040518083038186803b15801561118057600080fd5b505afa158015611194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b89190612d0e565b6040516370a0823160e01b81523060048201529091507351318b7d00db7acc4026c88c3952b66278b6a67f906370a082319060240160206040518083038186803b15801561120557600080fd5b505afa158015611219573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123d9190612d0e565b915060008211801561124f5750600081115b156116de57600b54611281907351318b7d00db7acc4026c88c3952b66278b6a67f906001600160a01b0316600061262a565b600b546112ad907351318b7d00db7acc4026c88c3952b66278b6a67f906001600160a01b03168461262a565b600b546112da907382af49447d8a07e3bd95bd0d56f35241523fbab1906001600160a01b0316600061262a565b600b54611306907382af49447d8a07e3bd95bd0d56f35241523fbab1906001600160a01b03168361262a565b600b546001600160a01b031663e8e337007351318b7d00db7acc4026c88c3952b66278b6a67f7382af49447d8a07e3bd95bd0d56f35241523fbab185856000803061135242603c6121d5565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e481019190915261010401606060405180830381600087803b1580156113c957600080fd5b505af11580156113dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114019190612d49565b50506040516370a0823160e01b81523060048201527351318b7d00db7acc4026c88c3952b66278b6a67f91506370a082319060240160206040518083038186803b15801561144e57600080fd5b505afa158015611462573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114869190612d0e565b6040516370a0823160e01b81523060048201529092507382af49447d8a07e3bd95bd0d56f35241523fbab1906370a082319060240160206040518083038186803b1580156114d357600080fd5b505afa1580156114e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150b9190612d0e565b9050811561163e577351318b7d00db7acc4026c88c3952b66278b6a67f6001600160a01b031663a9059cbb600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b15801561158457600080fd5b505afa158015611598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bc9190612b70565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401602060405180830381600087803b15801561160457600080fd5b505af1158015611618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163c9190612cd6565b505b80156116de57600854604080516361d027b360e01b815290516116de926001600160a01b0316916361d027b3916004808301926020929190829003018186803b15801561168a57600080fd5b505afa15801561169e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c29190612b70565b7382af49447d8a07e3bd95bd0d56f35241523fbab190836122f5565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561172257600080fd5b505afa158015611736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175a9190612d0e565b60408051428152602081018390529192507f6c8433a8e155f0af04dba058d4e4695f7da554578963d876bdf4a6d8d6399d9c910160405180910390a161179e61274e565b505050565b600a546001600160a01b031633146117cd5760405162461bcd60e51b8152600401610a7490612e3e565b600e55565b6008546000906001600160a01b031633146117ff5760405162461bcd60e51b8152600401610a7490612dd1565b6000546001600160a01b03838116911614156118465760405162461bcd60e51b8152600401610a74906020808252600490820152631dd85b9d60e21b604082015260600190565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b15801561188557600080fd5b505afa158015611899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bd9190612d0e565b6008549091506118da906001600160a01b038481169116836122f5565b919050565b6007546001600160a01b031633148061190257506009546001600160a01b031633145b8061191c5750336000908152600c602052604090205460ff165b6119385760405162461bcd60e51b8152600401610a7490612df6565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b600061197761196961099d565b611971611ce4565b906121d5565b905090565b600a546001600160a01b031633146119a65760405162461bcd60e51b8152600401610a7490612e3e565b600555565b6008546000906001600160a01b031633146119d85760405162461bcd60e51b8152600401610a7490612dd1565b6119e061290c565b6000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611a2357600080fd5b505afa158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b9190612d0e565b60085460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b158015611aa857600080fd5b505afa158015611abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae09190612b70565b90506001600160a01b038116611b085760405162461bcd60e51b8152600401610a7490612e1e565b600054611b1f906001600160a01b031682846122f5565b5090565b600a546001600160a01b0316331480611b4657506009546001600160a01b031633145b611b625760405162461bcd60e51b8152600401610a7490612e3e565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314611bae5760405162461bcd60e51b8152600401610a7490612e3e565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314611c185760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610a74565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314611c645760405162461bcd60e51b8152600401610a7490612e3e565b600655565b600a546001600160a01b03163314611c935760405162461bcd60e51b8152600401610a7490612e3e565b600d55565b600a546001600160a01b03163314611cc25760405162461bcd60e51b8152600401610a7490612e3e565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611d2857600080fd5b505afa158015611d3c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119779190612d0e565b6008546000906001600160a01b03163314611d8d5760405162461bcd60e51b8152600401610a7490612dd1565b611d9682612157565b506000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611dda57600080fd5b505afa158015611dee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e129190612d0e565b60085460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b158015611e5f57600080fd5b505afa158015611e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e979190612b70565b90506001600160a01b038116611ebf5760405162461bcd60e51b8152600401610a7490612e1e565b600054611ed6906001600160a01b031682846122f5565b50919050565b600a546001600160a01b03163314611f065760405162461bcd60e51b8152600401610a7490612e3e565b600455565b6007546001600160a01b03163314611f535760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610a74565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314611f9f5760405162461bcd60e51b8152600401610a7490612df6565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561200557600080fd5b505afa158015612019573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203d9190612d0e565b9050801561210b5760008054612074916001600160a01b0390911690735593473e318f0314eb2518239c474e183c4cbed59061262a565b60005461209f906001600160a01b0316735593473e318f0314eb2518239c474e183c4cbed58361262a565b601054604051631c57762b60e31b8152600481019190915260248101829052735593473e318f0314eb2518239c474e183c4cbed59063e2bbb15890604401600060405180830381600087803b1580156120f757600080fd5b505af1158015610e62573d6000803e3d6000fd5b50565b600061215083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612917565b9392505050565b601054604051630441a3e760e41b8152600091735593473e318f0314eb2518239c474e183c4cbed59163441a3e709161219d918690600401918252602082015260400190565b600060405180830381600087803b1580156121b757600080fd5b505af11580156121cb573d6000803e3d6000fd5b5093949350505050565b6000806121e28385612f02565b9050838110156121505760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a74565b60008261224357506000610997565b600061224f8385612f3a565b90508261225c8583612f1a565b146121505760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a74565b600061215083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612951565b6040516001600160a01b03831660248201526044810182905261179e90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261297f565b6001600160a01b03821661236b57600080fd5b60606001600160a01b0384167382af49447d8a07e3bd95bd0d56f35241523fbab114806123b457506001600160a01b0383167382af49447d8a07e3bd95bd0d56f35241523fbab1145b1561246257604080516002808252606082018352909160208301908036833701905050905083816000815181106123fb57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061243d57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505061255e565b60408051600380825260808201909252906020820160608036833701905050905083816000815181106124a557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507382af49447d8a07e3bd95bd0d56f35241523fbab1816001815181106124fb57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050828160028151811061253d57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600b54612579906001600160a01b038681169116600061262a565b600b54612593906001600160a01b0386811691168461262a565b600b546001600160a01b03166338ed173983600084306125b442603c6121d5565b6040518663ffffffff1660e01b81526004016125d4959493929190612e61565b600060405180830381600087803b1580156125ee57600080fd5b505af1158015612602573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e629190810190612c2e565b8015806126b35750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561267957600080fd5b505afa15801561268d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b19190612d0e565b155b61271e5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610a74565b6040516001600160a01b03831660248201526044810182905261179e90849063095ea7b360e01b90606401612321565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561279257600080fd5b505afa1580156127a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ca9190612d0e565b9050801561210b57600854604080516361d027b360e01b8152905161286b926001600160a01b0316916361d027b3916004808301926020929190829003018186803b15801561281857600080fd5b505afa15801561282c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128509190612b70565b610e4f612710610c796003548661223490919063ffffffff16565b60085460408051638d8f1e6760e01b81529051612904926001600160a01b031691638d8f1e67916004808301926020929190829003018186803b1580156128b157600080fd5b505afa1580156128c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e99190612b70565b610e4f612710610c796004548661223490919063ffffffff16565b61210b611fc1565b61210b610c4761099d565b6000818484111561293b5760405162461bcd60e51b8152600401610a749190612dbe565b5060006129488486612f59565b95945050505050565b600081836129725760405162461bcd60e51b8152600401610a749190612dbe565b5060006129488486612f1a565b60006129d4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a519092919063ffffffff16565b80519091501561179e57808060200190518101906129f29190612cd6565b61179e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a74565b6060612a608484600085612a68565b949350505050565b6060843b612ab85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a74565b600080866001600160a01b03168587604051612ad49190612da2565b60006040518083038185875af1925050503d8060008114612b11576040519150601f19603f3d011682016040523d82523d6000602084013e612b16565b606091505b50915091508115612b2a579150612a609050565b805115612b3a5780518082602001fd5b8360405162461bcd60e51b8152600401610a749190612dbe565b600060208284031215612b65578081fd5b813561215081612fcc565b600060208284031215612b81578081fd5b815161215081612fcc565b60008060408385031215612b9e578081fd5b8235612ba981612fcc565b915060208381013567ffffffffffffffff80821115612bc6578384fd5b818601915086601f830112612bd9578384fd5b813581811115612beb57612beb612fb6565b612bfd601f8201601f19168501612ed1565b91508082528784828501011115612c12578485fd5b8084840185840137810190920192909252919491935090915050565b60006020808385031215612c40578182fd5b825167ffffffffffffffff80821115612c57578384fd5b818501915085601f830112612c6a578384fd5b815181811115612c7c57612c7c612fb6565b8060051b9150612c8d848301612ed1565b8181528481019084860184860187018a1015612ca7578788fd5b8795505b83861015612cc9578051835260019590950194918601918601612cab565b5098975050505050505050565b600060208284031215612ce7578081fd5b81518015158114612150578182fd5b600060208284031215612d07578081fd5b5035919050565b600060208284031215612d1f578081fd5b5051919050565b60008060408385031215612d38578182fd5b505080516020909101519092909150565b600080600060608486031215612d5d578081fd5b8351925060208401519150604084015190509250925092565b60008151808452612d8e816020860160208601612f70565b601f01601f19169290920160200192915050565b60008251612db4818460208701612f70565b9190910192915050565b6020815260006121506020830184612d76565b6020808252600b908201526a10b1b7b73a3937b63632b960a91b604082015260600190565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600990820152682174696d656c6f636b60b81b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015612eb05784516001600160a01b031683529383019391830191600101612e8b565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612efa57612efa612fb6565b604052919050565b60008219821115612f1557612f15612fa0565b500190565b600082612f3557634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612f5457612f54612fa0565b500290565b600082821015612f6b57612f6b612fa0565b500390565b60005b83811015612f8b578181015183820152602001612f73565b83811115612f9a576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461210b57600080fdfea264697066735822122054dddfaa17ccc12ffadde50909d8500148b1e4cbc70964a4fc416d4f369809cb64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8000000000000000000000000afc36887ee43eddeb5773fedc877481ec97625a7000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
-----Decoded View---------------
Arg [0] : _governance (address): 0xCb410A689A03E06de0a6247b13C13D14237DecC8
Arg [1] : _strategist (address): 0xCb410A689A03E06de0a6247b13C13D14237DecC8
Arg [2] : _controller (address): 0xAFC36887EE43EDDeB5773fedC877481ec97625a7
Arg [3] : _timelock (address): 0xCb410A689A03E06de0a6247b13C13D14237DecC8
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Arg [1] : 000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Arg [2] : 000000000000000000000000afc36887ee43eddeb5773fedc877481ec97625a7
Arg [3] : 000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Deployed Bytecode Sourcemap
57587:670:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54376:191;;;;;;;;;;;;;:::i;:::-;;;11237:25:1;;;11225:2;11210:18;54376:191:0;;;;;;;;53788:39;;;;;;;;;;;;53822:5;53788:39;;40934:74;;;;;;;;;;-1:-1:-1;40934:74:0;;;;-1:-1:-1;;;;;40934:74:0;;;;;;-1:-1:-1;;;;;4745:32:1;;;4727:51;;4715:2;4700:18;40934:74:0;4682:102:1;54184:186:0;;;;;;;;;;;;;:::i;58139:115::-;;;;;;;;;;-1:-1:-1;58216:30:0;;;;;;;;;;;;-1:-1:-1;;;58216:30:0;;;;58139:115;;;;;;;:::i;43351:207::-;;;;;;;;;;-1:-1:-1;43351:207:0;;;;;:::i;:::-;;:::i;:::-;;48028:1053;;;;;;:::i;:::-;;:::i;40656:19::-;;;;;;;;;;-1:-1:-1;40656:19:0;;;;-1:-1:-1;;;;;40656:19:0;;;41653:25;;;;;;;;;;-1:-1:-1;41653:25:0;;;;-1:-1:-1;;;;;41653:25:0;;;53518:72;;;;;;;;;;;;53548:42;53518:72;;44337:213;;;;;;;;;;-1:-1:-1;44337:213:0;;;;;:::i;:::-;;:::i;45715:1032::-;;;;;;;;;;-1:-1:-1;45715:1032:0;;;;;:::i;:::-;;:::i;53858:21::-;;;;;;;;;;;;;;;;40682:73;;;;;;;;;;;;40713:42;40682:73;;55671:1809;;;;;;;;;;;;;:::i;41505:53::-;;;;;;;;;;;;41552:6;41505:53;;53597:85;;;;;;;;;;;;53640:42;53597:85;;55222:145;;;;;;;;;;-1:-1:-1;55222:145:0;;;;;:::i;:::-;;:::i;45348:289::-;;;;;;;;;;-1:-1:-1;45348:289:0;;;;;:::i;:::-;;:::i;41459:39::-;;;;;;;;;;;;;;;;43108:235;;;;;;;;;;-1:-1:-1;43108:235:0;;;;;:::i;:::-;;:::i;41058:44::-;;;;;;;;;;;;;;;;41589:25;;;;;;;;;;-1:-1:-1;41589:25:0;;;;-1:-1:-1;;;;;41589:25:0;;;57651:68;;;;;;;;;;-1:-1:-1;57651:68:0;;;;-1:-1:-1;;;;;57651:68:0;;;41730:71;;;;;;;;;;-1:-1:-1;41730:71:0;;;;-1:-1:-1;;;;;41730:71:0;;;42883:113;;;;;;;;;;;;;:::i;43947:195::-;;;;;;;;;;-1:-1:-1;43947:195:0;;;;;:::i;:::-;;:::i;47325:440::-;;;;;;;;;;;;;:::i;41810:42::-;;;;;;;;;;-1:-1:-1;41810:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6307:14:1;;6300:22;6282:41;;6270:2;6255:18;41810:42:0;6237:92:1;41172:36:0;;;;;;;;;;;;;;;;55373:208;;;;;;;;;;-1:-1:-1;55373:208:0;;;;;:::i;:::-;;:::i;41349:40::-;;;;;;;;;;;;;;;;45035:151;;;;;;;;;;-1:-1:-1;45035:151:0;;;;;:::i;:::-;;:::i;44721:155::-;;;;;;;;;;-1:-1:-1;44721:155:0;;;;;:::i;:::-;;:::i;43748:191::-;;;;;;;;;;-1:-1:-1;43748:191:0;;;;;:::i;:::-;;:::i;40855:72::-;;;;;;;;;;-1:-1:-1;40855:72:0;;;;-1:-1:-1;;;;;40855:72:0;;;55095:121;;;;;;;;;;-1:-1:-1;55095:121:0;;;;;:::i;:::-;;:::i;44884:143::-;;;;;;;;;;-1:-1:-1;44884:143:0;;;;;:::i;:::-;;:::i;42686:118::-;;;;;;;;;;;;;:::i;53751:32::-;;;;;;;;;;;;;;;;46811:438;;;;;;;;;;-1:-1:-1;46811:438:0;;;;;:::i;:::-;;:::i;44150:179::-;;;;;;;;;;-1:-1:-1;44150:179:0;;;;;:::i;:::-;;:::i;44558:155::-;;;;;;;;;;-1:-1:-1;44558:155:0;;;;;:::i;:::-;;:::i;43566:174::-;;;;;;;;;;-1:-1:-1;43566:174:0;;;;;:::i;:::-;;:::i;54573:315::-;;;;;;;;;;;;;:::i;41685:23::-;;;;;;;;;;-1:-1:-1;41685:23:0;;;;-1:-1:-1;;;;;41685:23:0;;;53720:26;;;;;;;;;;;;;;;;40762:72;;;;;;;;;;;;40792:42;40762:72;;41621:25;;;;;;;;;;-1:-1:-1;41621:25:0;;;;-1:-1:-1;;;;;41621:25:0;;;54376:191;54510:6;;54463:69;;-1:-1:-1;;;54463:69:0;;;;;11447:25:1;;;;54526:4:0;11488:18:1;;;11481:60;54425:7:0;;;;53640:42;;54463:46;;11420:18:1;;54463:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54441:91;54376:191;-1:-1:-1;;54376:191:0:o;54184:186::-;54321:6;;54276:67;;-1:-1:-1;;;54276:67:0;;;;;11447:25:1;;;;54337:4:0;11488:18:1;;;11481:60;54239:7:0;;;;53640:42;;54276:44;;11420:18:1;;54276:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;54255:88:0;54184:186;-1:-1:-1;;54184:186:0:o;43351:207::-;43438:10;;-1:-1:-1;;;;;43438:10:0;43424;:24;;:66;;-1:-1:-1;43480:10:0;;-1:-1:-1;;;;;43480:10:0;43466;:24;43424:66;43416:93;;;;-1:-1:-1;;;43416:93:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;43520:22:0;43545:5;43520:22;;;:10;:22;;;;;:30;;-1:-1:-1;;43520:30:0;;;43351:207::o;48028:1053::-;48194:8;;48133:21;;-1:-1:-1;;;;;48194:8:0;48180:10;:22;48172:44;;;;-1:-1:-1;;;48172:44:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48235:21:0;;48227:41;;;;-1:-1:-1;;;48227:41:0;;7322:2:1;48227:41:0;;;7304:21:1;7361:1;7341:18;;;7334:29;-1:-1:-1;;;7379:18:1;;;7372:37;7426:18;;48227:41:0;7294:156:1;48227:41:0;48545:1;48525;48500:5;48494:12;48470:4;48463:5;48459:16;48433:7;48409:4;48402:5;48398:16;48367:194;48587:16;48637:4;48631:11;48619:23;;48754:4;48750:9;48743:4;48736;48730;48726:15;48722:26;48718:42;48708:8;48704:57;48681:4;48656:120;48807:4;48797:8;48790:22;48865:4;48862:1;48855:4;48845:8;48841:19;48826:44;48900:9;48893:17;48933:1;48928:135;;;;48886:177;;48928:135;49039:4;49032;49022:8;49018:19;49011:33;48886:177;;;;48335:739;;;;:::o;44337:213::-;44461:8;;-1:-1:-1;;;;;44461:8:0;44447:10;:22;44439:44;;;;-1:-1:-1;;;44439:44:0;;;;;;;:::i;:::-;44494:22;:48;44337:213::o;45715:1032::-;45792:10;;-1:-1:-1;;;;;45792:10:0;45778;:24;45770:48;;;;-1:-1:-1;;;45770:48:0;;;;;;;:::i;:::-;45829:16;45855:4;;45848:37;;-1:-1:-1;;;45848:37:0;;45879:4;45848:37;;;4727:51:1;-1:-1:-1;;;;;45855:4:0;;;;45848:22;;4700:18:1;;45848:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45829:56;;45911:7;45900:8;:18;45896:143;;;45945:36;45959:21;:7;45971:8;45959:11;:21::i;:::-;45945:13;:36::i;:::-;45935:46;-1:-1:-1;46006:21:0;45935:46;46018:8;46006:11;:21::i;:::-;45996:31;;45896:143;46051:15;46069:83;41552:6;46069:33;46081:20;;46069:7;:11;;:33;;;;:::i;:::-;:37;;:83::i;:::-;46051:101;;46163:69;46201:10;;;;;;;;;-1:-1:-1;;;;;46201:10:0;-1:-1:-1;;;;;46189:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46170:4;;-1:-1:-1;;;;;46170:4:0;;46224:7;46163:25;:69::i;:::-;46245:20;46268:85;41444:6;46268:34;46280:21;;46268:7;:11;;:34;;;;:::i;:85::-;46245:108;;46364:112;46416:10;;;;;;;;;-1:-1:-1;;;;;46416:10:0;-1:-1:-1;;;;;46404:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46364:112;46518:10;;46489:14;46545:4;;46506:45;;-1:-1:-1;;;46506:45:0;;-1:-1:-1;;;;;46545:4:0;;;46506:45;;;4727:51:1;46489:14:0;;46518:10;;46506:30;;4700:18:1;;46506:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46489:62;-1:-1:-1;;;;;;46570:20:0;;46562:39;;;;-1:-1:-1;;;46562:39:0;;;;;;;:::i;:::-;46666:73;46692:6;46700:38;46725:12;46700:20;:7;46712;46700:11;:20::i;:::-;:24;;:38::i;:::-;46673:4;;-1:-1:-1;;;;;46673:4:0;;46666:73;:25;:73::i;:::-;45715:1032;;;;;:::o;55671:1809::-;42517:10;42506:22;;;;:10;:22;;;;;;;;;:67;;-1:-1:-1;42563:10:0;;-1:-1:-1;;;;;42563:10:0;42549;:24;42506:67;:112;;;-1:-1:-1;42608:10:0;;-1:-1:-1;;;;;42608:10:0;42594;:24;42506:112;42484:145;;;;;;55772:6:::1;::::0;55728:54:::1;::::0;-1:-1:-1;;;55728:54:0;;::::1;::::0;::::1;11734:25:1::0;;;;55780:1:0::1;11775:18:1::0;;;11768:34;53640:42:0::1;::::0;55728:43:::1;::::0;11707:18:1;;55728:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;55806:36:0::1;::::0;-1:-1:-1;;;55806:36:0;;55836:4:::1;55806:36;::::0;::::1;4727:51:1::0;55791:12:0::1;::::0;-1:-1:-1;53548:42:0::1;::::0;-1:-1:-1;55806:21:0::1;::::0;4700:18:1;;55806:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55791:51:::0;-1:-1:-1;55852:8:0;;55849:359:::1;;55917:16;55936:27;53822:5;55936:14;55945:4;;55936;:8;;:14;;;;:::i;:27::-;55917:46;;55974:107;56025:10;;;;;;;;;-1:-1:-1::0;;;;;56025:10:0::1;-1:-1:-1::0;;;;;56013:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53548:42;::::0;56062:8;55974:24:::1;:107::i;:::-;56109:36;::::0;-1:-1:-1;;;56109:36:0;;56139:4:::1;56109:36;::::0;::::1;4727:51:1::0;53548:42:0::1;::::0;56109:21:::1;::::0;4700:18:1;;56109:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56102:43:::0;-1:-1:-1;56156:38:0::1;53548:42;40713;56182:11;56102:43:::0;56191:1:::1;56182:8;:11::i;:::-;56156:14;:38::i;:::-;55849:359;;56236:37;::::0;-1:-1:-1;;;56236:37:0;;56267:4:::1;56236:37;::::0;::::1;4727:51:1::0;56220:13:0::1;::::0;40713:42:::1;::::0;56236:22:::1;::::0;4700:18:1;;56236:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56287:36;::::0;-1:-1:-1;;;56287:36:0;;56317:4:::1;56287:36;::::0;::::1;4727:51:1::0;56220:53:0;;-1:-1:-1;53548:42:0::1;::::0;56287:21:::1;::::0;4700:18:1;;56287:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56280:43;;56391:1;56384:4;:8;:21;;;;;56404:1;56396:5;:9;56384:21;56380:941;;;56442:11;::::0;56418:39:::1;::::0;53548:42:::1;::::0;-1:-1:-1;;;;;56442:11:0::1;;56418:23;:39::i;:::-;56492:11;::::0;56468:42:::1;::::0;53548::::1;::::0;-1:-1:-1;;;;;56492:11:0::1;56505:4:::0;56468:23:::1;:42::i;:::-;56546:11;::::0;56521:40:::1;::::0;40713:42:::1;::::0;-1:-1:-1;;;;;56546:11:0::1;;56521:24;:40::i;:::-;56597:11;::::0;56572:44:::1;::::0;40713:42:::1;::::0;-1:-1:-1;;;;;56597:11:0::1;56610:5:::0;56572:24:::1;:44::i;:::-;56645:11;::::0;-1:-1:-1;;;;;56645:11:0::1;56629:41;53548:42;40713;56722:4:::0;56741:5;56645:11:::1;::::0;56801:4:::1;56821:23;:15;56841:2;56821:19;:23::i;:::-;56629:226;::::0;::::1;::::0;;;-1:-1:-1;;;;;;56629:226:0;;;-1:-1:-1;;;;;5513:15:1;;;56629:226:0::1;::::0;::::1;5495:34:1::0;5565:15;;;5545:18;;;5538:43;5597:18;;;5590:34;;;;5640:18;;;5633:34;;;;5683:19;;;5676:35;;;;5727:19;;;5720:35;5792:15;;;5771:19;;;5764:44;5824:19;;;5817:35;;;;5429:19;;56629:226:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;56875:36:0::1;::::0;-1:-1:-1;;;56875:36:0;;56905:4:::1;56875:36;::::0;::::1;4727:51:1::0;53548:42:0::1;::::0;-1:-1:-1;56875:21:0::1;::::0;4700:18:1;;56875:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56930:37;::::0;-1:-1:-1;;;56930:37:0;;56961:4:::1;56930:37;::::0;::::1;4727:51:1::0;56868:43:0;;-1:-1:-1;40713:42:0::1;::::0;56930:22:::1;::::0;4700:18:1;;56930:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56922:45:::0;-1:-1:-1;57008:8:0;;57005:139:::1;;53548:42;-1:-1:-1::0;;;;;57031:20:0::1;;57078:10;;;;;;;;;-1:-1:-1::0;;;;;57078:10:0::1;-1:-1:-1::0;;;;;57066:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57031:101;::::0;-1:-1:-1;;;;;;57031:101:0::1;::::0;;;;;;-1:-1:-1;;;;;6055:32:1;;;57031:101:0::1;::::0;::::1;6037:51:1::0;6104:18;;;6097:34;;;6010:18;;57031:101:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57005:139;57167:9:::0;;57164:150:::1;;57245:10;::::0;57233:34:::1;::::0;;-1:-1:-1;;;57233:34:0;;;;57191:111:::1;::::0;-1:-1:-1;;;;;57245:10:0::1;::::0;57233:32:::1;::::0;:34:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;57245:10;57233:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40713:42;::::0;57284:5;57191:25:::1;:111::i;:::-;57329:13;57352:4:::0;;57345:37:::1;::::0;-1:-1:-1;;;57345:37:0;;57376:4:::1;57345:37;::::0;::::1;4727:51:1::0;-1:-1:-1;;;;;57352:4:0;;::::1;::::0;57345:22:::1;::::0;4700:18:1;;57345:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57394:31;::::0;;57402:15:::1;11734:25:1::0;;11790:2;11775:18;;11768:34;;;57329:53:0;;-1:-1:-1;57394:31:0::1;::::0;11707:18:1;57394:31:0::1;;;;;;;57434:38;:36;:38::i;:::-;42640:1;;;55671:1809::o:0;55222:145::-;55306:8;;-1:-1:-1;;;;;55306:8:0;55292:10;:22;55284:44;;;;-1:-1:-1;;;55284:44:0;;;;;;;:::i;:::-;55337:10;:24;55222:145::o;45348:289::-;45449:10;;45399:15;;-1:-1:-1;;;;;45449:10:0;45435;:24;45427:48;;;;-1:-1:-1;;;45427:48:0;;;;;;;:::i;:::-;45494:4;;-1:-1:-1;;;;;45494:23:0;;;:4;;:23;;45486:40;;;;-1:-1:-1;;;45486:40:0;;;;;;8353:2:1;8335:21;;;8392:1;8372:18;;;8365:29;-1:-1:-1;;;8425:2:1;8410:18;;8403:34;8469:2;8454:18;;8325:153;45486:40:0;45547:31;;-1:-1:-1;;;45547:31:0;;45572:4;45547:31;;;4727:51:1;-1:-1:-1;;;;;45547:16:0;;;;;4700:18:1;;45547:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45609:10;;45537:41;;-1:-1:-1;45589:40:0;;-1:-1:-1;;;;;45589:19:0;;;;45609:10;45537:41;45589:19;:40::i;:::-;45348:289;;;:::o;43108:235::-;43198:10;;-1:-1:-1;;;;;43198:10:0;43184;:24;;:66;;-1:-1:-1;43240:10:0;;-1:-1:-1;;;;;43240:10:0;43226;:24;43184:66;:92;;;-1:-1:-1;43265:10:0;43254:22;;;;:10;:22;;;;;;;;43184:92;43176:119;;;;-1:-1:-1;;;43176:119:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43306:22:0;;;;;:10;:22;;;;;:29;;-1:-1:-1;;43306:29:0;43331:4;43306:29;;;43108:235::o;42883:113::-;42925:7;42952:36;42972:15;:13;:15::i;:::-;42952;:13;:15::i;:::-;:19;;:36::i;:::-;42945:43;;42883:113;:::o;43947:195::-;44055:8;;-1:-1:-1;;;;;44055:8:0;44041:10;:22;44033:44;;;;-1:-1:-1;;;44033:44:0;;;;;;;:::i;:::-;44088:21;:46;43947:195::o;47325:440::-;47416:10;;47366:15;;-1:-1:-1;;;;;47416:10:0;47402;:24;47394:48;;;;-1:-1:-1;;;47394:48:0;;;;;;;:::i;:::-;47453:14;:12;:14::i;:::-;47497:4;;47490:37;;-1:-1:-1;;;47490:37:0;;47521:4;47490:37;;;4727:51:1;-1:-1:-1;;;;;47497:4:0;;;;47490:22;;4700:18:1;;47490:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47569:10;;47540:14;47596:4;;47557:45;;-1:-1:-1;;;47557:45:0;;-1:-1:-1;;;;;47596:4:0;;;47557:45;;;4727:51:1;47480:47:0;;-1:-1:-1;47540:14:0;;47569:10;;;47557:30;;4700:18:1;;47557:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47540:62;-1:-1:-1;;;;;;47621:20:0;;47613:39;;;;-1:-1:-1;;;47613:39:0;;;;;;;:::i;:::-;47722:4;;47715:42;;-1:-1:-1;;;;;47722:4:0;47741:6;47749:7;47715:25;:42::i;:::-;47325:440;;:::o;55373:208::-;55471:8;;-1:-1:-1;;;;;55471:8:0;55457:10;:22;;:50;;-1:-1:-1;55497:10:0;;-1:-1:-1;;;;;55497:10:0;55483;:24;55457:50;55437:103;;;;-1:-1:-1;;;55437:103:0;;;;;;;:::i;:::-;55549:11;:26;;-1:-1:-1;;;;;;55549:26:0;-1:-1:-1;;;;;55549:26:0;;;;;;;;;;55373:208::o;45035:151::-;45121:8;;-1:-1:-1;;;;;45121:8:0;45107:10;:22;45099:44;;;;-1:-1:-1;;;45099:44:0;;;;;;;:::i;:::-;45154:10;:24;;-1:-1:-1;;;;;;45154:24:0;-1:-1:-1;;;;;45154:24:0;;;;;;;;;;45035:151::o;44721:155::-;44807:10;;-1:-1:-1;;;;;44807:10:0;44793;:24;44785:48;;;;-1:-1:-1;;;44785:48:0;;6982:2:1;44785:48:0;;;6964:21:1;7021:2;7001:18;;;6994:30;-1:-1:-1;;;7040:18:1;;;7033:41;7091:18;;44785:48:0;6954:161:1;44785:48:0;44844:10;:24;;-1:-1:-1;;;;;;44844:24:0;-1:-1:-1;;;;;44844:24:0;;;;;;;;;;44721:155::o;43748:191::-;43854:8;;-1:-1:-1;;;;;43854:8:0;43840:10;:22;43832:44;;;;-1:-1:-1;;;43832:44:0;;;;;;;:::i;:::-;43887:20;:44;43748:191::o;55095:121::-;55167:8;;-1:-1:-1;;;;;55167:8:0;55153:10;:22;55145:44;;;;-1:-1:-1;;;55145:44:0;;;;;;;:::i;:::-;55198:4;:12;55095:121::o;44884:143::-;44966:8;;-1:-1:-1;;;;;44966:8:0;44952:10;:22;44944:44;;;;-1:-1:-1;;;44944:44:0;;;;;;;:::i;:::-;44999:8;:20;;-1:-1:-1;;;;;;44999:20:0;-1:-1:-1;;;;;44999:20:0;;;;;;;;;;44884:143::o;42686:118::-;42732:7;42766:4;;42759:37;;-1:-1:-1;;;42759:37:0;;42790:4;42759:37;;;4727:51:1;-1:-1:-1;;;;;42766:4:0;;;;42759:22;;4700:18:1;;42759:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;46811:438::-;46944:10;;46889:15;;-1:-1:-1;;;;;46944:10:0;46930;:24;46922:48;;;;-1:-1:-1;;;46922:48:0;;;;;;;:::i;:::-;46981:22;46995:7;46981:13;:22::i;:::-;-1:-1:-1;47033:4:0;;47026:37;;-1:-1:-1;;;47026:37:0;;47057:4;47026:37;;;4727:51:1;-1:-1:-1;;;;;47033:4:0;;;;47026:22;;4700:18:1;;47026:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47105:10;;47076:14;47132:4;;47093:45;;-1:-1:-1;;;47093:45:0;;-1:-1:-1;;;;;47132:4:0;;;47093:45;;;4727:51:1;47016:47:0;;-1:-1:-1;47076:14:0;;47105:10;;;47093:30;;4700:18:1;;47093:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47076:62;-1:-1:-1;;;;;;47157:20:0;;47149:39;;;;-1:-1:-1;;;47149:39:0;;;;;;;:::i;:::-;47206:4;;47199:42;;-1:-1:-1;;;;;47206:4:0;47225:6;47233:7;47199:25;:42::i;:::-;46811:438;;;;:::o;44150:179::-;44250:8;;-1:-1:-1;;;;;44250:8:0;44236:10;:22;44228:44;;;;-1:-1:-1;;;44228:44:0;;;;;;;:::i;:::-;44283:17;:38;44150:179::o;44558:155::-;44644:10;;-1:-1:-1;;;;;44644:10:0;44630;:24;44622:48;;;;-1:-1:-1;;;44622:48:0;;6982:2:1;44622:48:0;;;6964:21:1;7021:2;7001:18;;;6994:30;-1:-1:-1;;;7040:18:1;;;7033:41;7091:18;;44622:48:0;6954:161:1;44622:48:0;44681:10;:24;;-1:-1:-1;;;;;;44681:24:0;-1:-1:-1;;;;;44681:24:0;;;;;;;;;;44558:155::o;43566:174::-;43660:10;;-1:-1:-1;;;;;43660:10:0;43646;:24;43638:51;;;;-1:-1:-1;;;43638:51:0;;;;;;;:::i;:::-;43700:14;:32;;-1:-1:-1;;;;;;43700:32:0;-1:-1:-1;;;;;43700:32:0;;;;;;;;;;43566:174::o;54573:315::-;54615:13;54638:4;;54631:37;;-1:-1:-1;;;54631:37:0;;54662:4;54631:37;;;4727:51:1;-1:-1:-1;;;;;54638:4:0;;;;54631:22;;4700:18:1;;54631:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54615:53;-1:-1:-1;54679:9:0;;54675:208;;54744:1;54708:4;;54701:45;;-1:-1:-1;;;;;54708:4:0;;;;53640:42;;54701:24;:45::i;:::-;54764:4;;54757:49;;-1:-1:-1;;;;;54764:4:0;53640:42;54800:5;54757:24;:49::i;:::-;54861:6;;54817:58;;-1:-1:-1;;;54817:58:0;;;;;11734:25:1;;;;11775:18;;;11768:34;;;53640:42:0;;54817:43;;11707:18:1;;54817:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54675:208;54573:315;:::o;1485:136::-;1543:7;1570:43;1574:1;1577;1570:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1563:50;1485:136;-1:-1:-1;;;1485:136:0:o;54894:171::-;55022:6;;54977:61;;-1:-1:-1;;;54977:61:0;;54961:7;;53640:42;;54977:44;;:61;;55030:7;;54977:61;;11734:25:1;;;11790:2;11775:18;;11768:34;11722:2;11707:18;;11689:119;54977:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55052:7:0;;54894:171;-1:-1:-1;;;;54894:171:0:o;1021:181::-;1079:7;;1111:5;1115:1;1111;:5;:::i;:::-;1099:17;;1140:1;1135;:6;;1127:46;;;;-1:-1:-1;;;1127:46:0;;7997:2:1;1127:46:0;;;7979:21:1;8036:2;8016:18;;;8009:30;8075:29;8055:18;;;8048:57;8122:18;;1127:46:0;7969:177:1;2375:471:0;2433:7;2678:6;2674:47;;-1:-1:-1;2708:1:0;2701:8;;2674:47;2733:9;2745:5;2749:1;2745;:5;:::i;:::-;2733:17;-1:-1:-1;2778:1:0;2769:5;2773:1;2733:17;2769:5;:::i;:::-;:10;2761:56;;;;-1:-1:-1;;;2761:56:0;;9028:2:1;2761:56:0;;;9010:21:1;9067:2;9047:18;;;9040:30;9106:34;9086:18;;;9079:62;-1:-1:-1;;;9157:18:1;;;9150:31;9198:19;;2761:56:0;9000:223:1;3322:132:0;3380:7;3407:39;3411:1;3414;3407:39;;;;;;;;;;;;;;;;;:3;:39::i;26835:177::-;26945:58;;-1:-1:-1;;;;;6055:32:1;;26945:58:0;;;6037:51:1;6104:18;;;6097:34;;;26918:86:0;;26938:5;;-1:-1:-1;;;26968:23:0;6010:18:1;;26945:58:0;;;;-1:-1:-1;;26945:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;26945:58:0;-1:-1:-1;;;;;;26945:58:0;;;;;;;;;;26918:19;:86::i;49126:806::-;-1:-1:-1;;;;;49257:17:0;;49249:26;;;;;;49288:21;-1:-1:-1;;;;;49326:13:0;;40713:42;49326:13;;:28;;-1:-1:-1;;;;;;49343:11:0;;40713:42;49343:11;49326:28;49322:285;;;49378:16;;;49392:1;49378:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49378:16:0;49371:23;;49419:5;49409:4;49414:1;49409:7;;;;;;-1:-1:-1;;;49409:7:0;;;;;;;;;;;;;;:15;-1:-1:-1;;;;;49409:15:0;;;-1:-1:-1;;;;;49409:15:0;;;;;49449:3;49439:4;49444:1;49439:7;;;;;;-1:-1:-1;;;49439:7:0;;;;;;;;;;;;;;:13;-1:-1:-1;;;;;49439:13:0;;;-1:-1:-1;;;;;49439:13:0;;;;;49322:285;;;49492:16;;;49506:1;49492:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49492:16:0;49485:23;;49533:5;49523:4;49528:1;49523:7;;;;;;-1:-1:-1;;;49523:7:0;;;;;;;;;;;;;;:15;-1:-1:-1;;;;;49523:15:0;;;-1:-1:-1;;;;;49523:15:0;;;;;40713:42;49553:4;49558:1;49553:7;;;;;;-1:-1:-1;;;49553:7:0;;;;;;;;;;;;;;:14;-1:-1:-1;;;;;49553:14:0;;;-1:-1:-1;;;;;49553:14:0;;;;;49592:3;49582:4;49587:1;49582:7;;;;;;-1:-1:-1;;;49582:7:0;;;;;;;;;;;;;;:13;-1:-1:-1;;;;;49582:13:0;;;-1:-1:-1;;;;;49582:13:0;;;;;49322:285;49653:11;;49627:41;;-1:-1:-1;;;;;49627:25:0;;;;49653:11;;49627:25;:41::i;:::-;49705:11;;49679:47;;-1:-1:-1;;;;;49679:25:0;;;;49705:11;49718:7;49679:25;:47::i;:::-;49753:11;;-1:-1:-1;;;;;49753:11:0;49737:53;49805:7;49753:11;49843:4;49870;49890:23;:15;49910:2;49890:19;:23::i;:::-;49737:187;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49737:187:0;;;;;;;;;;;;:::i;27494:622::-;27864:10;;;27863:62;;-1:-1:-1;27880:39:0;;-1:-1:-1;;;27880:39:0;;27904:4;27880:39;;;5001:34:1;-1:-1:-1;;;;;5071:15:1;;;5051:18;;;5044:43;27880:15:0;;;;;4936:18:1;;27880:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;27863:62;27855:152;;;;-1:-1:-1;;;27855:152:0;;10870:2:1;27855:152:0;;;10852:21:1;10909:2;10889:18;;;10882:30;10948:34;10928:18;;;10921:62;-1:-1:-1;;;10999:18:1;;;10992:52;11061:19;;27855:152:0;10842:244:1;27855:152:0;28045:62;;-1:-1:-1;;;;;6055:32:1;;28045:62:0;;;6037:51:1;6104:18;;;6097:34;;;28018:90:0;;28038:5;;-1:-1:-1;;;28068:22:0;6010:18:1;;28045:62:0;5992:145:1;50417:623:0;50485:13;50508:4;;50501:37;;-1:-1:-1;;;50501:37:0;;50532:4;50501:37;;;4727:51:1;-1:-1:-1;;;;;50508:4:0;;;;50501:22;;4700:18:1;;50501:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50485:53;-1:-1:-1;50555:9:0;;50551:482;;50667:10;;50655:34;;;-1:-1:-1;;;50655:34:0;;;;50611:173;;-1:-1:-1;;;;;50667:10:0;;50655:32;;:34;;;;;;;;;;;;;;50667:10;50655:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50708:61;41158:5;50708:33;50718:22;;50708:5;:9;;:33;;;;:::i;50611:173::-;50889:10;;50877:33;;;-1:-1:-1;;;50877:33:0;;;;50833:162;;-1:-1:-1;;;;;50889:10:0;;50877:31;;:33;;;;;;;;;;;;;;50889:10;50877:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50929:51;41259:5;50929:28;50939:17;;50929:5;:9;;:28;;;;:::i;50833:162::-;51012:9;:7;:9::i;47773:82::-;47817:30;47831:15;:13;:15::i;1924:192::-;2010:7;2046:12;2038:6;;;;2030:29;;;;-1:-1:-1;;;2030:29:0;;;;;;;;:::i;:::-;-1:-1:-1;2070:9:0;2082:5;2086:1;2082;:5;:::i;:::-;2070:17;1924:192;-1:-1:-1;;;;;1924:192:0:o;3950:278::-;4036:7;4071:12;4064:5;4056:28;;;;-1:-1:-1;;;4056:28:0;;;;;;;;:::i;:::-;-1:-1:-1;4095:9:0;4107:5;4111:1;4107;:5;:::i;29140:761::-;29564:23;29590:69;29618:4;29590:69;;;;;;;;;;;;;;;;;29598:5;-1:-1:-1;;;;;29590:27:0;;;:69;;;;;:::i;:::-;29674:17;;29564:95;;-1:-1:-1;29674:21:0;29670:224;;29816:10;29805:30;;;;;;;;;;;;:::i;:::-;29797:85;;;;-1:-1:-1;;;29797:85:0;;10122:2:1;29797:85:0;;;10104:21:1;10161:2;10141:18;;;10134:30;10200:34;10180:18;;;10173:62;-1:-1:-1;;;10251:18:1;;;10244:40;10301:19;;29797:85:0;10094:232:1;12964:196:0;13067:12;13099:53;13122:6;13130:4;13136:1;13139:12;13099:22;:53::i;:::-;13092:60;12964:196;-1:-1:-1;;;;12964:196:0:o;14341:979::-;14471:12;10413:20;;14496:60;;;;-1:-1:-1;;;14496:60:0;;9764:2:1;14496:60:0;;;9746:21:1;9803:2;9783:18;;;9776:30;9842:31;9822:18;;;9815:59;9891:18;;14496:60:0;9736:179:1;14496:60:0;14630:12;14644:23;14671:6;-1:-1:-1;;;;;14671:11:0;14691:8;14702:4;14671:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14629:78;;;;14722:7;14718:595;;;14753:10;-1:-1:-1;14746:17:0;;-1:-1:-1;14746:17:0;14718:595;14867:17;;:21;14863:439;;15130:10;15124:17;15191:15;15178:10;15174:2;15170:19;15163:44;15078:148;15273:12;15266:20;;-1:-1:-1;;;15266:20:0;;;;;;;;:::i;14:257:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;542:943::-;619:6;627;680:2;668:9;659:7;655:23;651:32;648:2;;;701:6;693;686:22;648:2;745:9;732:23;764:31;789:5;764:31;:::i;:::-;814:5;-1:-1:-1;838:2:1;876:18;;;863:32;914:18;944:14;;;941:2;;;976:6;968;961:22;941:2;1019:6;1008:9;1004:22;994:32;;1064:7;1057:4;1053:2;1049:13;1045:27;1035:2;;1091:6;1083;1076:22;1035:2;1132;1119:16;1154:2;1150;1147:10;1144:2;;;1160:18;;:::i;:::-;1202:53;1245:2;1226:13;;-1:-1:-1;;1222:27:1;1218:36;;1202:53;:::i;:::-;1189:66;;1278:2;1271:5;1264:17;1318:7;1313:2;1308;1304;1300:11;1296:20;1293:33;1290:2;;;1344:6;1336;1329:22;1290:2;1404;1399;1395;1391:11;1386:2;1379:5;1375:14;1362:45;1427:14;;1423:23;;;1416:39;;;;638:847;;1431:5;;-1:-1:-1;638:847:1;;-1:-1:-1;;638:847:1:o;1490:992::-;1585:6;1616:2;1659;1647:9;1638:7;1634:23;1630:32;1627:2;;;1680:6;1672;1665:22;1627:2;1718:9;1712:16;1747:18;1788:2;1780:6;1777:14;1774:2;;;1809:6;1801;1794:22;1774:2;1852:6;1841:9;1837:22;1827:32;;1897:7;1890:4;1886:2;1882:13;1878:27;1868:2;;1924:6;1916;1909:22;1868:2;1958;1952:9;1980:2;1976;1973:10;1970:2;;;1986:18;;:::i;:::-;2032:2;2029:1;2025:10;2015:20;;2055:28;2079:2;2075;2071:11;2055:28;:::i;:::-;2117:15;;;2148:12;;;;2180:11;;;2210;;;2206:20;;2203:33;-1:-1:-1;2200:2:1;;;2254:6;2246;2239:22;2200:2;2281:6;2272:15;;2296:156;2310:2;2307:1;2304:9;2296:156;;;2367:10;;2355:23;;2328:1;2321:9;;;;;2398:12;;;;2430;;2296:156;;;-1:-1:-1;2471:5:1;1596:886;-1:-1:-1;;;;;;;;1596:886:1:o;2487:297::-;2554:6;2607:2;2595:9;2586:7;2582:23;2578:32;2575:2;;;2628:6;2620;2613:22;2575:2;2665:9;2659:16;2718:5;2711:13;2704:21;2697:5;2694:32;2684:2;;2745:6;2737;2730:22;3065:190;3124:6;3177:2;3165:9;3156:7;3152:23;3148:32;3145:2;;;3198:6;3190;3183:22;3145:2;-1:-1:-1;3226:23:1;;3135:120;-1:-1:-1;3135:120:1:o;3260:194::-;3330:6;3383:2;3371:9;3362:7;3358:23;3354:32;3351:2;;;3404:6;3396;3389:22;3351:2;-1:-1:-1;3432:16:1;;3341:113;-1:-1:-1;3341:113:1:o;3459:255::-;3538:6;3546;3599:2;3587:9;3578:7;3574:23;3570:32;3567:2;;;3620:6;3612;3605:22;3567:2;-1:-1:-1;;3648:16:1;;3704:2;3689:18;;;3683:25;3648:16;;3683:25;;-1:-1:-1;3557:157:1:o;3719:316::-;3807:6;3815;3823;3876:2;3864:9;3855:7;3851:23;3847:32;3844:2;;;3897:6;3889;3882:22;3844:2;3931:9;3925:16;3915:26;;3981:2;3970:9;3966:18;3960:25;3950:35;;4025:2;4014:9;4010:18;4004:25;3994:35;;3834:201;;;;;:::o;4040:257::-;4081:3;4119:5;4113:12;4146:6;4141:3;4134:19;4162:63;4218:6;4211:4;4206:3;4202:14;4195:4;4188:5;4184:16;4162:63;:::i;:::-;4279:2;4258:15;-1:-1:-1;;4254:29:1;4245:39;;;;4286:4;4241:50;;4089:208;-1:-1:-1;;4089:208:1:o;4302:274::-;4431:3;4469:6;4463:13;4485:53;4531:6;4526:3;4519:4;4511:6;4507:17;4485:53;:::i;:::-;4554:16;;;;;4439:137;-1:-1:-1;;4439:137:1:o;6334:217::-;6481:2;6470:9;6463:21;6444:4;6501:44;6541:2;6530:9;6526:18;6518:6;6501:44;:::i;7455:335::-;7657:2;7639:21;;;7696:2;7676:18;;;7669:30;-1:-1:-1;;;7730:2:1;7715:18;;7708:41;7781:2;7766:18;;7629:161::o;8483:338::-;8685:2;8667:21;;;8724:2;8704:18;;;8697:30;-1:-1:-1;;;8758:2:1;8743:18;;8736:44;8812:2;8797:18;;8657:164::o;9228:329::-;9430:2;9412:21;;;9469:1;9449:18;;;9442:29;-1:-1:-1;;;9502:2:1;9487:18;;9480:36;9548:2;9533:18;;9402:155::o;10331:332::-;10533:2;10515:21;;;10572:1;10552:18;;;10545:29;-1:-1:-1;;;10605:2:1;10590:18;;10583:39;10654:2;10639:18;;10505:158::o;11813:983::-;12075:4;12123:3;12112:9;12108:19;12154:6;12143:9;12136:25;12180:2;12218:6;12213:2;12202:9;12198:18;12191:34;12261:3;12256:2;12245:9;12241:18;12234:31;12285:6;12320;12314:13;12351:6;12343;12336:22;12389:3;12378:9;12374:19;12367:26;;12428:2;12420:6;12416:15;12402:29;;12449:4;12462:195;12476:6;12473:1;12470:13;12462:195;;;12541:13;;-1:-1:-1;;;;;12537:39:1;12525:52;;12632:15;;;;12597:12;;;;12573:1;12491:9;12462:195;;;-1:-1:-1;;;;;;;12713:32:1;;;;12708:2;12693:18;;12686:60;-1:-1:-1;;;12777:3:1;12762:19;12755:35;12674:3;12084:712;-1:-1:-1;;;12084:712:1:o;13054:275::-;13125:2;13119:9;13190:2;13171:13;;-1:-1:-1;;13167:27:1;13155:40;;13225:18;13210:34;;13246:22;;;13207:62;13204:2;;;13272:18;;:::i;:::-;13308:2;13301:22;13099:230;;-1:-1:-1;13099:230:1:o;13334:128::-;13374:3;13405:1;13401:6;13398:1;13395:13;13392:2;;;13411:18;;:::i;:::-;-1:-1:-1;13447:9:1;;13382:80::o;13467:217::-;13507:1;13533;13523:2;;-1:-1:-1;;;13558:31:1;;13612:4;13609:1;13602:15;13640:4;13565:1;13630:15;13523:2;-1:-1:-1;13669:9:1;;13513:171::o;13689:168::-;13729:7;13795:1;13791;13787:6;13783:14;13780:1;13777:21;13772:1;13765:9;13758:17;13754:45;13751:2;;;13802:18;;:::i;:::-;-1:-1:-1;13842:9:1;;13741:116::o;13862:125::-;13902:4;13930:1;13927;13924:8;13921:2;;;13935:18;;:::i;:::-;-1:-1:-1;13972:9:1;;13911:76::o;13992:258::-;14064:1;14074:113;14088:6;14085:1;14082:13;14074:113;;;14164:11;;;14158:18;14145:11;;;14138:39;14110:2;14103:10;14074:113;;;14205:6;14202:1;14199:13;14196:2;;;14240:1;14231:6;14226:3;14222:16;14215:27;14196:2;;14045:205;;;:::o;14255:127::-;14316:10;14311:3;14307:20;14304:1;14297:31;14347:4;14344:1;14337:15;14371:4;14368:1;14361:15;14387:127;14448:10;14443:3;14439:20;14436:1;14429:31;14479:4;14476:1;14469:15;14503:4;14500:1;14493:15;14519:131;-1:-1:-1;;;;;14594:31:1;;14584:42;;14574:2;;14640:1;14637;14630:12
Swarm Source
ipfs://54dddfaa17ccc12ffadde50909d8500148b1e4cbc70964a4fc416d4f369809cb
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.