Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 13787902 | 1066 days ago | IN | 0 ETH | 0.09144061 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
RelevantTokenV3
Compiler Version
v0.5.5+commit.47a71e8f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-21 */ // Sources flattened with hardhat v2.6.2 https://hardhat.org // File @openzeppelin/upgrades/contracts/[email protected] pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File @openzeppelin/contracts-ethereum-package/contracts/GSN/[email protected] pragma solidity ^0.5.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. */ contract Context is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view 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-ethereum-package/contracts/token/ERC20/[email protected] pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ 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-ethereum-package/contracts/math/[email protected] pragma solidity ^0.5.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. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 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. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/[email protected] pragma solidity ^0.5.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 {ERC20Mintable}. * * 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 Initializable, Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view 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 returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public 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 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 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 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 { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _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 { require(account != address(0), "ERC20: mint to the zero address"); _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 { require(account != address(0), "ERC20: burn from the zero address"); _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 is 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 { 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 Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } uint256[50] private ______gap; } // File @openzeppelin/contracts-ethereum-package/contracts/ownership/[email protected] pragma solidity ^0.5.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. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be aplied to your functions to restrict their use to * the owner. */ contract Ownable is Initializable, Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function initialize(address sender) public initializer { _owner = sender; emit OwnershipTransferred(address(0), _owner); } /** * @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(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _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 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[50] private ______gap; } // File @openzeppelin/contracts-ethereum-package/contracts/cryptography/[email protected] pragma solidity ^0.5.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * NOTE: This call _does not revert_ if the signature is invalid, or * if the signer is otherwise unable to be retrieved. In those scenarios, * the zero address is returned. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { return (address(0)); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return address(0); } if (v != 27 && v != 28) { return address(0); } // If the signature is valid (and not malleable), return the signer address return ecrecover(hash, v, r, s); } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`] * JSON-RPC method. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } // File @openzeppelin/contracts-ethereum-package/contracts/utils/[email protected] pragma solidity ^0.5.5; /** * @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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @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]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/[email protected] pragma solidity ^0.5.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 ERC20;` 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)); } 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. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/RelevantTokenV3.sol pragma solidity ^0.5.0; contract RelevantTokenV3 is Initializable, ERC20, Ownable { event Released(uint256 amount, uint256 secondsSinceLast, uint256 timestamp); event Claimed(address indexed account, uint256 amount); event SetAdmin(address admin); event SetInflation(uint256 inflation); event UpdateAllocatedRewards(uint256 allocatedRewards); event SetVestingContract(address vestingContract); uint256[101] private ______gap; // gap from prev version string public name; uint8 public decimals; string public symbol; string public version; address public admin; // (former dev fund address) this account is allowed to distribute rewards uint256 public inflation; // yearly inflation rate in basis points uint256 public lastReward; // timestamp when last reward was issued uint256[15] private ______gap1; // gap from prev version uint256 public allocatedRewards; // temporary - to be removed in future version for cleaner logic uint256 private ______gap2; // gap from prev version mapping(address => uint256) private nonces; uint256[4] private ______gap3; // gap from prev version bool public initializedV3; uint256 private constant INFLATION_DENOM = 1 days * 356 * 10000; // keccak256("ClaimTokens(address account,uint256 amount,uint256 nonce)") bytes32 public constant CLAIM_HASH = 0xa53a2b3fab2ad1dd8877a41407c34f62362beca7419151220729194783585d4c; bytes32 public DOMAIN_SEPARATOR; address public vestingContract; uint256 public constant MAX_INFLATION = 2_000; // inflation should not exceed 20% // Initialize the current version function initV3(address _admin, uint256 _inflation) public onlyOwner { require(!initializedV3, "Rel: v3 already initialized"); lastReward = block.timestamp; version = "v3"; initializedV3 = true; setAdmin(_admin); setInflation(_inflation); setVestingContract(address(0)); bytes32 nameHash = keccak256(bytes(name)); bytes32 versionHash = keccak256(bytes("1")); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); DOMAIN_SEPARATOR = keccak256(abi.encode(typeHash, nameHash, versionHash, 1, address(this))); } function setVestingContract(address _vestingContract) public onlyOwner { require(initializedV3, "Rel: v3 not initialized"); vestingContract = _vestingContract; emit SetVestingContract(_vestingContract); } function setInflation(uint256 _inflation) public onlyOwner { require(initializedV3, "Rel: v3 not initialized"); require(_inflation <= MAX_INFLATION, "Rel: inflation should not exceed max"); inflation = _inflation; emit SetInflation(_inflation); } function setAdmin(address _admin) public { require(msg.sender == admin || msg.sender == owner(), "Rel: not authorized"); require(initializedV3, "Rel: v3 not initialized"); admin = _admin; emit SetAdmin(admin); } // Burn tokens that belong to the smart contract but are not allocatedRewards function burn(uint256 amount) public onlyOwner { _burn(address(this), amount); require(balanceOf(address(this)) >= allocatedRewards, "Rel: cannot burn allocated tokens"); } function updateAllocatedRewards(uint256 newAllocatedRewards) public onlyOwner { require(newAllocatedRewards <= balanceOf(address(this)), "Rel: not enough tokens in contract"); require(newAllocatedRewards >= allocatedRewards, "Rel: allocatedRewards cannot decrease"); allocatedRewards = newAllocatedRewards; emit UpdateAllocatedRewards(allocatedRewards); } // send allocated tokens to vesting contracs // should we hardcode vestingContract or make this a generic recover funds method? function vestAllocatedTokens(uint256 amount) public onlyOwner { require(allocatedRewards >= amount, "Rel: not enough allocated tokens"); require(vestingContract != address(0), "Rel: vestingContract not set"); _transfer(address(this), vestingContract, amount); allocatedRewards = allocatedRewards.sub(amount); } // Compute and mint inflationary rewards (at most once a day) function releaseTokens() public { require(initializedV3, "Rel: v3 not initialized"); require(inflation > 0, "Rel: inflation is 0"); uint256 secondsSinceLast = (block.timestamp.sub(lastReward)); require(secondsSinceLast / (1 days) > 0, "Rel: less than one day from last reward"); uint256 rewardAmount = totalSupply().mul(secondsSinceLast).mul(inflation).div(INFLATION_DENOM); allocatedRewards = allocatedRewards.add(rewardAmount); uint256 balance = balanceOf(address(this)); // currently there are tokens in the smart contract pre-allocated as rewards // while the contract holds more tokens than are allocated as rewards, we don't need to mint new tokens if (balance < allocatedRewards) { uint256 mintAmount = allocatedRewards.sub(balance); _mint(address(this), mintAmount); } lastReward = block.timestamp; emit Released(rewardAmount, secondsSinceLast, lastReward); } // Claim curation reward tokens (to be called by user) function claimTokens(uint256 amount, bytes memory signature) public { require(initializedV3, "Rel: v3 not initialized"); require(allocatedRewards >= amount, "Rel: not enough allocated tokens"); uint256 nonce = nonces[msg.sender]; bytes32 structHash = keccak256(abi.encode(CLAIM_HASH, msg.sender, amount, nonce)); bytes32 digest = keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, structHash)); // check that the message was signed by contract owner address signer = ECDSA.recover(digest, signature); require(admin == signer, "Rel: claim not authorized"); nonces[msg.sender] = nonce + 1; allocatedRewards = allocatedRewards.sub(amount); _transfer(address(this), msg.sender, amount); emit Claimed(msg.sender, amount); } function nonceOf(address account) public view returns (uint256) { return nonces[account]; } // sweep tokens accidentally sent to contract function sweep(IERC20 token, uint256 amount) public { require(msg.sender == admin || msg.sender == owner(), "Rel: not authorized"); if (token == IERC20(this)) require( amount <= balanceOf(address(this)) - allocatedRewards, "Rel: cannot sweep allocatedRewards" ); SafeERC20.safeTransfer(token, msg.sender, amount); } // Prevent ETH from being sent to contract function() external payable { revert(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"amount","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"signature","type":"bytes"}],"name":"claimTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CLAIM_HASH","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vestingContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"}],"name":"sweep","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_vestingContract","type":"address"}],"name":"setVestingContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"allocatedRewards","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"vestAllocatedTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"releaseTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initializedV3","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"inflation","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAllocatedRewards","type":"uint256"}],"name":"updateAllocatedRewards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_inflation","type":"uint256"}],"name":"setInflation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"nonceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_admin","type":"address"},{"name":"_inflation","type":"uint256"}],"name":"initV3","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_INFLATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"secondsSinceLast","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"admin","type":"address"}],"name":"SetAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"inflation","type":"uint256"}],"name":"SetInflation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"allocatedRewards","type":"uint256"}],"name":"UpdateAllocatedRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"vestingContract","type":"address"}],"name":"SetVestingContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]
Contract Creation Code
6080604052612a92806100136000396000f3fe60806040526004361061021a5760003560e01c806385f1a5c111610123578063c4d66de8116100ab578063ed2a2d641161006f578063ed2a2d6414610807578063f2fde38b1461083a578063f30facf41461086d578063f851a440146108a6578063fdb04bbf146108bb5761021a565b8063c4d66de814610730578063c9b1714914610763578063cc29c34714610778578063dd62ed3e146107a2578063e0a8ed52146107dd5761021a565b8063a457c2d7116100f2578063a457c2d71461067f578063a9059cbb146106b8578063a96f8668146106f1578063b782e30314610706578063be0522e01461071b5761021a565b806385f1a5c1146106165780638da5cb5b146106405780638f32d59b1461065557806395d89b411461066a5761021a565b806342966c68116101a6578063704b6c0211610175578063704b6c021461055357806370a0823114610586578063715018a6146105b957806374991569146105ce5780637d556df0146106015761021a565b806342966c68146104aa57806354fd4d50146104d45780635e6f6045146104e95780636ea056a91461051a5761021a565b806323b872dd116101ed57806323b872dd146103d9578063313ce5671461041c57806333a6cc58146104475780633644e5151461045c57806339509351146104715761021a565b806306fdde031461021f578063095ea7b3146102a957806314d8bbf1146102f657806318160ddd146103b2575b600080fd5b34801561022b57600080fd5b506102346108d0565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026e578181015183820152602001610256565b50505050905090810190601f16801561029b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102b557600080fd5b506102e2600480360360408110156102cc57600080fd5b506001600160a01b03813516906020013561095d565b604080519115158252519081900360200190f35b34801561030257600080fd5b506103b06004803603604081101561031957600080fd5b8135919081019060408101602082013564010000000081111561033b57600080fd5b82018360208201111561034d57600080fd5b8035906020019184600183028401116401000000008311171561036f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061097b945050505050565b005b3480156103be57600080fd5b506103c7610bb1565b60408051918252519081900360200190f35b3480156103e557600080fd5b506102e2600480360360608110156103fc57600080fd5b506001600160a01b03813581169160208101359091169060400135610bb8565b34801561042857600080fd5b50610431610c45565b6040805160ff9092168252519081900360200190f35b34801561045357600080fd5b506103c7610c4f565b34801561046857600080fd5b506103c7610c73565b34801561047d57600080fd5b506102e26004803603604081101561049457600080fd5b506001600160a01b038135169060200135610c7a565b3480156104b657600080fd5b506103b0600480360360208110156104cd57600080fd5b5035610cce565b3480156104e057600080fd5b50610234610d74565b3480156104f557600080fd5b506104fe610dd0565b604080516001600160a01b039092168252519081900360200190f35b34801561052657600080fd5b506103b06004803603604081101561053d57600080fd5b506001600160a01b038135169060200135610de0565b34801561055f57600080fd5b506103b06004803603602081101561057657600080fd5b50356001600160a01b0316610ed7565b34801561059257600080fd5b506103c7600480360360208110156105a957600080fd5b50356001600160a01b0316611005565b3480156105c557600080fd5b506103b0611020565b3480156105da57600080fd5b506103b0600480360360208110156105f157600080fd5b50356001600160a01b03166110b6565b34801561060d57600080fd5b506103c76111a2565b34801561062257600080fd5b506103b06004803603602081101561063957600080fd5b50356111a9565b34801561064c57600080fd5b506104fe6112e7565b34801561066157600080fd5b506102e26112f6565b34801561067657600080fd5b5061023461131c565b34801561068b57600080fd5b506102e2600480360360408110156106a257600080fd5b506001600160a01b038135169060200135611378565b3480156106c457600080fd5b506102e2600480360360408110156106db57600080fd5b506001600160a01b0381351690602001356113e6565b3480156106fd57600080fd5b506103b06113fa565b34801561071257600080fd5b506102e26115da565b34801561072757600080fd5b506103c76115e4565b34801561073c57600080fd5b506103b06004803603602081101561075357600080fd5b50356001600160a01b03166115eb565b34801561076f57600080fd5b506103c76116e1565b34801561078457600080fd5b506103b06004803603602081101561079b57600080fd5b50356116e8565b3480156107ae57600080fd5b506103c7600480360360408110156107c557600080fd5b506001600160a01b03813581169160200135166117ff565b3480156107e957600080fd5b506103b06004803603602081101561080057600080fd5b503561182a565b34801561081357600080fd5b506103c76004803603602081101561082a57600080fd5b50356001600160a01b0316611941565b34801561084657600080fd5b506103b06004803603602081101561085d57600080fd5b50356001600160a01b031661195d565b34801561087957600080fd5b506103b06004803603604081101561089057600080fd5b506001600160a01b0381351690602001356119b2565b3480156108b257600080fd5b506104fe611bc7565b3480156108c757600080fd5b506103c7611bd7565b61010080546040805160206002600185161586026000190190941693909304601f810184900484028201840190925281815292918301828280156109555780601f1061092a57610100808354040283529160200191610955565b820191906000526020600020905b81548152906001019060200180831161093857829003601f168201915b505050505081565b600061097161096a611bdd565b8484611be1565b5060015b92915050565b61011d5460ff1615156109c65760408051600160e51b62461bcd02815260206004820152601760248201526000805160206129bb833981519152604482015290519081900360640190fd5b61011654821115610a215760408051600160e51b62461bcd02815260206004820181905260248201527f52656c3a206e6f7420656e6f75676820616c6c6f636174656420746f6b656e73604482015290519081900360640190fd5b336000818152610118602090815260408083205481517fa53a2b3fab2ad1dd8877a41407c34f62362beca7419151220729194783585d4c81850152808301959095526060850187905260808086018290528251808703909101815260a08601835280519084012061011e54600160f01b6119010260c088015260c287015260e28087018290528351808803909101815261010290960190925284519490920193909320909291610ad18286611cd7565b610104549091506001600160a01b03808316911614610b3a5760408051600160e51b62461bcd02815260206004820152601960248201527f52656c3a20636c61696d206e6f7420617574686f72697a656400000000000000604482015290519081900360640190fd5b3360009081526101186020526040902060018501905561011654610b64908763ffffffff611dc616565b61011655610b73303388611e0f565b60408051878152905133917fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a919081900360200190a2505050505050565b6035545b90565b6000610bc5848484611e0f565b610c3b84610bd1611bdd565b610c368560405180606001604052806028815260200161288c602891396001600160a01b038a16600090815260346020526040812090610c0f611bdd565b6001600160a01b03168152602081019190915260400160002054919063ffffffff611f7716565b611be1565b5060019392505050565b6101015460ff1681565b7fa53a2b3fab2ad1dd8877a41407c34f62362beca7419151220729194783585d4c81565b61011e5481565b6000610971610c87611bdd565b84610c368560346000610c98611bdd565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61201116565b610cd66112f6565b1515610d1a5760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b610d24308261206e565b61011654610d3130611005565b1015610d7157604051600160e51b62461bcd0281526004018080602001828103825260218152602001806129fd6021913960400191505060405180910390fd5b50565b610103805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109555780601f1061092a57610100808354040283529160200191610955565b61011f546001600160a01b031681565b610104546001600160a01b0316331480610e125750610dfd6112e7565b6001600160a01b0316336001600160a01b0316145b1515610e685760408051600160e51b62461bcd02815260206004820152601360248201527f52656c3a206e6f7420617574686f72697a656400000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038216301415610ec85761011654610e8630611005565b03811115610ec857604051600160e51b62461bcd0281526004018080602001828103825260228152602001806129db6022913960400191505060405180910390fd5b610ed382338361216f565b5050565b610104546001600160a01b0316331480610f095750610ef46112e7565b6001600160a01b0316336001600160a01b0316145b1515610f5f5760408051600160e51b62461bcd02815260206004820152601360248201527f52656c3a206e6f7420617574686f72697a656400000000000000000000000000604482015290519081900360640190fd5b61011d5460ff161515610faa5760408051600160e51b62461bcd02815260206004820152601760248201526000805160206129bb833981519152604482015290519081900360640190fd5b61010480546001600160a01b0319166001600160a01b03838116919091179182905560408051929091168252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a1916020908290030190a150565b6001600160a01b031660009081526033602052604090205490565b6110286112f6565b151561106c5760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b6068546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606880546001600160a01b0319169055565b6110be6112f6565b15156111025760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b61011d5460ff16151561114d5760408051600160e51b62461bcd02815260206004820152601760248201526000805160206129bb833981519152604482015290519081900360640190fd5b61011f80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcd37955fa232bde7dcb7336a2e808e86c03538919d26347a5f4159971a4ef2629181900360200190a150565b6101165481565b6111b16112f6565b15156111f55760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b610116548111156112505760408051600160e51b62461bcd02815260206004820181905260248201527f52656c3a206e6f7420656e6f75676820616c6c6f636174656420746f6b656e73604482015290519081900360640190fd5b61011f546001600160a01b031615156112b35760408051600160e51b62461bcd02815260206004820152601c60248201527f52656c3a2076657374696e67436f6e7472616374206e6f742073657400000000604482015290519081900360640190fd5b61011f546112cc9030906001600160a01b031683611e0f565b610116546112e0908263ffffffff611dc616565b6101165550565b6068546001600160a01b031690565b6068546000906001600160a01b031661130d611bdd565b6001600160a01b031614905090565b610102805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109555780601f1061092a57610100808354040283529160200191610955565b6000610971611385611bdd565b84610c3685604051806060016040528060258152602001612a1e60259139603460006113af611bdd565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff611f7716565b60006109716113f3611bdd565b8484611e0f565b61011d5460ff1615156114455760408051600160e51b62461bcd02815260206004820152601760248201526000805160206129bb833981519152604482015290519081900360640190fd5b61010554151561149f5760408051600160e51b62461bcd02815260206004820152601360248201527f52656c3a20696e666c6174696f6e206973203000000000000000000000000000604482015290519081900360640190fd5b60006114b76101065442611dc690919063ffffffff16565b905060006201518082041161150057604051600160e51b62461bcd0281526004018080602001828103825260278152602001806127f26027913960400191505060405180910390fd5b600061153664479d6f600061152a6101055461151e8661151e610bb1565b9063ffffffff6121c916565b9063ffffffff61222916565b6101165490915061154d908263ffffffff61201116565b61011655600061155c30611005565b90506101165481101561158e5761011654600090611580908363ffffffff611dc616565b905061158c308261226b565b505b42610106819055604080518481526020810186905280820192909252517ff854feef4c325cc8fcfad1a693b62c4383c8d228c4ca0bc52f9e06095338a5f19181900360600190a1505050565b61011d5460ff1681565b6101055481565b600054610100900460ff16806116045750611604612362565b80611612575060005460ff16155b151561165257604051600160e51b62461bcd02815260040180806020018281038252602e8152602001806128d4602e913960400191505060405180910390fd5b600054610100900460ff1615801561167d576000805460ff1961ff0019909116610100171660011790555b606880546001600160a01b0319166001600160a01b0384811691909117918290556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015610ed3576000805461ff00191690555050565b6101065481565b6116f06112f6565b15156117345760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b61173d30611005565b81111561177e57604051600160e51b62461bcd0281526004018080602001828103825260228152602001806127626022913960400191505060405180910390fd5b610116548110156117c357604051600160e51b62461bcd02815260040180806020018281038252602581526020018061296c6025913960400191505060405180910390fd5b6101168190556040805182815290517f865f3a638835ca43ecaf61455138a2ae6948763fa8bc9e580f080cb097ad10a19181900360200190a150565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6118326112f6565b15156118765760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b61011d5460ff1615156118c15760408051600160e51b62461bcd02815260206004820152601760248201526000805160206129bb833981519152604482015290519081900360640190fd5b6107d081111561190557604051600160e51b62461bcd028152600401808060200182810382526024815260200180612a436024913960400191505060405180910390fd5b6101058190556040805182815290517fa2c906d360736c15f8fc6c4b049228f49b9f4f8dbe56808aa82f316833a055be9181900360200190a150565b6001600160a01b03166000908152610118602052604090205490565b6119656112f6565b15156119a95760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b610d7181612368565b6119ba6112f6565b15156119fe5760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b61011d5460ff1615611a5a5760408051600160e51b62461bcd02815260206004820152601b60248201527f52656c3a20763320616c726561647920696e697469616c697a65640000000000604482015290519081900360640190fd5b4261010655604080518082019091526002808252600160f01b617633026020909201918252611a8c9161010391612684565b5061011d805460ff19166001179055611aa482610ed7565b611aad8161182a565b611ab760006110b6565b60006101006040518082805460018160011615610100020316600290048015611b175780601f10611af5576101008083540402835291820191611b17565b820191906000526020600020905b815481529060010190602001808311611b03575b505060408051918290038220828201825260018352600160f81b603102602090930192909252519093507fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6925060009150806052612819823960408051918290036052018220602080840191909152828201969096526060820194909452600160808201523060a0808301919091528451808303909101815260c09091019093525050805191012061011e555050565b610104546001600160a01b031681565b6107d081565b3390565b6001600160a01b0383161515611c2b57604051600160e51b62461bcd0281526004018080602001828103825260248152602001806129486024913960400191505060405180910390fd5b6001600160a01b0382161515611c7557604051600160e51b62461bcd0281526004018080602001828103825260228152602001806127aa6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b8051600090604114611ceb57506000610975565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611d315760009350505050610975565b8060ff16601b14158015611d4957508060ff16601c14155b15611d5a5760009350505050610975565b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa158015611db1573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6000611e0883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f77565b9392505050565b6001600160a01b0383161515611e5957604051600160e51b62461bcd0281526004018080602001828103825260258152602001806129236025913960400191505060405180910390fd5b6001600160a01b0382161515611ea357604051600160e51b62461bcd02815260040180806020018281038252602381526020018061271d6023913960400191505060405180910390fd5b611ee6816040518060600160405280602681526020016127cc602691396001600160a01b038616600090815260336020526040902054919063ffffffff611f7716565b6001600160a01b038085166000908152603360205260408082209390935590841681522054611f1b908263ffffffff61201116565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561200957604051600160e51b62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611fce578181015183820152602001611fb6565b50505050905090810190601f168015611ffb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015611e085760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b03821615156120b857604051600160e51b62461bcd0281526004018080602001828103825260218152602001806129026021913960400191505060405180910390fd5b6120fb81604051806060016040528060228152602001612740602291396001600160a01b038516600090815260336020526040902054919063ffffffff611f7716565b6001600160a01b038316600090815260336020526040902055603554612127908263ffffffff611dc616565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0316600160e01b63a9059cbb021790526121c490849061240e565b505050565b60008215156121da57506000610975565b8282028284828115156121e957fe5b0414611e0857604051600160e51b62461bcd02815260040180806020018281038252602181526020018061286b6021913960400191505060405180910390fd5b6000611e0883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506125db565b6001600160a01b03821615156122cb5760408051600160e51b62461bcd02815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6035546122de908263ffffffff61201116565b6035556001600160a01b03821660009081526033602052604090205461230a908263ffffffff61201116565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b303b1590565b6001600160a01b03811615156123b257604051600160e51b62461bcd0281526004018080602001828103825260268152602001806127846026913960400191505060405180910390fd5b6068546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606880546001600160a01b0319166001600160a01b0392909216919091179055565b612420826001600160a01b0316612648565b15156124765760408051600160e51b62461bcd02815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106124b45780518252601f199092019160209182019101612495565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612516576040519150601f19603f3d011682016040523d82523d6000602084013e61251b565b606091505b50915091508115156125775760408051600160e51b62461bcd02815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156125d55780806020019051602081101561259357600080fd5b505115156125d557604051600160e51b62461bcd02815260040180806020018281038252602a815260200180612991602a913960400191505060405180910390fd5b50505050565b60008183151561263057604051600160e51b62461bcd02815260040180806020018281038252838181518152602001915080519060200190808383600083811015611fce578181015183820152602001611fb6565b506000838581151561263e57fe5b0495945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061267c57508115155b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106126c557805160ff19168380011785556126f2565b828001600101855582156126f2579182015b828111156126f25782518255916020019190600101906126d7565b506126fe929150612702565b5090565b610bb591905b808211156126fe576000815560010161270856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636552656c3a206e6f7420656e6f75676820746f6b656e7320696e20636f6e74726163744f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636552656c3a206c657373207468616e206f6e65206461792066726f6d206c61737420726577617264454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737352656c3a20616c6c6f6361746564526577617264732063616e6e6f742064656372656173655361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656452656c3a207633206e6f7420696e697469616c697a656400000000000000000052656c3a2063616e6e6f7420737765657020616c6c6f63617465645265776172647352656c3a2063616e6e6f74206275726e20616c6c6f636174656420746f6b656e7345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f52656c3a20696e666c6174696f6e2073686f756c64206e6f7420657863656564206d6178a165627a7a72305820ff9862da63455f3701971a1e580d74788c248c7af45388e2dbaa19094ac986470029
Deployed Bytecode
0x60806040526004361061021a5760003560e01c806385f1a5c111610123578063c4d66de8116100ab578063ed2a2d641161006f578063ed2a2d6414610807578063f2fde38b1461083a578063f30facf41461086d578063f851a440146108a6578063fdb04bbf146108bb5761021a565b8063c4d66de814610730578063c9b1714914610763578063cc29c34714610778578063dd62ed3e146107a2578063e0a8ed52146107dd5761021a565b8063a457c2d7116100f2578063a457c2d71461067f578063a9059cbb146106b8578063a96f8668146106f1578063b782e30314610706578063be0522e01461071b5761021a565b806385f1a5c1146106165780638da5cb5b146106405780638f32d59b1461065557806395d89b411461066a5761021a565b806342966c68116101a6578063704b6c0211610175578063704b6c021461055357806370a0823114610586578063715018a6146105b957806374991569146105ce5780637d556df0146106015761021a565b806342966c68146104aa57806354fd4d50146104d45780635e6f6045146104e95780636ea056a91461051a5761021a565b806323b872dd116101ed57806323b872dd146103d9578063313ce5671461041c57806333a6cc58146104475780633644e5151461045c57806339509351146104715761021a565b806306fdde031461021f578063095ea7b3146102a957806314d8bbf1146102f657806318160ddd146103b2575b600080fd5b34801561022b57600080fd5b506102346108d0565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026e578181015183820152602001610256565b50505050905090810190601f16801561029b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102b557600080fd5b506102e2600480360360408110156102cc57600080fd5b506001600160a01b03813516906020013561095d565b604080519115158252519081900360200190f35b34801561030257600080fd5b506103b06004803603604081101561031957600080fd5b8135919081019060408101602082013564010000000081111561033b57600080fd5b82018360208201111561034d57600080fd5b8035906020019184600183028401116401000000008311171561036f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061097b945050505050565b005b3480156103be57600080fd5b506103c7610bb1565b60408051918252519081900360200190f35b3480156103e557600080fd5b506102e2600480360360608110156103fc57600080fd5b506001600160a01b03813581169160208101359091169060400135610bb8565b34801561042857600080fd5b50610431610c45565b6040805160ff9092168252519081900360200190f35b34801561045357600080fd5b506103c7610c4f565b34801561046857600080fd5b506103c7610c73565b34801561047d57600080fd5b506102e26004803603604081101561049457600080fd5b506001600160a01b038135169060200135610c7a565b3480156104b657600080fd5b506103b0600480360360208110156104cd57600080fd5b5035610cce565b3480156104e057600080fd5b50610234610d74565b3480156104f557600080fd5b506104fe610dd0565b604080516001600160a01b039092168252519081900360200190f35b34801561052657600080fd5b506103b06004803603604081101561053d57600080fd5b506001600160a01b038135169060200135610de0565b34801561055f57600080fd5b506103b06004803603602081101561057657600080fd5b50356001600160a01b0316610ed7565b34801561059257600080fd5b506103c7600480360360208110156105a957600080fd5b50356001600160a01b0316611005565b3480156105c557600080fd5b506103b0611020565b3480156105da57600080fd5b506103b0600480360360208110156105f157600080fd5b50356001600160a01b03166110b6565b34801561060d57600080fd5b506103c76111a2565b34801561062257600080fd5b506103b06004803603602081101561063957600080fd5b50356111a9565b34801561064c57600080fd5b506104fe6112e7565b34801561066157600080fd5b506102e26112f6565b34801561067657600080fd5b5061023461131c565b34801561068b57600080fd5b506102e2600480360360408110156106a257600080fd5b506001600160a01b038135169060200135611378565b3480156106c457600080fd5b506102e2600480360360408110156106db57600080fd5b506001600160a01b0381351690602001356113e6565b3480156106fd57600080fd5b506103b06113fa565b34801561071257600080fd5b506102e26115da565b34801561072757600080fd5b506103c76115e4565b34801561073c57600080fd5b506103b06004803603602081101561075357600080fd5b50356001600160a01b03166115eb565b34801561076f57600080fd5b506103c76116e1565b34801561078457600080fd5b506103b06004803603602081101561079b57600080fd5b50356116e8565b3480156107ae57600080fd5b506103c7600480360360408110156107c557600080fd5b506001600160a01b03813581169160200135166117ff565b3480156107e957600080fd5b506103b06004803603602081101561080057600080fd5b503561182a565b34801561081357600080fd5b506103c76004803603602081101561082a57600080fd5b50356001600160a01b0316611941565b34801561084657600080fd5b506103b06004803603602081101561085d57600080fd5b50356001600160a01b031661195d565b34801561087957600080fd5b506103b06004803603604081101561089057600080fd5b506001600160a01b0381351690602001356119b2565b3480156108b257600080fd5b506104fe611bc7565b3480156108c757600080fd5b506103c7611bd7565b61010080546040805160206002600185161586026000190190941693909304601f810184900484028201840190925281815292918301828280156109555780601f1061092a57610100808354040283529160200191610955565b820191906000526020600020905b81548152906001019060200180831161093857829003601f168201915b505050505081565b600061097161096a611bdd565b8484611be1565b5060015b92915050565b61011d5460ff1615156109c65760408051600160e51b62461bcd02815260206004820152601760248201526000805160206129bb833981519152604482015290519081900360640190fd5b61011654821115610a215760408051600160e51b62461bcd02815260206004820181905260248201527f52656c3a206e6f7420656e6f75676820616c6c6f636174656420746f6b656e73604482015290519081900360640190fd5b336000818152610118602090815260408083205481517fa53a2b3fab2ad1dd8877a41407c34f62362beca7419151220729194783585d4c81850152808301959095526060850187905260808086018290528251808703909101815260a08601835280519084012061011e54600160f01b6119010260c088015260c287015260e28087018290528351808803909101815261010290960190925284519490920193909320909291610ad18286611cd7565b610104549091506001600160a01b03808316911614610b3a5760408051600160e51b62461bcd02815260206004820152601960248201527f52656c3a20636c61696d206e6f7420617574686f72697a656400000000000000604482015290519081900360640190fd5b3360009081526101186020526040902060018501905561011654610b64908763ffffffff611dc616565b61011655610b73303388611e0f565b60408051878152905133917fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a919081900360200190a2505050505050565b6035545b90565b6000610bc5848484611e0f565b610c3b84610bd1611bdd565b610c368560405180606001604052806028815260200161288c602891396001600160a01b038a16600090815260346020526040812090610c0f611bdd565b6001600160a01b03168152602081019190915260400160002054919063ffffffff611f7716565b611be1565b5060019392505050565b6101015460ff1681565b7fa53a2b3fab2ad1dd8877a41407c34f62362beca7419151220729194783585d4c81565b61011e5481565b6000610971610c87611bdd565b84610c368560346000610c98611bdd565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61201116565b610cd66112f6565b1515610d1a5760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b610d24308261206e565b61011654610d3130611005565b1015610d7157604051600160e51b62461bcd0281526004018080602001828103825260218152602001806129fd6021913960400191505060405180910390fd5b50565b610103805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109555780601f1061092a57610100808354040283529160200191610955565b61011f546001600160a01b031681565b610104546001600160a01b0316331480610e125750610dfd6112e7565b6001600160a01b0316336001600160a01b0316145b1515610e685760408051600160e51b62461bcd02815260206004820152601360248201527f52656c3a206e6f7420617574686f72697a656400000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038216301415610ec85761011654610e8630611005565b03811115610ec857604051600160e51b62461bcd0281526004018080602001828103825260228152602001806129db6022913960400191505060405180910390fd5b610ed382338361216f565b5050565b610104546001600160a01b0316331480610f095750610ef46112e7565b6001600160a01b0316336001600160a01b0316145b1515610f5f5760408051600160e51b62461bcd02815260206004820152601360248201527f52656c3a206e6f7420617574686f72697a656400000000000000000000000000604482015290519081900360640190fd5b61011d5460ff161515610faa5760408051600160e51b62461bcd02815260206004820152601760248201526000805160206129bb833981519152604482015290519081900360640190fd5b61010480546001600160a01b0319166001600160a01b03838116919091179182905560408051929091168252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a1916020908290030190a150565b6001600160a01b031660009081526033602052604090205490565b6110286112f6565b151561106c5760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b6068546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606880546001600160a01b0319169055565b6110be6112f6565b15156111025760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b61011d5460ff16151561114d5760408051600160e51b62461bcd02815260206004820152601760248201526000805160206129bb833981519152604482015290519081900360640190fd5b61011f80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcd37955fa232bde7dcb7336a2e808e86c03538919d26347a5f4159971a4ef2629181900360200190a150565b6101165481565b6111b16112f6565b15156111f55760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b610116548111156112505760408051600160e51b62461bcd02815260206004820181905260248201527f52656c3a206e6f7420656e6f75676820616c6c6f636174656420746f6b656e73604482015290519081900360640190fd5b61011f546001600160a01b031615156112b35760408051600160e51b62461bcd02815260206004820152601c60248201527f52656c3a2076657374696e67436f6e7472616374206e6f742073657400000000604482015290519081900360640190fd5b61011f546112cc9030906001600160a01b031683611e0f565b610116546112e0908263ffffffff611dc616565b6101165550565b6068546001600160a01b031690565b6068546000906001600160a01b031661130d611bdd565b6001600160a01b031614905090565b610102805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109555780601f1061092a57610100808354040283529160200191610955565b6000610971611385611bdd565b84610c3685604051806060016040528060258152602001612a1e60259139603460006113af611bdd565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff611f7716565b60006109716113f3611bdd565b8484611e0f565b61011d5460ff1615156114455760408051600160e51b62461bcd02815260206004820152601760248201526000805160206129bb833981519152604482015290519081900360640190fd5b61010554151561149f5760408051600160e51b62461bcd02815260206004820152601360248201527f52656c3a20696e666c6174696f6e206973203000000000000000000000000000604482015290519081900360640190fd5b60006114b76101065442611dc690919063ffffffff16565b905060006201518082041161150057604051600160e51b62461bcd0281526004018080602001828103825260278152602001806127f26027913960400191505060405180910390fd5b600061153664479d6f600061152a6101055461151e8661151e610bb1565b9063ffffffff6121c916565b9063ffffffff61222916565b6101165490915061154d908263ffffffff61201116565b61011655600061155c30611005565b90506101165481101561158e5761011654600090611580908363ffffffff611dc616565b905061158c308261226b565b505b42610106819055604080518481526020810186905280820192909252517ff854feef4c325cc8fcfad1a693b62c4383c8d228c4ca0bc52f9e06095338a5f19181900360600190a1505050565b61011d5460ff1681565b6101055481565b600054610100900460ff16806116045750611604612362565b80611612575060005460ff16155b151561165257604051600160e51b62461bcd02815260040180806020018281038252602e8152602001806128d4602e913960400191505060405180910390fd5b600054610100900460ff1615801561167d576000805460ff1961ff0019909116610100171660011790555b606880546001600160a01b0319166001600160a01b0384811691909117918290556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015610ed3576000805461ff00191690555050565b6101065481565b6116f06112f6565b15156117345760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b61173d30611005565b81111561177e57604051600160e51b62461bcd0281526004018080602001828103825260228152602001806127626022913960400191505060405180910390fd5b610116548110156117c357604051600160e51b62461bcd02815260040180806020018281038252602581526020018061296c6025913960400191505060405180910390fd5b6101168190556040805182815290517f865f3a638835ca43ecaf61455138a2ae6948763fa8bc9e580f080cb097ad10a19181900360200190a150565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6118326112f6565b15156118765760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b61011d5460ff1615156118c15760408051600160e51b62461bcd02815260206004820152601760248201526000805160206129bb833981519152604482015290519081900360640190fd5b6107d081111561190557604051600160e51b62461bcd028152600401808060200182810382526024815260200180612a436024913960400191505060405180910390fd5b6101058190556040805182815290517fa2c906d360736c15f8fc6c4b049228f49b9f4f8dbe56808aa82f316833a055be9181900360200190a150565b6001600160a01b03166000908152610118602052604090205490565b6119656112f6565b15156119a95760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b610d7181612368565b6119ba6112f6565b15156119fe5760408051600160e51b62461bcd02815260206004820181905260248201526000805160206128b4833981519152604482015290519081900360640190fd5b61011d5460ff1615611a5a5760408051600160e51b62461bcd02815260206004820152601b60248201527f52656c3a20763320616c726561647920696e697469616c697a65640000000000604482015290519081900360640190fd5b4261010655604080518082019091526002808252600160f01b617633026020909201918252611a8c9161010391612684565b5061011d805460ff19166001179055611aa482610ed7565b611aad8161182a565b611ab760006110b6565b60006101006040518082805460018160011615610100020316600290048015611b175780601f10611af5576101008083540402835291820191611b17565b820191906000526020600020905b815481529060010190602001808311611b03575b505060408051918290038220828201825260018352600160f81b603102602090930192909252519093507fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6925060009150806052612819823960408051918290036052018220602080840191909152828201969096526060820194909452600160808201523060a0808301919091528451808303909101815260c09091019093525050805191012061011e555050565b610104546001600160a01b031681565b6107d081565b3390565b6001600160a01b0383161515611c2b57604051600160e51b62461bcd0281526004018080602001828103825260248152602001806129486024913960400191505060405180910390fd5b6001600160a01b0382161515611c7557604051600160e51b62461bcd0281526004018080602001828103825260228152602001806127aa6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b8051600090604114611ceb57506000610975565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611d315760009350505050610975565b8060ff16601b14158015611d4957508060ff16601c14155b15611d5a5760009350505050610975565b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa158015611db1573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6000611e0883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f77565b9392505050565b6001600160a01b0383161515611e5957604051600160e51b62461bcd0281526004018080602001828103825260258152602001806129236025913960400191505060405180910390fd5b6001600160a01b0382161515611ea357604051600160e51b62461bcd02815260040180806020018281038252602381526020018061271d6023913960400191505060405180910390fd5b611ee6816040518060600160405280602681526020016127cc602691396001600160a01b038616600090815260336020526040902054919063ffffffff611f7716565b6001600160a01b038085166000908152603360205260408082209390935590841681522054611f1b908263ffffffff61201116565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561200957604051600160e51b62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611fce578181015183820152602001611fb6565b50505050905090810190601f168015611ffb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015611e085760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b03821615156120b857604051600160e51b62461bcd0281526004018080602001828103825260218152602001806129026021913960400191505060405180910390fd5b6120fb81604051806060016040528060228152602001612740602291396001600160a01b038516600090815260336020526040902054919063ffffffff611f7716565b6001600160a01b038316600090815260336020526040902055603554612127908263ffffffff611dc616565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0316600160e01b63a9059cbb021790526121c490849061240e565b505050565b60008215156121da57506000610975565b8282028284828115156121e957fe5b0414611e0857604051600160e51b62461bcd02815260040180806020018281038252602181526020018061286b6021913960400191505060405180910390fd5b6000611e0883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506125db565b6001600160a01b03821615156122cb5760408051600160e51b62461bcd02815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6035546122de908263ffffffff61201116565b6035556001600160a01b03821660009081526033602052604090205461230a908263ffffffff61201116565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b303b1590565b6001600160a01b03811615156123b257604051600160e51b62461bcd0281526004018080602001828103825260268152602001806127846026913960400191505060405180910390fd5b6068546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606880546001600160a01b0319166001600160a01b0392909216919091179055565b612420826001600160a01b0316612648565b15156124765760408051600160e51b62461bcd02815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106124b45780518252601f199092019160209182019101612495565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612516576040519150601f19603f3d011682016040523d82523d6000602084013e61251b565b606091505b50915091508115156125775760408051600160e51b62461bcd02815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156125d55780806020019051602081101561259357600080fd5b505115156125d557604051600160e51b62461bcd02815260040180806020018281038252602a815260200180612991602a913960400191505060405180910390fd5b50505050565b60008183151561263057604051600160e51b62461bcd02815260040180806020018281038252838181518152602001915080519060200190808383600083811015611fce578181015183820152602001611fb6565b506000838581151561263e57fe5b0495945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061267c57508115155b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106126c557805160ff19168380011785556126f2565b828001600101855582156126f2579182015b828111156126f25782518255916020019190600101906126d7565b506126fe929150612702565b5090565b610bb591905b808211156126fe576000815560010161270856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636552656c3a206e6f7420656e6f75676820746f6b656e7320696e20636f6e74726163744f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636552656c3a206c657373207468616e206f6e65206461792066726f6d206c61737420726577617264454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737352656c3a20616c6c6f6361746564526577617264732063616e6e6f742064656372656173655361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656452656c3a207633206e6f7420696e697469616c697a656400000000000000000052656c3a2063616e6e6f7420737765657020616c6c6f63617465645265776172647352656c3a2063616e6e6f74206275726e20616c6c6f636174656420746f6b656e7345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f52656c3a20696e666c6174696f6e2073686f756c64206e6f7420657863656564206d6178a165627a7a72305820ff9862da63455f3701971a1e580d74788c248c7af45388e2dbaa19094ac986470029
Deployed Bytecode Sourcemap
33751:6657:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40391:8;;;34206:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34206:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;34206:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14518:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14518:152:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14518:152:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;38986:793;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38986:793:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38986:793:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;38986:793:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38986:793:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;38986:793:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38986:793:0;;-1:-1:-1;38986:793:0;;-1:-1:-1;;;;;38986:793:0:i;:::-;;13539:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13539:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;15142:304;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15142:304:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15142:304:0;;;;;;;;;;;;;;;;;:::i;34229:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34229:21:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35063:108;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35063:108:0;;;:::i;35178:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35178:31:0;;;:::i;15855:210::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15855:210:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15855:210:0;;;;;;;;:::i;36850:185::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36850:185:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36850:185:0;;:::i;34280:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34280:21:0;;;:::i;35216:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35216:30:0;;;:::i;:::-;;;;-1:-1:-1;;;;;35216:30:0;;;;;;;;;;;;;;39939:365;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39939:365:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39939:365:0;;;;;;;;:::i;36529:234::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36529:234:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36529:234:0;-1:-1:-1;;;;;36529:234:0;;:::i;13693:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13693:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13693:110:0;-1:-1:-1;;;;;13693:110:0;;:::i;22100:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22100:140:0;;;:::i;36026:222::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36026:222:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36026:222:0;-1:-1:-1;;;;;36026:222:0;;:::i;34613:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34613:31:0;;;:::i;37559:333::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37559:333:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37559:333:0;;:::i;21287:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21287:79:0;;;:::i;21653:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21653:94:0;;;:::i;34255:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34255:20:0;;;:::i;16568:261::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16568:261:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16568:261:0;;;;;;;;:::i;14016:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14016:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14016:158:0;;;;;;;;:::i;37963:959::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37963:959:0;;;:::i;34884:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34884:25:0;;;:::i;34408:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34408:24:0;;;:::i;21061:145::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21061:145:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21061:145:0;-1:-1:-1;;;;;21061:145:0;;:::i;34478:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34478:25:0;;;:::i;37041:378::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37041:378:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37041:378:0;;:::i;14237:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14237:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14237:134:0;;;;;;;;;;:::i;36254:269::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36254:269:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36254:269:0;;:::i;39785:99::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39785:99:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39785:99:0;-1:-1:-1;;;;;39785:99:0;;:::i;22395:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22395:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22395:109:0;-1:-1:-1;;;;;22395:109:0;;:::i;35377:643::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35377:643:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;35377:643:0;;;;;;;;:::i;34306:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34306:20:0;;;:::i;35253:45::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35253:45:0;;;:::i;34206:18::-;;;;;;;;;;;;;;;-1:-1:-1;;34206:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14518:152::-;14584:4;14601:39;14610:12;:10;:12::i;:::-;14624:7;14633:6;14601:8;:39::i;:::-;-1:-1:-1;14658:4:0;14518:152;;;;;:::o;38986:793::-;39069:13;;;;39061:49;;;;;;;-1:-1:-1;;;;;39061:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39061:49:0;;;;;;;;;;;;;;;39125:16;;:26;-1:-1:-1;39125:26:0;39117:71;;;;;-1:-1:-1;;;;;39117:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39218:10;39195:13;39211:18;;;:6;:18;;;;;;;;;39269:49;;35105:66;39269:49;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;39269::0;;;;;39259:60;;;;;;39382:16;;-1:-1:-1;;;;;39353:58:0;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;39353:58:0;;;;;;;39343:69;;;;;;;;;;39211:18;;39259:60;39498:32;39343:69;39520:9;39498:13;:32::i;:::-;39547:5;;39481:49;;-1:-1:-1;;;;;;39547:15:0;;;:5;;:15;39539:53;;;;;-1:-1:-1;;;;;39539:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39606:10;39599:18;;;;:6;:18;;;;;39628:1;39620:9;;39599:30;;39655:16;;:28;;39676:6;39655:28;:20;:28;:::i;:::-;39636:16;:47;39690:44;39708:4;39715:10;39727:6;39690:9;:44::i;:::-;39746:27;;;;;;;;39754:10;;39746:27;;;;;;;;;;38986:793;;;;;;:::o;13539:91::-;13610:12;;13539:91;;:::o;15142:304::-;15231:4;15248:36;15258:6;15266:9;15277:6;15248:9;:36::i;:::-;15295:121;15304:6;15312:12;:10;:12::i;:::-;15326:89;15364:6;15326:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15326:19:0;;;;;;:11;:19;;;;;;15346:12;:10;:12::i;:::-;-1:-1:-1;;;;;15326:33:0;;;;;;;;;;;;-1:-1:-1;15326:33:0;;;:89;;:37;:89;:::i;:::-;15295:8;:121::i;:::-;-1:-1:-1;15434:4:0;15142:304;;;;;:::o;34229:21::-;;;;;;:::o;35063:108::-;35105:66;35063:108;:::o;35178:31::-;;;;:::o;15855:210::-;15935:4;15952:83;15961:12;:10;:12::i;:::-;15975:7;15984:50;16023:10;15984:11;:25;15996:12;:10;:12::i;:::-;-1:-1:-1;;;;;15984:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;15984:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;36850:185::-;21499:9;:7;:9::i;:::-;21491:54;;;;;;;-1:-1:-1;;;;;21491:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21491:54:0;;;;;;;;;;;;;;;36904:28;36918:4;36925:6;36904:5;:28::i;:::-;36975:16;;36947:24;36965:4;36947:9;:24::i;:::-;:44;;36939:90;;;;-1:-1:-1;;;;;36939:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36850:185;:::o;34280:21::-;;;;;;;;;;;;;;;-1:-1:-1;;34280:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35216:30;;;-1:-1:-1;;;;;35216:30:0;;:::o;39939:365::-;40020:5;;-1:-1:-1;;;;;40020:5:0;40006:10;:19;;:44;;;40043:7;:5;:7::i;:::-;-1:-1:-1;;;;;40029:21:0;:10;-1:-1:-1;;;;;40029:21:0;;40006:44;39998:76;;;;;;;-1:-1:-1;;;;;39998:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40085:21:0;;40101:4;40085:21;40081:161;;;40170:16;;40143:24;40161:4;40143:9;:24::i;:::-;:43;40133:53;;;40115:127;;;;-1:-1:-1;;;;;40115:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40249:49;40272:5;40279:10;40291:6;40249:22;:49::i;:::-;39939:365;;:::o;36529:234::-;36599:5;;-1:-1:-1;;;;;36599:5:0;36585:10;:19;;:44;;;36622:7;:5;:7::i;:::-;-1:-1:-1;;;;;36608:21:0;:10;-1:-1:-1;;;;;36608:21:0;;36585:44;36577:76;;;;;;;-1:-1:-1;;;;;36577:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36668:13;;;;36660:49;;;;;;;-1:-1:-1;;;;;36660:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36660:49:0;;;;;;;;;;;;;;;36716:5;:14;;-1:-1:-1;;;;;;36716:14:0;-1:-1:-1;;;;;36716:14:0;;;;;;;;;;;36742:15;;;36751:5;;;;36742:15;;;;;;;;;;;;;36529:234;:::o;13693:110::-;-1:-1:-1;;;;;13777:18:0;13750:7;13777:18;;;:9;:18;;;;;;;13693:110::o;22100:140::-;21499:9;:7;:9::i;:::-;21491:54;;;;;;;-1:-1:-1;;;;;21491:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21491:54:0;;;;;;;;;;;;;;;22183:6;;22162:40;;22199:1;;-1:-1:-1;;;;;22183:6:0;;22162:40;;22199:1;;22162:40;22213:6;:19;;-1:-1:-1;;;;;;22213:19:0;;;22100:140::o;36026:222::-;21499:9;:7;:9::i;:::-;21491:54;;;;;;;-1:-1:-1;;;;;21491:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21491:54:0;;;;;;;;;;;;;;;36112:13;;;;36104:49;;;;;;;-1:-1:-1;;;;;36104:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36104:49:0;;;;;;;;;;;;;;;36160:15;:34;;-1:-1:-1;;;;;36160:34:0;;-1:-1:-1;;;;;;36160:34:0;;;;;;;;36206:36;;;;;;;;;;;;;;;;36026:222;:::o;34613:31::-;;;;:::o;37559:333::-;21499:9;:7;:9::i;:::-;21491:54;;;;;;;-1:-1:-1;;;;;21491:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21491:54:0;;;;;;;;;;;;;;;37636:16;;:26;-1:-1:-1;37636:26:0;37628:71;;;;;-1:-1:-1;;;;;37628:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37714:15;;-1:-1:-1;;;;;37714:15:0;:29;;37706:70;;;;;-1:-1:-1;;;;;37706:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37808:15;;37783:49;;37801:4;;-1:-1:-1;;;;;37808:15:0;37825:6;37783:9;:49::i;:::-;37858:16;;:28;;37879:6;37858:28;:20;:28;:::i;:::-;37839:16;:47;-1:-1:-1;37559:333:0:o;21287:79::-;21352:6;;-1:-1:-1;;;;;21352:6:0;21287:79;:::o;21653:94::-;21733:6;;21693:4;;-1:-1:-1;;;;;21733:6:0;21717:12;:10;:12::i;:::-;-1:-1:-1;;;;;21717:22:0;;21710:29;;21653:94;:::o;34255:20::-;;;;;;;;;;;;;;;-1:-1:-1;;34255:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16568:261;16653:4;16670:129;16679:12;:10;:12::i;:::-;16693:7;16702:96;16741:15;16702:96;;;;;;;;;;;;;;;;;:11;:25;16714:12;:10;:12::i;:::-;-1:-1:-1;;;;;16702:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;16702:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;14016:158::-;14085:4;14102:42;14112:12;:10;:12::i;:::-;14126:9;14137:6;14102:9;:42::i;37963:959::-;38010:13;;;;38002:49;;;;;;;-1:-1:-1;;;;;38002:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;38002:49:0;;;;;;;;;;;;;;;38066:9;;:13;;38058:45;;;;;-1:-1:-1;;;;;38058:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38110:24;38138:31;38158:10;;38138:15;:19;;:31;;;;:::i;:::-;38110:60;-1:-1:-1;38215:1:0;38205:6;38110:60;38185:27;:31;38177:83;;;;-1:-1:-1;;;;;38177:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38269:20;38292:71;34959:20;38292:50;38332:9;;38292:35;38310:16;38292:13;:11;:13::i;:::-;:17;:35;:17;:35;:::i;:50::-;:54;:71;:54;:71;:::i;:::-;38391:16;;38269:94;;-1:-1:-1;38391:34:0;;38269:94;38391:34;:20;:34;:::i;:::-;38372:16;:53;38434:15;38452:24;38470:4;38452:9;:24::i;:::-;38434:42;;38690:16;;38680:7;:26;38676:140;;;38738:16;;38717:18;;38738:29;;38759:7;38738:29;:20;:29;:::i;:::-;38717:50;;38776:32;38790:4;38797:10;38776:5;:32::i;:::-;38676:140;;38835:15;38822:10;:28;;;38864:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37963:959;;;:::o;34884:25::-;;;;;;:::o;34408:24::-;;;;:::o;21061:145::-;1188:12;;;;;;;;:31;;;1204:15;:13;:15::i;:::-;1188:47;;;-1:-1:-1;1224:11:0;;;;1223:12;1188:47;1180:106;;;;;;-1:-1:-1;;;;;1180:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1295:19;1318:12;;;;;;1317:13;1337:83;;;;1366:12;:19;;-1:-1:-1;;;;1366:19:0;;;;;1394:18;1381:4;1394:18;;;1337:83;21127:6;:15;;-1:-1:-1;;;;;;21127:15:0;-1:-1:-1;;;;;21127:15:0;;;;;;;;;;;21158:40;;21191:6;;;-1:-1:-1;;21158:40:0;;-1:-1:-1;;21158:40:0;1442:14;1438:57;;;1482:5;1467:20;;-1:-1:-1;;1467:20:0;;;21061:145;;:::o;34478:25::-;;;;:::o;37041:378::-;21499:9;:7;:9::i;:::-;21491:54;;;;;;;-1:-1:-1;;;;;21491:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21491:54:0;;;;;;;;;;;;;;;37157:24;37175:4;37157:9;:24::i;:::-;37134:47;;;37126:94;;;;-1:-1:-1;;;;;37126:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37258:16;;37235:39;;;37227:89;;;;-1:-1:-1;;;;;37227:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37323:16;:38;;;37373:40;;;;;;;;;;;;;;;;;37041:378;:::o;14237:134::-;-1:-1:-1;;;;;14336:18:0;;;14309:7;14336:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14237:134::o;36254:269::-;21499:9;:7;:9::i;:::-;21491:54;;;;;;;-1:-1:-1;;;;;21491:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21491:54:0;;;;;;;;;;;;;;;36328:13;;;;36320:49;;;;;;;-1:-1:-1;;;;;36320:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36320:49:0;;;;;;;;;;;;;;;35293:5;36384:27;;;36376:76;;;;-1:-1:-1;;;;;36376:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36459:9;:22;;;36493:24;;;;;;;;;;;;;;;;;36254:269;:::o;39785:99::-;-1:-1:-1;;;;;39863:15:0;39840:7;39863:15;;;:6;:15;;;;;;;39785:99::o;22395:109::-;21499:9;:7;:9::i;:::-;21491:54;;;;;;;-1:-1:-1;;;;;21491:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21491:54:0;;;;;;;;;;;;;;;22468:28;22487:8;22468:18;:28::i;35377:643::-;21499:9;:7;:9::i;:::-;21491:54;;;;;;;-1:-1:-1;;;;;21491:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21491:54:0;;;;;;;;;;;;;;;35462:13;;;;35461:14;35453:54;;;;;-1:-1:-1;;;;;35453:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35527:15;35514:10;:28;35549:14;;;;;;;;;;;;;-1:-1:-1;;;;;35549:14:0;;;;;;;;;:7;;:14;:::i;:::-;-1:-1:-1;35570:13:0;:20;;-1:-1:-1;;35570:20:0;35586:4;35570:20;;;35597:16;35606:6;35597:8;:16::i;:::-;35620:24;35633:10;35620:12;:24::i;:::-;35651:30;35678:1;35651:18;:30::i;:::-;35690:16;35725:4;35709:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35709:22:0;;;;;;;;;35770:10;;;;;;;;-1:-1:-1;;;;;35770:10:0;;;;;;;;35807:109;35709:22;;-1:-1:-1;35760:21:0;;-1:-1:-1;35738:19:0;;-1:-1:-1;35807:109:0;;;;;;;;;;;;;;;;35952:61;;;;;;;;;;;;;;;;;;;;;;35996:1;35952:61;;;;36007:4;35952:61;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;35952:61:0;;;;;;;-1:-1:-1;;35942:72:0;;;;;35923:16;:91;-1:-1:-1;;35377:643:0:o;34306:20::-;;;-1:-1:-1;;;;;34306:20:0;;:::o;35253:45::-;35293:5;35253:45;:::o;3122:98::-;3202:10;3122:98;:::o;19499:338::-;-1:-1:-1;;;;;19593:19:0;;;;19585:68;;;;-1:-1:-1;;;;;19585:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19672:21:0;;;;19664:68;;;;-1:-1:-1;;;;;19664:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19745:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19797:32;;;;;;;;;;;;;;;;;19499:338;;;:::o;24231:1930::-;24372:16;;24309:7;;24392:2;24372:22;24368:74;;-1:-1:-1;24427:1:0;24411:19;;24368:74;24803:4;24788:20;;24782:27;24849:4;24834:20;;24828:27;24903:4;24888:20;;24882:27;24511:9;24874:36;25833:66;25820:79;;25816:129;;;25931:1;25916:17;;;;;;;25816:129;25961:1;:7;;25966:2;25961:7;;:18;;;;;25972:1;:7;;25977:2;25972:7;;25961:18;25957:68;;;26011:1;25996:17;;;;;;;25957:68;26129:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26129:24:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;26129:24:0;;-1:-1:-1;;26129:24:0;;;24231:1930;-1:-1:-1;;;;;;;24231:1930:0:o;7779:136::-;7837:7;7864:43;7868:1;7871;7864:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;7857:50;7779:136;-1:-1:-1;;;7779:136:0:o;17319:471::-;-1:-1:-1;;;;;17417:20:0;;;;17409:70;;;;-1:-1:-1;;;;;17409:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17498:23:0;;;;17490:71;;;;-1:-1:-1;;;;;17490:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17594;17616:6;17594:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17594:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;17574:17:0;;;;;;;:9;:17;;;;;;:91;;;;17699:20;;;;;;;:32;;17724:6;17699:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;17676:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;17747:35;;;;;;;17676:20;;17747:35;;;;;;;;;;;;;17319:471;;;:::o;8252:192::-;8338:7;8374:12;8366:6;;;;8358:29;;;;-1:-1:-1;;;;;8358:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;8358:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8410:5:0;;;8252:192::o;7323:181::-;7381:7;7413:5;;;7437:6;;;;7429:46;;;;;-1:-1:-1;;;;;7429:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;18711:348;-1:-1:-1;;;;;18787:21:0;;;;18779:67;;;;-1:-1:-1;;;;;18779:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18880:68;18903:6;18880:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18880:18:0;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;18859:18:0;;;;;;:9;:18;;;;;:89;18974:12;;:24;;18991:6;18974:24;:16;:24;:::i;:::-;18959:12;:39;19014:37;;;;;;;;19040:1;;-1:-1:-1;;;;;19014:37:0;;;;;;;;;;;;18711:348;;:::o;30513:176::-;30622:58;;;-1:-1:-1;;;;;30622:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;30622:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;179:29;160:49;;30596:85:0;;30615:5;;30596:18;:85::i;:::-;30513:176;;;:::o;8695:471::-;8753:7;8998:6;;8994:47;;;-1:-1:-1;9028:1:0;9021:8;;8994:47;9065:5;;;9069:1;9065;:5;9089;;;;;;;;:10;9081:56;;;;-1:-1:-1;;;;;9081:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9634:132;9692:7;9719:39;9723:1;9726;9719:39;;;;;;;;;;;;;;;;;:3;:39::i;18071:308::-;-1:-1:-1;;;;;18147:21:0;;;;18139:65;;;;;-1:-1:-1;;;;;18139:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18232:12;;:24;;18249:6;18232:24;:16;:24;:::i;:::-;18217:12;:39;-1:-1:-1;;;;;18288:18:0;;;;;;:9;:18;;;;;;:30;;18311:6;18288:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;18267:18:0;;;;;;:9;:18;;;;;;;;:51;;;;18334:37;;;;;;;18267:18;;;;18334:37;;;;;;;;;;18071:308;;:::o;1589:508::-;2006:4;2052:17;2084:7;1589:508;:::o;22610:229::-;-1:-1:-1;;;;;22684:22:0;;;;22676:73;;;;-1:-1:-1;;;;;22676:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22786:6;;22765:38;;-1:-1:-1;;;;;22765:38:0;;;;22786:6;;22765:38;;22786:6;;22765:38;22814:6;:17;;-1:-1:-1;;;;;;22814:17:0;-1:-1:-1;;;;;22814:17:0;;;;;;;;;;22610:229::o;32552:1114::-;33156:27;33164:5;-1:-1:-1;;;;;33156:25:0;;:27::i;:::-;33148:71;;;;;;;-1:-1:-1;;;;;33148:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33293:12;33307:23;33342:5;-1:-1:-1;;;;;33334:19:0;33354:4;33334:25;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;33334:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;33292:67:0;;;;33378:7;33370:52;;;;;;;-1:-1:-1;;;;;33370:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33439:17;;:21;33435:224;;33581:10;33570:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33570:30:0;33562:85;;;;;;-1:-1:-1;;;;;33562:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32552:1114;;;;:::o;10296:345::-;10382:7;10484:12;10477:5;;;10469:28;;;;-1:-1:-1;;;;;10469:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;10469:28:0;;10508:9;10524:1;10520;:5;;;;;;;;;10296:345;-1:-1:-1;;;;;10296:345:0:o;27509:619::-;27569:4;28037:20;;27880:66;28077:23;;;;;;:42;;-1:-1:-1;28104:15:0;;;28077:42;28069:51;27509:619;-1:-1:-1;;;;27509:619:0:o;33751:6657::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33751:6657:0;;;-1:-1:-1;33751:6657:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://ff9862da63455f3701971a1e580d74788c248c7af45388e2dbaa19094ac98647
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.