Source Code
Latest 25 from a total of 104 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Harvest | 28916756 | 53 days ago | IN | 0 FRAX | 0.00000401 | ||||
| Harvest | 23079594 | 188 days ago | IN | 0 FRAX | 0.00004735 | ||||
| Harvest | 22821265 | 194 days ago | IN | 0 FRAX | 0.0000477 | ||||
| Harvest | 22480219 | 202 days ago | IN | 0 FRAX | 0.00002292 | ||||
| Harvest | 16558110 | 339 days ago | IN | 0 FRAX | 0.00000128 | ||||
| Harvest | 16388002 | 343 days ago | IN | 0 FRAX | 0.00000127 | ||||
| Harvest | 16083744 | 350 days ago | IN | 0 FRAX | 0.00000132 | ||||
| Harvest | 16041905 | 351 days ago | IN | 0 FRAX | 0.00000133 | ||||
| Harvest | 15431427 | 365 days ago | IN | 0 FRAX | 0.00000191 | ||||
| Harvest | 14004142 | 398 days ago | IN | 0 FRAX | 0.00000174 | ||||
| Harvest | 13784394 | 403 days ago | IN | 0 FRAX | 0.00000318 | ||||
| Harvest | 13447268 | 411 days ago | IN | 0 FRAX | 0.00000303 | ||||
| Harvest | 13260824 | 416 days ago | IN | 0 FRAX | 0.00000439 | ||||
| Harvest | 11897336 | 447 days ago | IN | 0 FRAX | 0.0000015 | ||||
| Harvest | 11856288 | 448 days ago | IN | 0 FRAX | 0.00000147 | ||||
| Harvest | 11725256 | 451 days ago | IN | 0 FRAX | 0.00000208 | ||||
| Harvest | 11597519 | 454 days ago | IN | 0 FRAX | 0.00000148 | ||||
| Harvest | 11415264 | 458 days ago | IN | 0 FRAX | 0.00000163 | ||||
| Harvest | 11244968 | 462 days ago | IN | 0 FRAX | 0.00000205 | ||||
| Harvest | 11167909 | 464 days ago | IN | 0 FRAX | 0.00000212 | ||||
| Harvest | 10939735 | 469 days ago | IN | 0 FRAX | 0.00000198 | ||||
| Harvest | 10904337 | 470 days ago | IN | 0 FRAX | 0.00000263 | ||||
| Harvest | 10687549 | 475 days ago | IN | 0 FRAX | 0.00000145 | ||||
| Harvest | 10519127 | 479 days ago | IN | 0 FRAX | 0.00000164 | ||||
| Harvest | 10426805 | 481 days ago | IN | 0 FRAX | 0.00000211 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 26336372 | 113 days ago | 0.00009836 FRAX |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FraxtalConvexFraxStablePoolStrategy
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at fraxscan.com on 2024-05-11
*/
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
// SPDX-License-Identifier: UNLICENSED
/*
* @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 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;
}
}
/**
* @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);
}
/**
* @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, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
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) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
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, reverting 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) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* 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);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
/**
* @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;
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_) public {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual 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 virtual returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `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 virtual {
_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 { }
}
/**
* @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");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
/**
* @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");
}
}
}
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () internal {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
interface IStrategy {
//Returns the token sent to the fee dist contract, which is used to calculate the amount of ADDY to mint when claiming rewards
function getFeeDistToken() external view returns (address);
//Returns the harvested token, which is not guaranteed to be the fee dist token
function getHarvestedToken() external view returns (address);
function lastHarvestTime() external view returns (uint256);
function rewards() external view returns (address);
function want() external view returns (address);
function deposit() external;
function withdrawForSwap(uint256) external returns (uint256);
function withdraw(uint256) external;
function balanceOf() external view returns (uint256);
function getHarvestable() external view returns (uint256);
function harvest() external;
function setJar(address _jar) external;
}
//A Jar is a contract that users deposit funds into.
//Jar contracts are paired with a strategy contract that interacts with the pool being farmed.
interface IJar {
function token() external view returns (IERC20);
function getRatio() external view returns (uint256);
function balance() external view returns (uint256);
function balanceOf(address _user) external view returns (uint256);
function depositAll() external;
function deposit(uint256) external;
//function depositFor(address user, uint256 amount) external;
function withdrawAll() external;
//function withdraw(uint256) external;
//function earn() external;
function strategy() external view returns (address);
//function decimals() external view returns (uint8);
//function getLastTimeRestaked(address _address) external view returns (uint256);
//function notifyReward(address _reward, uint256 _amount) external;
//function getPendingReward(address _user) external view returns (uint256);
}
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint 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 (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint 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 (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
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 (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
interface IUniswapRouterV2 {
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
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,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB);
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(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
}
abstract contract BaseStrategy is IStrategy, Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
using Address for address;
using SafeMath for uint256;
uint256 public override lastHarvestTime = 0;
// Tokens
address public override want; //The token being staked.
address internal harvestedToken; //The token we harvest. If the reward pool emits multiple tokens, they should be converted to a single token.
// Contracts
address public override rewards; //The staking rewards/MasterChef contract
address public strategist; //The address the performance fee is sent to
address public multiHarvest; //0x3355743Db830Ed30FF4089DB8b18DEeb683F8546; //The multi harvest contract
address public jar; //The vault/jar contract
// Dex
address public currentRouter; //0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff; //Quickswap router
constructor(
address _want,
address _strategist,
address _harvestedToken,
address _currentRouter,
address _rewards
) public {
require(_want != address(0));
require(_strategist != address(0));
require(_harvestedToken != address(0));
require(_currentRouter != address(0));
require(_rewards != address(0));
want = _want;
strategist = _strategist;
harvestedToken = _harvestedToken;
currentRouter = _currentRouter;
rewards = _rewards;
}
// **** Modifiers **** //
//prevent unauthorized smart contracts from calling harvest()
modifier onlyHumanOrWhitelisted {
require(msg.sender == tx.origin || msg.sender == owner() || msg.sender == multiHarvest || msg.sender == jar, "not authorized");
_;
}
// **** Views **** //
function balanceOfWant() public view returns (uint256) {
return IERC20(want).balanceOf(address(this));
}
function balanceOfPool() public virtual view returns (uint256);
function balanceOf() public override view returns (uint256) {
return balanceOfWant().add(balanceOfPool());
}
function getHarvestedToken() public override view returns (address) {
return harvestedToken;
}
// **** Setters **** //
function setJar(address _jar) external override onlyOwner {
require(jar == address(0), "jar already set");
require(IJar(_jar).strategy() == address(this), "incorrect jar");
jar = _jar;
emit SetJar(_jar);
}
function setMultiHarvest(address _address) external onlyOwner {
require(_address != address(0));
multiHarvest = _address;
}
// **** State mutations **** //
function deposit() public override virtual;
// Withdraw partial funds, normally used with a jar withdrawal
function withdraw(uint256 _amount) external override {
require(msg.sender == jar, "!jar");
uint256 _balance = IERC20(want).balanceOf(address(this));
if (_balance < _amount) {
_amount = _withdrawSome(_amount.sub(_balance));
_amount = _amount.add(_balance);
}
IERC20(want).safeTransfer(jar, _amount);
}
// Withdraw funds, used to swap between strategies
// Not utilized right now, but could be used for i.e. multi stablecoin strategies
function withdrawForSwap(uint256 _amount)
external override
returns (uint256 balance)
{
require(msg.sender == jar, "!jar");
_withdrawSome(_amount);
balance = IERC20(want).balanceOf(address(this));
IERC20(want).safeTransfer(jar, balance);
}
function _withdrawSome(uint256 _amount) internal virtual returns (uint256);
function harvest() public override virtual;
// **** Internal functions ****
//Performs a swap through the current router, assuming infinite approval for the token was already given
function _swapUniswapWithPathPreapproved(
address[] memory path,
uint256 _amount,
address _router
) internal {
require(path[1] != address(0));
IUniswapRouterV2(_router).swapExactTokensForTokens(
_amount,
0,
path,
address(this),
now.add(60)
);
}
function _swapUniswapWithPathPreapproved(
address[] memory path,
uint256 _amount
) internal {
_swapUniswapWithPathPreapproved(path, _amount, currentRouter);
}
//Legacy swap functions left in to not break compatibility with older strategy contracts
function _swapUniswapWithPath(
address[] memory path,
uint256 _amount,
address _router
) internal {
require(path[1] != address(0));
// Swap with uniswap
IERC20(path[0]).safeApprove(_router, 0);
IERC20(path[0]).safeApprove(_router, _amount);
IUniswapRouterV2(_router).swapExactTokensForTokens(
_amount,
0,
path,
address(this),
now.add(60)
);
}
function _swapUniswapWithPath(
address[] memory path,
uint256 _amount
) internal {
_swapUniswapWithPath(path, _amount, currentRouter);
}
function _swapUniswapWithPathForFeeOnTransferTokens(
address[] memory path,
uint256 _amount,
address _router
) internal {
require(path[1] != address(0));
// Swap with uniswap
IERC20(path[0]).safeApprove(_router, 0);
IERC20(path[0]).safeApprove(_router, _amount);
IUniswapRouterV2(_router).swapExactTokensForTokensSupportingFeeOnTransferTokens(
_amount,
0,
path,
address(this),
now.add(60)
);
}
function _swapUniswapWithPathForFeeOnTransferTokens(
address[] memory path,
uint256 _amount
) internal {
_swapUniswapWithPathForFeeOnTransferTokens(path, _amount, currentRouter);
}
function _distributePerformanceFeesAndDeposit() internal {
uint256 _want = IERC20(want).balanceOf(address(this));
if (_want > 0) {
deposit();
}
lastHarvestTime = now;
}
// **** Events **** //
event SetJar(address indexed jar);
}
interface IConvexRewardPool {
function rewardLength() external view returns(uint256);
function rewards(uint256) external view returns (address reward_token, uint256 reward_integral, uint256 reward_remaining);
//claim reward for given account (unguarded)
function getReward(address _account) external;
//withdraw balance and unwrap to the underlying lp token
function withdraw(uint256 _amount, bool _claim) external returns(bool);
//withdraw balance and unwrap to the underlying lp token
//but avoid checkpointing. will lose non-checkpointed rewards but can withdraw
function emergencyWithdraw(uint256 _amount) external returns(bool);
}
interface IConvexBooster {
//list of convex pools, index(pid) -> pool
function poolInfo(uint256) external view returns (
address lptoken, //the curve lp token
address gauge, //the curve gauge
address rewards, //the main reward/staking contract
bool shutdown, //is this pool shutdown?
address factory //a reference to the curve factory used to create this pool (needed for minting crv)
);
//deposit lp tokens and stake
function deposit(uint256 _pid, uint256 _amount) external returns(bool);
}
interface IERCFund {
function feeShareEnabled() external view returns (bool);
function depositToFeeDistributor(address token, uint256 amount) external;
function notifyFeeDistribution(address token) external;
function getFee() external view returns (uint256);
function recover(address token) external;
}
//Vaults are jars that emit ADDY rewards.
interface IVault is IJar {
function getBoost(address _user) external view returns (uint256);
function getPendingReward(address _user) external view returns (uint256);
function getLastDepositTime(address _user) external view returns (uint256);
function getTokensStaked(address _user) external view returns (uint256);
function totalShares() external view returns (uint256);
function getRewardMultiplier() external view returns (uint256);
function rewardAllocation() external view returns (uint256);
function totalPendingReward() external view returns (uint256);
function withdrawPenaltyTime() external view returns (uint256);
function withdrawPenalty() external view returns (uint256);
function increaseRewardAllocation(uint256 _newReward) external;
function setWithdrawPenaltyTime(uint256 _withdrawPenaltyTime) external;
function setWithdrawPenalty(uint256 _withdrawPenalty) external;
function setRewardMultiplier(uint256 _rewardMultiplier) external;
}
//A normal vault is a vault where the strategy contract notifies the vault contract about the profit it generated when harvesting.
interface IGenericVault is IVault {
//Strategy calls notifyReward to let the vault know that it earned a certain amount of profit (the performance fee) for gov token stakers
function notifyReward(address _reward, uint256 _amount) external;
}
interface ICurveStableSwapNG is IERC20 {
/// @notice Adds liquidity into the pool.
/// @param _amounts Amounts of each coin to add.
/// @param _min_mint_amount Minimum amount of LP to mint.
/// @return uint256 Amount of LP tokens received by the `receiver`
function add_liquidity(uint256[] calldata _amounts, uint256 _min_mint_amount) external returns (uint256);
/// `nonReentrant`
/// @notice Exchange using wrapped native token by default
/// @param i Index value for the input coin
/// @param j Index value for the output coin
/// @param dx Amount of input coin being swapped in
/// @param min_dy Minimum amount of output coin to receive
/// @return uint256 Amount of tokens at index j received by the `receiver
function exchange(int128 i, int128 j, uint256 dx, uint256 min_dy) external returns (uint256);
function coins(uint256 index) external view returns (address);
}
interface __ICurveTricryptoOptimized {
/// `nonReentrant`
/// @dev i and j are uint256s, unlike `ICurveStableSwapNG`
/// @notice Exchange using wrapped native token by default
/// @param i Index value for the input coin
/// @param j Index value for the output coin
/// @param dx Amount of input coin being swapped in
/// @param min_dy Minimum amount of output coin to receive
/// @return uint256 Amount of tokens at index j received by the `receiver
function exchange(uint256 i, uint256 j, uint256 dx, uint256 min_dy) external returns (uint256);
}
//Stable pools with two tokens that have FXS rewards and possibly CRV rewards
contract FraxtalConvexFraxStablePoolStrategy is BaseStrategy {
uint256 public constant FEE_DENOMINATOR = 10000;
address private constant FXS = 0xFc00000000000000000000000000000000000002;
address private constant CRV = 0x331B9182088e2A7d6D3Fe4742AbA1fB231aEcc56;
address private constant frxETH = 0xFC00000000000000000000000000000000000006;
address private constant TRICRV_POOL = 0xF593aE314749d0c92B450F0a13E7e1791f352bB7;
address private constant TRIFXS_POOL = 0xa0D3911349e701A1F49C1Ba2dDA34b4ce9636569;
address private constant CONVEX_BOOSTER = 0xd3327cb05a8E0095A543D582b5B3Ce3e19270389; //Convex's booster contract that stakes tokens
address public underlying;
uint256 private index = 0;
uint256 public pid = 0;
constructor(
address _rewards, //IConvexRewardPool
address _want,
address _underlying,
uint256 _pid
)
public
BaseStrategy(
_want,
0x8b36504F2c52f59a57EE6c84d6f1b82e7698EcF0, //Fraxtal ERCFund
FXS,
TRIFXS_POOL,
_rewards
)
{
underlying = _underlying;
pid = _pid;
//frax = 0
//frxETH = 1
//fxs = 2
if (underlying == frxETH) {
index = 1;
}
IERC20(_want).safeApprove(CONVEX_BOOSTER, uint256(-1)); //tokens are deposited in the Convex booster
IERC20(FXS).safeApprove(currentRouter, uint256(-1));
IERC20(_underlying).safeApprove(_want, uint256(-1));
IERC20(CRV).safeApprove(TRICRV_POOL, uint256(-1));
IERC20(frxETH).safeApprove(currentRouter, uint256(-1));
}
// **** Views ****
function balanceOfPool() public override view returns (uint256) {
return IERC20(rewards).balanceOf(address(this));
}
function getHarvestable() external override view returns (uint256) {
return 0;
}
function getFeeDistToken() public override view returns (address) {
return FXS;
}
/* **** Mutative functions **** */
function harvest() public override onlyHumanOrWhitelisted nonReentrant {
_getReward();
//distribute fee
uint256 _amountHarvested = IERC20(harvestedToken).balanceOf(address(this));
if (_amountHarvested > 0) {
uint256 _feeAmount = _amountHarvested.mul(IERCFund(strategist).getFee()).div(FEE_DENOMINATOR);
IERC20(harvestedToken).safeTransfer(strategist, _feeAmount);
}
uint256 _remainingHarvested = IERC20(harvestedToken).balanceOf(address(this));
if (_remainingHarvested > 0) {
__ICurveTricryptoOptimized(currentRouter).exchange(2, index, _remainingHarvested, 1);
}
//if pool has CRV rewards, swap it for frxETH and then FRAX if necessary
uint256 _crvBal = IERC20(CRV).balanceOf(address(this));
if (_crvBal > 0) {
uint256 _feeAmount = _crvBal.mul(IERCFund(strategist).getFee()).div(FEE_DENOMINATOR);
uint256 _remainingCrv = _crvBal.sub(_feeAmount);
IERC20(CRV).safeTransfer(strategist, _feeAmount);
//swap CRV for frxETH
__ICurveTricryptoOptimized(TRICRV_POOL).exchange(2, 1, _remainingCrv, 1);
//swap frxETH for FRAX if necessary
if (underlying != frxETH) {
uint256 _ethBal = IERC20(frxETH).balanceOf(address(this));
if (_ethBal > 0) {
__ICurveTricryptoOptimized(currentRouter).exchange(1, 0, _ethBal, 1);
}
}
}
uint256 _underlyingBalance = IERC20(underlying).balanceOf(address(this));
if (_underlyingBalance > 0) {
uint256[] memory _balances = new uint256[](2);
//strategy is only for pool with two tokens
if (ICurveStableSwapNG(want).coins(0) == underlying) {
_balances[0] = _underlyingBalance;
}
else {
_balances[1] = _underlyingBalance;
}
ICurveStableSwapNG(want).add_liquidity(_balances, 0);
_distributePerformanceFeesAndDeposit();
}
}
function deposit() public override {
uint256 _want = IERC20(want).balanceOf(address(this));
if (_want > 0) {
IConvexBooster(CONVEX_BOOSTER).deposit(pid, _want);
}
}
function _withdrawSome(uint256 _amount)
internal
override
returns (uint256)
{
IConvexRewardPool(rewards).withdraw(_amount, true);
return _amount;
}
function _getReward() internal {
IConvexRewardPool(rewards).getReward(address(this));
}
// **** Admin functions ****
// Added to support recovering LP Rewards from other systems to be distributed to holders
function salvage(address recipient, address token, uint256 amount) public onlyOwner {
// Admin cannot withdraw the staking or harvested token from the contract
require(token != want, "cannot salvage want");
require(token != harvestedToken, "cannot salvage harvestedToken");
require(token != rewards, "cannot salvage gauge token");
IERC20(token).safeTransfer(recipient, amount);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_rewards","type":"address"},{"internalType":"address","name":"_want","type":"address"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"jar","type":"address"}],"name":"SetJar","type":"event"},{"inputs":[],"name":"FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getFeeDistToken","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":"getHarvestedToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"jar","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastHarvestTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiHarvest","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"salvage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_jar","type":"address"}],"name":"setJar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setMultiHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawForSwap","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405260006002556000600b556000600c553480156200002057600080fd5b50604051620026f5380380620026f5833981016040819052620000439162000602565b82738b36504f2c52f59a57ee6c84d6f1b82e7698ecf073fc0000000000000000000000000000000000000273a0d3911349e701a1f49c1ba2dda34b4ce963656987600062000090620002fe565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180556001600160a01b038516620000f257600080fd5b6001600160a01b0384166200010657600080fd5b6001600160a01b0383166200011a57600080fd5b6001600160a01b0382166200012e57600080fd5b6001600160a01b0381166200014257600080fd5b600380546001600160a01b03199081166001600160a01b03978816179091556006805482169587169590951790945560048054851693861693909317909255600980548416918516919091179055600580548316918416919091179055600a80549091168483161790819055600c83905573fc0000000000000000000000000000000000000691161415620001d7576001600b555b6200021273d3327cb05a8e0095a543d582b5b3ce3e19270389600019856001600160a01b03166200030260201b62001326179092919060201c565b6009546200024e9073fc00000000000000000000000000000000000002906001600160a01b031660001962000302602090811b6200132617901c565b6200027583600019846001600160a01b03166200030260201b62001326179092919060201c565b620002b873331b9182088e2a7d6d3fe4742aba1fb231aecc5673f593ae314749d0c92b450f0a13e7e1791f352bb760001962000302602090811b6200132617901c565b600954620002f49073fc00000000000000000000000000000000000006906001600160a01b031660001962000302602090811b6200132617901c565b505050506200086e565b3390565b801580620003915750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906200033b9030908690600401620006af565b60206040518083038186803b1580156200035457600080fd5b505afa15801562000369573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200038f919062000678565b155b620003b95760405162461bcd60e51b8152600401620003b090620007de565b60405180910390fd5b620004148363095ea7b360e01b8484604051602401620003db929190620006c9565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b03938416179052906200041916565b505050565b606062000475826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620004b560201b62001420179092919060201c565b80519091501562000414578080602001905181019062000496919062000656565b620004145760405162461bcd60e51b8152600401620003b09062000794565b6060620004c68484600085620004d0565b90505b9392505050565b606082471015620004f55760405162461bcd60e51b8152600401620003b09062000717565b6200050085620005a0565b6200051f5760405162461bcd60e51b8152600401620003b0906200075d565b60006060866001600160a01b031685876040516200053e919062000691565b60006040518083038185875af1925050503d80600081146200057d576040519150601f19603f3d011682016040523d82523d6000602084013e62000582565b606091505b50909250905062000595828286620005a6565b979650505050505050565b3b151590565b60608315620005b7575081620004c9565b825115620005c85782518084602001fd5b8160405162461bcd60e51b8152600401620003b09190620006e2565b80516001600160a01b0381168114620005fc57600080fd5b92915050565b6000806000806080858703121562000618578384fd5b620006248686620005e4565b9350620006358660208701620005e4565b9250620006468660408701620005e4565b6060959095015193969295505050565b60006020828403121562000668578081fd5b81518015158114620004c9578182fd5b6000602082840312156200068a578081fd5b5051919050565b60008251620006a58184602087016200083b565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b6000602082528251806020840152620007038160408501602087016200083b565b601f01601f19169190910160400192915050565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b60005b83811015620008585781810151838201526020016200083e565b8381111562000868576000848401525b50505050565b611e77806200087e6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063722713f7116100de578063c6223e2611610097578063d73792a911610071578063d73792a914610294578063f10684541461029c578063f2fde38b146102a4578063f6f482aa146102b75761018e565b8063c6223e2614610271578063ceb0f62614610284578063d0e30db01461028c5761018e565b8063722713f7146102365780638da5cb5b1461023e5780639d27ab70146102465780639ec5a89414610259578063be38a4fe14610261578063c1a3d44c146102695761018e565b80631fe4a6861161014b578063506508f111610125578063506508f11461021657806367367d231461021e5780636f307dc314610226578063715018a61461022e5761018e565b80631fe4a686146101f35780632e1a7d4d146101fb5780634641257d1461020e5761018e565b80630547104d146101935780631113ef52146101b157806311588086146101c6578063122fea3b146101ce5780631836edca146101e35780631f1fcd51146101eb575b600080fd5b61019b6102ca565b6040516101a891906119a5565b60405180910390f35b6101c46101bf36600461186a565b6102cf565b005b61019b6103ba565b6101d6610440565b6040516101a89190611916565b6101d661044f565b6101d661045a565b6101d6610469565b6101c46102093660046118ca565b610478565b6101c461056f565b6101d6610d69565b6101d6610d78565b6101d6610d87565b6101c4610d96565b61019b610e1f565b6101d6610e3a565b6101c4610254366004611832565b610e49565b6101d6610ebd565b6101d6610ecc565b61019b610edb565b61019b61027f3660046118ca565b610f0c565b61019b610fe8565b6101c4610fee565b61019b611107565b61019b61110d565b6101c46102b2366004611832565b611113565b6101c46102c5366004611832565b6111d3565b600090565b6102d7611439565b6001600160a01b03166102e8610e3a565b6001600160a01b0316146103175760405162461bcd60e51b815260040161030e90611c23565b60405180910390fd5b6003546001600160a01b03838116911614156103455760405162461bcd60e51b815260040161030e90611a42565b6004546001600160a01b03838116911614156103735760405162461bcd60e51b815260040161030e90611aa6565b6005546001600160a01b03838116911614156103a15760405162461bcd60e51b815260040161030e90611c76565b6103b56001600160a01b038316848361143d565b505050565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a08231906103eb903090600401611916565b60206040518083038186803b15801561040357600080fd5b505afa158015610417573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043b91906118e2565b905090565b6009546001600160a01b031681565b6002603f609a1b0190565b6003546001600160a01b031681565b6006546001600160a01b031681565b6008546001600160a01b031633146104a25760405162461bcd60e51b815260040161030e90611c58565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a08231906104d3903090600401611916565b60206040518083038186803b1580156104eb57600080fd5b505afa1580156104ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052391906118e2565b90508181101561054e5761053f61053a838361145c565b611489565b915061054b8282611516565b91505b60085460035461056b916001600160a01b0391821691168461143d565b5050565b333214806105955750610580610e3a565b6001600160a01b0316336001600160a01b0316145b806105aa57506007546001600160a01b031633145b806105bf57506008546001600160a01b031633145b6105db5760405162461bcd60e51b815260040161030e90611bba565b600260015414156105fe5760405162461bcd60e51b815260040161030e90611d55565b600260015561060b61153b565b600480546040516370a0823160e01b81526000926001600160a01b03909216916370a082319161063d91309101611916565b60206040518083038186803b15801561065557600080fd5b505afa158015610669573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068d91906118e2565b9050801561075557600061073361271061072d600660009054906101000a90046001600160a01b03166001600160a01b031663ced72f876040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ee57600080fd5b505afa158015610702573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072691906118e2565b859061159f565b906115d9565b600654600454919250610753916001600160a01b0390811691168361143d565b505b600480546040516370a0823160e01b81526000926001600160a01b03909216916370a082319161078791309101611916565b60206040518083038186803b15801561079f57600080fd5b505afa1580156107b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d791906118e2565b9050801561086d57600954600b54604051630b68372160e31b81526001600160a01b0390921691635b41b90891610819916002919086906001906004016119ae565b602060405180830381600087803b15801561083357600080fd5b505af1158015610847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086b91906118e2565b505b6040516370a0823160e01b815260009073331b9182088e2a7d6d3fe4742aba1fb231aecc56906370a08231906108a7903090600401611916565b60206040518083038186803b1580156108bf57600080fd5b505afa1580156108d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f791906118e2565b90508015610b5657600061095861271061072d600660009054906101000a90046001600160a01b03166001600160a01b031663ced72f876040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ee57600080fd5b90506000610966838361145c565b6006549091506109959073331b9182088e2a7d6d3fe4742aba1fb231aecc56906001600160a01b03168461143d565b604051630b68372160e31b815273f593ae314749d0c92b450f0a13e7e1791f352bb790635b41b908906109d490600290600190869082906004016119ae565b602060405180830381600087803b1580156109ee57600080fd5b505af1158015610a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2691906118e2565b50600a546001600160a01b03166006603f609a1b0114610b53576040516370a0823160e01b81526000906006603f609a1b01906370a0823190610a6d903090600401611916565b60206040518083038186803b158015610a8557600080fd5b505afa158015610a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abd91906118e2565b90508015610b5157600954604051630b68372160e31b81526001600160a01b0390911690635b41b90890610afd90600190600090869083906004016119ae565b602060405180830381600087803b158015610b1757600080fd5b505af1158015610b2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4f91906118e2565b505b505b50505b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610b87903090600401611916565b60206040518083038186803b158015610b9f57600080fd5b505afa158015610bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd791906118e2565b90508015610d5f5760408051600280825260608083018452926020830190803683375050600a5460035460405163c661065760e01b81529394506001600160a01b03918216939116915063c661065790610c36906000906004016119a5565b60206040518083038186803b158015610c4e57600080fd5b505afa158015610c62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c86919061184e565b6001600160a01b03161415610cb4578181600081518110610ca357fe5b602002602001018181525050610ccf565b8181600181518110610cc257fe5b6020026020010181815250505b600354604051635b96faef60e11b81526001600160a01b039091169063b72df5de90610d0290849060009060040161195d565b602060405180830381600087803b158015610d1c57600080fd5b505af1158015610d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5491906118e2565b50610d5d61160b565b505b5050600180555050565b6007546001600160a01b031681565b6004546001600160a01b031690565b600a546001600160a01b031681565b610d9e611439565b6001600160a01b0316610daf610e3a565b6001600160a01b031614610dd55760405162461bcd60e51b815260040161030e90611c23565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600061043b610e2c6103ba565b610e34610edb565b90611516565b6000546001600160a01b031690565b610e51611439565b6001600160a01b0316610e62610e3a565b6001600160a01b031614610e885760405162461bcd60e51b815260040161030e90611c23565b6001600160a01b038116610e9b57600080fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b6008546001600160a01b031681565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a08231906103eb903090600401611916565b6008546000906001600160a01b03163314610f395760405162461bcd60e51b815260040161030e90611c58565b610f4282611489565b506003546040516370a0823160e01b81526001600160a01b03909116906370a0823190610f73903090600401611916565b60206040518083038186803b158015610f8b57600080fd5b505afa158015610f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc391906118e2565b600854600354919250610fe3916001600160a01b0390811691168361143d565b919050565b60025481565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a082319061101f903090600401611916565b60206040518083038186803b15801561103757600080fd5b505afa15801561104b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106f91906118e2565b9050801561110457600c54604051631c57762b60e31b815273d3327cb05a8e0095a543d582b5b3ce3e192703899163e2bbb158916110b291908590600401611df2565b602060405180830381600087803b1580156110cc57600080fd5b505af11580156110e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056b91906118aa565b50565b61271081565b600c5481565b61111b611439565b6001600160a01b031661112c610e3a565b6001600160a01b0316146111525760405162461bcd60e51b815260040161030e90611c23565b6001600160a01b0381166111785760405162461bcd60e51b815260040161030e906119fc565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6111db611439565b6001600160a01b03166111ec610e3a565b6001600160a01b0316146112125760405162461bcd60e51b815260040161030e90611c23565b6008546001600160a01b03161561123b5760405162461bcd60e51b815260040161030e90611b14565b306001600160a01b0316816001600160a01b031663a8c62e766040518163ffffffff1660e01b815260040160206040518083038186803b15801561127e57600080fd5b505afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b6919061184e565b6001600160a01b0316146112dc5760405162461bcd60e51b815260040161030e90611cad565b600880546001600160a01b0319166001600160a01b0383169081179091556040517f55c9c1522358ac20ccd3c4887fe1886c26bd0f045ab7fd11acd78680bb77956990600090a250565b8015806113ae5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061135c903090869060040161192a565b60206040518083038186803b15801561137457600080fd5b505afa158015611388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ac91906118e2565b155b6113ca5760405162461bcd60e51b815260040161030e90611d8c565b6103b58363095ea7b360e01b84846040516024016113e9929190611944565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526116a3565b606061142f8484600085611732565b90505b9392505050565b3390565b6103b58363a9059cbb60e01b84846040516024016113e9929190611944565b60008282111561147e5760405162461bcd60e51b815260040161030e90611add565b508082035b92915050565b600554604051631c683a1b60e11b81526000916001600160a01b0316906338d07436906114bd908590600190600401611de2565b602060405180830381600087803b1580156114d757600080fd5b505af11580156114eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150f91906118aa565b5090919050565b6000828201838110156114325760405162461bcd60e51b815260040161030e90611a6f565b600554604051630c00007b60e41b81526001600160a01b039091169063c00007b09061156b903090600401611916565b600060405180830381600087803b15801561158557600080fd5b505af1158015611599573d6000803e3d6000fd5b50505050565b6000826115ae57506000611483565b828202828482816115bb57fe5b04146114325760405162461bcd60e51b815260040161030e90611be2565b60008082116115fa5760405162461bcd60e51b815260040161030e90611b83565b81838161160357fe5b049392505050565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a082319061163c903090600401611916565b60206040518083038186803b15801561165457600080fd5b505afa158015611668573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168c91906118e2565b9050801561169c5761169c610fee565b5042600255565b60606116f8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114209092919063ffffffff16565b8051909150156103b5578080602001905181019061171691906118aa565b6103b55760405162461bcd60e51b815260040161030e90611d0b565b6060824710156117545760405162461bcd60e51b815260040161030e90611b3d565b61175d856117f3565b6117795760405162461bcd60e51b815260040161030e90611cd4565b60006060866001600160a01b0316858760405161179691906118fa565b60006040518083038185875af1925050503d80600081146117d3576040519150601f19603f3d011682016040523d82523d6000602084013e6117d8565b606091505b50915091506117e88282866117f9565b979650505050505050565b3b151590565b60608315611808575081611432565b8251156118185782518084602001fd5b8160405162461bcd60e51b815260040161030e91906119c9565b600060208284031215611843578081fd5b813561143281611e2c565b60006020828403121561185f578081fd5b815161143281611e2c565b60008060006060848603121561187e578182fd5b833561188981611e2c565b9250602084013561189981611e2c565b929592945050506040919091013590565b6000602082840312156118bb578081fd5b81518015158114611432578182fd5b6000602082840312156118db578081fd5b5035919050565b6000602082840312156118f3578081fd5b5051919050565b6000825161190c818460208701611e00565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b828110156119965781518452928401929084019060010161197a565b50505092019290925292915050565b90815260200190565b93845260208401929092526040830152606082015260800190565b60006020825282518060208401526119e8816040850160208701611e00565b601f01601f19169190910160400192915050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526013908201527218d85b9b9bdd081cd85b1d9859d9481dd85b9d606a1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601d908201527f63616e6e6f742073616c7661676520686172766573746564546f6b656e000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252600f908201526e1a985c88185b1c9958591e481cd95d608a1b604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526004908201526310b530b960e11b604082015260600190565b6020808252601a908201527f63616e6e6f742073616c7661676520676175676520746f6b656e000000000000604082015260600190565b6020808252600d908201526c34b731b7b93932b1ba103530b960991b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b9182521515602082015260400190565b918252602082015260400190565b60005b83811015611e1b578181015183820152602001611e03565b838111156115995750506000910152565b6001600160a01b038116811461110457600080fdfea2646970667358221220ede72129cfa1ad7b36a15e668c9ebf82516bacf3e314f6e8c75d59334ad07b2164736f6c634300060c0033000000000000000000000000567fde00a3541a4828e0bf1471ab3987aceaaa9c00000000000000000000000063eb7846642630456707c3efbb50a03c79b89d81000000000000000000000000fc000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063722713f7116100de578063c6223e2611610097578063d73792a911610071578063d73792a914610294578063f10684541461029c578063f2fde38b146102a4578063f6f482aa146102b75761018e565b8063c6223e2614610271578063ceb0f62614610284578063d0e30db01461028c5761018e565b8063722713f7146102365780638da5cb5b1461023e5780639d27ab70146102465780639ec5a89414610259578063be38a4fe14610261578063c1a3d44c146102695761018e565b80631fe4a6861161014b578063506508f111610125578063506508f11461021657806367367d231461021e5780636f307dc314610226578063715018a61461022e5761018e565b80631fe4a686146101f35780632e1a7d4d146101fb5780634641257d1461020e5761018e565b80630547104d146101935780631113ef52146101b157806311588086146101c6578063122fea3b146101ce5780631836edca146101e35780631f1fcd51146101eb575b600080fd5b61019b6102ca565b6040516101a891906119a5565b60405180910390f35b6101c46101bf36600461186a565b6102cf565b005b61019b6103ba565b6101d6610440565b6040516101a89190611916565b6101d661044f565b6101d661045a565b6101d6610469565b6101c46102093660046118ca565b610478565b6101c461056f565b6101d6610d69565b6101d6610d78565b6101d6610d87565b6101c4610d96565b61019b610e1f565b6101d6610e3a565b6101c4610254366004611832565b610e49565b6101d6610ebd565b6101d6610ecc565b61019b610edb565b61019b61027f3660046118ca565b610f0c565b61019b610fe8565b6101c4610fee565b61019b611107565b61019b61110d565b6101c46102b2366004611832565b611113565b6101c46102c5366004611832565b6111d3565b600090565b6102d7611439565b6001600160a01b03166102e8610e3a565b6001600160a01b0316146103175760405162461bcd60e51b815260040161030e90611c23565b60405180910390fd5b6003546001600160a01b03838116911614156103455760405162461bcd60e51b815260040161030e90611a42565b6004546001600160a01b03838116911614156103735760405162461bcd60e51b815260040161030e90611aa6565b6005546001600160a01b03838116911614156103a15760405162461bcd60e51b815260040161030e90611c76565b6103b56001600160a01b038316848361143d565b505050565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a08231906103eb903090600401611916565b60206040518083038186803b15801561040357600080fd5b505afa158015610417573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043b91906118e2565b905090565b6009546001600160a01b031681565b6002603f609a1b0190565b6003546001600160a01b031681565b6006546001600160a01b031681565b6008546001600160a01b031633146104a25760405162461bcd60e51b815260040161030e90611c58565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a08231906104d3903090600401611916565b60206040518083038186803b1580156104eb57600080fd5b505afa1580156104ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052391906118e2565b90508181101561054e5761053f61053a838361145c565b611489565b915061054b8282611516565b91505b60085460035461056b916001600160a01b0391821691168461143d565b5050565b333214806105955750610580610e3a565b6001600160a01b0316336001600160a01b0316145b806105aa57506007546001600160a01b031633145b806105bf57506008546001600160a01b031633145b6105db5760405162461bcd60e51b815260040161030e90611bba565b600260015414156105fe5760405162461bcd60e51b815260040161030e90611d55565b600260015561060b61153b565b600480546040516370a0823160e01b81526000926001600160a01b03909216916370a082319161063d91309101611916565b60206040518083038186803b15801561065557600080fd5b505afa158015610669573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068d91906118e2565b9050801561075557600061073361271061072d600660009054906101000a90046001600160a01b03166001600160a01b031663ced72f876040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ee57600080fd5b505afa158015610702573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072691906118e2565b859061159f565b906115d9565b600654600454919250610753916001600160a01b0390811691168361143d565b505b600480546040516370a0823160e01b81526000926001600160a01b03909216916370a082319161078791309101611916565b60206040518083038186803b15801561079f57600080fd5b505afa1580156107b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d791906118e2565b9050801561086d57600954600b54604051630b68372160e31b81526001600160a01b0390921691635b41b90891610819916002919086906001906004016119ae565b602060405180830381600087803b15801561083357600080fd5b505af1158015610847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086b91906118e2565b505b6040516370a0823160e01b815260009073331b9182088e2a7d6d3fe4742aba1fb231aecc56906370a08231906108a7903090600401611916565b60206040518083038186803b1580156108bf57600080fd5b505afa1580156108d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f791906118e2565b90508015610b5657600061095861271061072d600660009054906101000a90046001600160a01b03166001600160a01b031663ced72f876040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ee57600080fd5b90506000610966838361145c565b6006549091506109959073331b9182088e2a7d6d3fe4742aba1fb231aecc56906001600160a01b03168461143d565b604051630b68372160e31b815273f593ae314749d0c92b450f0a13e7e1791f352bb790635b41b908906109d490600290600190869082906004016119ae565b602060405180830381600087803b1580156109ee57600080fd5b505af1158015610a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2691906118e2565b50600a546001600160a01b03166006603f609a1b0114610b53576040516370a0823160e01b81526000906006603f609a1b01906370a0823190610a6d903090600401611916565b60206040518083038186803b158015610a8557600080fd5b505afa158015610a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abd91906118e2565b90508015610b5157600954604051630b68372160e31b81526001600160a01b0390911690635b41b90890610afd90600190600090869083906004016119ae565b602060405180830381600087803b158015610b1757600080fd5b505af1158015610b2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4f91906118e2565b505b505b50505b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610b87903090600401611916565b60206040518083038186803b158015610b9f57600080fd5b505afa158015610bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd791906118e2565b90508015610d5f5760408051600280825260608083018452926020830190803683375050600a5460035460405163c661065760e01b81529394506001600160a01b03918216939116915063c661065790610c36906000906004016119a5565b60206040518083038186803b158015610c4e57600080fd5b505afa158015610c62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c86919061184e565b6001600160a01b03161415610cb4578181600081518110610ca357fe5b602002602001018181525050610ccf565b8181600181518110610cc257fe5b6020026020010181815250505b600354604051635b96faef60e11b81526001600160a01b039091169063b72df5de90610d0290849060009060040161195d565b602060405180830381600087803b158015610d1c57600080fd5b505af1158015610d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5491906118e2565b50610d5d61160b565b505b5050600180555050565b6007546001600160a01b031681565b6004546001600160a01b031690565b600a546001600160a01b031681565b610d9e611439565b6001600160a01b0316610daf610e3a565b6001600160a01b031614610dd55760405162461bcd60e51b815260040161030e90611c23565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600061043b610e2c6103ba565b610e34610edb565b90611516565b6000546001600160a01b031690565b610e51611439565b6001600160a01b0316610e62610e3a565b6001600160a01b031614610e885760405162461bcd60e51b815260040161030e90611c23565b6001600160a01b038116610e9b57600080fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b6008546001600160a01b031681565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a08231906103eb903090600401611916565b6008546000906001600160a01b03163314610f395760405162461bcd60e51b815260040161030e90611c58565b610f4282611489565b506003546040516370a0823160e01b81526001600160a01b03909116906370a0823190610f73903090600401611916565b60206040518083038186803b158015610f8b57600080fd5b505afa158015610f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc391906118e2565b600854600354919250610fe3916001600160a01b0390811691168361143d565b919050565b60025481565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a082319061101f903090600401611916565b60206040518083038186803b15801561103757600080fd5b505afa15801561104b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106f91906118e2565b9050801561110457600c54604051631c57762b60e31b815273d3327cb05a8e0095a543d582b5b3ce3e192703899163e2bbb158916110b291908590600401611df2565b602060405180830381600087803b1580156110cc57600080fd5b505af11580156110e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056b91906118aa565b50565b61271081565b600c5481565b61111b611439565b6001600160a01b031661112c610e3a565b6001600160a01b0316146111525760405162461bcd60e51b815260040161030e90611c23565b6001600160a01b0381166111785760405162461bcd60e51b815260040161030e906119fc565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6111db611439565b6001600160a01b03166111ec610e3a565b6001600160a01b0316146112125760405162461bcd60e51b815260040161030e90611c23565b6008546001600160a01b03161561123b5760405162461bcd60e51b815260040161030e90611b14565b306001600160a01b0316816001600160a01b031663a8c62e766040518163ffffffff1660e01b815260040160206040518083038186803b15801561127e57600080fd5b505afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b6919061184e565b6001600160a01b0316146112dc5760405162461bcd60e51b815260040161030e90611cad565b600880546001600160a01b0319166001600160a01b0383169081179091556040517f55c9c1522358ac20ccd3c4887fe1886c26bd0f045ab7fd11acd78680bb77956990600090a250565b8015806113ae5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061135c903090869060040161192a565b60206040518083038186803b15801561137457600080fd5b505afa158015611388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ac91906118e2565b155b6113ca5760405162461bcd60e51b815260040161030e90611d8c565b6103b58363095ea7b360e01b84846040516024016113e9929190611944565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526116a3565b606061142f8484600085611732565b90505b9392505050565b3390565b6103b58363a9059cbb60e01b84846040516024016113e9929190611944565b60008282111561147e5760405162461bcd60e51b815260040161030e90611add565b508082035b92915050565b600554604051631c683a1b60e11b81526000916001600160a01b0316906338d07436906114bd908590600190600401611de2565b602060405180830381600087803b1580156114d757600080fd5b505af11580156114eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150f91906118aa565b5090919050565b6000828201838110156114325760405162461bcd60e51b815260040161030e90611a6f565b600554604051630c00007b60e41b81526001600160a01b039091169063c00007b09061156b903090600401611916565b600060405180830381600087803b15801561158557600080fd5b505af1158015611599573d6000803e3d6000fd5b50505050565b6000826115ae57506000611483565b828202828482816115bb57fe5b04146114325760405162461bcd60e51b815260040161030e90611be2565b60008082116115fa5760405162461bcd60e51b815260040161030e90611b83565b81838161160357fe5b049392505050565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a082319061163c903090600401611916565b60206040518083038186803b15801561165457600080fd5b505afa158015611668573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168c91906118e2565b9050801561169c5761169c610fee565b5042600255565b60606116f8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114209092919063ffffffff16565b8051909150156103b5578080602001905181019061171691906118aa565b6103b55760405162461bcd60e51b815260040161030e90611d0b565b6060824710156117545760405162461bcd60e51b815260040161030e90611b3d565b61175d856117f3565b6117795760405162461bcd60e51b815260040161030e90611cd4565b60006060866001600160a01b0316858760405161179691906118fa565b60006040518083038185875af1925050503d80600081146117d3576040519150601f19603f3d011682016040523d82523d6000602084013e6117d8565b606091505b50915091506117e88282866117f9565b979650505050505050565b3b151590565b60608315611808575081611432565b8251156118185782518084602001fd5b8160405162461bcd60e51b815260040161030e91906119c9565b600060208284031215611843578081fd5b813561143281611e2c565b60006020828403121561185f578081fd5b815161143281611e2c565b60008060006060848603121561187e578182fd5b833561188981611e2c565b9250602084013561189981611e2c565b929592945050506040919091013590565b6000602082840312156118bb578081fd5b81518015158114611432578182fd5b6000602082840312156118db578081fd5b5035919050565b6000602082840312156118f3578081fd5b5051919050565b6000825161190c818460208701611e00565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b828110156119965781518452928401929084019060010161197a565b50505092019290925292915050565b90815260200190565b93845260208401929092526040830152606082015260800190565b60006020825282518060208401526119e8816040850160208701611e00565b601f01601f19169190910160400192915050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526013908201527218d85b9b9bdd081cd85b1d9859d9481dd85b9d606a1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601d908201527f63616e6e6f742073616c7661676520686172766573746564546f6b656e000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252600f908201526e1a985c88185b1c9958591e481cd95d608a1b604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526004908201526310b530b960e11b604082015260600190565b6020808252601a908201527f63616e6e6f742073616c7661676520676175676520746f6b656e000000000000604082015260600190565b6020808252600d908201526c34b731b7b93932b1ba103530b960991b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b9182521515602082015260400190565b918252602082015260400190565b60005b83811015611e1b578181015183820152602001611e03565b838111156115995750506000910152565b6001600160a01b038116811461110457600080fdfea2646970667358221220ede72129cfa1ad7b36a15e668c9ebf82516bacf3e314f6e8c75d59334ad07b2164736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000567fde00a3541a4828e0bf1471ab3987aceaaa9c00000000000000000000000063eb7846642630456707c3efbb50a03c79b89d81000000000000000000000000fc000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _rewards (address): 0x567FDe00A3541A4828E0Bf1471Ab3987aCeaaA9C
Arg [1] : _want (address): 0x63Eb7846642630456707C3efBb50A03c79B89D81
Arg [2] : _underlying (address): 0xFc00000000000000000000000000000000000001
Arg [3] : _pid (uint256): 1
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000567fde00a3541a4828e0bf1471ab3987aceaaa9c
Arg [1] : 00000000000000000000000063eb7846642630456707c3efbb50a03c79b89d81
Arg [2] : 000000000000000000000000fc00000000000000000000000000000000000001
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode Sourcemap
56294:5377:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58171:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61239:429;;;;;;:::i;:::-;;:::i;:::-;;58033:130;;;:::i;45924:28::-;;;:::i;:::-;;;;;;;:::i;58273:95::-;;;:::i;45365:28::-;;;:::i;45674:25::-;;;:::i;47976:378::-;;;;;;:::i;:::-;;:::i;58418:2146::-;;;:::i;45751:27::-;;;:::i;47265:108::-;;;:::i;56981:25::-;;;:::i;35280:148::-;;;:::i;47135:122::-;;;:::i;34629:87::-;;;:::i;47666:146::-;;;;;;:::i;:::-;;:::i;45594:31::-;;;:::i;45860:18::-;;;:::i;46938:118::-;;;:::i;48505:307::-;;;;;;:::i;:::-;;:::i;45298:43::-;;;:::i;60572:209::-;;;:::i;56364:47::-;;;:::i;57045:22::-;;;:::i;35583:244::-;;;;;;:::i;:::-;;:::i;47412:246::-;;;;;;:::i;:::-;;:::i;58171:94::-;58229:7;58171:94;:::o;61239:429::-;34860:12;:10;:12::i;:::-;-1:-1:-1;;;;;34849:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34849:23:0;;34841:68;;;;-1:-1:-1;;;34841:68:0;;;;;;;:::i;:::-;;;;;;;;;61434:4:::1;::::0;-1:-1:-1;;;;;61425:13:0;;::::1;61434:4:::0;::::1;61425:13;;61417:45;;;;-1:-1:-1::0;;;61417:45:0::1;;;;;;;:::i;:::-;61490:14;::::0;-1:-1:-1;;;;;61481:23:0;;::::1;61490:14:::0;::::1;61481:23;;61473:65;;;;-1:-1:-1::0;;;61473:65:0::1;;;;;;;:::i;:::-;61566:7;::::0;-1:-1:-1;;;;;61557:16:0;;::::1;61566:7:::0;::::1;61557:16;;61549:55;;;;-1:-1:-1::0;;;61549:55:0::1;;;;;;;:::i;:::-;61615:45;-1:-1:-1::0;;;;;61615:26:0;::::1;61642:9:::0;61653:6;61615:26:::1;:45::i;:::-;61239:429:::0;;;:::o;58033:130::-;58122:7;;58115:40;;-1:-1:-1;;;58115:40:0;;58088:7;;-1:-1:-1;;;;;58122:7:0;;58115:25;;:40;;58149:4;;58115:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58108:47;;58033:130;:::o;45924:28::-;;;-1:-1:-1;;;;;45924:28:0;;:::o;58273:95::-;-1:-1:-1;;;;;58273:95:0;:::o;45365:28::-;;;-1:-1:-1;;;;;45365:28:0;;:::o;45674:25::-;;;-1:-1:-1;;;;;45674:25:0;;:::o;47976:378::-;48062:3;;-1:-1:-1;;;;;48062:3:0;48048:10;:17;48040:34;;;;-1:-1:-1;;;48040:34:0;;;;;;;:::i;:::-;48111:4;;48104:37;;-1:-1:-1;;;48104:37:0;;48085:16;;-1:-1:-1;;;;;48111:4:0;;48104:22;;:37;;48135:4;;48104:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48085:56;;48167:7;48156:8;:18;48152:143;;;48201:36;48215:21;:7;48227:8;48215:11;:21::i;:::-;48201:13;:36::i;:::-;48191:46;-1:-1:-1;48262:21:0;48191:46;48274:8;48262:11;:21::i;:::-;48252:31;;48152:143;48333:3;;48314:4;;48307:39;;-1:-1:-1;;;;;48314:4:0;;;;48333:3;48338:7;48307:25;:39::i;:::-;47976:378;;:::o;58418:2146::-;46763:10;46777:9;46763:23;;:48;;;46804:7;:5;:7::i;:::-;-1:-1:-1;;;;;46790:21:0;:10;-1:-1:-1;;;;;46790:21:0;;46763:48;:78;;;-1:-1:-1;46829:12:0;;-1:-1:-1;;;;;46829:12:0;46815:10;:26;46763:78;:99;;;-1:-1:-1;46859:3:0;;-1:-1:-1;;;;;46859:3:0;46845:10;:17;46763:99;46755:126;;;;-1:-1:-1;;;46755:126:0;;;;;;;:::i;:::-;37487:1:::1;38093:7;;:19;;38085:63;;;;-1:-1:-1::0;;;38085:63:0::1;;;;;;;:::i;:::-;37487:1;38226:7;:18:::0;58500:12:::2;:10;:12::i;:::-;58585:14;::::0;;58578:47:::2;::::0;-1:-1:-1;;;58578:47:0;;58551:24:::2;::::0;-1:-1:-1;;;;;58585:14:0;;::::2;::::0;58578:32:::2;::::0;:47:::2;::::0;58619:4:::2;::::0;58578:47:::2;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58551:74:::0;-1:-1:-1;58640:20:0;;58636:220:::2;;58677:18;58698:72;56406:5;58698:51;58728:10;;;;;;;;;-1:-1:-1::0;;;;;58728:10:0::2;-1:-1:-1::0;;;;;58719:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58698:16:::0;;:20:::2;:51::i;:::-;:55:::0;::::2;:72::i;:::-;58821:10;::::0;58792:14:::2;::::0;58677:93;;-1:-1:-1;58785:59:0::2;::::0;-1:-1:-1;;;;;58792:14:0;;::::2;::::0;58821:10:::2;58677:93:::0;58785:35:::2;:59::i;:::-;58636:220;;58905:14;::::0;;58898:47:::2;::::0;-1:-1:-1;;;58898:47:0;;58868:27:::2;::::0;-1:-1:-1;;;;;58905:14:0;;::::2;::::0;58898:32:::2;::::0;:47:::2;::::0;58939:4:::2;::::0;58898:47:::2;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58868:77:::0;-1:-1:-1;58960:23:0;;58956:140:::2;;59027:13;::::0;59054:5:::2;::::0;59000:84:::2;::::0;-1:-1:-1;;;59000:84:0;;-1:-1:-1;;;;;59027:13:0;;::::2;::::0;59000:50:::2;::::0;:84:::2;::::0;59051:1:::2;::::0;59054:5;59061:19;;59027:13;;59000:84:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58956:140;59208:36;::::0;-1:-1:-1;;;59208:36:0;;59190:15:::2;::::0;56531:42:::2;::::0;59208:21:::2;::::0;:36:::2;::::0;59238:4:::2;::::0;59208:36:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59190:54:::0;-1:-1:-1;59259:11:0;;59255:706:::2;;59287:18;59308:63;56406:5;59308:42;59329:10;;;;;;;;;-1:-1:-1::0;;;;;59329:10:0::2;-1:-1:-1::0;;;;;59320:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;59308:63;59287:84:::0;-1:-1:-1;59386:21:0::2;59410:23;:7:::0;59287:84;59410:11:::2;:23::i;:::-;59473:10;::::0;59386:47;;-1:-1:-1;59448:48:0::2;::::0;56531:42:::2;::::0;-1:-1:-1;;;;;59473:10:0::2;59485::::0;59448:24:::2;:48::i;:::-;59548:72;::::0;-1:-1:-1;;;59548:72:0;;56704:42:::2;::::0;59548:48:::2;::::0;:72:::2;::::0;59597:1:::2;::::0;59600::::2;::::0;59603:13;;59600:1;;59548:72:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;59690:10:0::2;::::0;-1:-1:-1;;;;;59690:10:0::2;-1:-1:-1::0;;;;;59690:20:0::2;59686:264;;59749:39;::::0;-1:-1:-1;;;59749:39:0;;59731:15:::2;::::0;-1:-1:-1;;;;;56614:42:0;59749:24:::2;::::0;:39:::2;::::0;59782:4:::2;::::0;59749:39:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59731:57:::0;-1:-1:-1;59811:11:0;;59807:128:::2;;59874:13;::::0;59847:68:::2;::::0;-1:-1:-1;;;59847:68:0;;-1:-1:-1;;;;;59874:13:0;;::::2;::::0;59847:50:::2;::::0;:68:::2;::::0;59874:13;;::::2;::::0;59904:7;;59874:13;;59847:68:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59807:128;59686:264;;59255:706;;;60009:10;::::0;60002:43:::2;::::0;-1:-1:-1;;;60002:43:0;;59973:26:::2;::::0;-1:-1:-1;;;;;60009:10:0::2;::::0;60002:28:::2;::::0;:43:::2;::::0;60039:4:::2;::::0;60002:43:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59973:72:::0;-1:-1:-1;60060:22:0;;60056:501:::2;;60128:16;::::0;;60142:1:::2;60128:16:::0;;;60099:26:::2;60128:16:::0;;::::2;::::0;;60099:26;60128:16:::2;::::0;::::2;::::0;;::::2;::::0;::::2;-1:-1:-1::0;;60257:10:0::2;::::0;60239:4:::2;::::0;60220:33:::2;::::0;-1:-1:-1;;;60220:33:0;;60099:45;;-1:-1:-1;;;;;;60257:10:0;;::::2;::::0;60239:4;::::2;::::0;-1:-1:-1;60220:30:0::2;::::0;:33:::2;::::0;60257:10:::2;::::0;60220:33:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;60220:47:0::2;;60216:208;;;60303:18;60288:9;60298:1;60288:12;;;;;;;;;;;;;:33;;;::::0;::::2;60216:208;;;60390:18;60375:9;60385:1;60375:12;;;;;;;;;;;;;:33;;;::::0;::::2;60216:208;60457:4;::::0;60438:52:::2;::::0;-1:-1:-1;;;60438:52:0;;-1:-1:-1;;;;;60457:4:0;;::::2;::::0;60438:38:::2;::::0;:52:::2;::::0;60477:9;;60457:4:::2;::::0;60438:52:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60507:38;:36;:38::i;:::-;60056:501;;-1:-1:-1::0;;37443:1:0::1;38405:22:::0;;-1:-1:-1;;58418:2146:0:o;45751:27::-;;;-1:-1:-1;;;;;45751:27:0;;:::o;47265:108::-;47351:14;;-1:-1:-1;;;;;47351:14:0;47265:108;:::o;56981:25::-;;;-1:-1:-1;;;;;56981:25:0;;:::o;35280:148::-;34860:12;:10;:12::i;:::-;-1:-1:-1;;;;;34849:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34849:23:0;;34841:68;;;;-1:-1:-1;;;34841:68:0;;;;;;;:::i;:::-;35387:1:::1;35371:6:::0;;35350:40:::1;::::0;-1:-1:-1;;;;;35371:6:0;;::::1;::::0;35350:40:::1;::::0;35387:1;;35350:40:::1;35418:1;35401:19:::0;;-1:-1:-1;;;;;;35401:19:0::1;::::0;;35280:148::o;47135:122::-;47186:7;47213:36;47233:15;:13;:15::i;:::-;47213;:13;:15::i;:::-;:19;;:36::i;34629:87::-;34675:7;34702:6;-1:-1:-1;;;;;34702:6:0;34629:87;:::o;47666:146::-;34860:12;:10;:12::i;:::-;-1:-1:-1;;;;;34849:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34849:23:0;;34841:68;;;;-1:-1:-1;;;34841:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47747:22:0;::::1;47739:31;;;::::0;::::1;;47781:12;:23:::0;;-1:-1:-1;;;;;;47781:23:0::1;-1:-1:-1::0;;;;;47781:23:0;;;::::1;::::0;;;::::1;::::0;;47666:146::o;45594:31::-;;;-1:-1:-1;;;;;45594:31:0;;:::o;45860:18::-;;;-1:-1:-1;;;;;45860:18:0;;:::o;46938:118::-;47018:4;;47011:37;;-1:-1:-1;;;47011:37:0;;46984:7;;-1:-1:-1;;;;;47018:4:0;;47011:22;;:37;;47042:4;;47011:37;;;:::i;48505:307::-;48647:3;;48592:15;;-1:-1:-1;;;;;48647:3:0;48633:10;:17;48625:34;;;;-1:-1:-1;;;48625:34:0;;;;;;;:::i;:::-;48670:22;48684:7;48670:13;:22::i;:::-;-1:-1:-1;48722:4:0;;48715:37;;-1:-1:-1;;;48715:37:0;;-1:-1:-1;;;;;48722:4:0;;;;48715:22;;:37;;48746:4;;48715:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48791:3;;48772:4;;48705:47;;-1:-1:-1;48765:39:0;;-1:-1:-1;;;;;48772:4:0;;;;48791:3;48705:47;48765:25;:39::i;:::-;48505:307;;;:::o;45298:43::-;;;;:::o;60572:209::-;60641:4;;60634:37;;-1:-1:-1;;;60634:37:0;;60618:13;;-1:-1:-1;;;;;60641:4:0;;60634:22;;:37;;60665:4;;60634:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60618:53;-1:-1:-1;60686:9:0;;60682:92;;60751:3;;60712:50;;-1:-1:-1;;;60712:50:0;;56883:42;;60712:38;;:50;;60751:3;60756:5;;60712:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;60682:92::-;60572:209;:::o;56364:47::-;56406:5;56364:47;:::o;57045:22::-;;;;:::o;35583:244::-;34860:12;:10;:12::i;:::-;-1:-1:-1;;;;;34849:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34849:23:0;;34841:68;;;;-1:-1:-1;;;34841:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35672:22:0;::::1;35664:73;;;;-1:-1:-1::0;;;35664:73:0::1;;;;;;;:::i;:::-;35774:6;::::0;;35753:38:::1;::::0;-1:-1:-1;;;;;35753:38:0;;::::1;::::0;35774:6;::::1;::::0;35753:38:::1;::::0;::::1;35802:6;:17:::0;;-1:-1:-1;;;;;;35802:17:0::1;-1:-1:-1::0;;;;;35802:17:0;;;::::1;::::0;;;::::1;::::0;;35583:244::o;47412:246::-;34860:12;:10;:12::i;:::-;-1:-1:-1;;;;;34849:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34849:23:0;;34841:68;;;;-1:-1:-1;;;34841:68:0;;;;;;;:::i;:::-;47489:3:::1;::::0;-1:-1:-1;;;;;47489:3:0::1;:17:::0;47481:45:::1;;;;-1:-1:-1::0;;;47481:45:0::1;;;;;;;:::i;:::-;47578:4;-1:-1:-1::0;;;;;47545:38:0::1;47550:4;-1:-1:-1::0;;;;;47545:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47545:38:0::1;;47537:64;;;;-1:-1:-1::0;;;47537:64:0::1;;;;;;;:::i;:::-;47612:3;:10:::0;;-1:-1:-1;;;;;;47612:10:0::1;-1:-1:-1::0;;;;;47612:10:0;::::1;::::0;;::::1;::::0;;;47638:12:::1;::::0;::::1;::::0;-1:-1:-1;;47638:12:0::1;47412:246:::0;:::o;31196:622::-;31566:10;;;31565:62;;-1:-1:-1;31582:39:0;;-1:-1:-1;;;31582:39:0;;-1:-1:-1;;;;;31582:15:0;;;;;:39;;31606:4;;31613:7;;31582:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;31565:62;31557:152;;;;-1:-1:-1;;;31557:152:0;;;;;;;:::i;:::-;31720:90;31740:5;31770:22;;;31794:7;31803:5;31747:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;31747:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31747:62:0;-1:-1:-1;;;;;;31747:62:0;;;;;;;;;;31720:19;:90::i;25633:195::-;25736:12;25768:52;25790:6;25798:4;25804:1;25807:12;25768:21;:52::i;:::-;25761:59;;25633:195;;;;;;:::o;648:106::-;736:10;648:106;:::o;30537:177::-;30620:86;30640:5;30670:23;;;30695:2;30699:5;30647:58;;;;;;;;;:::i;6885:158::-;6943:7;6976:1;6971;:6;;6963:49;;;;-1:-1:-1;;;6963:49:0;;;;;;;:::i;:::-;-1:-1:-1;7030:5:0;;;6885:158;;;;;:::o;60789:202::-;60926:7;;60908:50;;-1:-1:-1;;;60908:50:0;;60883:7;;-1:-1:-1;;;;;60926:7:0;;60908:35;;:50;;60944:7;;60926;;60908:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;60976:7:0;;60789:202;-1:-1:-1;60789:202:0:o;6423:179::-;6481:7;6513:5;;;6537:6;;;;6529:46;;;;-1:-1:-1;;;6529:46:0;;;;;;;:::i;60999:101::-;61059:7;;61041:51;;-1:-1:-1;;;61041:51:0;;-1:-1:-1;;;;;61059:7:0;;;;61041:36;;:51;;61086:4;;61041:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60999:101::o;7302:220::-;7360:7;7384:6;7380:20;;-1:-1:-1;7399:1:0;7392:8;;7380:20;7423:5;;;7427:1;7423;:5;:1;7447:5;;;;;:10;7439:56;;;;-1:-1:-1;;;7439:56:0;;;;;;;:::i;8000:153::-;8058:7;8090:1;8086;:5;8078:44;;;;-1:-1:-1;;;8078:44:0;;;;;;;:::i;:::-;8144:1;8140;:5;;;;;;;8000:153;-1:-1:-1;;;8000:153:0:o;51260:224::-;51351:4;;51344:37;;-1:-1:-1;;;51344:37:0;;51328:13;;-1:-1:-1;;;;;51351:4:0;;51344:22;;:37;;51375:4;;51344:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51328:53;-1:-1:-1;51398:9:0;;51394:51;;51424:9;:7;:9::i;:::-;-1:-1:-1;51473:3:0;51455:15;:21;51260:224::o;32842:761::-;33266:23;33292:69;33320:4;33292:69;;;;;;;;;;;;;;;;;33300:5;-1:-1:-1;;;;;33292:27:0;;;:69;;;;;:::i;:::-;33376:17;;33266:95;;-1:-1:-1;33376:21:0;33372:224;;33518:10;33507:30;;;;;;;;;;;;:::i;:::-;33499:85;;;;-1:-1:-1;;;33499:85:0;;;;;;;:::i;26685:530::-;26812:12;26870:5;26845:21;:30;;26837:81;;;;-1:-1:-1;;;26837:81:0;;;;;;;:::i;:::-;26937:18;26948:6;26937:10;:18::i;:::-;26929:60;;;;-1:-1:-1;;;26929:60:0;;;;;;;:::i;:::-;27063:12;27077:23;27104:6;-1:-1:-1;;;;;27104:11:0;27124:5;27132:4;27104:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27062:75;;;;27155:52;27173:7;27182:10;27194:12;27155:17;:52::i;:::-;27148:59;26685:530;-1:-1:-1;;;;;;;26685:530:0:o;22715:422::-;23082:20;23121:8;;;22715:422::o;29225:742::-;29340:12;29369:7;29365:595;;;-1:-1:-1;29400:10:0;29393:17;;29365:595;29514:17;;:21;29510:439;;29777:10;29771:17;29838:15;29825:10;29821:2;29817:19;29810:44;29725:148;29920:12;29913:20;;-1:-1:-1;;;29913:20:0;;;;;;;;:::i;696:241:-1:-;;800:2;788:9;779:7;775:23;771:32;768:2;;;-1:-1;;806:12;768:2;85:6;72:20;97:33;124:5;97:33;:::i;944:263::-;;1059:2;1047:9;1038:7;1034:23;1030:32;1027:2;;;-1:-1;;1065:12;1027:2;226:6;220:13;238:33;265:5;238:33;:::i;1214:491::-;;;;1352:2;1340:9;1331:7;1327:23;1323:32;1320:2;;;-1:-1;;1358:12;1320:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1410:63;-1:-1;1510:2;1549:22;;72:20;97:33;72:20;97:33;:::i;:::-;1314:391;;1518:63;;-1:-1;;;1618:2;1657:22;;;;485:20;;1314:391::o;1712:257::-;;1824:2;1812:9;1803:7;1799:23;1795:32;1792:2;;;-1:-1;;1830:12;1792:2;364:6;358:13;26396:5;25207:13;25200:21;26374:5;26371:32;26361:2;;-1:-1;;26407:12;1976:241;;2080:2;2068:9;2059:7;2055:23;2051:32;2048:2;;;-1:-1;;2086:12;2048:2;-1:-1;485:20;;2042:175;-1:-1;2042:175::o;2224:263::-;;2339:2;2327:9;2318:7;2314:23;2310:32;2307:2;;;-1:-1;;2345:12;2307:2;-1:-1;633:13;;2301:186;-1:-1;2301:186::o;11276:271::-;;3796:5;24118:12;3907:52;3952:6;3947:3;3940:4;3933:5;3929:16;3907:52;:::i;:::-;3971:16;;;;;11410:137;-1:-1;;11410:137::o;11554:222::-;-1:-1;;;;;25295:54;;;;2747:37;;11681:2;11666:18;;11652:124::o;11783:333::-;-1:-1;;;;;25295:54;;;2747:37;;25295:54;;12102:2;12087:18;;2747:37;11938:2;11923:18;;11909:207::o;12123:333::-;-1:-1;;;;;25295:54;;;;2747:37;;12442:2;12427:18;;11107:37;12278:2;12263:18;;12249:207::o;12463:497::-;12676:2;12690:47;;;24118:12;;12661:18;;;24650:19;;;12463:497;;24699:4;;24690:14;;;;23972;;;12463:497;3235:260;3260:6;3257:1;3254:13;3235:260;;;3321:13;;11107:37;;2648:14;;;;24505;;;;3282:1;3275:9;3235:260;;;-1:-1;;;12931:18;;4078:58;;;;12743:116;12647:313;-1:-1;;12647:313::o;12967:238::-;4078:58;;;13102:2;13087:18;;13073:132::o;13212:604::-;4078:58;;;13628:2;13613:18;;4078:58;;;;13711:2;13696:18;;11107:37;13802:2;13787:18;;4078:58;13447:3;13432:19;;13418:398::o;15029:310::-;;15176:2;15197:17;15190:47;4591:5;24118:12;24662:6;15176:2;15165:9;15161:18;24650:19;4685:52;4730:6;24690:14;15165:9;24690:14;15176:2;4711:5;4707:16;4685:52;:::i;:::-;26170:7;26154:14;-1:-1;;26150:28;4749:39;;;;24690:14;4749:39;;15147:192;-1:-1;;15147:192::o;15346:416::-;15546:2;15560:47;;;5025:2;15531:18;;;24650:19;5061:34;24690:14;;;5041:55;-1:-1;;;5116:12;;;5109:30;5158:12;;;15517:245::o;15769:416::-;15969:2;15983:47;;;5409:2;15954:18;;;24650:19;-1:-1;;;24690:14;;;5425:42;5486:12;;;15940:245::o;16192:416::-;16392:2;16406:47;;;5737:2;16377:18;;;24650:19;5773:29;24690:14;;;5753:50;5822:12;;;16363:245::o;16615:416::-;16815:2;16829:47;;;6073:2;16800:18;;;24650:19;6109:31;24690:14;;;6089:52;6160:12;;;16786:245::o;17038:416::-;17238:2;17252:47;;;6411:2;17223:18;;;24650:19;6447:32;24690:14;;;6427:53;6499:12;;;17209:245::o;17461:416::-;17661:2;17675:47;;;6750:2;17646:18;;;24650:19;-1:-1;;;24690:14;;;6766:38;6823:12;;;17632:245::o;17884:416::-;18084:2;18098:47;;;7074:2;18069:18;;;24650:19;7110:34;24690:14;;;7090:55;-1:-1;;;7165:12;;;7158:30;7207:12;;;18055:245::o;18307:416::-;18507:2;18521:47;;;7458:2;18492:18;;;24650:19;7494:28;24690:14;;;7474:49;7542:12;;;18478:245::o;18730:416::-;18930:2;18944:47;;;7793:2;18915:18;;;24650:19;-1:-1;;;24690:14;;;7809:37;7865:12;;;18901:245::o;19153:416::-;19353:2;19367:47;;;8116:2;19338:18;;;24650:19;8152:34;24690:14;;;8132:55;-1:-1;;;8207:12;;;8200:25;8244:12;;;19324:245::o;19576:416::-;19776:2;19790:47;;;19761:18;;;24650:19;8531:34;24690:14;;;8511:55;8585:12;;;19747:245::o;19999:416::-;20199:2;20213:47;;;8836:1;20184:18;;;24650:19;-1:-1;;;24690:14;;;8851:27;8897:12;;;20170:245::o;20422:416::-;20622:2;20636:47;;;9148:2;20607:18;;;24650:19;9184:28;24690:14;;;9164:49;9232:12;;;20593:245::o;20845:416::-;21045:2;21059:47;;;9483:2;21030:18;;;24650:19;-1:-1;;;24690:14;;;9499:36;9554:12;;;21016:245::o;21268:416::-;21468:2;21482:47;;;9805:2;21453:18;;;24650:19;9841:31;24690:14;;;9821:52;9892:12;;;21439:245::o;21691:416::-;21891:2;21905:47;;;10143:2;21876:18;;;24650:19;10179:34;24690:14;;;10159:55;-1:-1;;;10234:12;;;10227:34;10280:12;;;21862:245::o;22114:416::-;22314:2;22328:47;;;10531:2;22299:18;;;24650:19;10567:33;24690:14;;;10547:54;10620:12;;;22285:245::o;22537:416::-;22737:2;22751:47;;;10871:2;22722:18;;;24650:19;10907:34;24690:14;;;10887:55;-1:-1;;;10962:12;;;10955:46;11020:12;;;22708:245::o;23189:321::-;11107:37;;;25207:13;25200:21;23496:2;23481:18;;3590:34;23338:2;23323:18;;23309:201::o;23517:333::-;11107:37;;;23836:2;23821:18;;11107:37;23672:2;23657:18;;23643:207::o;25810:268::-;25875:1;25882:101;25896:6;25893:1;25890:13;25882:101;;;25963:11;;;25957:18;25944:11;;;25937:39;25918:2;25911:10;25882:101;;;25998:6;25995:1;25992:13;25989:2;;;-1:-1;;25875:1;26045:16;;26038:27;25859:219::o;26191:117::-;-1:-1;;;;;25295:54;;26250:35;;26240:2;;26299:1;;26289:12
Swarm Source
ipfs://ede72129cfa1ad7b36a15e668c9ebf82516bacf3e314f6e8c75d59334ad07b21
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.