ERC-20
Overview
Max Total Supply
623.480989194002810609 G-TOMB-60
Holders
40
Market
Price
$0.00 @ 0.000000 FTM
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
Grim60Vault
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-11-23 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @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: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @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: @openzeppelin/contracts/math/SafeMath.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; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @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 in 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: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.6.0; /** * @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 { } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } pragma solidity ^0.6.0; /** * @title Helps contracts guard against reentrancy attacks. * @author Remco Bloemen <remco@2π.com>, Eenae <[email protected]> * @dev If you mark a function `nonReentrant`, you should also * mark it `external`. */ contract ReentrancyGuard { /// @dev counter to allow mutex lock with only one SSTORE operation uint256 private _guardCounter = 1; /** * @dev Prevents a contract from calling itself, directly or indirectly. * If you mark a function `nonReentrant`, you should also * mark it `external`. Calling one `nonReentrant` function from * another is not supported. Instead, you can implement a * `private` function doing the actual work, and an `external` * wrapper marked as `nonReentrant`. */ modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter); } } pragma solidity ^0.6.0; interface IUniswapRouterETH { function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } pragma solidity ^0.6.0; interface IStrategy { function vault() external view returns (address); function want() external view returns (IERC20); function beforeDeposit() external; function deposit() external; function _deposit(uint256 amount) external; function withdraw(uint256) external; function balanceOf() external view returns (uint256); function harvest() external; function retireStrat() external; function panic() external; function pause() external; function unpause() external; function paused() external view returns (bool); } interface I40Vault { function depositFor(address token, uint _amount, address user ) external; } interface IUniswapV2Pair { function token0() external view returns (address); function token1() external view returns (address); } pragma solidity ^0.6.0; /** * @dev Implementation of a vault to deposit funds for yield optimizing. * This is the contract that receives funds and that users interface with. * The yield optimizing strategy itself is implemented in a separate 'Strategy.sol' contract. */ contract Grim60Vault is ERC20, Ownable, ReentrancyGuard { using SafeERC20 for IERC20; using SafeMath for uint256; struct StratCandidate { address implementation; uint proposedTime; } // The last proposed strategy to switch to. StratCandidate public stratCandidate; // The strategy currently in use by the vault. IStrategy public strategy; // The minimum time it has to pass before a strat candidate can be approved. uint256 public immutable approvalDelay; address public _40vault; address public tomb = address(0x6c021Ae822BEa943b2E66552bDe1D2696a53fbB7); address public wrapped = address(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83); address public tshare = address(0x4cdF39285D7Ca8eB3f090fDA0C069ba5F4145B37); address public unirouter = address(0xF491e7B69E4244ad4002BC14e878a34207E38c29); address public tombFtm = address(0x2A651563C9d3Af67aE0388a5c8F89b867038089e); address[] tombToWrappedRoute; address[] tombToTshareRoute; address[] wrappedToTshareRoute; event NewStratCandidate(address implementation); event UpgradeStrat(address implementation); /** * @dev Sets the value of {token} to the token that the vault will * hold as underlying value. It initializes the vault's own 'moo' token. * This token is minted when someone does a deposit. It is burned in order * to withdraw the corresponding portion of the underlying assets. * @param _strategy the address of the strategy. * @param _name the name of the vault token. * @param _symbol the symbol of the vault token. * @param _approvalDelay the delay before a new strat can be approved. */ constructor ( IStrategy _strategy, string memory _name, string memory _symbol, uint256 _approvalDelay ) public ERC20( _name, _symbol ) { strategy = _strategy; approvalDelay = _approvalDelay; tombToTshareRoute = [tomb, wrapped, tshare]; wrappedToTshareRoute = [wrapped, tshare]; } function want() public view returns (IERC20) { return IERC20(strategy.want()); } /** * @dev It calculates the total underlying value of {token} held by the system. * It takes into account the vault contract balance, the strategy contract balance * and the balance deployed in other contracts as part of the strategy. */ function balance() public view returns (uint) { return want().balanceOf(address(this)).add(IStrategy(strategy).balanceOf()); } /** * @dev Custom logic in here for how much the vault allows to be borrowed. * We return 100% of tokens for now. Under certain conditions we might * want to keep some of the system funds at hand in the vault, instead * of putting them to work. */ function available() public view returns (uint256) { return want().balanceOf(address(this)); } /** * @dev Function for various UIs to display the current value of one of our yield tokens. * Returns an uint256 with 18 decimals of how much underlying asset one vault share represents. */ function getPricePerFullShare() public view returns (uint256) { return totalSupply() == 0 ? 1e18 : balance().mul(1e18).div(totalSupply()); } /** * @dev A helper function to call deposit() with all the sender's funds. */ function depositAll() external { deposit(want().balanceOf(msg.sender)); } /** * @dev The entrypoint of funds into the system. People deposit with this function * into the vault. The vault is then in charge of sending funds into the strategy. */ function deposit(uint _amount) public nonReentrant { strategy.beforeDeposit(); uint256 depositAmount = _amount; uint256 tshareAmount = _amount.mul(40).div(100); _amount = depositAmount.sub(tshareAmount); uint256 _pool = balance(); // balance of vault + strategy 0 want().safeTransferFrom(msg.sender, address(this), depositAmount); earn(tshareAmount); uint256 _after = balance(); _amount = _after.sub(_pool); // Additional check for deflationary tokens uint256 shares = 0; if (totalSupply() == 0) { shares = _amount; } else { shares = (_amount.mul(totalSupply())).div(_pool); } _mint(msg.sender, shares); } /** * @dev Function to send funds into the strategy and put them to work. It's primarily called * by the vault's deposit() function. */ function earn(uint256 amount) internal { uint _bal = available(); want().safeTransfer(address(strategy), _bal); strategy._deposit(amount); } /** * @dev A helper function to call withdraw() with all the sender's funds. */ function withdrawAll() external { withdraw(balanceOf(msg.sender)); } /** * @dev Function to exit the system. The vault will withdraw the required tokens * from the strategy and pay up the token holder. A proportional number of IOU * tokens are burned in the process. */ function withdraw(uint256 _shares) public { uint256 r = (balance().mul(_shares)).div(totalSupply()); _burn(msg.sender, _shares); uint b = want().balanceOf(address(this)); if (b < r) { uint _withdraw = r.sub(b); strategy.withdraw(_withdraw); uint _after = want().balanceOf(address(this)); uint _diff = _after.sub(b); if (_diff < _withdraw) { r = b.add(_diff); } } want().safeTransfer(msg.sender, r); } /** * @dev Sets the candidate for the new strat to use with this vault. * @param _implementation The address of the candidate strategy. */ function proposeStrat(address _implementation) public onlyOwner { require(address(this) == IStrategy(_implementation).vault(), "Proposal not valid for this Vault"); stratCandidate = StratCandidate({ implementation: _implementation, proposedTime: block.timestamp }); emit NewStratCandidate(_implementation); } /** * @dev It switches the active strat for the strat candidate. After upgrading, the * candidate implementation is set to the 0x00 address, and proposedTime to a time * happening in +100 years for safety. */ function upgradeStrat() public onlyOwner { require(stratCandidate.implementation != address(0), "There is no candidate"); require(stratCandidate.proposedTime.add(approvalDelay) < block.timestamp, "Delay has not passed"); emit UpgradeStrat(stratCandidate.implementation); strategy.retireStrat(); strategy = IStrategy(stratCandidate.implementation); stratCandidate.implementation = address(0); stratCandidate.proposedTime = 5000000000; earn(balance()); } function approveTxnIfNeeded(address _token, address _spender, uint256 _amount) internal { if (IERC20(_token).allowance(address(this), _spender) < _amount) { IERC20(_token).safeApprove(_spender, uint256(0)); IERC20(_token).safeApprove(_spender, uint256(-1)); } } /** * @dev Rescues random funds stuck that the strat can't handle. * @param _token address of the token to rescue. */ function inCaseTokensGetStuck(address _token) external onlyOwner { require(_token != address(want()), "!token"); uint256 amount = IERC20(_token).balanceOf(address(this)); IERC20(_token).safeTransfer(msg.sender, amount); } function depositFor(address token, uint _amount,address user ) public { strategy.beforeDeposit(); uint256 _pool = balance(); IERC20(token).safeTransferFrom(msg.sender, address(this), _amount); earn(balance()); uint256 _after = balance(); _amount = _after.sub(_pool); // Additional check for deflationary tokens uint256 shares = 0; if (totalSupply() == 0) { shares = _amount; } else { shares = (_amount.mul(totalSupply())).div(_pool); } _mint(user, shares); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IStrategy","name":"_strategy","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_approvalDelay","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"NewStratCandidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"UpgradeStrat","type":"event"},{"inputs":[],"name":"_40vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"approvalDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"available","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"proposeStrat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stratCandidate","outputs":[{"internalType":"address","name":"implementation","type":"address"},{"internalType":"uint256","name":"proposedTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategy","outputs":[{"internalType":"contract IStrategy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tomb","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tombFtm","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tshare","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unirouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"upgradeStrat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrapped","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040526001600655736c021ae822bea943b2e66552bde1d2696a53fbb7600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507321be370d5312f44cb42ce377bc9b8a0cef1a4c83600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734cdf39285d7ca8eb3f090fda0c069ba5f4145b37600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073f491e7b69e4244ad4002bc14e878a34207e38c29600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550732a651563c9d3af67ae0388a5c8f89b867038089e600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001bf57600080fd5b50604051620042b6380380620042b683398181016040526080811015620001e557600080fd5b8101908080519060200190929190805160405193929190846401000000008211156200021057600080fd5b838201915060208201858111156200022757600080fd5b82518660018202830111640100000000821117156200024557600080fd5b8083526020830192505050908051906020019080838360005b838110156200027b5780820151818401526020810190506200025e565b50505050905090810190601f168015620002a95780820380516001836020036101000a031916815260200191505b5060405260200180516040519392919084640100000000821115620002cd57600080fd5b83820191506020820185811115620002e457600080fd5b82518660018202830111640100000000821117156200030257600080fd5b8083526020830192505050908051906020019080838360005b83811015620003385780820151818401526020810190506200031b565b50505050905090810190601f168015620003665780820380516001836020036101000a031916815260200191505b50604052602001805190602001909291905050508282816003908051906020019062000394929190620006b4565b508060049080519060200190620003ad929190620006b4565b506012600560006101000a81548160ff021916908360ff16021790555050506000620003de620006ac60201b60201c565b905080600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35083600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080608081815250506040518060600160405280600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506011906003620005dd9291906200073b565b506040518060400160405280600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506012906002620006a1929190620007ca565b5050505050620008b5565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620006f757805160ff191683800117855562000728565b8280016001018555821562000728579182015b82811115620007275782518255916020019190600101906200070a565b5b50905062000737919062000859565b5090565b828054828255906000526020600020908101928215620007b7579160200282015b82811115620007b65782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906200075c565b5b509050620007c6919062000878565b5090565b82805482825590600052602060002090810192821562000846579160200282015b82811115620008455782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620007eb565b5b50905062000855919062000878565b5090565b5b80821115620008745760008160009055506001016200085a565b5090565b5b80821115620008b157600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010162000879565b5090565b6080516139e1620008d560003980612093528061224d52506139e16000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c8063853828b611610125578063c8820f6c116100ad578063def68a9c1161007c578063def68a9c146109a0578063e2d1e75c146109e4578063e668524414610a02578063ee6822a714610a0c578063f2fde38b14610a4057610211565b8063c8820f6c1461087c578063d8cd541e146108ea578063dd62ed3e1461091e578063de5f62681461099657610211565b8063a8c62e76116100f4578063a8c62e7614610764578063a9059cbb14610798578063b69ef8a8146107fc578063b6b55f251461081a578063c040f23a1461084857610211565b8063853828b61461063f5780638da5cb5b1461064957806395d89b411461067d578063a457c2d71461070057610211565b806339509351116101a857806370a082311161017757806370a0823114610550578063715018a6146105a857806376dfabb8146105b257806377c7b8fc146105ed57806384756dde1461060b57610211565b8063395093511461045657806348a0d754146104ba57806350e70d48146104d85780635b12ff9b1461050c57610211565b806323b872dd116101e457806323b872dd1461034f578063257ae0de146103d35780632e1a7d4d14610407578063313ce5671461043557610211565b806306fdde0314610216578063095ea7b31461029957806318160ddd146102fd5780631f1fcd511461031b575b600080fd5b61021e610a84565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561025e578082015181840152602081019050610243565b50505050905090810190601f16801561028b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e5600480360360408110156102af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b26565b60405180821515815260200191505060405180910390f35b610305610b44565b6040518082815260200191505060405180910390f35b610323610b4e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103bb6004803603606081101561036557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610bf8565b60405180821515815260200191505060405180910390f35b6103db610cd1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104336004803603602081101561041d57600080fd5b8101908080359060200190929190505050610cf7565b005b61043d610fae565b604051808260ff16815260200191505060405180910390f35b6104a26004803603604081101561046c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fc5565b60405180821515815260200191505060405180910390f35b6104c2611078565b6040518082815260200191505060405180910390f35b6104e0611128565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61054e6004803603602081101561052257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061114e565b005b6105926004803603602081101561056657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113ed565b6040518082815260200191505060405180910390f35b6105b0611435565b005b6105ba6115c0565b604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b6105f56115f2565b6040518082815260200191505060405180910390f35b610613611651565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610647611677565b005b61065161168a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106856116b4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106c55780820151818401526020810190506106aa565b50505050905090810190601f1680156106f25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61074c6004803603604081101561071657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611756565b60405180821515815260200191505060405180910390f35b61076c611823565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107e4600480360360408110156107ae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611849565b60405180821515815260200191505060405180910390f35b610804611867565b6040518082815260200191505060405180910390f35b6108466004803603602081101561083057600080fd5b81019080803590602001909291905050506119cb565b005b610850611b7d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108e86004803603606081101561089257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ba3565b005b6108f2611ce9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109806004803603604081101561093457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d0f565b6040518082815260200191505060405180910390f35b61099e611d96565b005b6109e2600480360360208110156109b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e49565b005b6109ec612091565b6040518082815260200191505060405180910390f35b610a0a6120b5565b005b610a146124b3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a8260048036036020811015610a5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124d9565b005b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b1c5780601f10610af157610100808354040283529160200191610b1c565b820191906000526020600020905b815481529060010190602001808311610aff57829003601f168201915b5050505050905090565b6000610b3a610b336126e9565b84846126f1565b6001905092915050565b6000600254905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631f1fcd516040518163ffffffff1660e01b815260040160206040518083038186803b158015610bb857600080fd5b505afa158015610bcc573d6000803e3d6000fd5b505050506040513d6020811015610be257600080fd5b8101908080519060200190929190505050905090565b6000610c058484846128e8565b610cc684610c116126e9565b610cc1856040518060600160405280602881526020016138cb60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610c776126e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ba99092919063ffffffff16565b6126f1565b600190509392505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610d2c610d04610b44565b610d1e84610d10611867565b612c6990919063ffffffff16565b612cef90919063ffffffff16565b9050610d383383612d39565b6000610d42610b4e565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610da857600080fd5b505afa158015610dbc573d6000803e3d6000fd5b505050506040513d6020811015610dd257600080fd5b8101908080519060200190929190505050905081811015610f77576000610e028284612efd90919063ffffffff16565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b505050506000610e9b610b4e565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f0157600080fd5b505afa158015610f15573d6000803e3d6000fd5b505050506040513d6020811015610f2b57600080fd5b810190808051906020019092919050505090506000610f538483612efd90919063ffffffff16565b905082811015610f7357610f708185612f4790919063ffffffff16565b94505b5050505b610fa93383610f84610b4e565b73ffffffffffffffffffffffffffffffffffffffff16612fcf9092919063ffffffff16565b505050565b6000600560009054906101000a900460ff16905090565b600061106e610fd26126e9565b846110698560016000610fe36126e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f4790919063ffffffff16565b6126f1565b6001905092915050565b6000611082610b4e565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156110e857600080fd5b505afa1580156110fc573d6000803e3d6000fd5b505050506040513d602081101561111257600080fd5b8101908080519060200190929190505050905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111566126e9565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611218576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561125e57600080fd5b505afa158015611272573d6000803e3d6000fd5b505050506040513d602081101561128857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161461131c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806138896021913960400191505060405180910390fd5b60405180604001604052808273ffffffffffffffffffffffffffffffffffffffff16815260200142815250600760008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101559050507f1aae2ec5647db56da2d513de40528ba3565c6057525637050660c4323bbac7df81604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61143d6126e9565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60078060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b6000806115fd610b44565b146116425761163d61160d610b44565b61162f670de0b6b3a7640000611621611867565b612c6990919063ffffffff16565b612cef90919063ffffffff16565b61164c565b670de0b6b3a76400005b905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611688611683336113ed565b610cf7565b565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561174c5780601f106117215761010080835404028352916020019161174c565b820191906000526020600020905b81548152906001019060200180831161172f57829003601f168201915b5050505050905090565b60006118196117636126e9565b8461181485604051806060016040528060258152602001613987602591396001600061178d6126e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ba99092919063ffffffff16565b6126f1565b6001905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061185d6118566126e9565b84846128e8565b6001905092915050565b60006119c6600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663722713f76040518163ffffffff1660e01b815260040160206040518083038186803b1580156118d457600080fd5b505afa1580156118e8573d6000803e3d6000fd5b505050506040513d60208110156118fe57600080fd5b8101908080519060200190929190505050611917610b4e565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561197d57600080fd5b505afa158015611991573d6000803e3d6000fd5b505050506040513d60208110156119a757600080fd5b8101908080519060200190929190505050612f4790919063ffffffff16565b905090565b600160066000828254019250508190555060006006549050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663573fef0a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a4d57600080fd5b505af1158015611a61573d6000803e3d6000fd5b5050505060008290506000611a936064611a85602887612c6990919063ffffffff16565b612cef90919063ffffffff16565b9050611aa88183612efd90919063ffffffff16565b93506000611ab4611867565b9050611aea333085611ac4610b4e565b73ffffffffffffffffffffffffffffffffffffffff16613071909392919063ffffffff16565b611af382613132565b6000611afd611867565b9050611b128282612efd90919063ffffffff16565b9550600080611b1f610b44565b1415611b2d57869050611b5c565b611b5983611b4b611b3c610b44565b8a612c6990919063ffffffff16565b612cef90919063ffffffff16565b90505b611b663382613223565b50505050506006548114611b7957600080fd5b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663573fef0a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c0d57600080fd5b505af1158015611c21573d6000803e3d6000fd5b505050506000611c2f611867565b9050611c5e3330858773ffffffffffffffffffffffffffffffffffffffff16613071909392919063ffffffff16565b611c6e611c69611867565b613132565b6000611c78611867565b9050611c8d8282612efd90919063ffffffff16565b9350600080611c9a610b44565b1415611ca857849050611cd7565b611cd483611cc6611cb7610b44565b88612c6990919063ffffffff16565b612cef90919063ffffffff16565b90505b611ce18482613223565b505050505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611e47611da1610b4e565b73ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611e0757600080fd5b505afa158015611e1b573d6000803e3d6000fd5b505050506040513d6020811015611e3157600080fd5b81019080805190602001909291905050506119cb565b565b611e516126e9565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611f1b610b4e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260068152602001807f21746f6b656e000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561202557600080fd5b505afa158015612039573d6000803e3d6000fd5b505050506040513d602081101561204f57600080fd5b8101908080519060200190929190505050905061208d33828473ffffffffffffffffffffffffffffffffffffffff16612fcf9092919063ffffffff16565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6120bd6126e9565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461217f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612247576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5468657265206973206e6f2063616e646964617465000000000000000000000081525060200191505060405180910390fd5b426122807f0000000000000000000000000000000000000000000000000000000000000000600760010154612f4790919063ffffffff16565b106122f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f44656c617920686173206e6f742070617373656400000000000000000000000081525060200191505060405180910390fd5b7f7f37d440e85aba7fbf641c4bda5ca4ef669a80bffaacde2aa8d9feb1b048c82c600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb6177876040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156123cf57600080fd5b505af11580156123e3573d6000803e3d6000fd5b50505050600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600760000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555064012a05f2006007600101819055506124b16124ac611867565b613132565b565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6124e16126e9565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061381b6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612777576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806139396024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806138416022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561296e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806139146025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806137d66023913960400191505060405180910390fd5b6129ff8383836133ea565b612a6a81604051806060016040528060268152602001613863602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ba99092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612afd816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f4790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290612c56576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c1b578082015181840152602081019050612c00565b50505050905090810190601f168015612c485780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080831415612c7c5760009050612ce9565b6000828402905082848281612c8d57fe5b0414612ce4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806138aa6021913960400191505060405180910390fd5b809150505b92915050565b6000612d3183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506133ef565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dbf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806138f36021913960400191505060405180910390fd5b612dcb826000836133ea565b612e36816040518060600160405280602281526020016137f9602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ba99092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e8d81600254612efd90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000612f3f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ba9565b905092915050565b600080828401905083811015612fc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b61306c8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506134b5565b505050565b61312c846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506134b5565b50505050565b600061313c611078565b9050613192600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261316d610b4e565b73ffffffffffffffffffffffffffffffffffffffff16612fcf9092919063ffffffff16565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639213b124836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561320757600080fd5b505af115801561321b573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6132d2600083836133ea565b6132e781600254612f4790919063ffffffff16565b60028190555061333e816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f4790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b505050565b6000808311829061349b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613460578082015181840152602081019050613445565b50505050905090810190601f16801561348d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816134a757fe5b049050809150509392505050565b6060613517826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135a49092919063ffffffff16565b905060008151111561359f5780806020019051602081101561353857600080fd5b810190808051906020019092919050505061359e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061395d602a913960400191505060405180910390fd5b5b505050565b60606135b384846000856135bc565b90509392505050565b60606135c7856137c2565b613639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106136895780518252602082019150602081019050602083039250613666565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146136eb576040519150601f19603f3d011682016040523d82523d6000602084013e6136f0565b606091505b509150915081156137055780925050506137ba565b6000815111156137185780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561377f578082015181840152602081019050613764565b50505050905090810190601f1680156137ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b90506000811191505091905056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636550726f706f73616c206e6f742076616c696420666f722074686973205661756c74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122026f65b227749a9f8a5293dbc8760291a24812823d5d428094a207cfb7dedf52464736f6c634300060c003300000000000000000000000021e3460b7e3c707fe4e3884b4024a00c924d5354000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000009472d544f4d422d363000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009472d544f4d422d36300000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c8063853828b611610125578063c8820f6c116100ad578063def68a9c1161007c578063def68a9c146109a0578063e2d1e75c146109e4578063e668524414610a02578063ee6822a714610a0c578063f2fde38b14610a4057610211565b8063c8820f6c1461087c578063d8cd541e146108ea578063dd62ed3e1461091e578063de5f62681461099657610211565b8063a8c62e76116100f4578063a8c62e7614610764578063a9059cbb14610798578063b69ef8a8146107fc578063b6b55f251461081a578063c040f23a1461084857610211565b8063853828b61461063f5780638da5cb5b1461064957806395d89b411461067d578063a457c2d71461070057610211565b806339509351116101a857806370a082311161017757806370a0823114610550578063715018a6146105a857806376dfabb8146105b257806377c7b8fc146105ed57806384756dde1461060b57610211565b8063395093511461045657806348a0d754146104ba57806350e70d48146104d85780635b12ff9b1461050c57610211565b806323b872dd116101e457806323b872dd1461034f578063257ae0de146103d35780632e1a7d4d14610407578063313ce5671461043557610211565b806306fdde0314610216578063095ea7b31461029957806318160ddd146102fd5780631f1fcd511461031b575b600080fd5b61021e610a84565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561025e578082015181840152602081019050610243565b50505050905090810190601f16801561028b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e5600480360360408110156102af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b26565b60405180821515815260200191505060405180910390f35b610305610b44565b6040518082815260200191505060405180910390f35b610323610b4e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103bb6004803603606081101561036557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610bf8565b60405180821515815260200191505060405180910390f35b6103db610cd1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104336004803603602081101561041d57600080fd5b8101908080359060200190929190505050610cf7565b005b61043d610fae565b604051808260ff16815260200191505060405180910390f35b6104a26004803603604081101561046c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fc5565b60405180821515815260200191505060405180910390f35b6104c2611078565b6040518082815260200191505060405180910390f35b6104e0611128565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61054e6004803603602081101561052257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061114e565b005b6105926004803603602081101561056657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113ed565b6040518082815260200191505060405180910390f35b6105b0611435565b005b6105ba6115c0565b604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b6105f56115f2565b6040518082815260200191505060405180910390f35b610613611651565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610647611677565b005b61065161168a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106856116b4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106c55780820151818401526020810190506106aa565b50505050905090810190601f1680156106f25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61074c6004803603604081101561071657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611756565b60405180821515815260200191505060405180910390f35b61076c611823565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107e4600480360360408110156107ae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611849565b60405180821515815260200191505060405180910390f35b610804611867565b6040518082815260200191505060405180910390f35b6108466004803603602081101561083057600080fd5b81019080803590602001909291905050506119cb565b005b610850611b7d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108e86004803603606081101561089257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ba3565b005b6108f2611ce9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109806004803603604081101561093457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d0f565b6040518082815260200191505060405180910390f35b61099e611d96565b005b6109e2600480360360208110156109b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e49565b005b6109ec612091565b6040518082815260200191505060405180910390f35b610a0a6120b5565b005b610a146124b3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a8260048036036020811015610a5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124d9565b005b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b1c5780601f10610af157610100808354040283529160200191610b1c565b820191906000526020600020905b815481529060010190602001808311610aff57829003601f168201915b5050505050905090565b6000610b3a610b336126e9565b84846126f1565b6001905092915050565b6000600254905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631f1fcd516040518163ffffffff1660e01b815260040160206040518083038186803b158015610bb857600080fd5b505afa158015610bcc573d6000803e3d6000fd5b505050506040513d6020811015610be257600080fd5b8101908080519060200190929190505050905090565b6000610c058484846128e8565b610cc684610c116126e9565b610cc1856040518060600160405280602881526020016138cb60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610c776126e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ba99092919063ffffffff16565b6126f1565b600190509392505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610d2c610d04610b44565b610d1e84610d10611867565b612c6990919063ffffffff16565b612cef90919063ffffffff16565b9050610d383383612d39565b6000610d42610b4e565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610da857600080fd5b505afa158015610dbc573d6000803e3d6000fd5b505050506040513d6020811015610dd257600080fd5b8101908080519060200190929190505050905081811015610f77576000610e028284612efd90919063ffffffff16565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b505050506000610e9b610b4e565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f0157600080fd5b505afa158015610f15573d6000803e3d6000fd5b505050506040513d6020811015610f2b57600080fd5b810190808051906020019092919050505090506000610f538483612efd90919063ffffffff16565b905082811015610f7357610f708185612f4790919063ffffffff16565b94505b5050505b610fa93383610f84610b4e565b73ffffffffffffffffffffffffffffffffffffffff16612fcf9092919063ffffffff16565b505050565b6000600560009054906101000a900460ff16905090565b600061106e610fd26126e9565b846110698560016000610fe36126e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f4790919063ffffffff16565b6126f1565b6001905092915050565b6000611082610b4e565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156110e857600080fd5b505afa1580156110fc573d6000803e3d6000fd5b505050506040513d602081101561111257600080fd5b8101908080519060200190929190505050905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111566126e9565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611218576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561125e57600080fd5b505afa158015611272573d6000803e3d6000fd5b505050506040513d602081101561128857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161461131c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806138896021913960400191505060405180910390fd5b60405180604001604052808273ffffffffffffffffffffffffffffffffffffffff16815260200142815250600760008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101559050507f1aae2ec5647db56da2d513de40528ba3565c6057525637050660c4323bbac7df81604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61143d6126e9565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60078060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b6000806115fd610b44565b146116425761163d61160d610b44565b61162f670de0b6b3a7640000611621611867565b612c6990919063ffffffff16565b612cef90919063ffffffff16565b61164c565b670de0b6b3a76400005b905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611688611683336113ed565b610cf7565b565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561174c5780601f106117215761010080835404028352916020019161174c565b820191906000526020600020905b81548152906001019060200180831161172f57829003601f168201915b5050505050905090565b60006118196117636126e9565b8461181485604051806060016040528060258152602001613987602591396001600061178d6126e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ba99092919063ffffffff16565b6126f1565b6001905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061185d6118566126e9565b84846128e8565b6001905092915050565b60006119c6600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663722713f76040518163ffffffff1660e01b815260040160206040518083038186803b1580156118d457600080fd5b505afa1580156118e8573d6000803e3d6000fd5b505050506040513d60208110156118fe57600080fd5b8101908080519060200190929190505050611917610b4e565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561197d57600080fd5b505afa158015611991573d6000803e3d6000fd5b505050506040513d60208110156119a757600080fd5b8101908080519060200190929190505050612f4790919063ffffffff16565b905090565b600160066000828254019250508190555060006006549050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663573fef0a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a4d57600080fd5b505af1158015611a61573d6000803e3d6000fd5b5050505060008290506000611a936064611a85602887612c6990919063ffffffff16565b612cef90919063ffffffff16565b9050611aa88183612efd90919063ffffffff16565b93506000611ab4611867565b9050611aea333085611ac4610b4e565b73ffffffffffffffffffffffffffffffffffffffff16613071909392919063ffffffff16565b611af382613132565b6000611afd611867565b9050611b128282612efd90919063ffffffff16565b9550600080611b1f610b44565b1415611b2d57869050611b5c565b611b5983611b4b611b3c610b44565b8a612c6990919063ffffffff16565b612cef90919063ffffffff16565b90505b611b663382613223565b50505050506006548114611b7957600080fd5b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663573fef0a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c0d57600080fd5b505af1158015611c21573d6000803e3d6000fd5b505050506000611c2f611867565b9050611c5e3330858773ffffffffffffffffffffffffffffffffffffffff16613071909392919063ffffffff16565b611c6e611c69611867565b613132565b6000611c78611867565b9050611c8d8282612efd90919063ffffffff16565b9350600080611c9a610b44565b1415611ca857849050611cd7565b611cd483611cc6611cb7610b44565b88612c6990919063ffffffff16565b612cef90919063ffffffff16565b90505b611ce18482613223565b505050505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611e47611da1610b4e565b73ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611e0757600080fd5b505afa158015611e1b573d6000803e3d6000fd5b505050506040513d6020811015611e3157600080fd5b81019080805190602001909291905050506119cb565b565b611e516126e9565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611f1b610b4e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260068152602001807f21746f6b656e000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561202557600080fd5b505afa158015612039573d6000803e3d6000fd5b505050506040513d602081101561204f57600080fd5b8101908080519060200190929190505050905061208d33828473ffffffffffffffffffffffffffffffffffffffff16612fcf9092919063ffffffff16565b5050565b7f000000000000000000000000000000000000000000000000000000000001518081565b6120bd6126e9565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461217f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612247576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5468657265206973206e6f2063616e646964617465000000000000000000000081525060200191505060405180910390fd5b426122807f0000000000000000000000000000000000000000000000000000000000015180600760010154612f4790919063ffffffff16565b106122f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f44656c617920686173206e6f742070617373656400000000000000000000000081525060200191505060405180910390fd5b7f7f37d440e85aba7fbf641c4bda5ca4ef669a80bffaacde2aa8d9feb1b048c82c600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb6177876040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156123cf57600080fd5b505af11580156123e3573d6000803e3d6000fd5b50505050600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600760000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555064012a05f2006007600101819055506124b16124ac611867565b613132565b565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6124e16126e9565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061381b6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612777576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806139396024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806138416022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561296e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806139146025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806137d66023913960400191505060405180910390fd5b6129ff8383836133ea565b612a6a81604051806060016040528060268152602001613863602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ba99092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612afd816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f4790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290612c56576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c1b578082015181840152602081019050612c00565b50505050905090810190601f168015612c485780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080831415612c7c5760009050612ce9565b6000828402905082848281612c8d57fe5b0414612ce4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806138aa6021913960400191505060405180910390fd5b809150505b92915050565b6000612d3183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506133ef565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dbf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806138f36021913960400191505060405180910390fd5b612dcb826000836133ea565b612e36816040518060600160405280602281526020016137f9602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ba99092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e8d81600254612efd90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000612f3f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ba9565b905092915050565b600080828401905083811015612fc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b61306c8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506134b5565b505050565b61312c846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506134b5565b50505050565b600061313c611078565b9050613192600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261316d610b4e565b73ffffffffffffffffffffffffffffffffffffffff16612fcf9092919063ffffffff16565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639213b124836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561320757600080fd5b505af115801561321b573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6132d2600083836133ea565b6132e781600254612f4790919063ffffffff16565b60028190555061333e816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f4790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b505050565b6000808311829061349b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613460578082015181840152602081019050613445565b50505050905090810190601f16801561348d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816134a757fe5b049050809150509392505050565b6060613517826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135a49092919063ffffffff16565b905060008151111561359f5780806020019051602081101561353857600080fd5b810190808051906020019092919050505061359e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061395d602a913960400191505060405180910390fd5b5b505050565b60606135b384846000856135bc565b90509392505050565b60606135c7856137c2565b613639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106136895780518252602082019150602081019050602083039250613666565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146136eb576040519150601f19603f3d011682016040523d82523d6000602084013e6136f0565b606091505b509150915081156137055780925050506137ba565b6000815111156137185780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561377f578082015181840152602081019050613764565b50505050905090810190601f1680156137ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b90506000811191505091905056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636550726f706f73616c206e6f742076616c696420666f722074686973205661756c74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122026f65b227749a9f8a5293dbc8760291a24812823d5d428094a207cfb7dedf52464736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000021e3460b7e3c707fe4e3884b4024a00c924d5354000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000009472d544f4d422d363000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009472d544f4d422d36300000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _strategy (address): 0x21e3460b7E3C707fe4E3884b4024A00c924D5354
Arg [1] : _name (string): G-TOMB-60
Arg [2] : _symbol (string): G-TOMB-60
Arg [3] : _approvalDelay (uint256): 86400
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000021e3460b7e3c707fe4e3884b4024a00c924d5354
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 472d544f4d422d36300000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [7] : 472d544f4d422d36300000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
35698:8577:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17428:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19534:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18503:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37833:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20177:321;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36506:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41056:558;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18355:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20907:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38635:108;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36341:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41787:378;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18666:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31700:148;;;:::i;:::-;;35977:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;38965:154;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36591:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40736:82;;;:::i;:::-;;31058:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;17630:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21628:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36072:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18998:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38204:140;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39512:780;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36261:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;43682:590;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36231:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19236:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39223:87;;;:::i;:::-;;43419:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36186:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42417:535;;;:::i;:::-;;36424:75;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32003:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17428:83;17465:13;17498:5;17491:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17428:83;:::o;19534:169::-;19617:4;19634:39;19643:12;:10;:12::i;:::-;19657:7;19666:6;19634:8;:39::i;:::-;19691:4;19684:11;;19534:169;;;;:::o;18503:100::-;18556:7;18583:12;;18576:19;;18503:100;:::o;37833:94::-;37870:6;37903:8;;;;;;;;;;;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37889:30;;37833:94;:::o;20177:321::-;20283:4;20300:36;20310:6;20318:9;20329:6;20300:9;:36::i;:::-;20347:121;20356:6;20364:12;:10;:12::i;:::-;20378:89;20416:6;20378:89;;;;;;;;;;;;;;;;;:11;:19;20390:6;20378:19;;;;;;;;;;;;;;;:33;20398:12;:10;:12::i;:::-;20378:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;20347:8;:121::i;:::-;20486:4;20479:11;;20177:321;;;;;:::o;36506:78::-;;;;;;;;;;;;;:::o;41056:558::-;41109:9;41121:43;41150:13;:11;:13::i;:::-;41122:22;41136:7;41122:9;:7;:9::i;:::-;:13;;:22;;;;:::i;:::-;41121:28;;:43;;;;:::i;:::-;41109:55;;41175:26;41181:10;41193:7;41175:5;:26::i;:::-;41214:6;41223;:4;:6::i;:::-;:16;;;41248:4;41223:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41214:40;;41273:1;41269;:5;41265:295;;;41291:14;41308:8;41314:1;41308;:5;;:8;;;;:::i;:::-;41291:25;;41331:8;;;;;;;;;;;:17;;;41349:9;41331:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41374:11;41388:6;:4;:6::i;:::-;:16;;;41413:4;41388:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41374:45;;41434:10;41447:13;41458:1;41447:6;:10;;:13;;;;:::i;:::-;41434:26;;41487:9;41479:5;:17;41475:74;;;41521:12;41527:5;41521:1;:5;;:12;;;;:::i;:::-;41517:16;;41475:74;41265:295;;;;41572:34;41592:10;41604:1;41572:6;:4;:6::i;:::-;:19;;;;:34;;;;;:::i;:::-;41056:558;;;:::o;18355:83::-;18396:5;18421:9;;;;;;;;;;;18414:16;;18355:83;:::o;20907:218::-;20995:4;21012:83;21021:12;:10;:12::i;:::-;21035:7;21044:50;21083:10;21044:11;:25;21056:12;:10;:12::i;:::-;21044:25;;;;;;;;;;;;;;;:34;21070:7;21044:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;21012:8;:83::i;:::-;21113:4;21106:11;;20907:218;;;;:::o;38635:108::-;38677:7;38704:6;:4;:6::i;:::-;:16;;;38729:4;38704:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38697:38;;38635:108;:::o;36341:76::-;;;;;;;;;;;;;:::o;41787:378::-;31280:12;:10;:12::i;:::-;31270:22;;:6;;;;;;;;;;;:22;;;31262:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41897:15:::1;41887:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;41870:51;;41878:4;41870:51;;;41862:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41987:118;;;;;;;;42033:15;41987:118;;;;;;42077:15;41987:118;;::::0;41970:14:::1;:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42123:34;42141:15;42123:34;;;;;;;;;;;;;;;;;;;;41787:378:::0;:::o;18666:119::-;18732:7;18759:9;:18;18769:7;18759:18;;;;;;;;;;;;;;;;18752:25;;18666:119;;;:::o;31700:148::-;31280:12;:10;:12::i;:::-;31270:22;;:6;;;;;;;;;;;:22;;;31262:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31807:1:::1;31770:40;;31791:6;;;;;;;;;;;31770:40;;;;;;;;;;;;31838:1;31821:6;;:19;;;;;;;;;;;;;;;;;;31700:148::o:0;35977:36::-;;;;;;;;;;;;;;;;;;;;;;;:::o;38965:154::-;39018:7;39062:1;39045:13;:11;:13::i;:::-;:18;:66;;39073:38;39097:13;:11;:13::i;:::-;39073:19;39087:4;39073:9;:7;:9::i;:::-;:13;;:19;;;;:::i;:::-;:23;;:38;;;;:::i;:::-;39045:66;;;39066:4;39045:66;39038:73;;38965:154;:::o;36591:76::-;;;;;;;;;;;;;:::o;40736:82::-;40779:31;40788:21;40798:10;40788:9;:21::i;:::-;40779:8;:31::i;:::-;40736:82::o;31058:79::-;31096:7;31123:6;;;;;;;;;;;31116:13;;31058:79;:::o;17630:87::-;17669:13;17702:7;17695:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17630:87;:::o;21628:269::-;21721:4;21738:129;21747:12;:10;:12::i;:::-;21761:7;21770:96;21809:15;21770:96;;;;;;;;;;;;;;;;;:11;:25;21782:12;:10;:12::i;:::-;21770:25;;;;;;;;;;;;;;;:34;21796:7;21770:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;21738:8;:129::i;:::-;21885:4;21878:11;;21628:269;;;;:::o;36072:25::-;;;;;;;;;;;;;:::o;18998:175::-;19084:4;19101:42;19111:12;:10;:12::i;:::-;19125:9;19136:6;19101:9;:42::i;:::-;19161:4;19154:11;;18998:175;;;;:::o;38204:140::-;38244:4;38268:68;38314:8;;;;;;;;;;;38304:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38268:6;:4;:6::i;:::-;:16;;;38293:4;38268:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:35;;:68;;;;:::i;:::-;38261:75;;38204:140;:::o;39512:780::-;33088:1;33071:13;;:18;;;;;;;;;;;33096:20;33119:13;;33096:36;;39574:8:::1;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39609:21;39633:7;39609:31;;39651:20;39674:24;39694:3;39674:15;39686:2;39674:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;39651:47;;39729:31;39747:12;39729:13;:17;;:31;;;;:::i;:::-;39719:41;;39773:13;39789:9;:7;:9::i;:::-;39773:25;;39848:65;39872:10;39892:4;39899:13;39848:6;:4;:6::i;:::-;:23;;;;:65;;;;;;:::i;:::-;39924:18;39929:12;39924:4;:18::i;:::-;39953:14;39970:9;:7;:9::i;:::-;39953:26;;40000:17;40011:5;40000:6;:10;;:17;;;;:::i;:::-;39990:27;;40072:14;40122:1:::0;40105:13:::1;:11;:13::i;:::-;:18;40101:148;;;40149:7;40140:16;;40101:148;;;40198:39;40231:5;40199:26;40211:13;:11;:13::i;:::-;40199:7;:11;;:26;;;;:::i;:::-;40198:32;;:39;;;;:::i;:::-;40189:48;;40101:148;40259:25;40265:10;40277:6;40259:5;:25::i;:::-;33139:1;;;;;33171:13:::0;;33155:12;:29;33147:38;;;;;;39512:780;;:::o;36261:73::-;;;;;;;;;;;;;:::o;43682:590::-;43763:8;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43800:13;43816:9;:7;:9::i;:::-;43800:25;;43836:66;43867:10;43887:4;43894:7;43843:5;43836:30;;;;:66;;;;;;:::i;:::-;43913:15;43918:9;:7;:9::i;:::-;43913:4;:15::i;:::-;43939:14;43956:9;:7;:9::i;:::-;43939:26;;43986:17;43997:5;43986:6;:10;;:17;;;;:::i;:::-;43976:27;;44058:14;44108:1;44091:13;:11;:13::i;:::-;:18;44087:148;;;44135:7;44126:16;;44087:148;;;44184:39;44217:5;44185:26;44197:13;:11;:13::i;:::-;44185:7;:11;;:26;;;;:::i;:::-;44184:32;;:39;;;;:::i;:::-;44175:48;;44087:148;44245:19;44251:4;44257:6;44245:5;:19::i;:::-;43682:590;;;;;;:::o;36231:23::-;;;;;;;;;;;;;:::o;19236:151::-;19325:7;19352:11;:18;19364:5;19352:18;;;;;;;;;;;;;;;:27;19371:7;19352:27;;;;;;;;;;;;;;;;19345:34;;19236:151;;;;:::o;39223:87::-;39265:37;39273:6;:4;:6::i;:::-;:16;;;39290:10;39273:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39265:7;:37::i;:::-;39223:87::o;43419:255::-;31280:12;:10;:12::i;:::-;31270:22;;:6;;;;;;;;;;;:22;;;31262:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43521:6:::1;:4;:6::i;:::-;43503:25;;:6;:25;;;;43495:44;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;43552:14;43576:6;43569:24;;;43602:4;43569:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;43552:56;;43619:47;43647:10;43659:6;43626;43619:27;;;;:47;;;;;:::i;:::-;31340:1;43419:255:::0;:::o;36186:38::-;;;:::o;42417:535::-;31280:12;:10;:12::i;:::-;31270:22;;:6;;;;;;;;;;;:22;;;31262:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42518:1:::1;42477:43;;:14;:29;;;;;;;;;;;;:43;;;;42469:77;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;42614:15;42565:46;42597:13;42565:14;:27;;;:31;;:46;;;;:::i;:::-;:64;42557:97;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;42672:43;42685:14;:29;;;;;;;;;;;;42672:43;;;;;;;;;;;;;;;;;;;;42728:8;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42782:14;:29;;;;;;;;;;;;42761:8;;:51;;;;;;;;;;;;;;;;;;42863:1;42823:14;:29;;;:42;;;;;;;;;;;;;;;;;;42906:10;42876:14;:27;;:40;;;;42929:15;42934:9;:7;:9::i;:::-;42929:4;:15::i;:::-;42417:535::o:0;36424:75::-;;;;;;;;;;;;;:::o;32003:244::-;31280:12;:10;:12::i;:::-;31270:22;;:6;;;;;;;;;;;:22;;;31262:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32112:1:::1;32092:22;;:8;:22;;;;32084:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32202:8;32173:38;;32194:6;;;;;;;;;;;32173:38;;;;;;;;;;;;32231:8;32222:6;;:17;;;;;;;;;;;;;;;;;;32003:244:::0;:::o;657:106::-;710:15;745:10;738:17;;657:106;:::o;24773:346::-;24892:1;24875:19;;:5;:19;;;;24867:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24973:1;24954:21;;:7;:21;;;;24946:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25057:6;25027:11;:18;25039:5;25027:18;;;;;;;;;;;;;;;:27;25046:7;25027:27;;;;;;;;;;;;;;;:36;;;;25095:7;25079:32;;25088:5;25079:32;;;25104:6;25079:32;;;;;;;;;;;;;;;;;;24773:346;;;:::o;22387:539::-;22511:1;22493:20;;:6;:20;;;;22485:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22595:1;22574:23;;:9;:23;;;;22566:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22650:47;22671:6;22679:9;22690:6;22650:20;:47::i;:::-;22730:71;22752:6;22730:71;;;;;;;;;;;;;;;;;:9;:17;22740:6;22730:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;22710:9;:17;22720:6;22710:17;;;;;;;;;;;;;;;:91;;;;22835:32;22860:6;22835:9;:20;22845:9;22835:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;22812:9;:20;22822:9;22812:20;;;;;;;;;;;;;;;:55;;;;22900:9;22883:35;;22892:6;22883:35;;;22911:6;22883:35;;;;;;;;;;;;;;;;;;22387:539;;;:::o;5638:192::-;5724:7;5757:1;5752;:6;;5760:12;5744:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5784:9;5800:1;5796;:5;5784:17;;5821:1;5814:8;;;5638:192;;;;;:::o;6089:471::-;6147:7;6397:1;6392;:6;6388:47;;;6422:1;6415:8;;;;6388:47;6447:9;6463:1;6459;:5;6447:17;;6492:1;6487;6483;:5;;;;;;:10;6475:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6551:1;6544:8;;;6089:471;;;;;:::o;7036:132::-;7094:7;7121:39;7125:1;7128;7121:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7114:46;;7036:132;;;;:::o;23917:418::-;24020:1;24001:21;;:7;:21;;;;23993:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24073:49;24094:7;24111:1;24115:6;24073:20;:49::i;:::-;24156:68;24179:6;24156:68;;;;;;;;;;;;;;;;;:9;:18;24166:7;24156:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;24135:9;:18;24145:7;24135:18;;;;;;;;;;;;;;;:89;;;;24250:24;24267:6;24250:12;;:16;;:24;;;;:::i;:::-;24235:12;:39;;;;24316:1;24290:37;;24299:7;24290:37;;;24320:6;24290:37;;;;;;;;;;;;;;;;;;23917:418;;:::o;5199:136::-;5257:7;5284:43;5288:1;5291;5284:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5277:50;;5199:136;;;;:::o;4735:181::-;4793:7;4813:9;4829:1;4825;:5;4813:17;;4854:1;4849;:6;;4841:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4907:1;4900:8;;;4735:181;;;;:::o;26893:177::-;26976:86;26996:5;27026:23;;;27051:2;27055:5;27003:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26976:19;:86::i;:::-;26893:177;;;:::o;27078:205::-;27179:96;27199:5;27229:27;;;27258:4;27264:2;27268:5;27206:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27179:19;:96::i;:::-;27078:205;;;;:::o;40459:172::-;40509:9;40521:11;:9;:11::i;:::-;40509:23;;40543:44;40571:8;;;;;;;;;;;40582:4;40543:6;:4;:6::i;:::-;:19;;;;:44;;;;;:::i;:::-;40598:8;;;;;;;;;;;:17;;;40616:6;40598:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40459:172;;:::o;23207:378::-;23310:1;23291:21;;:7;:21;;;;23283:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23361:49;23390:1;23394:7;23403:6;23361:20;:49::i;:::-;23438:24;23455:6;23438:12;;:16;;:24;;;;:::i;:::-;23423:12;:39;;;;23494:30;23517:6;23494:9;:18;23504:7;23494:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;23473:9;:18;23483:7;23473:18;;;;;;;;;;;;;;;:51;;;;23561:7;23540:37;;23557:1;23540:37;;;23570:6;23540:37;;;;;;;;;;;;;;;;;;23207:378;;:::o;26144:92::-;;;;:::o;7664:278::-;7750:7;7782:1;7778;:5;7785:12;7770:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7809:9;7825:1;7821;:5;;;;;;7809:17;;7933:1;7926:8;;;7664:278;;;;;:::o;29198:761::-;29622:23;29648:69;29676:4;29648:69;;;;;;;;;;;;;;;;;29656:5;29648:27;;;;:69;;;;;:::i;:::-;29622:95;;29752:1;29732:10;:17;:21;29728:224;;;29874:10;29863:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29855:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29728:224;29198:761;;;:::o;12877:196::-;12980:12;13012:53;13035:6;13043:4;13049:1;13052:12;13012:22;:53::i;:::-;13005:60;;12877:196;;;;;:::o;14254:979::-;14384:12;14417:18;14428:6;14417:10;:18::i;:::-;14409:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14543:12;14557:23;14584:6;:11;;14604:8;14615:4;14584:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14542:78;;;;14635:7;14631:595;;;14666:10;14659:17;;;;;;14631:595;14800:1;14780:10;:17;:21;14776:439;;;15043:10;15037:17;15104:15;15091:10;15087:2;15083:19;15076:44;14991:148;15186:12;15179:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14254:979;;;;;;;:::o;9959:422::-;10019:4;10227:12;10338:7;10326:20;10318:28;;10372:1;10365:4;:8;10358:15;;;9959:422;;;:::o
Swarm Source
ipfs://26f65b227749a9f8a5293dbc8760291a24812823d5d428094a207cfb7dedf524
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.