Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 44 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Execute | 10972900 | 1374 days ago | IN | 0 ETH | 0.0179214 | ||||
Harvest | 10972714 | 1374 days ago | IN | 0 ETH | 0.14573313 | ||||
Harvest | 10972469 | 1374 days ago | IN | 0 ETH | 0.15489368 | ||||
Execute | 10972333 | 1374 days ago | IN | 0 ETH | 0.0358428 | ||||
Harvest | 10972051 | 1374 days ago | IN | 0 ETH | 0.09058771 | ||||
Harvest | 10969835 | 1375 days ago | IN | 0 ETH | 0.08198387 | ||||
Harvest | 10967897 | 1375 days ago | IN | 0 ETH | 0.10149179 | ||||
Harvest | 10966131 | 1375 days ago | IN | 0 ETH | 0.13183303 | ||||
Harvest | 10959912 | 1376 days ago | IN | 0 ETH | 0.1062027 | ||||
Harvest | 10955584 | 1377 days ago | IN | 0 ETH | 0.13521337 | ||||
Harvest | 10953645 | 1377 days ago | IN | 0 ETH | 0.14259177 | ||||
Harvest | 10951703 | 1378 days ago | IN | 0 ETH | 0.25117781 | ||||
Harvest | 10951425 | 1378 days ago | IN | 0 ETH | 0.2754402 | ||||
Harvest | 10951150 | 1378 days ago | IN | 0 ETH | 0.22473799 | ||||
Harvest | 10950871 | 1378 days ago | IN | 0 ETH | 0.3129099 | ||||
Harvest | 10950599 | 1378 days ago | IN | 0 ETH | 0.26662611 | ||||
Harvest | 10950320 | 1378 days ago | IN | 0 ETH | 0.24238737 | ||||
Harvest | 10950043 | 1378 days ago | IN | 0 ETH | 0.21814864 | ||||
Harvest | 10949764 | 1378 days ago | IN | 0 ETH | 0.16085707 | ||||
Harvest | 10949492 | 1378 days ago | IN | 0 ETH | 0.14760682 | ||||
Harvest | 10949210 | 1378 days ago | IN | 0 ETH | 0.21154472 | ||||
Harvest | 10947122 | 1378 days ago | IN | 0 ETH | 0.09051 | ||||
Harvest | 10944935 | 1379 days ago | IN | 0 ETH | 0.12136569 | ||||
Harvest | 10942533 | 1379 days ago | IN | 0 ETH | 0.18307705 | ||||
Harvest | 10940020 | 1379 days ago | IN | 0 ETH | 0.10079523 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
StrategyCurveSCRVv3
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-09-21 */ // hevm: flattened sources of src/strategies/strategy-curve-scrv-v3.sol pragma solidity >=0.4.23 >=0.6.0 <0.7.0 >=0.6.2 <0.7.0 >=0.6.7 <0.7.0; ////// src/interfaces/controller.sol // SPDX-License-Identifier: MIT /* pragma solidity ^0.6.0; */ interface IController { function jars(address) external view returns (address); function rewards() external view returns (address); function want(address) external view returns (address); // NOTE: Only StrategyControllerV2 implements this function balanceOf(address) external view returns (uint256); function withdraw(address, uint256) external; function freeWithdraw(address, uint256) external; function earn(address, uint256) external; } ////// src/interfaces/curve.sol /* pragma solidity ^0.6.2; */ interface ICurveFi { function get_virtual_price() external view returns (uint256); function add_liquidity(uint256[4] calldata amounts, uint256 min_mint_amount) external; function remove_liquidity_imbalance( uint256[4] calldata amounts, uint256 max_burn_amount ) external; function remove_liquidity(uint256 _amount, uint256[4] calldata amounts) external; function exchange( int128 from, int128 to, uint256 _from_amount, uint256 _min_to_amount ) external; function balances(int128) external view returns (uint256); } interface ICurveZap { function add_liquidity( uint256[4] calldata uamounts, uint256 min_mint_amount ) external; function remove_liquidity(uint256 _amount, uint256[4] calldata min_uamounts) external; function remove_liquidity_imbalance( uint256[4] calldata uamounts, uint256 max_burn_amount ) external; function calc_withdraw_one_coin(uint256 _token_amount, int128 i) external returns (uint256); function remove_liquidity_one_coin( uint256 _token_amount, int128 i, uint256 min_uamount ) external; function remove_liquidity_one_coin( uint256 _token_amount, int128 i, uint256 min_uamount, bool donate_dust ) external; function withdraw_donated_dust() external; function coins(int128 arg0) external returns (address); function underlying_coins(int128 arg0) external returns (address); function curve() external returns (address); function token() external returns (address); } interface ICurveGauge { function deposit(uint256 _value) external; function deposit(uint256 _value, address addr) external; function balanceOf(address arg0) external view returns (uint256); function withdraw(uint256 _value) external; function withdraw(uint256 _value, bool claim_rewards) external; function claim_rewards() external; function claim_rewards(address addr) external; function claimable_tokens(address addr) external returns (uint256); function claimable_reward(address addr) external view returns (uint256); function integrate_fraction(address arg0) external view returns (uint256); } interface ICurveMintr { function mint(address) external; function minted(address arg0, address arg1) external view returns (uint256); } interface ICurveVotingEscrow { function locked(address arg0) external view returns (int128 amount, uint256 end); function locked__end(address _addr) external view returns (uint256); function create_lock(uint256 _value, uint256 _unlock_time) external; function increase_amount(uint256 _value) external; function increase_unlock_time(uint256 _unlock_time) external; function withdraw() external; } ////// src/lib/safe-math.sol /* pragma solidity ^0.6.0; */ /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } ////// src/lib/erc20.sol // File: contracts/GSN/Context.sol /* pragma solidity ^0.6.0; */ /* import "./safe-math.sol"; */ /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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; } } // File: contracts/token/ERC20/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/utils/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/token/ERC20/ERC20.sol /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } ////// src/interfaces/jar.sol /* pragma solidity ^0.6.2; */ /* import "../lib/erc20.sol"; */ interface IJar is IERC20 { function token() external view returns (address); function claimInsurance() external; // NOTE: Only yDelegatedVault implements this function getRatio() external view returns (uint256); function deposit(uint256) external; function withdraw(uint256) external; function earn() external; } ////// src/interfaces/uniswapv2.sol /* pragma solidity ^0.6.2; */ interface UniswapRouterV2 { function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, 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); } interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; } interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function createPair(address tokenA, address tokenB) external returns (address pair); } ////// src/strategies/strategy-curve-scrv-v3.sol // https://github.com/iearn-finance/contracts/blob/master/contracts/strategies/StrategyCurveYCRVVoter.sol /* pragma solidity ^0.6.2; */ /* import "../lib/erc20.sol"; */ /* import "../lib/safe-math.sol"; */ /* import "../interfaces/jar.sol"; */ /* import "../interfaces/curve.sol"; */ /* import "../interfaces/uniswapv2.sol"; */ /* import "../interfaces/controller.sol"; */ contract StrategyCurveSCRVv3 { // v2 Uses uniswap for less gas // We can roll back to v1 if the liquidity is there using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; // sCRV address public constant want = 0xC25a3A3b969415c80451098fa907EC722572917F; // susdv2 pool address public constant curve = 0xA5407eAE9Ba41422680e2e00537571bcC53efBfD; // tokens we're farming address public constant crv = 0xD533a949740bb3306d119CC777fa900bA034cd52; address public constant snx = 0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F; // curve dao address public constant gauge = 0xA90996896660DEcC6E997655E065b23788857849; address public constant mintr = 0xd061D61a4d941c39E5453435B6345Dc261C2fcE0; // stablecoins address public constant dai = 0x6B175474E89094C44Da98b954EedeAC495271d0F; address public constant usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; address public constant usdt = 0xdAC17F958D2ee523a2206206994597C13D831ec7; address public constant susd = 0x57Ab1ec28D129707052df4dF418D58a2D46d5f51; // pickle token address public constant pickle = 0x429881672B9AE42b8EbA0E26cD9C73711b891Ca5; // weth (for uniswapv2 xfers) address public constant weth = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // burn address address public constant burn = 0x000000000000000000000000000000000000dEaD; // dex address public univ2Router2 = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // How much CRV tokens to keep uint256 public keepCRV = 1000; uint256 public constant keepCRVMax = 10000; // Fees ~4.93% in total // - 2.94% performance fee // - 1.5% used to burn pickles // - 0.5% gas compensation fee (for caller) // 3% of 98% = 2.94% of original 100% uint256 public performanceFee = 300; uint256 public constant performanceMax = 10000; uint256 public burnFee = 150; uint256 public constant burnMax = 10000; uint256 public callerFee = 50; uint256 public constant callerMax = 10000; uint256 public withdrawalFee = 50; uint256 public constant withdrawalMax = 10000; address public governance; address public controller; address public strategist; address public timelock; // Proxy implementation // Once we get whitelisted by curve address public implementation; constructor( address _governance, address _strategist, address _controller, address _timelock ) public { governance = _governance; strategist = _strategist; controller = _controller; timelock = _timelock; } // **** Views **** function balanceOfWant() public view returns (uint256) { return IERC20(want).balanceOf(address(this)); } function balanceOfPool() public view returns (uint256) { return ICurveGauge(gauge).balanceOf(address(this)); } function balanceOf() public view returns (uint256) { return balanceOfWant().add(balanceOfPool()); } function getName() external pure returns (string memory) { return "StrategyCurveSCRVv3"; } function getHarvestable() external returns (uint256) { return ICurveGauge(gauge).claimable_tokens(address(this)); } function getMostPremiumStablecoin() public view returns (address, uint256) { uint256[] memory balances = new uint256[](4); balances[0] = ICurveFi(curve).balances(0); // DAI balances[1] = ICurveFi(curve).balances(1).mul(10**12); // USDC balances[2] = ICurveFi(curve).balances(2).mul(10**12); // USDT balances[3] = ICurveFi(curve).balances(3); // sUSD // DAI if ( balances[0] < balances[1] && balances[0] < balances[2] && balances[0] < balances[3] ) { return (dai, 0); } // USDC if ( balances[1] < balances[0] && balances[1] < balances[2] && balances[1] < balances[3] ) { return (usdc, 1); } // USDT if ( balances[2] < balances[0] && balances[2] < balances[1] && balances[2] < balances[3] ) { return (usdt, 2); } // SUSD if ( balances[3] < balances[0] && balances[3] < balances[1] && balances[3] < balances[2] ) { return (susd, 3); } // If they're somehow equal, we just want DAI return (dai, 0); } // **** Setters **** function setWithdrawalFee(uint256 _withdrawalFee) external { require(msg.sender == governance, "!governance"); withdrawalFee = _withdrawalFee; } function setPerformanceFee(uint256 _performanceFee) external { require(msg.sender == governance, "!governance"); performanceFee = _performanceFee; } function setCallerFee(uint256 _callerFee) external { require(msg.sender == governance, "!governance"); callerFee = _callerFee; } function setBurnFee(uint256 _burnFee) external { require(msg.sender == governance, "!governance"); burnFee = _burnFee; } function setStrategist(address _strategist) external { require(msg.sender == governance, "!governance"); strategist = _strategist; } function setGovernance(address _governance) external { require(msg.sender == governance, "!governance"); governance = _governance; } function setController(address _controller) external { require(msg.sender == governance, "!governance"); controller = _controller; } function setTimelock(address _timelock) external { require(msg.sender == timelock, "!timelock"); timelock = _timelock; } function setImplementation(address _implementation) external { require(msg.sender == timelock, "!timelock"); implementation = _implementation; } function setKeepCRV(uint256 _keepCRV) external { require(msg.sender == governance, "!governance"); keepCRV = _keepCRV; } // **** State Mutations **** function deposit() public { uint256 _want = IERC20(want).balanceOf(address(this)); if (_want > 0) { IERC20(want).safeApprove(gauge, 0); IERC20(want).approve(gauge, _want); ICurveGauge(gauge).deposit(_want); } } // Contoller only function for withdrawing for free // This is used to swap between jars function freeWithdraw(uint256 _amount) external { require(msg.sender == controller, "!controller"); uint256 _balance = IERC20(want).balanceOf(address(this)); if (_balance < _amount) { _amount = _withdrawSome(_amount.sub(_balance)); _amount = _amount.add(_balance); } IERC20(want).safeTransfer(msg.sender, _amount); } // Controller only function for creating additional rewards from dust function withdraw(IERC20 _asset) external returns (uint256 balance) { require(msg.sender == controller, "!controller"); require(want != address(_asset), "want"); require(crv != address(_asset), "crv"); require(snx != address(_asset), "snx"); require(dai != address(_asset), "dai"); require(usdc != address(_asset), "usdc"); require(usdt != address(_asset), "usdt"); require(susd != address(_asset), "susd"); balance = _asset.balanceOf(address(this)); _asset.safeTransfer(controller, balance); } // Withdraw partial funds, normally used with a jar withdrawal function withdraw(uint256 _amount) external { require(msg.sender == controller, "!controller"); uint256 _balance = IERC20(want).balanceOf(address(this)); if (_balance < _amount) { _amount = _withdrawSome(_amount.sub(_balance)); _amount = _amount.add(_balance); } uint256 _fee = _amount.mul(withdrawalFee).div(withdrawalMax); IERC20(want).safeTransfer(IController(controller).rewards(), _fee); address _jar = IController(controller).jars(address(want)); require(_jar != address(0), "!jar"); // additional protection so we don't burn the funds IERC20(want).safeTransfer(_jar, _amount.sub(_fee)); } // Withdraw all funds, normally used when migrating strategies function withdrawAll() external returns (uint256 balance) { require(msg.sender == controller, "!controller"); _withdrawAll(); balance = IERC20(want).balanceOf(address(this)); address _jar = IController(controller).jars(address(want)); require(_jar != address(0), "!jar"); // additional protection so we don't burn the funds IERC20(want).safeTransfer(_jar, balance); } function _withdrawAll() internal { ICurveGauge(gauge).withdraw( ICurveGauge(gauge).balanceOf(address(this)) ); } function _withdrawSome(uint256 _amount) internal returns (uint256) { ICurveGauge(gauge).withdraw(_amount); return _amount; } function brine() public { harvest(); } function harvest() public { // Anyone can harvest it at any given time. // I understand the possibility of being frontrun // But ETH is a dark forest, and I wanna see how this plays out // i.e. will be be heavily frontrunned? // if so, a new strategy will be deployed. // stablecoin we want to convert to (address to, uint256 toIndex) = getMostPremiumStablecoin(); // Collects crv tokens // Don't bother voting in v1 ICurveMintr(mintr).mint(gauge); uint256 _crv = IERC20(crv).balanceOf(address(this)); if (_crv > 0) { // x% is sent back to the rewards holder // to be used to lock up in as veCRV in a future date uint256 _keepCRV = _crv.mul(keepCRV).div(keepCRVMax); IERC20(crv).safeTransfer( IController(controller).rewards(), _keepCRV ); _crv = _crv.sub(_keepCRV); _swap(crv, to, _crv); } // Collects SNX tokens ICurveGauge(gauge).claim_rewards(address(this)); uint256 _snx = IERC20(snx).balanceOf(address(this)); if (_snx > 0) { _swap(snx, to, _snx); } // Adds liquidity to curve.fi's susd pool // to get back want (scrv) uint256 _to = IERC20(to).balanceOf(address(this)); if (_to > 0) { // Fees (in stablecoin) // 0.5% sent to msg.sender to refund gas uint256 _callerFee = _to.mul(callerFee).div(callerMax); IERC20(to).safeTransfer(msg.sender, _callerFee); // 1.5% used to buy and BURN pickles uint256 _burnFee = _to.mul(burnFee).div(burnMax); _swap(to, pickle, _burnFee); IERC20(pickle).transfer( burn, IERC20(pickle).balanceOf(address(this)) ); // Supply to curve to get sCRV _to = _to.sub(_callerFee).sub(_burnFee); IERC20(to).safeApprove(curve, 0); IERC20(to).safeApprove(curve, _to); uint256[4] memory liquidity; liquidity[toIndex] = _to; ICurveFi(curve).add_liquidity(liquidity, 0); } // We want to get back sCRV uint256 _want = IERC20(want).balanceOf(address(this)); if (_want > 0) { // Fees (in sCRV) // 3% performance fee // This 3% comes AFTER deducing 2% // So in reality its actually around 2.94% // 0.98 * 0.03 = 0.0294 IERC20(want).safeTransfer( IController(controller).rewards(), _want.mul(performanceFee).div(performanceMax) ); deposit(); } } function _swap( address _from, address _to, uint256 _amount ) internal { // Swap with uniswap IERC20(_from).safeApprove(univ2Router2, 0); IERC20(_from).safeApprove(univ2Router2, _amount); address[] memory path = new address[](3); path[0] = _from; path[1] = weth; path[2] = _to; UniswapRouterV2(univ2Router2).swapExactTokensForTokens( _amount, 0, path, address(this), now.add(60) ); } // Proxy pattern // Implementation is only settable by timelock function execute(bytes memory _data) public payable returns (bytes memory response) { address _target = implementation; require(_target != address(0), "!target"); // call contract in current context assembly { let succeeded := delegatecall( sub(gas(), 5000), _target, add(_data, 0x20), mload(_data), 0, 0 ) let size := returndatasize() response := mload(0x40) mstore( 0x40, add(response, and(add(add(size, 0x20), 0x1f), not(0x1f))) ) mstore(response, size) returndatacopy(add(response, 0x20), 0, size) switch iszero(succeeded) case 1 { // throw if delegatecall failed revert(add(response, 0x20), size) } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_timelock","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"brine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burn","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callerMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crv","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"freeWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHarvestable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMostPremiumStablecoin","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepCRV","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepCRVMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pickle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"setBurnFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_callerFee","type":"uint256"}],"name":"setCallerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"setImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_keepCRV","type":"uint256"}],"name":"setKeepCRV","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceFee","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawalFee","type":"uint256"}],"name":"setWithdrawalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"susd","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"univ2Router2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_asset","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600080546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790556103e860015561012c60025560966003556032600481905560055534801561005157600080fd5b5060405161340c38038061340c8339818101604052608081101561007457600080fd5b50805160208201516040830151606090930151600680546001600160a01b03199081166001600160a01b039586161790915560088054821693851693909317909255600780548316948416949094179093556009805490911691909216179055613329806100e36000396000f3fe60806040526004361061031a5760003560e01c8063853828b6116101ab578063cbf807bd116100f7578063e7d2799811610095578063f3887eee1161006f578063f3887eee14610970578063f4b9fa7514610985578063f77c47911461099a578063fce589d8146109af5761031a565b8063e7d2799814610931578063e9751f6b14610617578063eebeea4f146109465761031a565b8063d33219b4116100d1578063d33219b4146108d4578063d5c1ff7314610617578063d784d426146108e9578063e0af073f1461091c5761031a565b8063cbf807bd14610617578063d0e30db0146108aa578063d1e61dcb146108bf5761031a565b8063ab033ea911610164578063bdacb3031161013e578063bdacb3031461081a578063c1a3d44c1461084d578063c7b9d53014610862578063c9257775146108955761031a565b8063ab033ea9146107a8578063ac1e5025146107db578063b9e37489146108055761031a565b8063853828b6146106f7578063877887821461070c5780638bc7e8c41461072157806392eefe9b14610736578063955383bd14610769578063a6f19c84146107935761031a565b80634bf2c7c91161026a5780636a4874a111610223578063722713f7116101fd578063722713f7146106955780637cc79113146106175780637fef901a146106aa57806380efa080146106bf5761031a565b80636a4874a11461064157806370897b23146106565780637165485d146106805761031a565b80634bf2c7c91461057b57806351cff8d9146105a557806353aa7dcd146105d85780635aa6e675146106025780635c131d70146106175780635c60da1b1461062c5761031a565b80632e1a7d4d116102d75780633e413bee116102b15780633e413bee146105275780633fc8cef31461053c57806344df8e70146105515780634641257d146105665761031a565b80632e1a7d4d146104d15780632f48ab7d146104fd57806334d441d0146105125761031a565b80630547104d1461031f57806309c5eabe14610346578063115880861461046157806317d7de7c146104765780631f1fcd511461048b5780631fe4a686146104bc575b600080fd5b34801561032b57600080fd5b506103346109c4565b60408051918252519081900360200190f35b6103ec6004803603602081101561035c57600080fd5b81019060208101813564010000000081111561037757600080fd5b82018360208201111561038957600080fd5b803590602001918460018302840111640100000000831117156103ab57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a4b945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561042657818101518382015260200161040e565b50505050905090810190601f1680156104535780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046d57600080fd5b50610334610ae6565b34801561048257600080fd5b506103ec610b4f565b34801561049757600080fd5b506104a0610b7c565b604080516001600160a01b039092168252519081900360200190f35b3480156104c857600080fd5b506104a0610b8e565b3480156104dd57600080fd5b506104fb600480360360208110156104f457600080fd5b5035610b9d565b005b34801561050957600080fd5b506104a0610e3d565b34801561051e57600080fd5b50610334610e55565b34801561053357600080fd5b506104a0610e5b565b34801561054857600080fd5b506104a0610e73565b34801561055d57600080fd5b506104a0610e8b565b34801561057257600080fd5b506104fb610e91565b34801561058757600080fd5b506104fb6004803603602081101561059e57600080fd5b50356115dd565b3480156105b157600080fd5b50610334600480360360208110156105c857600080fd5b50356001600160a01b031661162f565b3480156105e457600080fd5b506104fb600480360360208110156105fb57600080fd5b5035611981565b34801561060e57600080fd5b506104a06119d3565b34801561062357600080fd5b506103346119e2565b34801561063857600080fd5b506104a06119e8565b34801561064d57600080fd5b506104a06119f7565b34801561066257600080fd5b506104fb6004803603602081101561067957600080fd5b5035611a0f565b34801561068c57600080fd5b506104a0611a61565b3480156106a157600080fd5b50610334611a79565b3480156106b657600080fd5b50610334611a99565b3480156106cb57600080fd5b506106d4611a9f565b604080516001600160a01b03909316835260208301919091528051918290030190f35b34801561070357600080fd5b50610334612022565b34801561071857600080fd5b506103346121df565b34801561072d57600080fd5b506103346121e5565b34801561074257600080fd5b506104fb6004803603602081101561075957600080fd5b50356001600160a01b03166121eb565b34801561077557600080fd5b506104fb6004803603602081101561078c57600080fd5b503561225a565b34801561079f57600080fd5b506104a06122ac565b3480156107b457600080fd5b506104fb600480360360208110156107cb57600080fd5b50356001600160a01b03166122c4565b3480156107e757600080fd5b506104fb600480360360208110156107fe57600080fd5b5035612333565b34801561081157600080fd5b506104a0612385565b34801561082657600080fd5b506104fb6004803603602081101561083d57600080fd5b50356001600160a01b0316612394565b34801561085957600080fd5b50610334612401565b34801561086e57600080fd5b506104fb6004803603602081101561088557600080fd5b50356001600160a01b0316612450565b3480156108a157600080fd5b506104a06124bf565b3480156108b657600080fd5b506104fb6124d7565b3480156108cb57600080fd5b506104a061268b565b3480156108e057600080fd5b506104a06126a3565b3480156108f557600080fd5b506104fb6004803603602081101561090c57600080fd5b50356001600160a01b03166126b2565b34801561092857600080fd5b506104fb61271f565b34801561093d57600080fd5b506104a0612729565b34801561095257600080fd5b506104fb6004803603602081101561096957600080fd5b5035612741565b34801561097c57600080fd5b506104a061284c565b34801561099157600080fd5b506104a0612864565b3480156109a657600080fd5b506104a061287c565b3480156109bb57600080fd5b5061033461288b565b60408051633313458360e01b8152306004820152905160009173a90996896660decc6e997655e065b237888578499163331345839160248082019260209290919082900301818787803b158015610a1a57600080fd5b505af1158015610a2e573d6000803e3d6000fd5b505050506040513d6020811015610a4457600080fd5b5051905090565b600a546060906001600160a01b031680610a96576040805162461bcd60e51b8152602060048201526007602482015266085d185c99d95d60ca1b604482015290519081900360640190fd5b600080845160208601846113885a03f43d6040519350601f19601f6020830101168401604052808452806000602086013e811560018114610ad657610add565b8160208601fd5b50505050919050565b604080516370a0823160e01b8152306004820152905160009173a90996896660decc6e997655e065b23788857849916370a0823191602480820192602092909190829003018186803b158015610b3b57600080fd5b505afa158015610a2e573d6000803e3d6000fd5b6040805180820190915260138152725374726174656779437572766553435256763360681b602082015290565b60008051602061325383398151915281565b6008546001600160a01b031681565b6007546001600160a01b03163314610bea576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b604080516370a0823160e01b81523060048201529051600091600080516020613253833981519152916370a0823191602480820192602092909190829003018186803b158015610c3957600080fd5b505afa158015610c4d573d6000803e3d6000fd5b505050506040513d6020811015610c6357600080fd5b5051905081811015610c9057610c81610c7c8383612891565b6128dc565b9150610c8d8282612956565b91505b6000610cb3612710610cad600554866129b090919063ffffffff16565b90612a09565b9050610d48600760009054906101000a90046001600160a01b03166001600160a01b0316639ec5a8946040518163ffffffff1660e01b815260040160206040518083038186803b158015610d0657600080fd5b505afa158015610d1a573d6000803e3d6000fd5b505050506040513d6020811015610d3057600080fd5b50516000805160206132538339815191529083612a4b565b60075460408051636535246160e11b8152600080516020613253833981519152600482015290516000926001600160a01b03169163ca6a48c2916024808301926020929190829003018186803b158015610da157600080fd5b505afa158015610db5573d6000803e3d6000fd5b505050506040513d6020811015610dcb57600080fd5b505190506001600160a01b038116610e13576040805162461bcd60e51b8152602060048083019190915260248201526310b530b960e11b604482015290519081900360640190fd5b610e3781610e218685612891565b6000805160206132538339815191529190612a4b565b50505050565b73dac17f958d2ee523a2206206994597c13d831ec781565b60045481565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61dead81565b600080610e9c611a9f565b9150915073d061d61a4d941c39e5453435b6345dc261c2fce06001600160a01b0316636a62784273a90996896660decc6e997655e065b237888578496040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610f1757600080fd5b505af1158015610f2b573d6000803e3d6000fd5b5050604080516370a0823160e01b815230600482015290516000935073d533a949740bb3306d119cc777fa900ba034cd5292506370a0823191602480820192602092909190829003018186803b158015610f8457600080fd5b505afa158015610f98573d6000803e3d6000fd5b505050506040513d6020811015610fae57600080fd5b50519050801561109d576000610fd5612710610cad600154856129b090919063ffffffff16565b9050611070600760009054906101000a90046001600160a01b03166001600160a01b0316639ec5a8946040518163ffffffff1660e01b815260040160206040518083038186803b15801561102857600080fd5b505afa15801561103c573d6000803e3d6000fd5b505050506040513d602081101561105257600080fd5b505173d533a949740bb3306d119cc777fa900ba034cd529083612a4b565b61107a8282612891565b915061109b73d533a949740bb3306d119cc777fa900ba034cd528584612aa2565b505b60408051634274debf60e11b8152306004820152905173a90996896660decc6e997655e065b23788857849916384e9bd7e91602480830192600092919082900301818387803b1580156110ef57600080fd5b505af1158015611103573d6000803e3d6000fd5b5050604080516370a0823160e01b815230600482015290516000935073c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f92506370a0823191602480820192602092909190829003018186803b15801561115c57600080fd5b505afa158015611170573d6000803e3d6000fd5b505050506040513d602081101561118657600080fd5b5051905080156111af576111af73c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f8583612aa2565b6000846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156111fe57600080fd5b505afa158015611212573d6000803e3d6000fd5b505050506040513d602081101561122857600080fd5b5051905080156114c257600061124f612710610cad600454856129b090919063ffffffff16565b90506112656001600160a01b0387163383612a4b565b6000611282612710610cad600354866129b090919063ffffffff16565b90506112a38773429881672b9ae42b8eba0e26cd9c73711b891ca583612aa2565b604080516370a0823160e01b8152306004820152905173429881672b9ae42b8eba0e26cd9c73711b891ca59163a9059cbb9161dead9184916370a0823191602480820192602092909190829003018186803b15801561130157600080fd5b505afa158015611315573d6000803e3d6000fd5b505050506040513d602081101561132b57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561137c57600080fd5b505af1158015611390573d6000803e3d6000fd5b505050506040513d60208110156113a657600080fd5b506113bd9050816113b78585612891565b90612891565b92506113e86001600160a01b03881673a5407eae9ba41422680e2e00537571bcc53efbfd6000612d13565b6114106001600160a01b03881673a5407eae9ba41422680e2e00537571bcc53efbfd85612d13565b611418613234565b8381886004811061142557fe5b602002015260405162a6cbcd60e21b815273a5407eae9ba41422680e2e00537571bcc53efbfd9063029b2f3490839060009060040180836080808383875b8381101561147b578181015183820152602001611463565b5050505090500182815260200192505050600060405180830381600087803b1580156114a657600080fd5b505af11580156114ba573d6000803e3d6000fd5b505050505050505b604080516370a0823160e01b81523060048201529051600091600080516020613253833981519152916370a0823191602480820192602092909190829003018186803b15801561151157600080fd5b505afa158015611525573d6000803e3d6000fd5b505050506040513d602081101561153b57600080fd5b5051905080156115d557600754604080516327b16a2560e21b815290516115cd926001600160a01b031691639ec5a894916004808301926020929190829003018186803b15801561158b57600080fd5b505afa15801561159f573d6000803e3d6000fd5b505050506040513d60208110156115b557600080fd5b5051600254610e219061271090610cad9086906129b0565b6115d56124d7565b505050505050565b6006546001600160a01b0316331461162a576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600355565b6007546000906001600160a01b0316331461167f576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6000805160206132538339815191526001600160a01b03831614156116d4576040805162461bcd60e51b815260206004808301919091526024820152631dd85b9d60e21b604482015290519081900360640190fd5b73d533a949740bb3306d119cc777fa900ba034cd526001600160a01b038316141561172c576040805162461bcd60e51b815260206004820152600360248201526231b93b60e91b604482015290519081900360640190fd5b73c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f6001600160a01b0383161415611784576040805162461bcd60e51b81526020600482015260036024820152620e6dcf60eb1b604482015290519081900360640190fd5b736b175474e89094c44da98b954eedeac495271d0f6001600160a01b03831614156117dc576040805162461bcd60e51b815260206004820152600360248201526264616960e81b604482015290519081900360640190fd5b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0383161415611837576040805162461bcd60e51b815260206004808301919091526024820152637573646360e01b604482015290519081900360640190fd5b73dac17f958d2ee523a2206206994597c13d831ec76001600160a01b0383161415611892576040805162461bcd60e51b815260206004808301919091526024820152631d5cd91d60e21b604482015290519081900360640190fd5b7357ab1ec28d129707052df4df418d58a2d46d5f516001600160a01b03831614156118ed576040805162461bcd60e51b815260206004808301919091526024820152631cdd5cd960e21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561193357600080fd5b505afa158015611947573d6000803e3d6000fd5b505050506040513d602081101561195d57600080fd5b505160075490915061197c906001600160a01b03848116911683612a4b565b919050565b6006546001600160a01b031633146119ce576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600455565b6006546001600160a01b031681565b61271081565b600a546001600160a01b031681565b73d533a949740bb3306d119cc777fa900ba034cd5281565b6006546001600160a01b03163314611a5c576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600255565b73a5407eae9ba41422680e2e00537571bcc53efbfd81565b6000611a94611a86610ae6565b611a8e612401565b90612956565b905090565b60015481565b60408051600480825260a0820190925260009182916060916020820160808036833750506040805162cb501b60e31b815260006004820152905192935073a5407eae9ba41422680e2e00537571bcc53efbfd9263065a80d892506024808301926020929190829003018186803b158015611b1857600080fd5b505afa158015611b2c573d6000803e3d6000fd5b505050506040513d6020811015611b4257600080fd5b505181518290600090611b5157fe5b602002602001018181525050611bf164e8d4a5100073a5407eae9ba41422680e2e00537571bcc53efbfd6001600160a01b031663065a80d860016040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611bbf57600080fd5b505afa158015611bd3573d6000803e3d6000fd5b505050506040513d6020811015611be957600080fd5b5051906129b0565b81600181518110611bfe57fe5b602002602001018181525050611c6c64e8d4a5100073a5407eae9ba41422680e2e00537571bcc53efbfd6001600160a01b031663065a80d860026040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611bbf57600080fd5b81600281518110611c7957fe5b60200260200101818152505073a5407eae9ba41422680e2e00537571bcc53efbfd6001600160a01b031663065a80d860036040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611cde57600080fd5b505afa158015611cf2573d6000803e3d6000fd5b505050506040513d6020811015611d0857600080fd5b5051815182906003908110611d1957fe5b60200260200101818152505080600181518110611d3257fe5b602002602001015181600081518110611d4757fe5b6020026020010151108015611d83575080600281518110611d6457fe5b602002602001015181600081518110611d7957fe5b6020026020010151105b8015611db6575080600381518110611d9757fe5b602002602001015181600081518110611dac57fe5b6020026020010151105b15611ddc57736b175474e89094c44da98b954eedeac495271d0f6000925092505061201e565b80600081518110611de957fe5b602002602001015181600181518110611dfe57fe5b6020026020010151108015611e3a575080600281518110611e1b57fe5b602002602001015181600181518110611e3057fe5b6020026020010151105b8015611e6d575080600381518110611e4e57fe5b602002602001015181600181518110611e6357fe5b6020026020010151105b15611e935773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001925092505061201e565b80600081518110611ea057fe5b602002602001015181600281518110611eb557fe5b6020026020010151108015611ef1575080600181518110611ed257fe5b602002602001015181600281518110611ee757fe5b6020026020010151105b8015611f24575080600381518110611f0557fe5b602002602001015181600281518110611f1a57fe5b6020026020010151105b15611f4a5773dac17f958d2ee523a2206206994597c13d831ec76002925092505061201e565b80600081518110611f5757fe5b602002602001015181600381518110611f6c57fe5b6020026020010151108015611fa8575080600181518110611f8957fe5b602002602001015181600381518110611f9e57fe5b6020026020010151105b8015611fdb575080600281518110611fbc57fe5b602002602001015181600381518110611fd157fe5b6020026020010151105b15612001577357ab1ec28d129707052df4df418d58a2d46d5f516003925092505061201e565b736b175474e89094c44da98b954eedeac495271d0f600092509250505b9091565b6007546000906001600160a01b03163314612072576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b61207a612e26565b604080516370a0823160e01b81523060048201529051600080516020613253833981519152916370a08231916024808301926020929190829003018186803b1580156120c557600080fd5b505afa1580156120d9573d6000803e3d6000fd5b505050506040513d60208110156120ef57600080fd5b505160075460408051636535246160e11b8152600080516020613253833981519152600482015290519293506000926001600160a01b039092169163ca6a48c291602480820192602092909190829003018186803b15801561215057600080fd5b505afa158015612164573d6000803e3d6000fd5b505050506040513d602081101561217a57600080fd5b505190506001600160a01b0381166121c2576040805162461bcd60e51b8152602060048083019190915260248201526310b530b960e11b604482015290519081900360640190fd5b6121db6000805160206132538339815191528284612a4b565b5090565b60025481565b60055481565b6006546001600160a01b03163314612238576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146122a7576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600155565b73a90996896660decc6e997655e065b2378885784981565b6006546001600160a01b03163314612311576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314612380576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600555565b6000546001600160a01b031681565b6009546001600160a01b031633146123df576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b604080516370a0823160e01b81523060048201529051600091600080516020613253833981519152916370a0823191602480820192602092909190829003018186803b158015610b3b57600080fd5b6006546001600160a01b0316331461249d576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b7357ab1ec28d129707052df4df418d58a2d46d5f5181565b604080516370a0823160e01b81523060048201529051600091600080516020613253833981519152916370a0823191602480820192602092909190829003018186803b15801561252657600080fd5b505afa15801561253a573d6000803e3d6000fd5b505050506040513d602081101561255057600080fd5b5051905080156126885761258860008051602061325383398151915273a90996896660decc6e997655e065b237888578496000612d13565b6040805163095ea7b360e01b815273a90996896660decc6e997655e065b2378885784960048201526024810183905290516000805160206132538339815191529163095ea7b39160448083019260209291908290030181600087803b1580156125f057600080fd5b505af1158015612604573d6000803e3d6000fd5b505050506040513d602081101561261a57600080fd5b50506040805163b6b55f2560e01b815260048101839052905173a90996896660decc6e997655e065b237888578499163b6b55f2591602480830192600092919082900301818387803b15801561266f57600080fd5b505af1158015612683573d6000803e3d6000fd5b505050505b50565b73d061d61a4d941c39e5453435b6345dc261c2fce081565b6009546001600160a01b031681565b6009546001600160a01b031633146126fd576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b612727610e91565b565b73c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f81565b6007546001600160a01b0316331461278e576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b604080516370a0823160e01b81523060048201529051600091600080516020613253833981519152916370a0823191602480820192602092909190829003018186803b1580156127dd57600080fd5b505afa1580156127f1573d6000803e3d6000fd5b505050506040513d602081101561280757600080fd5b505190508181101561282f57612820610c7c8383612891565b915061282c8282612956565b91505b6128486000805160206132538339815191523384612a4b565b5050565b73429881672b9ae42b8eba0e26cd9c73711b891ca581565b736b175474e89094c44da98b954eedeac495271d0f81565b6007546001600160a01b031681565b60035481565b60006128d383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612efd565b90505b92915050565b600073a90996896660decc6e997655e065b237888578496001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561293857600080fd5b505af115801561294c573d6000803e3d6000fd5b5093949350505050565b6000828201838110156128d3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000826129bf575060006128d6565b828202828482816129cc57fe5b04146128d35760405162461bcd60e51b81526004018080602001828103825260218152602001806132736021913960400191505060405180910390fd5b60006128d383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f94565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612a9d908490612ff9565b505050565b60008054612abd916001600160a01b03868116921690612d13565b600054612ad7906001600160a01b03858116911683612d13565b604080516003808252608082019092526060916020820183803683370190505090508381600081518110612b0757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612b4957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508281600281518110612b7757fe5b6001600160a01b03928316602091820292909201015260008054909116906338ed17399084908430612baa42603c612956565b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015612c1a578181015183820152602001612c02565b505050509050019650505050505050600060405180830381600087803b158015612c4357600080fd5b505af1158015612c57573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612c8057600080fd5b8101908080516040519392919084640100000000821115612ca057600080fd5b908301906020820185811115612cb557600080fd5b8251866020820283011164010000000082111715612cd257600080fd5b82525081516020918201928201910280838360005b83811015612cff578181015183820152602001612ce7565b505050509050016040525050505050505050565b801580612d99575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612d6b57600080fd5b505afa158015612d7f573d6000803e3d6000fd5b505050506040513d6020811015612d9557600080fd5b5051155b612dd45760405162461bcd60e51b81526004018080602001828103825260368152602001806132be6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612a9d908490612ff9565b604080516370a0823160e01b8152306004820152905173a90996896660decc6e997655e065b2378885784991632e1a7d4d9183916370a08231916024808301926020929190829003018186803b158015612e7f57600080fd5b505afa158015612e93573d6000803e3d6000fd5b505050506040513d6020811015612ea957600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015612ee957600080fd5b505af1158015610e37573d6000803e3d6000fd5b60008184841115612f8c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612f51578181015183820152602001612f39565b50505050905090810190601f168015612f7e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183612fe35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612f51578181015183820152602001612f39565b506000838581612fef57fe5b0495945050505050565b606061304e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166130aa9092919063ffffffff16565b805190915015612a9d5780806020019051602081101561306d57600080fd5b5051612a9d5760405162461bcd60e51b815260040180806020018281038252602a815260200180613294602a913960400191505060405180910390fd5b60606130b984846000856130c1565b949350505050565b60606130cc8561322e565b61311d576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061315c5780518252601f19909201916020918201910161313d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146131be576040519150601f19603f3d011682016040523d82523d6000602084013e6131c3565b606091505b509150915081156131d75791506130b99050565b8051156131e75780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612f51578181015183820152602001612f39565b3b151590565b6040518060800160405280600490602082028036833750919291505056fe000000000000000000000000c25a3a3b969415c80451098fa907ec722572917f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212203a33ea826c78551b251abbb3593e88f59d44f1923a0072af8d6787a8a1480bec64736f6c634300060c00330000000000000000000000009d074e37d408542fd38be78848e8814afb38db17000000000000000000000000907d9b32654b8d43e8737e0291ad9bfcce01dad6000000000000000000000000e106dbb9aeb3860f935f29f2b29826f53ed9f47e000000000000000000000000d92c7faa0ca0e6ae4918f3a83d9832d9caeaa0d3
Deployed Bytecode
0x60806040526004361061031a5760003560e01c8063853828b6116101ab578063cbf807bd116100f7578063e7d2799811610095578063f3887eee1161006f578063f3887eee14610970578063f4b9fa7514610985578063f77c47911461099a578063fce589d8146109af5761031a565b8063e7d2799814610931578063e9751f6b14610617578063eebeea4f146109465761031a565b8063d33219b4116100d1578063d33219b4146108d4578063d5c1ff7314610617578063d784d426146108e9578063e0af073f1461091c5761031a565b8063cbf807bd14610617578063d0e30db0146108aa578063d1e61dcb146108bf5761031a565b8063ab033ea911610164578063bdacb3031161013e578063bdacb3031461081a578063c1a3d44c1461084d578063c7b9d53014610862578063c9257775146108955761031a565b8063ab033ea9146107a8578063ac1e5025146107db578063b9e37489146108055761031a565b8063853828b6146106f7578063877887821461070c5780638bc7e8c41461072157806392eefe9b14610736578063955383bd14610769578063a6f19c84146107935761031a565b80634bf2c7c91161026a5780636a4874a111610223578063722713f7116101fd578063722713f7146106955780637cc79113146106175780637fef901a146106aa57806380efa080146106bf5761031a565b80636a4874a11461064157806370897b23146106565780637165485d146106805761031a565b80634bf2c7c91461057b57806351cff8d9146105a557806353aa7dcd146105d85780635aa6e675146106025780635c131d70146106175780635c60da1b1461062c5761031a565b80632e1a7d4d116102d75780633e413bee116102b15780633e413bee146105275780633fc8cef31461053c57806344df8e70146105515780634641257d146105665761031a565b80632e1a7d4d146104d15780632f48ab7d146104fd57806334d441d0146105125761031a565b80630547104d1461031f57806309c5eabe14610346578063115880861461046157806317d7de7c146104765780631f1fcd511461048b5780631fe4a686146104bc575b600080fd5b34801561032b57600080fd5b506103346109c4565b60408051918252519081900360200190f35b6103ec6004803603602081101561035c57600080fd5b81019060208101813564010000000081111561037757600080fd5b82018360208201111561038957600080fd5b803590602001918460018302840111640100000000831117156103ab57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a4b945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561042657818101518382015260200161040e565b50505050905090810190601f1680156104535780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046d57600080fd5b50610334610ae6565b34801561048257600080fd5b506103ec610b4f565b34801561049757600080fd5b506104a0610b7c565b604080516001600160a01b039092168252519081900360200190f35b3480156104c857600080fd5b506104a0610b8e565b3480156104dd57600080fd5b506104fb600480360360208110156104f457600080fd5b5035610b9d565b005b34801561050957600080fd5b506104a0610e3d565b34801561051e57600080fd5b50610334610e55565b34801561053357600080fd5b506104a0610e5b565b34801561054857600080fd5b506104a0610e73565b34801561055d57600080fd5b506104a0610e8b565b34801561057257600080fd5b506104fb610e91565b34801561058757600080fd5b506104fb6004803603602081101561059e57600080fd5b50356115dd565b3480156105b157600080fd5b50610334600480360360208110156105c857600080fd5b50356001600160a01b031661162f565b3480156105e457600080fd5b506104fb600480360360208110156105fb57600080fd5b5035611981565b34801561060e57600080fd5b506104a06119d3565b34801561062357600080fd5b506103346119e2565b34801561063857600080fd5b506104a06119e8565b34801561064d57600080fd5b506104a06119f7565b34801561066257600080fd5b506104fb6004803603602081101561067957600080fd5b5035611a0f565b34801561068c57600080fd5b506104a0611a61565b3480156106a157600080fd5b50610334611a79565b3480156106b657600080fd5b50610334611a99565b3480156106cb57600080fd5b506106d4611a9f565b604080516001600160a01b03909316835260208301919091528051918290030190f35b34801561070357600080fd5b50610334612022565b34801561071857600080fd5b506103346121df565b34801561072d57600080fd5b506103346121e5565b34801561074257600080fd5b506104fb6004803603602081101561075957600080fd5b50356001600160a01b03166121eb565b34801561077557600080fd5b506104fb6004803603602081101561078c57600080fd5b503561225a565b34801561079f57600080fd5b506104a06122ac565b3480156107b457600080fd5b506104fb600480360360208110156107cb57600080fd5b50356001600160a01b03166122c4565b3480156107e757600080fd5b506104fb600480360360208110156107fe57600080fd5b5035612333565b34801561081157600080fd5b506104a0612385565b34801561082657600080fd5b506104fb6004803603602081101561083d57600080fd5b50356001600160a01b0316612394565b34801561085957600080fd5b50610334612401565b34801561086e57600080fd5b506104fb6004803603602081101561088557600080fd5b50356001600160a01b0316612450565b3480156108a157600080fd5b506104a06124bf565b3480156108b657600080fd5b506104fb6124d7565b3480156108cb57600080fd5b506104a061268b565b3480156108e057600080fd5b506104a06126a3565b3480156108f557600080fd5b506104fb6004803603602081101561090c57600080fd5b50356001600160a01b03166126b2565b34801561092857600080fd5b506104fb61271f565b34801561093d57600080fd5b506104a0612729565b34801561095257600080fd5b506104fb6004803603602081101561096957600080fd5b5035612741565b34801561097c57600080fd5b506104a061284c565b34801561099157600080fd5b506104a0612864565b3480156109a657600080fd5b506104a061287c565b3480156109bb57600080fd5b5061033461288b565b60408051633313458360e01b8152306004820152905160009173a90996896660decc6e997655e065b237888578499163331345839160248082019260209290919082900301818787803b158015610a1a57600080fd5b505af1158015610a2e573d6000803e3d6000fd5b505050506040513d6020811015610a4457600080fd5b5051905090565b600a546060906001600160a01b031680610a96576040805162461bcd60e51b8152602060048201526007602482015266085d185c99d95d60ca1b604482015290519081900360640190fd5b600080845160208601846113885a03f43d6040519350601f19601f6020830101168401604052808452806000602086013e811560018114610ad657610add565b8160208601fd5b50505050919050565b604080516370a0823160e01b8152306004820152905160009173a90996896660decc6e997655e065b23788857849916370a0823191602480820192602092909190829003018186803b158015610b3b57600080fd5b505afa158015610a2e573d6000803e3d6000fd5b6040805180820190915260138152725374726174656779437572766553435256763360681b602082015290565b60008051602061325383398151915281565b6008546001600160a01b031681565b6007546001600160a01b03163314610bea576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b604080516370a0823160e01b81523060048201529051600091600080516020613253833981519152916370a0823191602480820192602092909190829003018186803b158015610c3957600080fd5b505afa158015610c4d573d6000803e3d6000fd5b505050506040513d6020811015610c6357600080fd5b5051905081811015610c9057610c81610c7c8383612891565b6128dc565b9150610c8d8282612956565b91505b6000610cb3612710610cad600554866129b090919063ffffffff16565b90612a09565b9050610d48600760009054906101000a90046001600160a01b03166001600160a01b0316639ec5a8946040518163ffffffff1660e01b815260040160206040518083038186803b158015610d0657600080fd5b505afa158015610d1a573d6000803e3d6000fd5b505050506040513d6020811015610d3057600080fd5b50516000805160206132538339815191529083612a4b565b60075460408051636535246160e11b8152600080516020613253833981519152600482015290516000926001600160a01b03169163ca6a48c2916024808301926020929190829003018186803b158015610da157600080fd5b505afa158015610db5573d6000803e3d6000fd5b505050506040513d6020811015610dcb57600080fd5b505190506001600160a01b038116610e13576040805162461bcd60e51b8152602060048083019190915260248201526310b530b960e11b604482015290519081900360640190fd5b610e3781610e218685612891565b6000805160206132538339815191529190612a4b565b50505050565b73dac17f958d2ee523a2206206994597c13d831ec781565b60045481565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61dead81565b600080610e9c611a9f565b9150915073d061d61a4d941c39e5453435b6345dc261c2fce06001600160a01b0316636a62784273a90996896660decc6e997655e065b237888578496040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610f1757600080fd5b505af1158015610f2b573d6000803e3d6000fd5b5050604080516370a0823160e01b815230600482015290516000935073d533a949740bb3306d119cc777fa900ba034cd5292506370a0823191602480820192602092909190829003018186803b158015610f8457600080fd5b505afa158015610f98573d6000803e3d6000fd5b505050506040513d6020811015610fae57600080fd5b50519050801561109d576000610fd5612710610cad600154856129b090919063ffffffff16565b9050611070600760009054906101000a90046001600160a01b03166001600160a01b0316639ec5a8946040518163ffffffff1660e01b815260040160206040518083038186803b15801561102857600080fd5b505afa15801561103c573d6000803e3d6000fd5b505050506040513d602081101561105257600080fd5b505173d533a949740bb3306d119cc777fa900ba034cd529083612a4b565b61107a8282612891565b915061109b73d533a949740bb3306d119cc777fa900ba034cd528584612aa2565b505b60408051634274debf60e11b8152306004820152905173a90996896660decc6e997655e065b23788857849916384e9bd7e91602480830192600092919082900301818387803b1580156110ef57600080fd5b505af1158015611103573d6000803e3d6000fd5b5050604080516370a0823160e01b815230600482015290516000935073c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f92506370a0823191602480820192602092909190829003018186803b15801561115c57600080fd5b505afa158015611170573d6000803e3d6000fd5b505050506040513d602081101561118657600080fd5b5051905080156111af576111af73c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f8583612aa2565b6000846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156111fe57600080fd5b505afa158015611212573d6000803e3d6000fd5b505050506040513d602081101561122857600080fd5b5051905080156114c257600061124f612710610cad600454856129b090919063ffffffff16565b90506112656001600160a01b0387163383612a4b565b6000611282612710610cad600354866129b090919063ffffffff16565b90506112a38773429881672b9ae42b8eba0e26cd9c73711b891ca583612aa2565b604080516370a0823160e01b8152306004820152905173429881672b9ae42b8eba0e26cd9c73711b891ca59163a9059cbb9161dead9184916370a0823191602480820192602092909190829003018186803b15801561130157600080fd5b505afa158015611315573d6000803e3d6000fd5b505050506040513d602081101561132b57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561137c57600080fd5b505af1158015611390573d6000803e3d6000fd5b505050506040513d60208110156113a657600080fd5b506113bd9050816113b78585612891565b90612891565b92506113e86001600160a01b03881673a5407eae9ba41422680e2e00537571bcc53efbfd6000612d13565b6114106001600160a01b03881673a5407eae9ba41422680e2e00537571bcc53efbfd85612d13565b611418613234565b8381886004811061142557fe5b602002015260405162a6cbcd60e21b815273a5407eae9ba41422680e2e00537571bcc53efbfd9063029b2f3490839060009060040180836080808383875b8381101561147b578181015183820152602001611463565b5050505090500182815260200192505050600060405180830381600087803b1580156114a657600080fd5b505af11580156114ba573d6000803e3d6000fd5b505050505050505b604080516370a0823160e01b81523060048201529051600091600080516020613253833981519152916370a0823191602480820192602092909190829003018186803b15801561151157600080fd5b505afa158015611525573d6000803e3d6000fd5b505050506040513d602081101561153b57600080fd5b5051905080156115d557600754604080516327b16a2560e21b815290516115cd926001600160a01b031691639ec5a894916004808301926020929190829003018186803b15801561158b57600080fd5b505afa15801561159f573d6000803e3d6000fd5b505050506040513d60208110156115b557600080fd5b5051600254610e219061271090610cad9086906129b0565b6115d56124d7565b505050505050565b6006546001600160a01b0316331461162a576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600355565b6007546000906001600160a01b0316331461167f576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6000805160206132538339815191526001600160a01b03831614156116d4576040805162461bcd60e51b815260206004808301919091526024820152631dd85b9d60e21b604482015290519081900360640190fd5b73d533a949740bb3306d119cc777fa900ba034cd526001600160a01b038316141561172c576040805162461bcd60e51b815260206004820152600360248201526231b93b60e91b604482015290519081900360640190fd5b73c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f6001600160a01b0383161415611784576040805162461bcd60e51b81526020600482015260036024820152620e6dcf60eb1b604482015290519081900360640190fd5b736b175474e89094c44da98b954eedeac495271d0f6001600160a01b03831614156117dc576040805162461bcd60e51b815260206004820152600360248201526264616960e81b604482015290519081900360640190fd5b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0383161415611837576040805162461bcd60e51b815260206004808301919091526024820152637573646360e01b604482015290519081900360640190fd5b73dac17f958d2ee523a2206206994597c13d831ec76001600160a01b0383161415611892576040805162461bcd60e51b815260206004808301919091526024820152631d5cd91d60e21b604482015290519081900360640190fd5b7357ab1ec28d129707052df4df418d58a2d46d5f516001600160a01b03831614156118ed576040805162461bcd60e51b815260206004808301919091526024820152631cdd5cd960e21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561193357600080fd5b505afa158015611947573d6000803e3d6000fd5b505050506040513d602081101561195d57600080fd5b505160075490915061197c906001600160a01b03848116911683612a4b565b919050565b6006546001600160a01b031633146119ce576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600455565b6006546001600160a01b031681565b61271081565b600a546001600160a01b031681565b73d533a949740bb3306d119cc777fa900ba034cd5281565b6006546001600160a01b03163314611a5c576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600255565b73a5407eae9ba41422680e2e00537571bcc53efbfd81565b6000611a94611a86610ae6565b611a8e612401565b90612956565b905090565b60015481565b60408051600480825260a0820190925260009182916060916020820160808036833750506040805162cb501b60e31b815260006004820152905192935073a5407eae9ba41422680e2e00537571bcc53efbfd9263065a80d892506024808301926020929190829003018186803b158015611b1857600080fd5b505afa158015611b2c573d6000803e3d6000fd5b505050506040513d6020811015611b4257600080fd5b505181518290600090611b5157fe5b602002602001018181525050611bf164e8d4a5100073a5407eae9ba41422680e2e00537571bcc53efbfd6001600160a01b031663065a80d860016040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611bbf57600080fd5b505afa158015611bd3573d6000803e3d6000fd5b505050506040513d6020811015611be957600080fd5b5051906129b0565b81600181518110611bfe57fe5b602002602001018181525050611c6c64e8d4a5100073a5407eae9ba41422680e2e00537571bcc53efbfd6001600160a01b031663065a80d860026040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611bbf57600080fd5b81600281518110611c7957fe5b60200260200101818152505073a5407eae9ba41422680e2e00537571bcc53efbfd6001600160a01b031663065a80d860036040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611cde57600080fd5b505afa158015611cf2573d6000803e3d6000fd5b505050506040513d6020811015611d0857600080fd5b5051815182906003908110611d1957fe5b60200260200101818152505080600181518110611d3257fe5b602002602001015181600081518110611d4757fe5b6020026020010151108015611d83575080600281518110611d6457fe5b602002602001015181600081518110611d7957fe5b6020026020010151105b8015611db6575080600381518110611d9757fe5b602002602001015181600081518110611dac57fe5b6020026020010151105b15611ddc57736b175474e89094c44da98b954eedeac495271d0f6000925092505061201e565b80600081518110611de957fe5b602002602001015181600181518110611dfe57fe5b6020026020010151108015611e3a575080600281518110611e1b57fe5b602002602001015181600181518110611e3057fe5b6020026020010151105b8015611e6d575080600381518110611e4e57fe5b602002602001015181600181518110611e6357fe5b6020026020010151105b15611e935773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001925092505061201e565b80600081518110611ea057fe5b602002602001015181600281518110611eb557fe5b6020026020010151108015611ef1575080600181518110611ed257fe5b602002602001015181600281518110611ee757fe5b6020026020010151105b8015611f24575080600381518110611f0557fe5b602002602001015181600281518110611f1a57fe5b6020026020010151105b15611f4a5773dac17f958d2ee523a2206206994597c13d831ec76002925092505061201e565b80600081518110611f5757fe5b602002602001015181600381518110611f6c57fe5b6020026020010151108015611fa8575080600181518110611f8957fe5b602002602001015181600381518110611f9e57fe5b6020026020010151105b8015611fdb575080600281518110611fbc57fe5b602002602001015181600381518110611fd157fe5b6020026020010151105b15612001577357ab1ec28d129707052df4df418d58a2d46d5f516003925092505061201e565b736b175474e89094c44da98b954eedeac495271d0f600092509250505b9091565b6007546000906001600160a01b03163314612072576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b61207a612e26565b604080516370a0823160e01b81523060048201529051600080516020613253833981519152916370a08231916024808301926020929190829003018186803b1580156120c557600080fd5b505afa1580156120d9573d6000803e3d6000fd5b505050506040513d60208110156120ef57600080fd5b505160075460408051636535246160e11b8152600080516020613253833981519152600482015290519293506000926001600160a01b039092169163ca6a48c291602480820192602092909190829003018186803b15801561215057600080fd5b505afa158015612164573d6000803e3d6000fd5b505050506040513d602081101561217a57600080fd5b505190506001600160a01b0381166121c2576040805162461bcd60e51b8152602060048083019190915260248201526310b530b960e11b604482015290519081900360640190fd5b6121db6000805160206132538339815191528284612a4b565b5090565b60025481565b60055481565b6006546001600160a01b03163314612238576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146122a7576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600155565b73a90996896660decc6e997655e065b2378885784981565b6006546001600160a01b03163314612311576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314612380576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600555565b6000546001600160a01b031681565b6009546001600160a01b031633146123df576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b604080516370a0823160e01b81523060048201529051600091600080516020613253833981519152916370a0823191602480820192602092909190829003018186803b158015610b3b57600080fd5b6006546001600160a01b0316331461249d576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b7357ab1ec28d129707052df4df418d58a2d46d5f5181565b604080516370a0823160e01b81523060048201529051600091600080516020613253833981519152916370a0823191602480820192602092909190829003018186803b15801561252657600080fd5b505afa15801561253a573d6000803e3d6000fd5b505050506040513d602081101561255057600080fd5b5051905080156126885761258860008051602061325383398151915273a90996896660decc6e997655e065b237888578496000612d13565b6040805163095ea7b360e01b815273a90996896660decc6e997655e065b2378885784960048201526024810183905290516000805160206132538339815191529163095ea7b39160448083019260209291908290030181600087803b1580156125f057600080fd5b505af1158015612604573d6000803e3d6000fd5b505050506040513d602081101561261a57600080fd5b50506040805163b6b55f2560e01b815260048101839052905173a90996896660decc6e997655e065b237888578499163b6b55f2591602480830192600092919082900301818387803b15801561266f57600080fd5b505af1158015612683573d6000803e3d6000fd5b505050505b50565b73d061d61a4d941c39e5453435b6345dc261c2fce081565b6009546001600160a01b031681565b6009546001600160a01b031633146126fd576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b612727610e91565b565b73c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f81565b6007546001600160a01b0316331461278e576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b604080516370a0823160e01b81523060048201529051600091600080516020613253833981519152916370a0823191602480820192602092909190829003018186803b1580156127dd57600080fd5b505afa1580156127f1573d6000803e3d6000fd5b505050506040513d602081101561280757600080fd5b505190508181101561282f57612820610c7c8383612891565b915061282c8282612956565b91505b6128486000805160206132538339815191523384612a4b565b5050565b73429881672b9ae42b8eba0e26cd9c73711b891ca581565b736b175474e89094c44da98b954eedeac495271d0f81565b6007546001600160a01b031681565b60035481565b60006128d383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612efd565b90505b92915050565b600073a90996896660decc6e997655e065b237888578496001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561293857600080fd5b505af115801561294c573d6000803e3d6000fd5b5093949350505050565b6000828201838110156128d3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000826129bf575060006128d6565b828202828482816129cc57fe5b04146128d35760405162461bcd60e51b81526004018080602001828103825260218152602001806132736021913960400191505060405180910390fd5b60006128d383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f94565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612a9d908490612ff9565b505050565b60008054612abd916001600160a01b03868116921690612d13565b600054612ad7906001600160a01b03858116911683612d13565b604080516003808252608082019092526060916020820183803683370190505090508381600081518110612b0757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612b4957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508281600281518110612b7757fe5b6001600160a01b03928316602091820292909201015260008054909116906338ed17399084908430612baa42603c612956565b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015612c1a578181015183820152602001612c02565b505050509050019650505050505050600060405180830381600087803b158015612c4357600080fd5b505af1158015612c57573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612c8057600080fd5b8101908080516040519392919084640100000000821115612ca057600080fd5b908301906020820185811115612cb557600080fd5b8251866020820283011164010000000082111715612cd257600080fd5b82525081516020918201928201910280838360005b83811015612cff578181015183820152602001612ce7565b505050509050016040525050505050505050565b801580612d99575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612d6b57600080fd5b505afa158015612d7f573d6000803e3d6000fd5b505050506040513d6020811015612d9557600080fd5b5051155b612dd45760405162461bcd60e51b81526004018080602001828103825260368152602001806132be6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612a9d908490612ff9565b604080516370a0823160e01b8152306004820152905173a90996896660decc6e997655e065b2378885784991632e1a7d4d9183916370a08231916024808301926020929190829003018186803b158015612e7f57600080fd5b505afa158015612e93573d6000803e3d6000fd5b505050506040513d6020811015612ea957600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015612ee957600080fd5b505af1158015610e37573d6000803e3d6000fd5b60008184841115612f8c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612f51578181015183820152602001612f39565b50505050905090810190601f168015612f7e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183612fe35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612f51578181015183820152602001612f39565b506000838581612fef57fe5b0495945050505050565b606061304e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166130aa9092919063ffffffff16565b805190915015612a9d5780806020019051602081101561306d57600080fd5b5051612a9d5760405162461bcd60e51b815260040180806020018281038252602a815260200180613294602a913960400191505060405180910390fd5b60606130b984846000856130c1565b949350505050565b60606130cc8561322e565b61311d576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061315c5780518252601f19909201916020918201910161313d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146131be576040519150601f19603f3d011682016040523d82523d6000602084013e6131c3565b606091505b509150915081156131d75791506130b99050565b8051156131e75780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612f51578181015183820152602001612f39565b3b151590565b6040518060800160405280600490602082028036833750919291505056fe000000000000000000000000c25a3a3b969415c80451098fa907ec722572917f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212203a33ea826c78551b251abbb3593e88f59d44f1923a0072af8d6787a8a1480bec64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009d074e37d408542fd38be78848e8814afb38db17000000000000000000000000907d9b32654b8d43e8737e0291ad9bfcce01dad6000000000000000000000000e106dbb9aeb3860f935f29f2b29826f53ed9f47e000000000000000000000000d92c7faa0ca0e6ae4918f3a83d9832d9caeaa0d3
-----Decoded View---------------
Arg [0] : _governance (address): 0x9d074E37d408542FD38be78848e8814AFB38db17
Arg [1] : _strategist (address): 0x907D9B32654B8D43e8737E0291Ad9bfcce01DAD6
Arg [2] : _controller (address): 0xE106DBb9AeB3860f935f29f2B29826F53ed9f47e
Arg [3] : _timelock (address): 0xD92c7fAa0Ca0e6AE4918f3a83d9832d9CAEAA0d3
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000009d074e37d408542fd38be78848e8814afb38db17
Arg [1] : 000000000000000000000000907d9b32654b8d43e8737e0291ad9bfcce01dad6
Arg [2] : 000000000000000000000000e106dbb9aeb3860f935f29f2b29826f53ed9f47e
Arg [3] : 000000000000000000000000d92c7faa0ca0e6ae4918f3a83d9832d9caeaa0d3
Deployed Bytecode Sourcemap
40123:14119:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43411:129;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;53213:1026;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53213:1026:0;;-1:-1:-1;53213:1026:0;;-1:-1:-1;;;;;53213:1026:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43046:124;;;;;;;;;;;;;:::i;43299:104::-;;;;;;;;;;;;;:::i;40368:73::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;40368:73:0;;;;;;;;;;;;;;42426:25;;;;;;;;;;;;;:::i;48104:713::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48104:713:0;;:::i;:::-;;41103:73;;;;;;;;;;;;;:::i;42182:29::-;;;;;;;;;;;;;:::i;41023:73::-;;;;;;;;;;;;;:::i;41405:::-;;;;;;;;;;;;;:::i;41508:::-;;;;;;;;;;;;;:::i;49702:2851::-;;;;;;;;;;;;;:::i;45423:143::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45423:143:0;;:::i;47439:589::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47439:589:0;-1:-1:-1;;;;;47439:589:0;;:::i;45264:151::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45264:151:0;;:::i;42362:25::-;;;;;;;;;;;;;:::i;42134:39::-;;;;;;;;;;;;;:::i;42560:29::-;;;;;;;;;;;;;:::i;40582:72::-;;;;;;;;;;;;;:::i;45085:171::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45085:171:0;;:::i;40470:74::-;;;;;;;;;;;;;:::i;43178:113::-;;;;;;;;;;;;;:::i;41719:29::-;;;;;;;;;;;;;:::i;43548:1326::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;43548:1326:0;;;;;;;;;;;;;;;;;;;;;48893:430;;;;;;;;;;;;;:::i;42002:35::-;;;;;;;;;;;;;:::i;42268:33::-;;;;;;;;;;;;;:::i;45900:155::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45900:155:0;-1:-1:-1;;;;;45900:155:0;;:::i;46389:143::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46389:143:0;;:::i;40760:74::-;;;;;;;;;;;;;:::i;45737:155::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45737:155:0;-1:-1:-1;;;;;45737:155:0;;:::i;44910:167::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44910:167:0;;:::i;41602:72::-;;;;;;;;;;;;;:::i;46063:143::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46063:143:0;-1:-1:-1;;;;;46063:143:0;;:::i;42920:118::-;;;;;;;;;;;;;:::i;45574:155::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45574:155:0;-1:-1:-1;;;;;45574:155:0;;:::i;41183:73::-;;;;;;;;;;;;;:::i;46576:281::-;;;;;;;;;;;;;:::i;40841:74::-;;;;;;;;;;;;;:::i;42458:23::-;;;;;;;;;;;;;:::i;46214:167::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46214:167:0;-1:-1:-1;;;;;46214:167:0;;:::i;49642:52::-;;;;;;;;;;;;;:::i;40661:72::-;;;;;;;;;;;;;:::i;46964:392::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46964:392:0;;:::i;41286:75::-;;;;;;;;;;;;;:::i;40944:72::-;;;;;;;;;;;;;:::i;42394:25::-;;;;;;;;;;;;;:::i;42099:28::-;;;;;;;;;;;;;:::i;43411:129::-;43482:50;;;-1:-1:-1;;;43482:50:0;;43526:4;43482:50;;;;;;43455:7;;40792:42;;43482:35;;:50;;;;;;;;;;;;;;;43455:7;40792:42;43482:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43482:50:0;;-1:-1:-1;43411:129:0;:::o;53213:1026::-;53358:14;;53301:21;;-1:-1:-1;;;;;53358:14:0;53393:21;53385:41;;;;;-1:-1:-1;;;53385:41:0;;;;;;;;;;;;-1:-1:-1;;;53385:41:0;;;;;;;;;;;;;;;53703:1;53683;53658:5;53652:12;53628:4;53621:5;53617:16;53591:7;53567:4;53560:5;53556:16;53525:194;53745:16;53795:4;53789:11;53777:23;;53912:4;53908:9;53901:4;53894;53888;53884:15;53880:26;53876:42;53866:8;53862:57;53839:4;53814:120;53965:4;53955:8;53948:22;54023:4;54020:1;54013:4;54003:8;53999:19;53984:44;54058:9;54051:17;54091:1;54086:135;;;;54044:177;;54086:135;54197:4;54190;54180:8;54176:19;54169:33;54044:177;;;;53493:739;;;;:::o;43046:124::-;43119:43;;;-1:-1:-1;;;43119:43:0;;43156:4;43119:43;;;;;;43092:7;;40792:42;;43119:28;;:43;;;;;;;;;;;;;;;40792:42;43119:43;;;;;;;;;;;;;;;;;;;;;;;;;;43299:104;43367:28;;;;;;;;;;;;-1:-1:-1;;;43367:28:0;;;;43299:104;:::o;40368:73::-;-1:-1:-1;;;;;;;;;;;40368:73:0;:::o;42426:25::-;;;-1:-1:-1;;;;;42426:25:0;;:::o;48104:713::-;48181:10;;-1:-1:-1;;;;;48181:10:0;48167;:24;48159:48;;;;;-1:-1:-1;;;48159:48:0;;;;;;;;;;;;-1:-1:-1;;;48159:48:0;;;;;;;;;;;;;;;48237:37;;;-1:-1:-1;;;48237:37:0;;48268:4;48237:37;;;;;;48218:16;;-1:-1:-1;;;;;;;;;;;40399:42:0;48237:22;;:37;;;;;;;;;;;;;;;40399:42;48237:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48237:37:0;;-1:-1:-1;48289:18:0;;;48285:143;;;48334:36;48348:21;:7;48360:8;48348:11;:21::i;:::-;48334:13;:36::i;:::-;48324:46;-1:-1:-1;48395:21:0;48324:46;48407:8;48395:11;:21::i;:::-;48385:31;;48285:143;48440:12;48455:45;42348:5;48455:26;48467:13;;48455:7;:11;;:26;;;;:::i;:::-;:30;;:45::i;:::-;48440:60;;48513:66;48551:10;;;;;;;;;-1:-1:-1;;;;;48551:10:0;-1:-1:-1;;;;;48539:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48539:33:0;-1:-1:-1;;;;;;;;;;;40399:42:0;48574:4;48513:25;:66::i;:::-;48617:10;;48605:43;;;-1:-1:-1;;;48605:43:0;;-1:-1:-1;;;;;;;;;;;48605:43:0;;;;;;48590:12;;-1:-1:-1;;;;;48617:10:0;;48605:28;;:43;;;;;;;;;;;;;;48617:10;48605:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48605:43:0;;-1:-1:-1;;;;;;48667:18:0;;48659:35;;;;;-1:-1:-1;;;48659:35:0;;;;;;;;;;;;;;;-1:-1:-1;;;48659:35:0;;;;;;;;;;;;;;;48759:50;48785:4;48791:17;:7;48803:4;48791:11;:17::i;:::-;-1:-1:-1;;;;;;;;;;;40399:42:0;48759:50;:25;:50::i;:::-;48104:713;;;;:::o;41103:73::-;41134:42;41103:73;:::o;42182:29::-;;;;:::o;41023:73::-;41054:42;41023:73;:::o;41405:::-;41436:42;41405:73;:::o;41508:::-;41539:42;41508:73;:::o;49702:2851::-;50078:10;50090:15;50109:26;:24;:26::i;:::-;50077:58;;;;40873:42;-1:-1:-1;;;;;50218:23:0;;40792:42;50218:30;;;;;;;;;;;;;-1:-1:-1;;;;;50218:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50274:36:0;;;-1:-1:-1;;;50274:36:0;;50304:4;50274:36;;;;;;50259:12;;-1:-1:-1;40612:42:0;;-1:-1:-1;50274:21:0;;:36;;;;;;;;;;;;;;;40612:42;50274:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50274:36:0;;-1:-1:-1;50325:8:0;;50321:424;;50471:16;50490:33;41792:5;50490:17;50499:7;;50490:4;:8;;:17;;;;:::i;:33::-;50471:52;;50538:118;50593:10;;;;;;;;;-1:-1:-1;;;;;50593:10:0;-1:-1:-1;;;;;50581:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50581:33:0;40612:42;;50633:8;50538:24;:118::i;:::-;50678:18;:4;50687:8;50678;:18::i;:::-;50671:25;;50713:20;40612:42;50724:2;50728:4;50713:5;:20::i;:::-;50321:424;;50789:47;;;-1:-1:-1;;;50789:47:0;;50830:4;50789:47;;;;;;40792:42;;50789:32;;:47;;;;;-1:-1:-1;;50789:47:0;;;;;;;-1:-1:-1;40792:42:0;50789:47;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50862:36:0;;;-1:-1:-1;;;50862:36:0;;50892:4;50862:36;;;;;;50847:12;;-1:-1:-1;40691:42:0;;-1:-1:-1;50862:21:0;;:36;;;;;;;;;;;;;;;40691:42;50862:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50862:36:0;;-1:-1:-1;50913:8:0;;50909:61;;50938:20;40691:42;50949:2;50953:4;50938:5;:20::i;:::-;51069:11;51090:2;-1:-1:-1;;;;;51083:20:0;;51112:4;51083:35;;;;;;;;;;;;;-1:-1:-1;;;;;51083:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51083:35:0;;-1:-1:-1;51133:7:0;;51129:873;;51248:18;51269:33;42254:5;51269:18;51277:9;;51269:3;:7;;:18;;;;:::i;:33::-;51248:54;-1:-1:-1;51317:47:0;-1:-1:-1;;;;;51317:23:0;;51341:10;51248:54;51317:23;:47::i;:::-;51431:16;51450:29;42168:5;51450:16;51458:7;;51450:3;:7;;:16;;;;:::i;:29::-;51431:48;;51494:27;51500:2;41319:42;51512:8;51494:5;:27::i;:::-;51601:39;;;-1:-1:-1;;;51601:39:0;;51634:4;51601:39;;;;;;41319:42;;51536:23;;41539:42;;41319;;51601:24;;:39;;;;;;;;;;;;;;;41319:42;51601:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51601:39:0;51536:119;;;-1:-1:-1;;;;;;51536:119:0;;;;;;;-1:-1:-1;;;;;51536:119:0;;;;;;;;;;;;;;;;;;;;51601:39;;51536:119;;;;;;;-1:-1:-1;51536:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51722:33:0;;-1:-1:-1;51746:8:0;51722:19;:3;51730:10;51722:7;:19::i;:::-;:23;;:33::i;:::-;51716:39;-1:-1:-1;51770:32:0;-1:-1:-1;;;;;51770:22:0;;40502:42;51800:1;51770:22;:32::i;:::-;51817:34;-1:-1:-1;;;;;51817:22:0;;40502:42;51847:3;51817:22;:34::i;:::-;51866:27;;:::i;:::-;51929:3;51908:9;51918:7;51908:18;;;;;;;;;;:24;51947:43;;-1:-1:-1;;;51947:43:0;;40502:42;;51947:29;;51977:9;;51988:1;;51947:43;;;51977:9;51947:43;;;51977:9;51988:1;51947:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51129:873;;;;52067:37;;;-1:-1:-1;;;52067:37:0;;52098:4;52067:37;;;;;;52051:13;;-1:-1:-1;;;;;;;;;;;40399:42:0;52067:22;;:37;;;;;;;;;;;;;;;40399:42;52067:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52067:37:0;;-1:-1:-1;52119:9:0;;52115:431;;52408:10;;52396:33;;;-1:-1:-1;;;52396:33:0;;;;52352:156;;-1:-1:-1;;;;;52408:10:0;;52396:31;;:33;;;;;;;;;;;;;;52408:10;52396:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52396:33:0;52458:14;;52448:45;;42085:5;;52448:25;;:5;;:9;:25::i;52352:156::-;52525:9;:7;:9::i;:::-;49702:2851;;;;;;:::o;45423:143::-;45503:10;;-1:-1:-1;;;;;45503:10:0;45489;:24;45481:48;;;;;-1:-1:-1;;;45481:48:0;;;;;;;;;;;;-1:-1:-1;;;45481:48:0;;;;;;;;;;;;;;;45540:7;:18;45423:143::o;47439:589::-;47540:10;;47490:15;;-1:-1:-1;;;;;47540:10:0;47526;:24;47518:48;;;;;-1:-1:-1;;;47518:48:0;;;;;;;;;;;;-1:-1:-1;;;47518:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;47585:23:0;;;;47577:40;;;;;-1:-1:-1;;;47577:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;47577:40:0;;;;;;;;;;;;;;;40612:42;-1:-1:-1;;;;;47636:22:0;;;;47628:38;;;;;-1:-1:-1;;;47628:38:0;;;;;;;;;;;;-1:-1:-1;;;47628:38:0;;;;;;;;;;;;;;;40691:42;-1:-1:-1;;;;;47685:22:0;;;;47677:38;;;;;-1:-1:-1;;;47677:38:0;;;;;;;;;;;;-1:-1:-1;;;47677:38:0;;;;;;;;;;;;;;;40974:42;-1:-1:-1;;;;;47734:22:0;;;;47726:38;;;;;-1:-1:-1;;;47726:38:0;;;;;;;;;;;;-1:-1:-1;;;47726:38:0;;;;;;;;;;;;;;;41054:42;-1:-1:-1;;;;;47783:23:0;;;;47775:40;;;;;-1:-1:-1;;;47775:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;47775:40:0;;;;;;;;;;;;;;;41134:42;-1:-1:-1;;;;;47834:23:0;;;;47826:40;;;;;-1:-1:-1;;;47826:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;47826:40:0;;;;;;;;;;;;;;;41214:42;-1:-1:-1;;;;;47885:23:0;;;;47877:40;;;;;-1:-1:-1;;;47877:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;47877:40:0;;;;;;;;;;;;;;;47938:31;;;-1:-1:-1;;;47938:31:0;;47963:4;47938:31;;;;;;-1:-1:-1;;;;;47938:16:0;;;;;:31;;;;;;;;;;;;;;:16;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47938:31:0;48000:10;;47938:31;;-1:-1:-1;47980:40:0;;-1:-1:-1;;;;;47980:19:0;;;;48000:10;47938:31;47980:19;:40::i;:::-;47439:589;;;:::o;45264:151::-;45348:10;;-1:-1:-1;;;;;45348:10:0;45334;:24;45326:48;;;;;-1:-1:-1;;;45326:48:0;;;;;;;;;;;;-1:-1:-1;;;45326:48:0;;;;;;;;;;;;;;;45385:9;:22;45264:151::o;42362:25::-;;;-1:-1:-1;;;;;42362:25:0;;:::o;42134:39::-;42168:5;42134:39;:::o;42560:29::-;;;-1:-1:-1;;;;;42560:29:0;;:::o;40582:72::-;40612:42;40582:72;:::o;45085:171::-;45179:10;;-1:-1:-1;;;;;45179:10:0;45165;:24;45157:48;;;;;-1:-1:-1;;;45157:48:0;;;;;;;;;;;;-1:-1:-1;;;45157:48:0;;;;;;;;;;;;;;;45216:14;:32;45085:171::o;40470:74::-;40502:42;40470:74;:::o;43178:113::-;43220:7;43247:36;43267:15;:13;:15::i;:::-;43247;:13;:15::i;:::-;:19;;:36::i;:::-;43240:43;;43178:113;:::o;41719:29::-;;;;:::o;43548:1326::-;43662:16;;;43676:1;43662:16;;;;;;;;;43605:7;;;;43634:25;;43662:16;;;;;;;;-1:-1:-1;;43703:27:0;;;-1:-1:-1;;;43703:27:0;;43728:1;43703:27;;;;;;43634:44;;-1:-1:-1;40502:42:0;;43703:24;;-1:-1:-1;43703:27:0;;;;;;;;;;;;;;40502:42;43703:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43703:27:0;43689:11;;:8;;43698:1;;43689:11;;;;;;;;;:41;;;;;43762:39;43794:6;40502:42;-1:-1:-1;;;;;43762:24:0;;43787:1;43762:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43762:27:0;;:31;:39::i;:::-;43748:8;43757:1;43748:11;;;;;;;;;;;;;:53;;;;;43834:39;43866:6;40502:42;-1:-1:-1;;;;;43834:24:0;;43859:1;43834:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:39;43820:8;43829:1;43820:11;;;;;;;;;;;;;:53;;;;;40502:42;-1:-1:-1;;;;;43906:24:0;;43931:1;43906:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43906:27:0;43892:11;;:8;;43901:1;;43892:11;;;;;;;;;;;:41;;;;;44002:8;44011:1;44002:11;;;;;;;;;;;;;;43988:8;43997:1;43988:11;;;;;;;;;;;;;;:25;:67;;;;;44044:8;44053:1;44044:11;;;;;;;;;;;;;;44030:8;44039:1;44030:11;;;;;;;;;;;;;;:25;43988:67;:109;;;;;44086:8;44095:1;44086:11;;;;;;;;;;;;;;44072:8;44081:1;44072:11;;;;;;;;;;;;;;:25;43988:109;43970:181;;;40974:42;44137:1;44124:15;;;;;;;43970:181;44212:8;44221:1;44212:11;;;;;;;;;;;;;;44198:8;44207:1;44198:11;;;;;;;;;;;;;;:25;:67;;;;;44254:8;44263:1;44254:11;;;;;;;;;;;;;;44240:8;44249:1;44240:11;;;;;;;;;;;;;;:25;44198:67;:109;;;;;44296:8;44305:1;44296:11;;;;;;;;;;;;;;44282:8;44291:1;44282:11;;;;;;;;;;;;;;:25;44198:109;44180:182;;;41054:42;44348:1;44334:16;;;;;;;44180:182;44423:8;44432:1;44423:11;;;;;;;;;;;;;;44409:8;44418:1;44409:11;;;;;;;;;;;;;;:25;:67;;;;;44465:8;44474:1;44465:11;;;;;;;;;;;;;;44451:8;44460:1;44451:11;;;;;;;;;;;;;;:25;44409:67;:109;;;;;44507:8;44516:1;44507:11;;;;;;;;;;;;;;44493:8;44502:1;44493:11;;;;;;;;;;;;;;:25;44409:109;44391:182;;;41134:42;44559:1;44545:16;;;;;;;44391:182;44634:8;44643:1;44634:11;;;;;;;;;;;;;;44620:8;44629:1;44620:11;;;;;;;;;;;;;;:25;:67;;;;;44676:8;44685:1;44676:11;;;;;;;;;;;;;;44662:8;44671:1;44662:11;;;;;;;;;;;;;;:25;44620:67;:109;;;;;44718:8;44727:1;44718:11;;;;;;;;;;;;;;44704:8;44713:1;44704:11;;;;;;;;;;;;;;:25;44620:109;44602:182;;;41214:42;44770:1;44756:16;;;;;;;44602:182;40974:42;44864:1;44851:15;;;;;43548:1326;;;:::o;48893:430::-;48984:10;;48934:15;;-1:-1:-1;;;;;48984:10:0;48970;:24;48962:48;;;;;-1:-1:-1;;;48962:48:0;;;;;;;;;;;;-1:-1:-1;;;48962:48:0;;;;;;;;;;;;;;;49021:14;:12;:14::i;:::-;49058:37;;;-1:-1:-1;;;49058:37:0;;49089:4;49058:37;;;;;;-1:-1:-1;;;;;;;;;;;40399:42:0;49058:22;;:37;;;;;;;;;;;;;;40399:42;49058:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49058:37:0;49135:10;;49123:43;;;-1:-1:-1;;;49123:43:0;;-1:-1:-1;;;;;;;;;;;49123:43:0;;;;;;49058:37;;-1:-1:-1;49108:12:0;;-1:-1:-1;;;;;49135:10:0;;;;49123:28;;:43;;;;;49058:37;;49123:43;;;;;;;;49135:10;49123:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49123:43:0;;-1:-1:-1;;;;;;49185:18:0;;49177:35;;;;;-1:-1:-1;;;49177:35:0;;;;;;;;;;;;;;;-1:-1:-1;;;49177:35:0;;;;;;;;;;;;;;;49275:40;-1:-1:-1;;;;;;;;;;;49301:4:0;49307:7;49275:25;:40::i;:::-;48893:430;;:::o;42002:35::-;;;;:::o;42268:33::-;;;;:::o;45900:155::-;45986:10;;-1:-1:-1;;;;;45986:10:0;45972;:24;45964:48;;;;;-1:-1:-1;;;45964:48:0;;;;;;;;;;;;-1:-1:-1;;;45964:48:0;;;;;;;;;;;;;;;46023:10;:24;;-1:-1:-1;;;;;;46023:24:0;-1:-1:-1;;;;;46023:24:0;;;;;;;;;;45900:155::o;46389:143::-;46469:10;;-1:-1:-1;;;;;46469:10:0;46455;:24;46447:48;;;;;-1:-1:-1;;;46447:48:0;;;;;;;;;;;;-1:-1:-1;;;46447:48:0;;;;;;;;;;;;;;;46506:7;:18;46389:143::o;40760:74::-;40792:42;40760:74;:::o;45737:155::-;45823:10;;-1:-1:-1;;;;;45823:10:0;45809;:24;45801:48;;;;;-1:-1:-1;;;45801:48:0;;;;;;;;;;;;-1:-1:-1;;;45801:48:0;;;;;;;;;;;;;;;45860:10;:24;;-1:-1:-1;;;;;;45860:24:0;-1:-1:-1;;;;;45860:24:0;;;;;;;;;;45737:155::o;44910:167::-;45002:10;;-1:-1:-1;;;;;45002:10:0;44988;:24;44980:48;;;;;-1:-1:-1;;;44980:48:0;;;;;;;;;;;;-1:-1:-1;;;44980:48:0;;;;;;;;;;;;;;;45039:13;:30;44910:167::o;41602:72::-;;;-1:-1:-1;;;;;41602:72:0;;:::o;46063:143::-;46145:8;;-1:-1:-1;;;;;46145:8:0;46131:10;:22;46123:44;;;;;-1:-1:-1;;;46123:44:0;;;;;;;;;;;;-1:-1:-1;;;46123:44:0;;;;;;;;;;;;;;;46178:8;:20;;-1:-1:-1;;;;;;46178:20:0;-1:-1:-1;;;;;46178:20:0;;;;;;;;;;46063:143::o;42920:118::-;42993:37;;;-1:-1:-1;;;42993:37:0;;43024:4;42993:37;;;;;;42966:7;;-1:-1:-1;;;;;;;;;;;40399:42:0;42993:22;;:37;;;;;;;;;;;;;;;40399:42;42993:37;;;;;;;;;;45574:155;45660:10;;-1:-1:-1;;;;;45660:10:0;45646;:24;45638:48;;;;;-1:-1:-1;;;45638:48:0;;;;;;;;;;;;-1:-1:-1;;;45638:48:0;;;;;;;;;;;;;;;45697:10;:24;;-1:-1:-1;;;;;;45697:24:0;-1:-1:-1;;;;;45697:24:0;;;;;;;;;;45574:155::o;41183:73::-;41214:42;41183:73;:::o;46576:281::-;46629:37;;;-1:-1:-1;;;46629:37:0;;46660:4;46629:37;;;;;;46613:13;;-1:-1:-1;;;;;;;;;;;40399:42:0;46629:22;;:37;;;;;;;;;;;;;;;40399:42;46629:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46629:37:0;;-1:-1:-1;46681:9:0;;46677:173;;46707:34;-1:-1:-1;;;;;;;;;;;40792:42:0;46739:1;46707:24;:34::i;:::-;46756;;;-1:-1:-1;;;46756:34:0;;40792:42;46756:34;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;40399:42:0;46756:20;;:34;;;;;;;;;;;;;;-1:-1:-1;40399:42:0;46756:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46805:33:0;;;-1:-1:-1;;;46805:33:0;;;;;;;;;;40792:42;;46805:26;;:33;;;;;-1:-1:-1;;46805:33:0;;;;;;;-1:-1:-1;40792:42:0;46805:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46677:173;46576:281;:::o;40841:74::-;40873:42;40841:74;:::o;42458:23::-;;;-1:-1:-1;;;;;42458:23:0;;:::o;46214:167::-;46308:8;;-1:-1:-1;;;;;46308:8:0;46294:10;:22;46286:44;;;;;-1:-1:-1;;;46286:44:0;;;;;;;;;;;;-1:-1:-1;;;46286:44:0;;;;;;;;;;;;;;;46341:14;:32;;-1:-1:-1;;;;;;46341:32:0;-1:-1:-1;;;;;46341:32:0;;;;;;;;;;46214:167::o;49642:52::-;49677:9;:7;:9::i;:::-;49642:52::o;40661:72::-;40691:42;40661:72;:::o;46964:392::-;47045:10;;-1:-1:-1;;;;;47045:10:0;47031;:24;47023:48;;;;;-1:-1:-1;;;47023:48:0;;;;;;;;;;;;-1:-1:-1;;;47023:48:0;;;;;;;;;;;;;;;47101:37;;;-1:-1:-1;;;47101:37:0;;47132:4;47101:37;;;;;;47082:16;;-1:-1:-1;;;;;;;;;;;40399:42:0;47101:22;;:37;;;;;;;;;;;;;;;40399:42;47101:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47101:37:0;;-1:-1:-1;47153:18:0;;;47149:143;;;47198:36;47212:21;:7;47224:8;47212:11;:21::i;47198:36::-;47188:46;-1:-1:-1;47259:21:0;47188:46;47271:8;47259:11;:21::i;:::-;47249:31;;47149:143;47302:46;-1:-1:-1;;;;;;;;;;;47328:10:0;47340:7;47302:25;:46::i;:::-;46964:392;;:::o;41286:75::-;41319:42;41286:75;:::o;40944:72::-;40974:42;40944:72;:::o;42394:25::-;;;-1:-1:-1;;;;;42394:25:0;;:::o;42099:28::-;;;;:::o;5211:136::-;5269:7;5296:43;5300:1;5303;5296:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5289:50;;5211:136;;;;;:::o;49487:147::-;49545:7;40792:42;-1:-1:-1;;;;;49565:27:0;;49593:7;49565:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49619:7:0;;49487:147;-1:-1:-1;;;;49487:147:0:o;4747:181::-;4805:7;4837:5;;;4861:6;;;;4853:46;;;;;-1:-1:-1;;;4853:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6101:471;6159:7;6404:6;6400:47;;-1:-1:-1;6434:1:0;6427:8;;6400:47;6471:5;;;6475:1;6471;:5;:1;6495:5;;;;;:10;6487:56;;;;-1:-1:-1;;;6487:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7048:132;7106:7;7133:39;7137:1;7140;7133:39;;;;;;;;;;;;;;;;;:3;:39::i;30515:177::-;30625:58;;;-1:-1:-1;;;;;30625:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30625:58:0;-1:-1:-1;;;30625:58:0;;;30598:86;;30618:5;;30598:19;:86::i;:::-;30515:177;;;:::o;52561:570::-;52731:12;;;52705:42;;-1:-1:-1;;;;;52705:25:0;;;;52731:12;;52705:25;:42::i;:::-;52784:12;;52758:48;;-1:-1:-1;;;;;52758:25:0;;;;52784:12;52798:7;52758:25;:48::i;:::-;52843:16;;;52857:1;52843:16;;;;;;;;;52819:21;;52843:16;;;52819:21;;52843:16;;;;;-1:-1:-1;52843:16:0;52819:40;;52880:5;52870:4;52875:1;52870:7;;;;;;;;;;;;;:15;-1:-1:-1;;;;;52870:15:0;;;-1:-1:-1;;;;;52870:15:0;;;;;41436:42;52896:4;52901:1;52896:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;52896:14:0;;;-1:-1:-1;;;;;52896:14:0;;;;;52931:3;52921:4;52926:1;52921:7;;;;;;;;-1:-1:-1;;;;;52921:13:0;;;:7;;;;;;;;;:13;52963:12;;;;;;;52947:54;;53016:7;;53054:4;53081;53101:11;:3;53109:2;53101:7;:11::i;:::-;52947:176;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52947:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52947:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52947:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52561:570;;;;:::o;31174:622::-;31544:10;;;31543:62;;-1:-1:-1;31560:39:0;;;-1:-1:-1;;;31560:39:0;;31584:4;31560:39;;;;-1:-1:-1;;;;;31560:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31560:39:0;:44;31543:62;31535:152;;;;-1:-1:-1;;;31535:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31725:62;;;-1:-1:-1;;;;;31725:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31725:62:0;-1:-1:-1;;;31725:62:0;;;31698:90;;31718:5;;31698:19;:90::i;49331:148::-;49417:43;;;-1:-1:-1;;;49417:43:0;;49454:4;49417:43;;;;;;40792:42;;49375:27;;40792:42;;49417:28;;:43;;;;;;;;;;;;;;40792:42;49417:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49417:43:0;49375:96;;;-1:-1:-1;;;;;;49375:96:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49375:96:0;;;;;;;-1:-1:-1;49375:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5650:192;5736:7;5772:12;5764:6;;;;5756:29;;;;-1:-1:-1;;;5756:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5808:5:0;;;5650:192::o;7676:278::-;7762:7;7797:12;7790:5;7782:28;;;;-1:-1:-1;;;7782:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7821:9;7837:1;7833;:5;;;;;;;7676:278;-1:-1:-1;;;;;7676:278:0:o;32820:761::-;33244:23;33270:69;33298:4;33270:69;;;;;;;;;;;;;;;;;33278:5;-1:-1:-1;;;;;33270:27:0;;;:69;;;;;:::i;:::-;33354:17;;33244:95;;-1:-1:-1;33354:21:0;33350:224;;33496:10;33485:30;;;;;;;;;;;;;;;-1:-1:-1;33485:30:0;33477:85;;;;-1:-1:-1;;;33477:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16641:196;16744:12;16776:53;16799:6;16807:4;16813:1;16816:12;16776:22;:53::i;:::-;16769:60;16641:196;-1:-1:-1;;;;16641:196:0:o;18018:979::-;18148:12;18181:18;18192:6;18181:10;:18::i;:::-;18173:60;;;;;-1:-1:-1;;;18173:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18307:12;18321:23;18348:6;-1:-1:-1;;;;;18348:11:0;18368:8;18379:4;18348:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18348:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18306:78;;;;18399:7;18395:595;;;18430:10;-1:-1:-1;18423:17:0;;-1:-1:-1;18423:17:0;18395:595;18544:17;;:21;18540:439;;18807:10;18801:17;18868:15;18855:10;18851:2;18847:19;18840:44;18755:148;18943:20;;-1:-1:-1;;;18943:20:0;;;;;;;;;;;;;;;;;18950:12;;18943:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13723:422;14090:20;14129:8;;;13723:422::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://3a33ea826c78551b251abbb3593e88f59d44f1923a0072af8d6787a8a1480bec
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.