Source Code
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
StrategyGmx
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/**
*Submitted for verification at Arbiscan.io on 2023-09-27
*/
// 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/gmx-reward-router.sol
pragma solidity 0.8.4;
interface IRewardRouterV2 {
function stakeGmx(uint256 _amount) external;
function handleRewards(
bool _shouldClaimGmx,
bool _shouldStakeGmx,
bool _shouldClaimEsGmx,
bool _shouldStakeEsGmx,
bool _shouldStakeMultiplierPoints,
bool _shouldClaimWeth,
bool _shouldConvertWethToEth
) external;
function unstakeGmx(uint256 _amount) external;
function unstakeEsGmx(uint256 _amount) external;
}
interface IRewardTracker {
function stakedAmounts(address) external view returns (uint256);
function claimable(address _account) external view returns (uint256);
function depositBalances(address, address) external view returns (uint256);
}
// File contracts/lib/BoringERC20.sol
pragma solidity 0.8.4;
library BoringERC20 {
function safeSymbol(IERC20 token) internal view returns(string memory) {
(bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));
return success && data.length > 0 ? abi.decode(data, (string)) : "???";
}
function safeName(IERC20 token) internal view returns(string memory) {
(bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));
return success && data.length > 0 ? abi.decode(data, (string)) : "???";
}
function safeDecimals(IERC20 token) internal view returns (uint8) {
(bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));
return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
}
function safeTransfer(IERC20 token, address to, uint256 amount) internal {
(bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));
require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed");
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {
(bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount));
require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed");
}
}
// File contracts/interfaces/IRewarder.sol
pragma solidity 0.8.4;
interface IRewarder {
function onSushiReward(uint256 pid, address user, address recipient, uint256 sushiAmount, uint256 newLpAmount) external;
function pendingTokens(uint256 pid, address user, uint256 sushiAmount) external view returns (IERC20[] memory, uint256[] memory);
}
// File contracts/strategies/gmx/gmx-farm-bases/strategy-gmx-single-sided-farm-base.sol
pragma solidity 0.8.4;
abstract contract StrategyGMXFarmBase is StrategyBase {
using SafeERC20 for IERC20;
using Address for address;
using SafeMath for uint256;
// Token addresses
address public constant gmx = 0xfc5A1A6EB076a2C7aD06eD22C90d7E710E35ad0a;
address public constant esGMX = 0xf42Ae1D54fd613C9bb14810b0588FaAa09a426cA;
address public constant rewardRouter = 0xA906F338CB21815cBc4Bc87ace9e68c87eF8d8F1;
address public constant rewardTracker = 0x908C4D94D34924765f1eDc22A1DD098397c59dD4;
address rewardToken;
// How much tokens to keep?
uint256 public keep = 1000;
uint256 public keepReward = 1000;
uint256 public constant keepMax = 10000;
constructor(
address _lp,
address _governance,
address _strategist,
address _controller,
address _timelock
)
StrategyBase(_lp, _governance, _strategist, _controller, _timelock)
{
}
function balanceOfPool() public view override returns (uint256) {
uint256 amount = IRewardTracker(rewardTracker).depositBalances(address(this), gmx);
return amount;
}
function getHarvestable() external view returns (uint256) {
uint256 _pendingesGMX = IRewardTracker(rewardTracker).claimable(address(this));
return (_pendingesGMX);
}
// **** Setters ****
function deposit() public override {
uint256 _want = IERC20(want).balanceOf(address(this));
if (_want > 0) {
IERC20(want).safeApprove(rewardTracker, 0);
IERC20(want).safeApprove(rewardTracker, _want);
IRewardRouterV2(rewardRouter).stakeGmx(_want);
}
}
function _withdrawSome(uint256 _amount)
internal
override
returns (uint256)
{
IRewardRouterV2(rewardRouter).unstakeGmx(_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;
}
// **** State Mutations ****
// Declare a Harvest Event
event Harvest(uint _timestamp, uint _value);
function harvest() public override onlyBenevolent {
// Collects rewards
IRewardRouterV2(rewardRouter).handleRewards(
true,
true,
true,
true,
true,
true,
false
);
uint256 _weth = IERC20(weth).balanceOf(address(this));
if (_weth > 0) {
// 10% is locked up for future gov
uint256 _keepWETH = _weth.mul(keep).div(keepMax);
IERC20(weth).safeTransfer(
IController(controller).treasury(),
_keepWETH
);
_swapSushiswap(weth, gmx, _weth.sub(_keepWETH));
}
uint256 _want = IERC20(want).balanceOf(address(this));
emit Harvest(block.timestamp, _want);
// We want to get back GMX tokens
_distributePerformanceFeesAndDeposit();
}
}
// File contracts/strategies/gmx/strategy-gmx-x-gmx.sol
pragma solidity 0.8.4;
contract StrategyGmx is StrategyGMXFarmBase {
constructor(
address _governance,
address _strategist,
address _controller,
address _timelock
)
StrategyGMXFarmBase(
gmx,
_governance,
_strategist,
_controller,
_timelock
)
{}
// **** Views ****
function getName() external override pure returns (string memory) {
return "StrategyGmx";
}
}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":[],"name":"esGMX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"gmx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"address","name":"_harvester","type":"address"}],"name":"revokeHarvester","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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
6080604052600180546001600160a01b031990811673e54ca86531e17ef3616d22ca28b0d458b6c891061790915560028054821673ad86ef5fd2ebc25bb9db41a1fe8d0f2a322c78391790556103e86003819055600060048190556005819055600655600b8054909216731b02da8cb0d097eb8d57a175b88c7d8b4799750617909155600e819055600f553480156200009757600080fd5b5060405162002b8138038062002b81833981016040819052620000ba91620001b2565b73fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a8484848484848484846001600160a01b038416620000ec57600080fd5b6001600160a01b0383166200010057600080fd5b6001600160a01b0382166200011457600080fd5b6001600160a01b0381166200012857600080fd5b600080546001600160a01b03199081166001600160a01b03978816179091556007805482169587169590951790945560098054851693861693909317909255600880548416918516919091179055600a80549092169216919091179055506200020e975050505050505050565b80516001600160a01b0381168114620001ad57600080fd5b919050565b60008060008060808587031215620001c8578384fd5b620001d38562000195565b9350620001e36020860162000195565b9250620001f36040860162000195565b9150620002036060860162000195565b905092959194509250565b612963806200021e6000396000f3fe6080604052600436106102ff5760003560e01c8063722713f711610190578063c1a3d44c116100dc578063ccfc2e8d11610095578063e4d06d821161006f578063e4d06d82146108b7578063edc9af95146108cd578063f77c4791146108f5578063fe1f8f7a146104e657600080fd5b8063ccfc2e8d14610862578063d0e30db014610882578063d33219b41461089757600080fd5b8063c1a3d44c146107af578063c39d4334146107c4578063c6223e26146107da578063c65e3242146107fa578063c7b9d5301461081a578063cac931841461083a57600080fd5b80638ccdbb7011610149578063ab73e43311610123578063ab73e4331461072f578063b9e374891461074f578063ba40273d1461076f578063bdacb3031461078f57600080fd5b80638ccdbb70146106d957806392eefe9b146106ef578063ab033ea91461070f57600080fd5b8063722713f714610619578063823785941461062e578063853828b61461064e578063879765831461066357806388993f22146106a35780638aee8127146106b957600080fd5b80633fc8cef31161024f57806351f3d0b8116102085780635a3bb989116101e25780635a3bb989146105895780635aa6e675146105b15780636bcb411a146105d15780636d13582c146105f957600080fd5b806351f3d0b81461053d57806354df7b631461055357806359739ec41461057357600080fd5b80633fc8cef3146104a95780634641257d146104d1578063479119be146104e65780634c2798ad146104fd5780634fe809cc1461032c57806351cff8d91461051d57600080fd5b80631cff79cd116102bc578063249fb9b411610296578063249fb9b41461044157806326e886c61461032c5780632e1a7d4d1461046157806331e67c711461048157600080fd5b80631cff79cd146103ee5780631f1fcd51146104015780631fe4a6861461042157600080fd5b80630547104d146103045780630975d8d81461032c5780630d43e8ad14610342578063115880861461037a57806317d7de7c1461038f57806318eb0e0b146103cc575b600080fd5b34801561031057600080fd5b50610319610915565b6040519081526020015b60405180910390f35b34801561033857600080fd5b5061031961271081565b34801561034e57600080fd5b50600254610362906001600160a01b031681565b6040516001600160a01b039091168152602001610323565b34801561038657600080fd5b506103196109a3565b34801561039b57600080fd5b5060408051808201909152600b81526a0a6e8e4c2e8cacef28edaf60ab1b60208201525b604051610323919061270a565b3480156103d857600080fd5b506103ec6103e73660046124f0565b6109f9565b005b6103bf6103fc366004612528565b610a62565b34801561040d57600080fd5b50600054610362906001600160a01b031681565b34801561042d57600080fd5b50600954610362906001600160a01b031681565b34801561044d57600080fd5b506103ec61045c366004612692565b610b1f565b34801561046d57600080fd5b506103ec61047c366004612692565b610b4e565b34801561048d57600080fd5b5061036273fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a81565b3480156104b557600080fd5b506103627382af49447d8a07e3bd95bd0d56f35241523fbab181565b3480156104dd57600080fd5b506103ec610e2d565b3480156104f257600080fd5b50610319620186a081565b34801561050957600080fd5b506103ec610518366004612692565b611155565b34801561052957600080fd5b506103196105383660046124f0565b611184565b34801561054957600080fd5b5061031960065481565b34801561055f57600080fd5b506103ec61056e3660046124f0565b611291565b34801561057f57600080fd5b5061031960035481565b34801561059557600080fd5b5061036273a906f338cb21815cbc4bc87ace9e68c87ef8d8f181565b3480156105bd57600080fd5b50600754610362906001600160a01b031681565b3480156105dd57600080fd5b5061036273908c4d94d34924765f1edc22a1dd098397c59dd481565b34801561060557600080fd5b50600b54610362906001600160a01b031681565b34801561062557600080fd5b5061031961130e565b34801561063a57600080fd5b506103ec610649366004612692565b61132e565b34801561065a57600080fd5b5061031961135d565b34801561066f57600080fd5b5061069361067e3660046124f0565b600c6020526000908152604090205460ff1681565b6040519015158152602001610323565b3480156106af57600080fd5b5061031960045481565b3480156106c557600080fd5b506103ec6106d43660046124f0565b6114d5565b3480156106e557600080fd5b5061031960055481565b3480156106fb57600080fd5b506103ec61070a3660046124f0565b611536565b34801561071b57600080fd5b506103ec61072a3660046124f0565b611582565b34801561073b57600080fd5b506103ec61074a366004612692565b6115ec565b34801561075b57600080fd5b50600154610362906001600160a01b031681565b34801561077b57600080fd5b506103ec61078a366004612692565b61161b565b34801561079b57600080fd5b506103ec6107aa3660046124f0565b61164a565b3480156107bb57600080fd5b50610319611696565b3480156107d057600080fd5b50610319600f5481565b3480156107e657600080fd5b506103196107f5366004612692565b611712565b34801561080657600080fd5b506103ec610815366004612692565b61188e565b34801561082657600080fd5b506103ec6108353660046124f0565b6118bd565b34801561084657600080fd5b5061036273f42ae1d54fd613c9bb14810b0588faaa09a426ca81565b34801561086e57600080fd5b506103ec61087d3660046124f0565b611927565b34801561088e57600080fd5b506103ec611973565b3480156108a357600080fd5b50600a54610362906001600160a01b031681565b3480156108c357600080fd5b50610319600e5481565b3480156108d957600080fd5b5061036273d4d42f0b6def4ce0383636770ef773390d85c61a81565b34801561090157600080fd5b50600854610362906001600160a01b031681565b60405163402914f560e01b8152306004820152600090819073908c4d94d34924765f1edc22a1dd098397c59dd49063402914f5906024015b60206040518083038186803b15801561096557600080fd5b505afa158015610979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099d91906126aa565b92915050565b604051637aeceb1f60e11b815230600482015273fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a6024820152600090819073908c4d94d34924765f1edc22a1dd098397c59dd49063f5d9d63e9060440161094d565b6007546001600160a01b0316331480610a1c57506009546001600160a01b031633145b610a415760405162461bcd60e51b8152600401610a3890612742565b60405180910390fd5b6001600160a01b03166000908152600c60205260409020805460ff19169055565b600a546060906001600160a01b03163314610a8f5760405162461bcd60e51b8152600401610a389061278a565b6001600160a01b038316610acf5760405162461bcd60e51b8152602060048201526007602482015266085d185c99d95d60ca1b6044820152606401610a38565b600080835160208501866113885a03f43d6040519250601f19601f6020830101168301604052808352806000602085013e811560018114610b0f57610b16565b8160208501fd5b50505092915050565b600a546001600160a01b03163314610b495760405162461bcd60e51b8152600401610a389061278a565b600355565b6008546001600160a01b03163314610b785760405162461bcd60e51b8152600401610a389061271d565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610bbc57600080fd5b505afa158015610bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf491906126aa565b905081811015610c1f57610c10610c0b8383611ab5565b611afe565b9150610c1c8282611b6c565b91505b6000610c43620186a0610c3d60065486611bcb90919063ffffffff16565b90611c4a565b9050610ce1600860009054906101000a90046001600160a01b03166001600160a01b0316638d8f1e676040518163ffffffff1660e01b815260040160206040518083038186803b158015610c9657600080fd5b505afa158015610caa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cce919061250c565b6000546001600160a01b03169083611c8c565b6000610cff620186a0610c3d60055487611bcb90919063ffffffff16565b9050610d52600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b158015610c9657600080fd5b60085460008054604051632988bb9f60e21b81526001600160a01b0391821660048201529192169063a622ee7c9060240160206040518083038186803b158015610d9b57600080fd5b505afa158015610daf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd3919061250c565b90506001600160a01b038116610dfb5760405162461bcd60e51b8152600401610a389061276a565b610e2681610e1384610e0d8988611ab5565b90611ab5565b6000546001600160a01b03169190611c8c565b5050505050565b336000908152600c602052604090205460ff1680610e5557506007546001600160a01b031633145b80610e6a57506009546001600160a01b031633145b610e7357600080fd5b60405163185b800160e11b81526001600482018190526024820181905260448201819052606482018190526084820181905260a4820152600060c482015273a906f338cb21815cbc4bc87ace9e68c87ef8d8f1906330b700029060e401600060405180830381600087803b158015610eea57600080fd5b505af1158015610efe573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507382af49447d8a07e3bd95bd0d56f35241523fbab191506370a082319060240160206040518083038186803b158015610f4f57600080fd5b505afa158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8791906126aa565b90508015611091576000610fac612710610c3d600e5485611bcb90919063ffffffff16565b9050611053600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b158015610fff57600080fd5b505afa158015611013573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611037919061250c565b7382af49447d8a07e3bd95bd0d56f35241523fbab19083611c8c565b61108f7382af49447d8a07e3bd95bd0d56f35241523fbab173fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a61108a8585611ab5565b611cf4565b505b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110d91906126aa565b60408051428152602081018390529192507f6c8433a8e155f0af04dba058d4e4695f7da554578963d876bdf4a6d8d6399d9c910160405180910390a1611151611fc6565b5050565b600a546001600160a01b0316331461117f5760405162461bcd60e51b8152600401610a389061278a565b600f55565b6008546000906001600160a01b031633146111b15760405162461bcd60e51b8152600401610a389061271d565b6000546001600160a01b03838116911614156111f85760405162461bcd60e51b8152600401610a38906020808252600490820152631dd85b9d60e21b604082015260600190565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f91906126aa565b60085490915061128c906001600160a01b03848116911683611c8c565b919050565b6007546001600160a01b03163314806112b457506009546001600160a01b031633145b806112ce5750336000908152600c602052604090205460ff165b6112ea5760405162461bcd60e51b8152600401610a3890612742565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b600061132961131b6109a3565b611323611696565b90611b6c565b905090565b600a546001600160a01b031633146113585760405162461bcd60e51b8152600401610a389061278a565b600555565b6008546000906001600160a01b0316331461138a5760405162461bcd60e51b8152600401610a389061271d565b611392612184565b6000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156113d557600080fd5b505afa1580156113e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140d91906126aa565b60085460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b15801561145a57600080fd5b505afa15801561146e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611492919061250c565b90506001600160a01b0381166114ba5760405162461bcd60e51b8152600401610a389061276a565b6000546114d1906001600160a01b03168284611c8c565b5090565b600a546001600160a01b03163314806114f857506009546001600160a01b031633145b6115145760405162461bcd60e51b8152600401610a389061278a565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031633146115605760405162461bcd60e51b8152600401610a389061278a565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031633146115ca5760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610a38565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031633146116165760405162461bcd60e51b8152600401610a389061278a565b600655565b600a546001600160a01b031633146116455760405162461bcd60e51b8152600401610a389061278a565b600e55565b600a546001600160a01b031633146116745760405162461bcd60e51b8152600401610a389061278a565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156116da57600080fd5b505afa1580156116ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132991906126aa565b6008546000906001600160a01b0316331461173f5760405162461bcd60e51b8152600401610a389061271d565b61174882611afe565b506000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561178c57600080fd5b505afa1580156117a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c491906126aa565b60085460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b15801561181157600080fd5b505afa158015611825573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611849919061250c565b90506001600160a01b0381166118715760405162461bcd60e51b8152600401610a389061276a565b600054611888906001600160a01b03168284611c8c565b50919050565b600a546001600160a01b031633146118b85760405162461bcd60e51b8152600401610a389061278a565b600455565b6007546001600160a01b031633146119055760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610a38565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031633146119515760405162461bcd60e51b8152600401610a3890612742565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156119b757600080fd5b505afa1580156119cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ef91906126aa565b90508015611ab25760008054611a26916001600160a01b039091169073908c4d94d34924765f1edc22a1dd098397c59dd49061218f565b600054611a51906001600160a01b031673908c4d94d34924765f1edc22a1dd098397c59dd48361218f565b604051633cf6bab360e21b81526004810182905273a906f338cb21815cbc4bc87ace9e68c87ef8d8f19063f3daeacc90602401600060405180830381600087803b158015611a9e57600080fd5b505af1158015610e26573d6000803e3d6000fd5b50565b6000611af783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506122b3565b9392505050565b6040516303c2c06960e11b81526004810182905260009073a906f338cb21815cbc4bc87ace9e68c87ef8d8f19063078580d290602401600060405180830381600087803b158015611b4e57600080fd5b505af1158015611b62573d6000803e3d6000fd5b5093949350505050565b600080611b79838561284e565b905083811015611af75760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a38565b600082611bda5750600061099d565b6000611be68385612886565b905082611bf38583612866565b14611af75760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a38565b6000611af783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506122ed565b6040516001600160a01b038316602482015260448101829052611cef90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261231b565b505050565b6001600160a01b038216611d0757600080fd5b60606001600160a01b0384167382af49447d8a07e3bd95bd0d56f35241523fbab11480611d5057506001600160a01b0383167382af49447d8a07e3bd95bd0d56f35241523fbab1145b15611dfe5760408051600280825260608201835290916020830190803683370190505090508381600081518110611d9757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611dd957634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050611efa565b6040805160038082526080820190925290602082016060803683370190505090508381600081518110611e4157634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507382af49447d8a07e3bd95bd0d56f35241523fbab181600181518110611e9757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508281600281518110611ed957634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600b54611f15906001600160a01b038681169116600061218f565b600b54611f2f906001600160a01b0386811691168461218f565b600b546001600160a01b03166338ed17398360008430611f5042603c611b6c565b6040518663ffffffff1660e01b8152600401611f709594939291906127ad565b600060405180830381600087803b158015611f8a57600080fd5b505af1158015611f9e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e2691908101906125ca565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561200a57600080fd5b505afa15801561201e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204291906126aa565b90508015611ab257600854604080516361d027b360e01b815290516120e3926001600160a01b0316916361d027b3916004808301926020929190829003018186803b15801561209057600080fd5b505afa1580156120a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c8919061250c565b610e13612710610c3d60035486611bcb90919063ffffffff16565b60085460408051638d8f1e6760e01b8152905161217c926001600160a01b031691638d8f1e67916004808301926020929190829003018186803b15801561212957600080fd5b505afa15801561213d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612161919061250c565b610e13612710610c3d60045486611bcb90919063ffffffff16565b611ab2611973565b611ab2610c0b6109a3565b8015806122185750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156121de57600080fd5b505afa1580156121f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221691906126aa565b155b6122835760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610a38565b6040516001600160a01b038316602482015260448101829052611cef90849063095ea7b360e01b90606401611cb8565b600081848411156122d75760405162461bcd60e51b8152600401610a38919061270a565b5060006122e484866128a5565b95945050505050565b6000818361230e5760405162461bcd60e51b8152600401610a38919061270a565b5060006122e48486612866565b6000612370826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123ed9092919063ffffffff16565b805190915015611cef578080602001905181019061238e9190612672565b611cef5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a38565b60606123fc8484600085612404565b949350505050565b6060843b6124545760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a38565b600080866001600160a01b0316858760405161247091906126ee565b60006040518083038185875af1925050503d80600081146124ad576040519150601f19603f3d011682016040523d82523d6000602084013e6124b2565b606091505b509150915081156124c65791506123fc9050565b8051156124d65780518082602001fd5b8360405162461bcd60e51b8152600401610a38919061270a565b600060208284031215612501578081fd5b8135611af781612918565b60006020828403121561251d578081fd5b8151611af781612918565b6000806040838503121561253a578081fd5b823561254581612918565b915060208381013567ffffffffffffffff80821115612562578384fd5b818601915086601f830112612575578384fd5b81358181111561258757612587612902565b612599601f8201601f1916850161281d565b915080825287848285010111156125ae578485fd5b8084840185840137810190920192909252919491935090915050565b600060208083850312156125dc578182fd5b825167ffffffffffffffff808211156125f3578384fd5b818501915085601f830112612606578384fd5b81518181111561261857612618612902565b8060051b915061262984830161281d565b8181528481019084860184860187018a1015612643578788fd5b8795505b83861015612665578051835260019590950194918601918601612647565b5098975050505050505050565b600060208284031215612683578081fd5b81518015158114611af7578182fd5b6000602082840312156126a3578081fd5b5035919050565b6000602082840312156126bb578081fd5b5051919050565b600081518084526126da8160208601602086016128bc565b601f01601f19169290920160200192915050565b600082516127008184602087016128bc565b9190910192915050565b602081526000611af760208301846126c2565b6020808252600b908201526a10b1b7b73a3937b63632b960a91b604082015260600190565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600990820152682174696d656c6f636b60b81b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156127fc5784516001600160a01b0316835293830193918301916001016127d7565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561284657612846612902565b604052919050565b60008219821115612861576128616128ec565b500190565b60008261288157634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156128a0576128a06128ec565b500290565b6000828210156128b7576128b76128ec565b500390565b60005b838110156128d75781810151838201526020016128bf565b838111156128e6576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611ab257600080fdfea2646970667358221220f6b2e75e0d110784fbfe8091327dd621e263586d9049f92044cf2752f10fa1b564736f6c63430008040033000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc80000000000000000000000006ccc135d543f8ffd7d93174f8a11ba4860695808000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Deployed Bytecode
0x6080604052600436106102ff5760003560e01c8063722713f711610190578063c1a3d44c116100dc578063ccfc2e8d11610095578063e4d06d821161006f578063e4d06d82146108b7578063edc9af95146108cd578063f77c4791146108f5578063fe1f8f7a146104e657600080fd5b8063ccfc2e8d14610862578063d0e30db014610882578063d33219b41461089757600080fd5b8063c1a3d44c146107af578063c39d4334146107c4578063c6223e26146107da578063c65e3242146107fa578063c7b9d5301461081a578063cac931841461083a57600080fd5b80638ccdbb7011610149578063ab73e43311610123578063ab73e4331461072f578063b9e374891461074f578063ba40273d1461076f578063bdacb3031461078f57600080fd5b80638ccdbb70146106d957806392eefe9b146106ef578063ab033ea91461070f57600080fd5b8063722713f714610619578063823785941461062e578063853828b61461064e578063879765831461066357806388993f22146106a35780638aee8127146106b957600080fd5b80633fc8cef31161024f57806351f3d0b8116102085780635a3bb989116101e25780635a3bb989146105895780635aa6e675146105b15780636bcb411a146105d15780636d13582c146105f957600080fd5b806351f3d0b81461053d57806354df7b631461055357806359739ec41461057357600080fd5b80633fc8cef3146104a95780634641257d146104d1578063479119be146104e65780634c2798ad146104fd5780634fe809cc1461032c57806351cff8d91461051d57600080fd5b80631cff79cd116102bc578063249fb9b411610296578063249fb9b41461044157806326e886c61461032c5780632e1a7d4d1461046157806331e67c711461048157600080fd5b80631cff79cd146103ee5780631f1fcd51146104015780631fe4a6861461042157600080fd5b80630547104d146103045780630975d8d81461032c5780630d43e8ad14610342578063115880861461037a57806317d7de7c1461038f57806318eb0e0b146103cc575b600080fd5b34801561031057600080fd5b50610319610915565b6040519081526020015b60405180910390f35b34801561033857600080fd5b5061031961271081565b34801561034e57600080fd5b50600254610362906001600160a01b031681565b6040516001600160a01b039091168152602001610323565b34801561038657600080fd5b506103196109a3565b34801561039b57600080fd5b5060408051808201909152600b81526a0a6e8e4c2e8cacef28edaf60ab1b60208201525b604051610323919061270a565b3480156103d857600080fd5b506103ec6103e73660046124f0565b6109f9565b005b6103bf6103fc366004612528565b610a62565b34801561040d57600080fd5b50600054610362906001600160a01b031681565b34801561042d57600080fd5b50600954610362906001600160a01b031681565b34801561044d57600080fd5b506103ec61045c366004612692565b610b1f565b34801561046d57600080fd5b506103ec61047c366004612692565b610b4e565b34801561048d57600080fd5b5061036273fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a81565b3480156104b557600080fd5b506103627382af49447d8a07e3bd95bd0d56f35241523fbab181565b3480156104dd57600080fd5b506103ec610e2d565b3480156104f257600080fd5b50610319620186a081565b34801561050957600080fd5b506103ec610518366004612692565b611155565b34801561052957600080fd5b506103196105383660046124f0565b611184565b34801561054957600080fd5b5061031960065481565b34801561055f57600080fd5b506103ec61056e3660046124f0565b611291565b34801561057f57600080fd5b5061031960035481565b34801561059557600080fd5b5061036273a906f338cb21815cbc4bc87ace9e68c87ef8d8f181565b3480156105bd57600080fd5b50600754610362906001600160a01b031681565b3480156105dd57600080fd5b5061036273908c4d94d34924765f1edc22a1dd098397c59dd481565b34801561060557600080fd5b50600b54610362906001600160a01b031681565b34801561062557600080fd5b5061031961130e565b34801561063a57600080fd5b506103ec610649366004612692565b61132e565b34801561065a57600080fd5b5061031961135d565b34801561066f57600080fd5b5061069361067e3660046124f0565b600c6020526000908152604090205460ff1681565b6040519015158152602001610323565b3480156106af57600080fd5b5061031960045481565b3480156106c557600080fd5b506103ec6106d43660046124f0565b6114d5565b3480156106e557600080fd5b5061031960055481565b3480156106fb57600080fd5b506103ec61070a3660046124f0565b611536565b34801561071b57600080fd5b506103ec61072a3660046124f0565b611582565b34801561073b57600080fd5b506103ec61074a366004612692565b6115ec565b34801561075b57600080fd5b50600154610362906001600160a01b031681565b34801561077b57600080fd5b506103ec61078a366004612692565b61161b565b34801561079b57600080fd5b506103ec6107aa3660046124f0565b61164a565b3480156107bb57600080fd5b50610319611696565b3480156107d057600080fd5b50610319600f5481565b3480156107e657600080fd5b506103196107f5366004612692565b611712565b34801561080657600080fd5b506103ec610815366004612692565b61188e565b34801561082657600080fd5b506103ec6108353660046124f0565b6118bd565b34801561084657600080fd5b5061036273f42ae1d54fd613c9bb14810b0588faaa09a426ca81565b34801561086e57600080fd5b506103ec61087d3660046124f0565b611927565b34801561088e57600080fd5b506103ec611973565b3480156108a357600080fd5b50600a54610362906001600160a01b031681565b3480156108c357600080fd5b50610319600e5481565b3480156108d957600080fd5b5061036273d4d42f0b6def4ce0383636770ef773390d85c61a81565b34801561090157600080fd5b50600854610362906001600160a01b031681565b60405163402914f560e01b8152306004820152600090819073908c4d94d34924765f1edc22a1dd098397c59dd49063402914f5906024015b60206040518083038186803b15801561096557600080fd5b505afa158015610979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099d91906126aa565b92915050565b604051637aeceb1f60e11b815230600482015273fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a6024820152600090819073908c4d94d34924765f1edc22a1dd098397c59dd49063f5d9d63e9060440161094d565b6007546001600160a01b0316331480610a1c57506009546001600160a01b031633145b610a415760405162461bcd60e51b8152600401610a3890612742565b60405180910390fd5b6001600160a01b03166000908152600c60205260409020805460ff19169055565b600a546060906001600160a01b03163314610a8f5760405162461bcd60e51b8152600401610a389061278a565b6001600160a01b038316610acf5760405162461bcd60e51b8152602060048201526007602482015266085d185c99d95d60ca1b6044820152606401610a38565b600080835160208501866113885a03f43d6040519250601f19601f6020830101168301604052808352806000602085013e811560018114610b0f57610b16565b8160208501fd5b50505092915050565b600a546001600160a01b03163314610b495760405162461bcd60e51b8152600401610a389061278a565b600355565b6008546001600160a01b03163314610b785760405162461bcd60e51b8152600401610a389061271d565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610bbc57600080fd5b505afa158015610bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf491906126aa565b905081811015610c1f57610c10610c0b8383611ab5565b611afe565b9150610c1c8282611b6c565b91505b6000610c43620186a0610c3d60065486611bcb90919063ffffffff16565b90611c4a565b9050610ce1600860009054906101000a90046001600160a01b03166001600160a01b0316638d8f1e676040518163ffffffff1660e01b815260040160206040518083038186803b158015610c9657600080fd5b505afa158015610caa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cce919061250c565b6000546001600160a01b03169083611c8c565b6000610cff620186a0610c3d60055487611bcb90919063ffffffff16565b9050610d52600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b158015610c9657600080fd5b60085460008054604051632988bb9f60e21b81526001600160a01b0391821660048201529192169063a622ee7c9060240160206040518083038186803b158015610d9b57600080fd5b505afa158015610daf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd3919061250c565b90506001600160a01b038116610dfb5760405162461bcd60e51b8152600401610a389061276a565b610e2681610e1384610e0d8988611ab5565b90611ab5565b6000546001600160a01b03169190611c8c565b5050505050565b336000908152600c602052604090205460ff1680610e5557506007546001600160a01b031633145b80610e6a57506009546001600160a01b031633145b610e7357600080fd5b60405163185b800160e11b81526001600482018190526024820181905260448201819052606482018190526084820181905260a4820152600060c482015273a906f338cb21815cbc4bc87ace9e68c87ef8d8f1906330b700029060e401600060405180830381600087803b158015610eea57600080fd5b505af1158015610efe573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507382af49447d8a07e3bd95bd0d56f35241523fbab191506370a082319060240160206040518083038186803b158015610f4f57600080fd5b505afa158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8791906126aa565b90508015611091576000610fac612710610c3d600e5485611bcb90919063ffffffff16565b9050611053600860009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b815260040160206040518083038186803b158015610fff57600080fd5b505afa158015611013573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611037919061250c565b7382af49447d8a07e3bd95bd0d56f35241523fbab19083611c8c565b61108f7382af49447d8a07e3bd95bd0d56f35241523fbab173fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a61108a8585611ab5565b611cf4565b505b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110d91906126aa565b60408051428152602081018390529192507f6c8433a8e155f0af04dba058d4e4695f7da554578963d876bdf4a6d8d6399d9c910160405180910390a1611151611fc6565b5050565b600a546001600160a01b0316331461117f5760405162461bcd60e51b8152600401610a389061278a565b600f55565b6008546000906001600160a01b031633146111b15760405162461bcd60e51b8152600401610a389061271d565b6000546001600160a01b03838116911614156111f85760405162461bcd60e51b8152600401610a38906020808252600490820152631dd85b9d60e21b604082015260600190565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f91906126aa565b60085490915061128c906001600160a01b03848116911683611c8c565b919050565b6007546001600160a01b03163314806112b457506009546001600160a01b031633145b806112ce5750336000908152600c602052604090205460ff165b6112ea5760405162461bcd60e51b8152600401610a3890612742565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b600061132961131b6109a3565b611323611696565b90611b6c565b905090565b600a546001600160a01b031633146113585760405162461bcd60e51b8152600401610a389061278a565b600555565b6008546000906001600160a01b0316331461138a5760405162461bcd60e51b8152600401610a389061271d565b611392612184565b6000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156113d557600080fd5b505afa1580156113e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140d91906126aa565b60085460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b15801561145a57600080fd5b505afa15801561146e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611492919061250c565b90506001600160a01b0381166114ba5760405162461bcd60e51b8152600401610a389061276a565b6000546114d1906001600160a01b03168284611c8c565b5090565b600a546001600160a01b03163314806114f857506009546001600160a01b031633145b6115145760405162461bcd60e51b8152600401610a389061278a565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031633146115605760405162461bcd60e51b8152600401610a389061278a565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031633146115ca5760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610a38565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031633146116165760405162461bcd60e51b8152600401610a389061278a565b600655565b600a546001600160a01b031633146116455760405162461bcd60e51b8152600401610a389061278a565b600e55565b600a546001600160a01b031633146116745760405162461bcd60e51b8152600401610a389061278a565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156116da57600080fd5b505afa1580156116ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132991906126aa565b6008546000906001600160a01b0316331461173f5760405162461bcd60e51b8152600401610a389061271d565b61174882611afe565b506000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561178c57600080fd5b505afa1580156117a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c491906126aa565b60085460008054604051632988bb9f60e21b81526001600160a01b039182166004820152939450909291169063a622ee7c9060240160206040518083038186803b15801561181157600080fd5b505afa158015611825573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611849919061250c565b90506001600160a01b0381166118715760405162461bcd60e51b8152600401610a389061276a565b600054611888906001600160a01b03168284611c8c565b50919050565b600a546001600160a01b031633146118b85760405162461bcd60e51b8152600401610a389061278a565b600455565b6007546001600160a01b031633146119055760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b6044820152606401610a38565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031633146119515760405162461bcd60e51b8152600401610a3890612742565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156119b757600080fd5b505afa1580156119cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ef91906126aa565b90508015611ab25760008054611a26916001600160a01b039091169073908c4d94d34924765f1edc22a1dd098397c59dd49061218f565b600054611a51906001600160a01b031673908c4d94d34924765f1edc22a1dd098397c59dd48361218f565b604051633cf6bab360e21b81526004810182905273a906f338cb21815cbc4bc87ace9e68c87ef8d8f19063f3daeacc90602401600060405180830381600087803b158015611a9e57600080fd5b505af1158015610e26573d6000803e3d6000fd5b50565b6000611af783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506122b3565b9392505050565b6040516303c2c06960e11b81526004810182905260009073a906f338cb21815cbc4bc87ace9e68c87ef8d8f19063078580d290602401600060405180830381600087803b158015611b4e57600080fd5b505af1158015611b62573d6000803e3d6000fd5b5093949350505050565b600080611b79838561284e565b905083811015611af75760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a38565b600082611bda5750600061099d565b6000611be68385612886565b905082611bf38583612866565b14611af75760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a38565b6000611af783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506122ed565b6040516001600160a01b038316602482015260448101829052611cef90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261231b565b505050565b6001600160a01b038216611d0757600080fd5b60606001600160a01b0384167382af49447d8a07e3bd95bd0d56f35241523fbab11480611d5057506001600160a01b0383167382af49447d8a07e3bd95bd0d56f35241523fbab1145b15611dfe5760408051600280825260608201835290916020830190803683370190505090508381600081518110611d9757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611dd957634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050611efa565b6040805160038082526080820190925290602082016060803683370190505090508381600081518110611e4157634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507382af49447d8a07e3bd95bd0d56f35241523fbab181600181518110611e9757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508281600281518110611ed957634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600b54611f15906001600160a01b038681169116600061218f565b600b54611f2f906001600160a01b0386811691168461218f565b600b546001600160a01b03166338ed17398360008430611f5042603c611b6c565b6040518663ffffffff1660e01b8152600401611f709594939291906127ad565b600060405180830381600087803b158015611f8a57600080fd5b505af1158015611f9e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e2691908101906125ca565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561200a57600080fd5b505afa15801561201e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204291906126aa565b90508015611ab257600854604080516361d027b360e01b815290516120e3926001600160a01b0316916361d027b3916004808301926020929190829003018186803b15801561209057600080fd5b505afa1580156120a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c8919061250c565b610e13612710610c3d60035486611bcb90919063ffffffff16565b60085460408051638d8f1e6760e01b8152905161217c926001600160a01b031691638d8f1e67916004808301926020929190829003018186803b15801561212957600080fd5b505afa15801561213d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612161919061250c565b610e13612710610c3d60045486611bcb90919063ffffffff16565b611ab2611973565b611ab2610c0b6109a3565b8015806122185750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156121de57600080fd5b505afa1580156121f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221691906126aa565b155b6122835760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610a38565b6040516001600160a01b038316602482015260448101829052611cef90849063095ea7b360e01b90606401611cb8565b600081848411156122d75760405162461bcd60e51b8152600401610a38919061270a565b5060006122e484866128a5565b95945050505050565b6000818361230e5760405162461bcd60e51b8152600401610a38919061270a565b5060006122e48486612866565b6000612370826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123ed9092919063ffffffff16565b805190915015611cef578080602001905181019061238e9190612672565b611cef5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a38565b60606123fc8484600085612404565b949350505050565b6060843b6124545760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a38565b600080866001600160a01b0316858760405161247091906126ee565b60006040518083038185875af1925050503d80600081146124ad576040519150601f19603f3d011682016040523d82523d6000602084013e6124b2565b606091505b509150915081156124c65791506123fc9050565b8051156124d65780518082602001fd5b8360405162461bcd60e51b8152600401610a38919061270a565b600060208284031215612501578081fd5b8135611af781612918565b60006020828403121561251d578081fd5b8151611af781612918565b6000806040838503121561253a578081fd5b823561254581612918565b915060208381013567ffffffffffffffff80821115612562578384fd5b818601915086601f830112612575578384fd5b81358181111561258757612587612902565b612599601f8201601f1916850161281d565b915080825287848285010111156125ae578485fd5b8084840185840137810190920192909252919491935090915050565b600060208083850312156125dc578182fd5b825167ffffffffffffffff808211156125f3578384fd5b818501915085601f830112612606578384fd5b81518181111561261857612618612902565b8060051b915061262984830161281d565b8181528481019084860184860187018a1015612643578788fd5b8795505b83861015612665578051835260019590950194918601918601612647565b5098975050505050505050565b600060208284031215612683578081fd5b81518015158114611af7578182fd5b6000602082840312156126a3578081fd5b5035919050565b6000602082840312156126bb578081fd5b5051919050565b600081518084526126da8160208601602086016128bc565b601f01601f19169290920160200192915050565b600082516127008184602087016128bc565b9190910192915050565b602081526000611af760208301846126c2565b6020808252600b908201526a10b1b7b73a3937b63632b960a91b604082015260600190565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600990820152682174696d656c6f636b60b81b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156127fc5784516001600160a01b0316835293830193918301916001016127d7565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561284657612846612902565b604052919050565b60008219821115612861576128616128ec565b500190565b60008261288157634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156128a0576128a06128ec565b500290565b6000828210156128b7576128b76128ec565b500390565b60005b838110156128d75781810151838201526020016128bf565b838111156128e6576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611ab257600080fdfea2646970667358221220f6b2e75e0d110784fbfe8091327dd621e263586d9049f92044cf2752f10fa1b564736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc80000000000000000000000006ccc135d543f8ffd7d93174f8a11ba4860695808000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
-----Decoded View---------------
Arg [0] : _governance (address): 0xCb410A689A03E06de0a6247b13C13D14237DecC8
Arg [1] : _strategist (address): 0xCb410A689A03E06de0a6247b13C13D14237DecC8
Arg [2] : _controller (address): 0x6cCc135D543f8fFD7D93174f8A11Ba4860695808
Arg [3] : _timelock (address): 0xCb410A689A03E06de0a6247b13C13D14237DecC8
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Arg [1] : 000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Arg [2] : 0000000000000000000000006ccc135d543f8ffd7d93174f8a11ba4860695808
Arg [3] : 000000000000000000000000cb410a689a03e06de0a6247b13c13d14237decc8
Deployed Bytecode Sourcemap
58296:497:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55849:188;;;;;;;;;;;;;:::i;:::-;;;10573:25:1;;;10561:2;10546:18;55849:188:0;;;;;;;;55346:39;;;;;;;;;;;;55380:5;55346:39;;40934:74;;;;;;;;;;-1:-1:-1;40934:74:0;;;;-1:-1:-1;;;;;40934:74:0;;;;;;-1:-1:-1;;;;;4164:32:1;;;4146:51;;4134:2;4119:18;40934:74:0;4101:102:1;55651:190:0;;;;;;;;;;;;;:::i;58685:105::-;;;;;;;;;;-1:-1:-1;58762:20:0;;;;;;;;;;;;-1:-1:-1;;;58762:20:0;;;;58685:105;;;;;;;:::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;;;44337:213;;;;;;;;;;-1:-1:-1;44337:213:0;;;;;:::i;:::-;;:::i;45715:1032::-;;;;;;;;;;-1:-1:-1;45715:1032:0;;;;;:::i;:::-;;:::i;54865:72::-;;;;;;;;;;;;54895:42;54865:72;;40682:73;;;;;;;;;;;;40713:42;40682:73;;57281:919;;;;;;;;;;;;;:::i;41505:53::-;;;;;;;;;;;;41552:6;41505:53;;56773:151;;;;;;;;;;-1:-1:-1;56773:151: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::-;;;;;;;;;;;;;;;;55026:81;;;;;;;;;;;;55065:42;55026:81;;41589:25;;;;;;;;;;-1:-1:-1;41589:25:0;;;;-1:-1:-1;;;;;41589:25:0;;;55116:82;;;;;;;;;;;;55156:42;55116:82;;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;:::-;;;;;;;;;;;;;;;;;;;4961:14:1;;4954:22;4936:41;;4924:2;4909:18;41810:42:0;4891:92:1;41172:36:0;;;;;;;;;;;;;;;;56932:220;;;;;;;;;;-1:-1:-1;56932:220: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;;;56638:127;;;;;;;;;;-1:-1:-1;56638:127:0;;;;;:::i;:::-;;:::i;44884:143::-;;;;;;;;;;-1:-1:-1;44884:143:0;;;;;:::i;:::-;;:::i;42686:118::-;;;;;;;;;;;;;:::i;55307: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;54944:74::-;;;;;;;;;;;;54976:42;54944:74;;43566:174;;;;;;;;;;-1:-1:-1;43566:174:0;;;;;:::i;:::-;;:::i;56071:322::-;;;;;;;;;;;;;:::i;41685:23::-;;;;;;;;;;-1:-1:-1;41685:23:0;;;;-1:-1:-1;;;;;41685:23:0;;;55274:26;;;;;;;;;;;;;;;;40762:72;;;;;;;;;;;;40792:42;40762:72;;41621:25;;;;;;;;;;-1:-1:-1;41621:25:0;;;;-1:-1:-1;;;;;41621:25:0;;;55849:188;55942:54;;-1:-1:-1;;;55942:54:0;;55990:4;55942:54;;;4146:51:1;55898:7:0;;;;55156:42;;55942:39;;4119:18:1;;55942:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55918:78;55849:188;-1:-1:-1;;55849:188:0:o;55651:190::-;55743:65;;-1:-1:-1;;;55743:65:0;;55797:4;55743:65;;;4420:34:1;54895:42:0;4470:18:1;;;4463:43;55706:7:0;;;;55156:42;;55743:45;;4355:18:1;;55743:65:0;4337:175:1;43351:207:0;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;;6658:2:1;48227:41:0;;;6640:21:1;6697:1;6677:18;;;6670:29;-1:-1:-1;;;6715:18:1;;;6708:37;6762:18;;48227:41:0;6630: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;;;4146:51:1;-1:-1:-1;;;;;45855:4:0;;;;45848:22;;4119: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;;;4146:51:1;46489:14:0;;46518:10;;46506:30;;4119: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;57281:919::-;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;;;;;;57373:194:::1;::::0;-1:-1:-1;;;57373:194:0;;57431:4:::1;57373:194;::::0;::::1;5261:41:1::0;;;5318:18;;;5311:50;;;5377:18;;;5370:50;;;5436:18;;;5429:50;;;5495:19;;;5488:51;;;5555:19;;;5548:51;57551:5:0::1;5615:19:1::0;;;5608:51;55065:42:0::1;::::0;57373:43:::1;::::0;5233:19:1;;57373:194:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;57596:37:0::1;::::0;-1:-1:-1;;;57596:37:0;;57627:4:::1;57596:37;::::0;::::1;4146:51:1::0;57580:13:0::1;::::0;-1:-1:-1;40713:42:0::1;::::0;-1:-1:-1;57596:22:0::1;::::0;4119:18:1;;57596:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57580:53:::0;-1:-1:-1;57648:9:0;;57644:336:::1;;57722:17;57742:28;55380:5;57742:15;57752:4;;57742:5;:9;;:15;;;;:::i;:28::-;57722:48;;57785:121;57841:10;;;;;;;;;-1:-1:-1::0;;;;;57841:10:0::1;-1:-1:-1::0;;;;;57829:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40713:42;::::0;57882:9;57785:25:::1;:121::i;:::-;57921:47;40713:42;54895;57947:20;:5:::0;57957:9;57947::::1;:20::i;:::-;57921:14;:47::i;:::-;57644:336;;57992:13;58015:4:::0;;58008:37:::1;::::0;-1:-1:-1;;;58008:37:0;;58039:4:::1;58008:37;::::0;::::1;4146:51:1::0;-1:-1:-1;;;;;58015:4:0;;::::1;::::0;58008:22:::1;::::0;4119:18:1;;58008:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58067:31;::::0;;58075:15:::1;11771:25:1::0;;11827:2;11812:18;;11805:34;;;57992:53:0;;-1:-1:-1;58067:31:0::1;::::0;11744:18:1;58067:31:0::1;;;;;;;58154:38;:36;:38::i;:::-;42640:1;;57281:919::o:0;56773:151::-;56859:8;;-1:-1:-1;;;;;56859:8:0;56845:10;:22;56837:44;;;;-1:-1:-1;;;56837:44:0;;;;;;;:::i;:::-;56892:10;:24;56773:151::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;;;;;;7689:2:1;7671:21;;;7728:1;7708:18;;;7701:29;-1:-1:-1;;;7761:2:1;7746:18;;7739:34;7805:2;7790:18;;7661:153;45486:40:0;45547:31;;-1:-1:-1;;;45547:31:0;;45572:4;45547:31;;;4146:51:1;-1:-1:-1;;;;;45547:16:0;;;;;4119: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;;;4146:51:1;-1:-1:-1;;;;;47497:4:0;;;;47490:22;;4119: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;;;4146:51:1;47480:47:0;;-1:-1:-1;47540:14:0;;47569:10;;;47557:30;;4119: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;56932:220::-;57034:8;;-1:-1:-1;;;;;57034:8:0;57020:10;:22;;:50;;-1:-1:-1;57060:10:0;;-1:-1:-1;;;;;57060:10:0;57046;:24;57020:50;56998:109;;;;-1:-1:-1;;;56998:109:0;;;;;;;:::i;:::-;57118:11;:26;;-1:-1:-1;;;;;;57118:26:0;-1:-1:-1;;;;;57118:26:0;;;;;;;;;;56932:220::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;;6318:2:1;44785:48:0;;;6300:21:1;6357:2;6337:18;;;6330:30;-1:-1:-1;;;6376:18:1;;;6369:41;6427:18;;44785:48:0;6290: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;56638:127::-;56712:8;;-1:-1:-1;;;;;56712:8:0;56698:10;:22;56690:44;;;;-1:-1:-1;;;56690:44:0;;;;;;;:::i;:::-;56745:4;:12;56638:127::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;;;4146:51:1;-1:-1:-1;;;;;42766:4:0;;;;42759:22;;4119: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;;;4146:51:1;-1:-1:-1;;;;;47033:4:0;;;;47026:22;;4119: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;;;4146:51:1;47016:47:0;;-1:-1:-1;47076:14:0;;47105:10;;;47093:30;;4119: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;;6318:2:1;44622:48:0;;;6300:21:1;6357:2;6337:18;;;6330:30;-1:-1:-1;;;6376:18:1;;;6369:41;6427:18;;44622:48:0;6290: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;56071:322::-;56117:13;56140:4;;56133:37;;-1:-1:-1;;;56133:37:0;;56164:4;56133:37;;;4146:51:1;-1:-1:-1;;;;;56140:4:0;;;;56133:22;;4119:18:1;;56133:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56117:53;-1:-1:-1;56185:9:0;;56181:205;;56251:1;56218:4;;56211:42;;-1:-1:-1;;;;;56218:4:0;;;;55156:42;;56211:24;:42::i;:::-;56275:4;;56268:46;;-1:-1:-1;;;;;56275:4:0;55156:42;56308:5;56268:24;:46::i;:::-;56329:45;;-1:-1:-1;;;56329:45:0;;;;;10573:25:1;;;55065:42:0;;56329:38;;10546:18:1;;56329:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56181:205;56071:322;:::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;56401:201::-;56520:49;;-1:-1:-1;;;56520:49:0;;;;;10573:25:1;;;56495:7:0;;55065:42;;56520:40;;10546:18:1;;56520:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56587:7:0;;56401:201;-1:-1:-1;;;;56401:201: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;;7333:2:1;1127:46:0;;;7315:21:1;7372:2;7352:18;;;7345:30;7411:29;7391:18;;;7384:57;7458:18;;1127:46:0;7305: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;;8364:2:1;2761:56:0;;;8346:21:1;8403:2;8383:18;;;8376:30;8442:34;8422:18;;;8415:62;-1:-1:-1;;;8493:18:1;;;8486:31;8534:19;;2761:56:0;8336:223:1;3322:132:0;3380:7;3407:39;3411:1;3414;3407:39;;;;;;;;;;;;;;;;;:3;:39::i;26835:177::-;26945:58;;-1:-1:-1;;;;;4709:32:1;;26945:58:0;;;4691:51:1;4758:18;;;4751:34;;;26918:86:0;;26938:5;;-1:-1:-1;;;26968:23:0;4664: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;:::-;26835:177;;;:::o;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;50417:623::-;50485:13;50508:4;;50501:37;;-1:-1:-1;;;50501:37:0;;50532:4;50501:37;;;4146:51:1;-1:-1:-1;;;;;50508:4:0;;;;50501:22;;4119: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;27494:622::-;27864:10;;;27863:62;;-1:-1:-1;27880:39:0;;-1:-1:-1;;;27880:39:0;;27904:4;27880:39;;;4420:34:1;-1:-1:-1;;;;;4490:15:1;;;4470:18;;;4463:43;27880:15:0;;;;;4355:18:1;;27880:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;27863:62;27855:152;;;;-1:-1:-1;;;27855:152:0;;10206:2:1;27855:152:0;;;10188:21:1;10245:2;10225:18;;;10218:30;10284:34;10264:18;;;10257:62;-1:-1:-1;;;10335:18:1;;;10328:52;10397:19;;27855:152:0;10178:244:1;27855:152:0;28045:62;;-1:-1:-1;;;;;4709:32:1;;28045:62:0;;;4691:51:1;4758:18;;;4751:34;;;28018:90:0;;28038:5;;-1:-1:-1;;;28068:22:0;4664:18:1;;28045:62:0;4646:145:1;1924:192:0;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;;9458:2:1;29797:85:0;;;9440:21:1;9497:2;9477:18;;;9470:30;9536:34;9516:18;;;9509:62;-1:-1:-1;;;9587:18:1;;;9580:40;9637:19;;29797:85:0;9430: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;;9100:2:1;14496:60:0;;;9082:21:1;9139:2;9119:18;;;9112:30;9178:31;9158:18;;;9151:59;9227:18;;14496:60:0;9072: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:257::-;3500:3;3538:5;3532:12;3565:6;3560:3;3553:19;3581:63;3637:6;3630:4;3625:3;3621:14;3614:4;3607:5;3603:16;3581:63;:::i;:::-;3698:2;3677:15;-1:-1:-1;;3673:29:1;3664:39;;;;3705:4;3660:50;;3508:208;-1:-1:-1;;3508:208:1:o;3721:274::-;3850:3;3888:6;3882:13;3904:53;3950:6;3945:3;3938:4;3930:6;3926:17;3904:53;:::i;:::-;3973:16;;;;;3858:137;-1:-1:-1;;3858:137:1:o;5670:217::-;5817:2;5806:9;5799:21;5780:4;5837:44;5877:2;5866:9;5862:18;5854:6;5837:44;:::i;6791:335::-;6993:2;6975:21;;;7032:2;7012:18;;;7005:30;-1:-1:-1;;;7066:2:1;7051:18;;7044:41;7117:2;7102:18;;6965:161::o;7819:338::-;8021:2;8003:21;;;8060:2;8040:18;;;8033:30;-1:-1:-1;;;8094:2:1;8079:18;;8072:44;8148:2;8133:18;;7993:164::o;8564:329::-;8766:2;8748:21;;;8805:1;8785:18;;;8778:29;-1:-1:-1;;;8838:2:1;8823:18;;8816:36;8884:2;8869:18;;8738:155::o;9667:332::-;9869:2;9851:21;;;9908:1;9888:18;;;9881:29;-1:-1:-1;;;9941:2:1;9926:18;;9919:39;9990:2;9975:18;;9841:158::o;10609:983::-;10871:4;10919:3;10908:9;10904:19;10950:6;10939:9;10932:25;10976:2;11014:6;11009:2;10998:9;10994:18;10987:34;11057:3;11052:2;11041:9;11037:18;11030:31;11081:6;11116;11110:13;11147:6;11139;11132:22;11185:3;11174:9;11170:19;11163:26;;11224:2;11216:6;11212:15;11198:29;;11245:4;11258:195;11272:6;11269:1;11266:13;11258:195;;;11337:13;;-1:-1:-1;;;;;11333:39:1;11321:52;;11428:15;;;;11393:12;;;;11369:1;11287:9;11258:195;;;-1:-1:-1;;;;;;;11509:32:1;;;;11504:2;11489:18;;11482:60;-1:-1:-1;;;11573:3:1;11558:19;11551:35;11470:3;10880:712;-1:-1:-1;;;10880:712:1:o;11850:275::-;11921:2;11915:9;11986:2;11967:13;;-1:-1:-1;;11963:27:1;11951:40;;12021:18;12006:34;;12042:22;;;12003:62;12000:2;;;12068:18;;:::i;:::-;12104:2;12097:22;11895:230;;-1:-1:-1;11895:230:1:o;12130:128::-;12170:3;12201:1;12197:6;12194:1;12191:13;12188:2;;;12207:18;;:::i;:::-;-1:-1:-1;12243:9:1;;12178:80::o;12263:217::-;12303:1;12329;12319:2;;-1:-1:-1;;;12354:31:1;;12408:4;12405:1;12398:15;12436:4;12361:1;12426:15;12319:2;-1:-1:-1;12465:9:1;;12309:171::o;12485:168::-;12525:7;12591:1;12587;12583:6;12579:14;12576:1;12573:21;12568:1;12561:9;12554:17;12550:45;12547:2;;;12598:18;;:::i;:::-;-1:-1:-1;12638:9:1;;12537:116::o;12658:125::-;12698:4;12726:1;12723;12720:8;12717:2;;;12731:18;;:::i;:::-;-1:-1:-1;12768:9:1;;12707:76::o;12788:258::-;12860:1;12870:113;12884:6;12881:1;12878:13;12870:113;;;12960:11;;;12954:18;12941:11;;;12934:39;12906:2;12899:10;12870:113;;;13001:6;12998:1;12995:13;12992:2;;;13036:1;13027:6;13022:3;13018:16;13011:27;12992:2;;12841:205;;;:::o;13051:127::-;13112:10;13107:3;13103:20;13100:1;13093:31;13143:4;13140:1;13133:15;13167:4;13164:1;13157:15;13183:127;13244:10;13239:3;13235:20;13232:1;13225:31;13275:4;13272:1;13265:15;13299:4;13296:1;13289:15;13315:131;-1:-1:-1;;;;;13390:31:1;;13380:42;;13370:2;;13436:1;13433;13426:12
Swarm Source
ipfs://f6b2e75e0d110784fbfe8091327dd621e263586d9049f92044cf2752f10fa1b5
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.