ETH Price: $2,946.26 (-2.51%)
Gas: 3 Gwei

Token

BYTES (BYTES)
 

Overview

Max Total Supply

225,231.385576145821539606 BYTES

Holders

5,341

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BYTESContract

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-22
*/

pragma solidity ^0.8.0;

// Part: ICitizen - Needed to interface with the final citizen contract

interface ICitizen {
	function getRewardRate(address _user) external view returns(uint256);

    function getRewardsRateForTokenId(uint256) external view returns(uint256);

    function getCurrentOrFinalTime() external view returns(uint256);

    function reduceRewards(uint256, address) external;

    function increaseRewards(uint256, address) external;

    function getEnd() external returns(uint256);
}

interface IIdentity {
    function ownerOf(uint256 tokenId) external view returns (address owner);
}

interface IVaultBox {
	function getCredits(uint256 tokenId) external view returns (string memory);
    function ownerOf(uint256 tokenId) external view returns (address owner);
}

// Part: OpenZeppelin/[email protected]/Address

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// Part: OpenZeppelin/[email protected]/Context

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// Part: OpenZeppelin/[email protected]/IERC20

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// Part: OpenZeppelin/[email protected]/SafeMath

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// Part: OpenZeppelin/[email protected]/ERC20

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

// File: BYTESContract.sol

contract BYTESContract is Ownable, ERC20("BYTES", "BYTES") {
	using SafeMath for uint256;

    uint256 maxRewardableCitizens;

	mapping(address => uint256) public rewards;
	mapping(address => uint256) public lastUpdate;
    mapping(address => bool) public adminContracts;

    mapping(uint256 => uint256) public identityBoxOpened;
    mapping(uint256 => uint256) public vaultBoxOpenedByIdentity;

	ICitizen public citizenContract;
    IIdentity public identityContract;
    IIdentity public boughtIdentityContract;
    IVaultBox public vaultBoxContract;

	event RewardPaid(address indexed user, uint256 reward);

	constructor() {
        identityContract = IIdentity(0x86357A19E5537A8Fba9A004E555713BC943a66C0);
        vaultBoxContract = IVaultBox(0xab0b0dD7e4EaB0F9e31a539074a03f1C1Be80879);
        maxRewardableCitizens = 2501;
	}

    function openVaultBox(uint256 identityTokenId, uint256 vaultBoxTokenId) public 
    {
        require(identityBoxOpened[identityTokenId] == 0, "That identity has already opened a box");
        require(vaultBoxOpenedByIdentity[vaultBoxTokenId] == 0, "That box has already been opened");
        require(validateIdentity(identityTokenId), "You don't own that identity");
        require(vaultBoxContract.ownerOf(vaultBoxTokenId) == msg.sender, "You don't own that vault box");

        uint credits;
        bool valueReturned; 
        (credits, valueReturned) = strToUint(vaultBoxContract.getCredits(vaultBoxTokenId));

        uint payout = credits * 10 ** 18;

        if(valueReturned)
        {
            _mint(msg.sender, payout);
            identityBoxOpened[identityTokenId] = vaultBoxTokenId;
            vaultBoxOpenedByIdentity[vaultBoxTokenId] = identityTokenId;
        }
    }

    function hasVaultBoxBeenOpened(uint256 tokenId) public view returns(bool)
    {
        if(vaultBoxOpenedByIdentity[tokenId] == 0)
        {
            return false;
        }

        return true;
    }

    function hasIdentityOpenedABox(uint256 tokenId) public view returns(bool)
    {
        if(identityBoxOpened[tokenId] == 0)
        {
            return false;
        }

        return true;
    }

    function updateMaxRewardableTokens(uint256 _amount) public onlyOwner
    {
        maxRewardableCitizens = _amount;
    }

    function addAdminContractAddress(address _address) public onlyOwner
    {
        adminContracts[_address] = true;
    }

    function removeAdminContactAddress(address _address) public onlyOwner
    {
        adminContracts[_address] = false;
    }

    function validateIdentity(uint256 tokenId) internal view returns(bool)
    {
        if(tokenId < 2300)
        {
            if(identityContract.ownerOf(tokenId) == msg.sender)
            {
                return true;
            }
        }
        else
        {
            if(boughtIdentityContract.ownerOf(tokenId) == msg.sender)
            {
                return true;
            }
        }

        return false;

    }

    function setIdentityContract(address _address) public onlyOwner {
        identityContract = IIdentity(_address);
    }

    function setBoughtIdentityContract(address _address) public onlyOwner {
        boughtIdentityContract = IIdentity(_address);
    }

    function setVaultBoxContract(address _address) public onlyOwner {
        vaultBoxContract = IVaultBox(_address);
    }

    function setCitizenContract(address _address) public onlyOwner {
        adminContracts[_address] = true;
        citizenContract = ICitizen(_address);
    }

	// called when a new citizen is minted
	function updateRewardOnMint(address _user, uint256 tokenId) external {
		require(msg.sender == address(citizenContract), "Can't call this");
		uint256 time;
		uint256 timerUser = lastUpdate[_user];

        time = citizenContract.getCurrentOrFinalTime();


		if (timerUser > 0)
        {
            rewards[_user] = rewards[_user].add(citizenContract.getRewardRate(_user).mul((time.sub(timerUser))).div(86400));
        }

        uint256 rateDelta = citizenContract.getRewardsRateForTokenId(tokenId);

        citizenContract.increaseRewards(rateDelta, _user);

		lastUpdate[_user] = time;
	}

	// called on transfers or right before a getReward to properly update rewards
	function updateReward(address _from, address _to, uint256 _tokenId) external {
		require(msg.sender == address(citizenContract));
		if (_tokenId < maxRewardableCitizens) {
			uint256 time;
			uint256 timerFrom = lastUpdate[_from];

            uint256 END = citizenContract.getEnd();

            time = citizenContract.getCurrentOrFinalTime();

            uint256 rateDelta = citizenContract.getRewardsRateForTokenId(_tokenId);

			if (timerFrom > 0)
            {
                rewards[_from] += citizenContract.getRewardRate(_from).mul((time.sub(timerFrom))).div(86400);
            }
			if (timerFrom != END)
            {
				lastUpdate[_from] = time;
            }
			if (_to != address(0)) {
				uint256 timerTo = lastUpdate[_to];
				if (timerTo > 0)
                {
                    rewards[_to] += citizenContract.getRewardRate(_to).mul((time.sub(timerTo))).div(86400);
                }
				if (timerTo != END)
                {
					lastUpdate[_to] = time;
                }
			}

            citizenContract.reduceRewards(rateDelta, _from);
            citizenContract.increaseRewards(rateDelta, _to);
		}
	}

	function getReward(address _to) external {
		require(msg.sender == address(citizenContract));
		uint256 reward = rewards[_to];
		if (reward > 0) {
			rewards[_to] = 0;
			_mint(_to, reward * 10 ** 18);
			emit RewardPaid(_to, reward);
		}
	}

	function burn(address _from, uint256 _amount) external {
		require(adminContracts[msg.sender], "You are not approved to burn tokens");
		_burn(_from, _amount);
	}

	function getTotalClaimable(address _user) external view returns(uint256) {
		
        uint256 time = citizenContract.getCurrentOrFinalTime();

        uint256 pending = citizenContract.getRewardRate(_user).mul((time.sub(lastUpdate[_user]))).div(86400);
		return rewards[_user] + pending;
	}

    function strToUint(string memory _str) public pure returns(uint256 res, bool err) {
    for (uint256 i = 0; i < bytes(_str).length; i++) {
        if ((uint8(bytes(_str)[i]) - 48) < 0 || (uint8(bytes(_str)[i]) - 48) > 9) {
            return (0, false);
        }
        res += (uint8(bytes(_str)[i]) - 48) * 10**(bytes(_str).length - i - 1);
    }
    
    return (res, true);
}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addAdminContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"adminContracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boughtIdentityContract","outputs":[{"internalType":"contract IIdentity","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"citizenContract","outputs":[{"internalType":"contract ICitizen","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getTotalClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hasIdentityOpenedABox","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hasVaultBoxBeenOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"identityBoxOpened","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"identityContract","outputs":[{"internalType":"contract IIdentity","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"identityTokenId","type":"uint256"},{"internalType":"uint256","name":"vaultBoxTokenId","type":"uint256"}],"name":"openVaultBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeAdminContactAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setBoughtIdentityContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setCitizenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setIdentityContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setVaultBoxContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_str","type":"string"}],"name":"strToUint","outputs":[{"internalType":"uint256","name":"res","type":"uint256"},{"internalType":"bool","name":"err","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateMaxRewardableTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"updateReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"updateRewardOnMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultBoxContract","outputs":[{"internalType":"contract IVaultBox","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaultBoxOpenedByIdentity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405180604001604052806005815260200164425954455360d81b81525060405180604001604052806005815260200164425954455360d81b8152506200006862000062620000f760201b60201c565b620000fb565b81516200007d9060049060208501906200014b565b508051620000939060059060208401906200014b565b50506006805460ff1916601217905550600e80546001600160a01b03199081167386357a19e5537a8fba9a004e555713bc943a66c0179091556010805490911673ab0b0dd7e4eab0f9e31a539074a03f1c1be808791790556109c56007556200022e565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200015990620001f1565b90600052602060002090601f0160209004810192826200017d5760008555620001c8565b82601f106200019857805160ff1916838001178555620001c8565b82800160010185558215620001c8579182015b82811115620001c8578251825591602001919060010190620001ab565b50620001d6929150620001da565b5090565b5b80821115620001d65760008155600101620001db565b600181811c908216806200020657607f821691505b602082108114156200022857634e487b7160e01b600052602260045260246000fd5b50919050565b612550806200023e6000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c80638da5cb5b1161013b578063c89a5158116100b8578063e46a501e1161007c578063e46a501e1461057f578063e6d5864b14610592578063eead4b16146105a5578063f27b8cc5146105b8578063f2fde38b146105cb57600080fd5b8063c89a5158146104dd578063cac4977214610500578063cb03fb1e14610513578063cc240c0114610533578063dd62ed3e1461054657600080fd5b8063a1e4aff2116100ff578063a1e4aff214610469578063a457c2d71461047c578063a9059cbb1461048f578063c00007b0146104a2578063c5ef3ec5146104b557600080fd5b80638da5cb5b1461040a57806395d89b411461041b5780639a687796146104235780639dc29fac146104435780639f8187351461045657600080fd5b80632c8e8dfa116101c95780635aece3141161018d5780635aece314146103a057806367031bae146103b357806370a08231146103c6578063715018a6146103ef57806382b1168d146103f757600080fd5b80632c8e8dfa1461033f578063313ce56714610352578063395093511461036757806348ebfb3f1461037a57806351a00b4b1461038d57600080fd5b806318160ddd1161021057806318160ddd146102dc57806323b872dd146102e4578063267e8ab6146102f757806327ceecf41461030a5780632bbbc1051461031f57600080fd5b806306fdde03146102425780630700037d14610260578063095ea7b31461028e5780631377baf7146102b1575b600080fd5b61024a6105de565b6040516102579190612169565b60405180910390f35b61028061026e366004611f47565b60086020526000908152604090205481565b604051908152602001610257565b6102a161029c366004611ffb565b610670565b6040519015158152602001610257565b6010546102c4906001600160a01b031681565b6040516001600160a01b039091168152602001610257565b600354610280565b6102a16102f2366004611fba565b610687565b610280610305366004611f47565b6106f0565b61031d610318366004611f47565b610867565b005b61028061032d366004612115565b600b6020526000908152604090205481565b61031d61034d366004611fba565b6108bb565b60065460405160ff9091168152602001610257565b6102a1610375366004611ffb565b610c83565b61031d610388366004612147565b610cb9565b6102a161039b366004612115565b610f82565b61031d6103ae366004612115565b610fa5565b600e546102c4906001600160a01b031681565b6102806103d4366004611f47565b6001600160a01b031660009081526001602052604090205490565b61031d610fd4565b61031d610405366004611f47565b61100a565b6000546001600160a01b03166102c4565b61024a61106b565b610280610431366004612115565b600c6020526000908152604090205481565b61031d610451366004611ffb565b61107a565b61031d610464366004611f47565b6110f3565b61031d610477366004611f47565b611141565b6102a161048a366004611ffb565b61118d565b6102a161049d366004611ffb565b6111dc565b61031d6104b0366004611f47565b6111e9565b6104c86104c3366004612027565b61129a565b60408051928352901515602083015201610257565b6102a16104eb366004611f47565b600a6020526000908152604090205460ff1681565b600d546102c4906001600160a01b031681565b610280610521366004611f47565b60096020526000908152604090205481565b61031d610541366004611ffb565b611399565b610280610554366004611f81565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61031d61058d366004611f47565b611604565b61031d6105a0366004611f47565b611650565b600f546102c4906001600160a01b031681565b6102a16105c6366004612115565b61169c565b61031d6105d9366004611f47565b6116b7565b6060600480546105ed906123d8565b80601f0160208091040260200160405190810160405280929190818152602001828054610619906123d8565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050905090565b600061067d338484611752565b5060015b92915050565b6000610694848484611877565b6106e684336106e1856040518060600160405280602881526020016124ce602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906119fd565b611752565b5060019392505050565b600080600d60009054906101000a90046001600160a01b03166001600160a01b031663ca2882ca6040518163ffffffff1660e01b815260040160206040518083038186803b15801561074157600080fd5b505afa158015610755573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610779919061212e565b6001600160a01b03841660009081526009602052604081205491925090610838906201518090610832906107ae908690611a37565b600d5460405163ea7cbff160e01b81526001600160a01b038a811660048301529091169063ea7cbff1906024015b60206040518083038186803b1580156107f457600080fd5b505afa158015610808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082c919061212e565b90611a80565b90611aff565b6001600160a01b03851660009081526008602052604090205490915061085f90829061222a565b949350505050565b6000546001600160a01b0316331461089a5760405162461bcd60e51b81526004016108919061219c565b60405180910390fd5b6001600160a01b03166000908152600a60205260409020805460ff19169055565b600d546001600160a01b031633146108d257600080fd5b600754811015610c7e576001600160a01b03808416600090815260096020908152604080832054600d548251639f05a36d60e01b815292519495919486949190921692639f05a36d926004808301939282900301818787803b15801561093757600080fd5b505af115801561094b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096f919061212e565b9050600d60009054906101000a90046001600160a01b03166001600160a01b031663ca2882ca6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109bf57600080fd5b505afa1580156109d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f7919061212e565b600d54604051632eadf27d60e11b8152600481018790529194506000916001600160a01b0390911690635d5be4fa9060240160206040518083038186803b158015610a4157600080fd5b505afa158015610a55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a79919061212e565b90508215610af557610ac762015180610832610a958787611a37565b600d5460405163ea7cbff160e01b81526001600160a01b038d811660048301529091169063ea7cbff1906024016107dc565b6001600160a01b03881660009081526008602052604081208054909190610aef90849061222a565b90915550505b818314610b18576001600160a01b03871660009081526009602052604090208490555b6001600160a01b03861615610bad576001600160a01b0386166000908152600960205260409020548015610b8857610b5a62015180610832610a958885611a37565b6001600160a01b03881660009081526008602052604081208054909190610b8290849061222a565b90915550505b828114610bab576001600160a01b03871660009081526009602052604090208590555b505b600d546040516375e5ff4360e01b8152600481018390526001600160a01b038981166024830152909116906375e5ff4390604401600060405180830381600087803b158015610bfb57600080fd5b505af1158015610c0f573d6000803e3d6000fd5b5050600d54604051631208f9b360e21b8152600481018590526001600160a01b038a811660248301529091169250634823e6cc9150604401600060405180830381600087803b158015610c6157600080fd5b505af1158015610c75573d6000803e3d6000fd5b50505050505050505b505050565b3360008181526002602090815260408083206001600160a01b0387168452909152812054909161067d9185906106e19086611b41565b6000828152600b602052604090205415610d245760405162461bcd60e51b815260206004820152602660248201527f54686174206964656e746974792068617320616c7265616479206f70656e6564604482015265040c240c4def60d31b6064820152608401610891565b6000818152600c602052604090205415610d805760405162461bcd60e51b815260206004820181905260248201527f5468617420626f782068617320616c7265616479206265656e206f70656e65646044820152606401610891565b610d8982611ba0565b610dd55760405162461bcd60e51b815260206004820152601b60248201527f596f7520646f6e2774206f776e2074686174206964656e7469747900000000006044820152606401610891565b6010546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b158015610e1957600080fd5b505afa158015610e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e519190611f64565b6001600160a01b031614610ea75760405162461bcd60e51b815260206004820152601c60248201527f596f7520646f6e2774206f776e2074686174207661756c7420626f78000000006044820152606401610891565b6010546040516319389b9560e01b8152600481018390526000918291610f2e916001600160a01b0316906319389b959060240160006040518083038186803b158015610ef257600080fd5b505afa158015610f06573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104c391908101906120a7565b90925090506000610f4783670de0b6b3a764000061234f565b90508115610f7b57610f593382611cdf565b6000858152600b60209081526040808320879055868352600c90915290208590555b5050505050565b6000818152600c6020526040812054610f9d57506000919050565b506001919050565b6000546001600160a01b03163314610fcf5760405162461bcd60e51b81526004016108919061219c565b600755565b6000546001600160a01b03163314610ffe5760405162461bcd60e51b81526004016108919061219c565b6110086000611dc5565b565b6000546001600160a01b031633146110345760405162461bcd60e51b81526004016108919061219c565b6001600160a01b03166000818152600a60205260409020805460ff19166001179055600d80546001600160a01b0319169091179055565b6060600580546105ed906123d8565b336000908152600a602052604090205460ff166110e55760405162461bcd60e51b815260206004820152602360248201527f596f7520617265206e6f7420617070726f76656420746f206275726e20746f6b604482015262656e7360e81b6064820152608401610891565b6110ef8282611e15565b5050565b6000546001600160a01b0316331461111d5760405162461bcd60e51b81526004016108919061219c565b6001600160a01b03166000908152600a60205260409020805460ff19166001179055565b6000546001600160a01b0316331461116b5760405162461bcd60e51b81526004016108919061219c565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600061067d33846106e1856040518060600160405280602581526020016124f6602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906119fd565b600061067d338484611877565b600d546001600160a01b0316331461120057600080fd5b6001600160a01b03811660009081526008602052604090205480156110ef576001600160a01b0382166000908152600860205260408120556112538261124e83670de0b6b3a764000061234f565b611cdf565b816001600160a01b03167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04868260405161128e91815260200190565b60405180910390a25050565b60008060005b835181101561138e57600060308583815181106112bf576112bf612444565b01602001516112d1919060f81c612385565b60ff1610806113085750600960308583815181106112f1576112f1612444565b0160200151611303919060f81c612385565b60ff16115b156113195750600093849350915050565b6001818551611328919061236e565b611332919061236e565b61133d90600a6122a7565b603085838151811061135157611351612444565b0160200151611363919060f81c612385565b60ff16611370919061234f565b61137a908461222a565b92508061138681612413565b9150506112a0565b509092600192509050565b600d546001600160a01b031633146113e55760405162461bcd60e51b815260206004820152600f60248201526e43616e27742063616c6c207468697360881b6044820152606401610891565b6001600160a01b03808316600090815260096020908152604080832054600d548251636514416560e11b815292519495919491169263ca2882ca9260048082019391829003018186803b15801561143b57600080fd5b505afa15801561144f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611473919061212e565b915080156114fd576114e36114c4620151806108326114928686611a37565b600d5460405163ea7cbff160e01b81526001600160a01b038b811660048301529091169063ea7cbff1906024016107dc565b6001600160a01b03861660009081526008602052604090205490611b41565b6001600160a01b0385166000908152600860205260409020555b600d54604051632eadf27d60e11b8152600481018590526000916001600160a01b031690635d5be4fa9060240160206040518083038186803b15801561154257600080fd5b505afa158015611556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157a919061212e565b600d54604051631208f9b360e21b8152600481018390526001600160a01b038881166024830152929350911690634823e6cc90604401600060405180830381600087803b1580156115ca57600080fd5b505af11580156115de573d6000803e3d6000fd5b5050506001600160a01b0390951660009081526009602052604090209290925550505050565b6000546001600160a01b0316331461162e5760405162461bcd60e51b81526004016108919061219c565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461167a5760405162461bcd60e51b81526004016108919061219c565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600b6020526040812054610f9d57506000919050565b6000546001600160a01b031633146116e15760405162461bcd60e51b81526004016108919061219c565b6001600160a01b0381166117465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610891565b61174f81611dc5565b50565b6001600160a01b0383166117b45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610891565b6001600160a01b0382166118155760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610891565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166118db5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610891565b6001600160a01b03821661193d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610891565b61197a816040518060600160405280602681526020016124a8602691396001600160a01b03861660009081526001602052604090205491906119fd565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546119a99082611b41565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061186a9085815260200190565b60008184841115611a215760405162461bcd60e51b81526004016108919190612169565b506000611a2e848661236e565b95945050505050565b6000611a7983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506119fd565b9392505050565b600082611a8f57506000610681565b6000611a9b838561234f565b905082611aa88583612242565b14611a795760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610891565b6000611a7983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611f19565b600080611b4e838561222a565b905083811015611a795760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610891565b60006108fc821015611c4457600e546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e9060240160206040518083038186803b158015611bf057600080fd5b505afa158015611c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c289190611f64565b6001600160a01b03161415611c3f57506001919050565b611cd7565b600f546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e9060240160206040518083038186803b158015611c8857600080fd5b505afa158015611c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc09190611f64565b6001600160a01b03161415611cd757506001919050565b506000919050565b6001600160a01b038216611d355760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610891565b600354611d429082611b41565b6003556001600160a01b038216600090815260016020526040902054611d689082611b41565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611db99085815260200190565b60405180910390a35050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216611e755760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610891565b611eb281604051806060016040528060228152602001612486602291396001600160a01b03851660009081526001602052604090205491906119fd565b6001600160a01b038316600090815260016020526040902055600354611ed89082611a37565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611db9565b60008183611f3a5760405162461bcd60e51b81526004016108919190612169565b506000611a2e8486612242565b600060208284031215611f5957600080fd5b8135611a7981612470565b600060208284031215611f7657600080fd5b8151611a7981612470565b60008060408385031215611f9457600080fd5b8235611f9f81612470565b91506020830135611faf81612470565b809150509250929050565b600080600060608486031215611fcf57600080fd5b8335611fda81612470565b92506020840135611fea81612470565b929592945050506040919091013590565b6000806040838503121561200e57600080fd5b823561201981612470565b946020939093013593505050565b60006020828403121561203957600080fd5b813567ffffffffffffffff81111561205057600080fd5b8201601f8101841361206157600080fd5b803561207461206f82612202565b6121d1565b81815285602083850101111561208957600080fd5b81602084016020830137600091810160200191909152949350505050565b6000602082840312156120b957600080fd5b815167ffffffffffffffff8111156120d057600080fd5b8201601f810184136120e157600080fd5b80516120ef61206f82612202565b81815285602083850101111561210457600080fd5b611a2e8260208301602086016123a8565b60006020828403121561212757600080fd5b5035919050565b60006020828403121561214057600080fd5b5051919050565b6000806040838503121561215a57600080fd5b50508035926020909101359150565b60208152600082518060208401526121888160408501602087016123a8565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156121fa576121fa61245a565b604052919050565b600067ffffffffffffffff82111561221c5761221c61245a565b50601f01601f191660200190565b6000821982111561223d5761223d61242e565b500190565b60008261225f57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561229f5781600019048211156122855761228561242e565b8085161561229257918102915b93841c9390800290612269565b509250929050565b6000611a7983836000826122bd57506001610681565b816122ca57506000610681565b81600181146122e057600281146122ea57612306565b6001915050610681565b60ff8411156122fb576122fb61242e565b50506001821b610681565b5060208310610133831016604e8410600b8410161715612329575081810a610681565b6123338383612264565b80600019048211156123475761234761242e565b029392505050565b60008160001904831182151516156123695761236961242e565b500290565b6000828210156123805761238061242e565b500390565b600060ff821660ff84168082101561239f5761239f61242e565b90039392505050565b60005b838110156123c35781810151838201526020016123ab565b838111156123d2576000848401525b50505050565b600181811c908216806123ec57607f821691505b6020821081141561240d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124275761242761242e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461174f57600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206246260b165f5f16e755b584c4f4f83f85dd83787d27bb15c2b565efd3b746d764736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061023d5760003560e01c80638da5cb5b1161013b578063c89a5158116100b8578063e46a501e1161007c578063e46a501e1461057f578063e6d5864b14610592578063eead4b16146105a5578063f27b8cc5146105b8578063f2fde38b146105cb57600080fd5b8063c89a5158146104dd578063cac4977214610500578063cb03fb1e14610513578063cc240c0114610533578063dd62ed3e1461054657600080fd5b8063a1e4aff2116100ff578063a1e4aff214610469578063a457c2d71461047c578063a9059cbb1461048f578063c00007b0146104a2578063c5ef3ec5146104b557600080fd5b80638da5cb5b1461040a57806395d89b411461041b5780639a687796146104235780639dc29fac146104435780639f8187351461045657600080fd5b80632c8e8dfa116101c95780635aece3141161018d5780635aece314146103a057806367031bae146103b357806370a08231146103c6578063715018a6146103ef57806382b1168d146103f757600080fd5b80632c8e8dfa1461033f578063313ce56714610352578063395093511461036757806348ebfb3f1461037a57806351a00b4b1461038d57600080fd5b806318160ddd1161021057806318160ddd146102dc57806323b872dd146102e4578063267e8ab6146102f757806327ceecf41461030a5780632bbbc1051461031f57600080fd5b806306fdde03146102425780630700037d14610260578063095ea7b31461028e5780631377baf7146102b1575b600080fd5b61024a6105de565b6040516102579190612169565b60405180910390f35b61028061026e366004611f47565b60086020526000908152604090205481565b604051908152602001610257565b6102a161029c366004611ffb565b610670565b6040519015158152602001610257565b6010546102c4906001600160a01b031681565b6040516001600160a01b039091168152602001610257565b600354610280565b6102a16102f2366004611fba565b610687565b610280610305366004611f47565b6106f0565b61031d610318366004611f47565b610867565b005b61028061032d366004612115565b600b6020526000908152604090205481565b61031d61034d366004611fba565b6108bb565b60065460405160ff9091168152602001610257565b6102a1610375366004611ffb565b610c83565b61031d610388366004612147565b610cb9565b6102a161039b366004612115565b610f82565b61031d6103ae366004612115565b610fa5565b600e546102c4906001600160a01b031681565b6102806103d4366004611f47565b6001600160a01b031660009081526001602052604090205490565b61031d610fd4565b61031d610405366004611f47565b61100a565b6000546001600160a01b03166102c4565b61024a61106b565b610280610431366004612115565b600c6020526000908152604090205481565b61031d610451366004611ffb565b61107a565b61031d610464366004611f47565b6110f3565b61031d610477366004611f47565b611141565b6102a161048a366004611ffb565b61118d565b6102a161049d366004611ffb565b6111dc565b61031d6104b0366004611f47565b6111e9565b6104c86104c3366004612027565b61129a565b60408051928352901515602083015201610257565b6102a16104eb366004611f47565b600a6020526000908152604090205460ff1681565b600d546102c4906001600160a01b031681565b610280610521366004611f47565b60096020526000908152604090205481565b61031d610541366004611ffb565b611399565b610280610554366004611f81565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61031d61058d366004611f47565b611604565b61031d6105a0366004611f47565b611650565b600f546102c4906001600160a01b031681565b6102a16105c6366004612115565b61169c565b61031d6105d9366004611f47565b6116b7565b6060600480546105ed906123d8565b80601f0160208091040260200160405190810160405280929190818152602001828054610619906123d8565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050905090565b600061067d338484611752565b5060015b92915050565b6000610694848484611877565b6106e684336106e1856040518060600160405280602881526020016124ce602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906119fd565b611752565b5060019392505050565b600080600d60009054906101000a90046001600160a01b03166001600160a01b031663ca2882ca6040518163ffffffff1660e01b815260040160206040518083038186803b15801561074157600080fd5b505afa158015610755573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610779919061212e565b6001600160a01b03841660009081526009602052604081205491925090610838906201518090610832906107ae908690611a37565b600d5460405163ea7cbff160e01b81526001600160a01b038a811660048301529091169063ea7cbff1906024015b60206040518083038186803b1580156107f457600080fd5b505afa158015610808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082c919061212e565b90611a80565b90611aff565b6001600160a01b03851660009081526008602052604090205490915061085f90829061222a565b949350505050565b6000546001600160a01b0316331461089a5760405162461bcd60e51b81526004016108919061219c565b60405180910390fd5b6001600160a01b03166000908152600a60205260409020805460ff19169055565b600d546001600160a01b031633146108d257600080fd5b600754811015610c7e576001600160a01b03808416600090815260096020908152604080832054600d548251639f05a36d60e01b815292519495919486949190921692639f05a36d926004808301939282900301818787803b15801561093757600080fd5b505af115801561094b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096f919061212e565b9050600d60009054906101000a90046001600160a01b03166001600160a01b031663ca2882ca6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109bf57600080fd5b505afa1580156109d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f7919061212e565b600d54604051632eadf27d60e11b8152600481018790529194506000916001600160a01b0390911690635d5be4fa9060240160206040518083038186803b158015610a4157600080fd5b505afa158015610a55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a79919061212e565b90508215610af557610ac762015180610832610a958787611a37565b600d5460405163ea7cbff160e01b81526001600160a01b038d811660048301529091169063ea7cbff1906024016107dc565b6001600160a01b03881660009081526008602052604081208054909190610aef90849061222a565b90915550505b818314610b18576001600160a01b03871660009081526009602052604090208490555b6001600160a01b03861615610bad576001600160a01b0386166000908152600960205260409020548015610b8857610b5a62015180610832610a958885611a37565b6001600160a01b03881660009081526008602052604081208054909190610b8290849061222a565b90915550505b828114610bab576001600160a01b03871660009081526009602052604090208590555b505b600d546040516375e5ff4360e01b8152600481018390526001600160a01b038981166024830152909116906375e5ff4390604401600060405180830381600087803b158015610bfb57600080fd5b505af1158015610c0f573d6000803e3d6000fd5b5050600d54604051631208f9b360e21b8152600481018590526001600160a01b038a811660248301529091169250634823e6cc9150604401600060405180830381600087803b158015610c6157600080fd5b505af1158015610c75573d6000803e3d6000fd5b50505050505050505b505050565b3360008181526002602090815260408083206001600160a01b0387168452909152812054909161067d9185906106e19086611b41565b6000828152600b602052604090205415610d245760405162461bcd60e51b815260206004820152602660248201527f54686174206964656e746974792068617320616c7265616479206f70656e6564604482015265040c240c4def60d31b6064820152608401610891565b6000818152600c602052604090205415610d805760405162461bcd60e51b815260206004820181905260248201527f5468617420626f782068617320616c7265616479206265656e206f70656e65646044820152606401610891565b610d8982611ba0565b610dd55760405162461bcd60e51b815260206004820152601b60248201527f596f7520646f6e2774206f776e2074686174206964656e7469747900000000006044820152606401610891565b6010546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b158015610e1957600080fd5b505afa158015610e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e519190611f64565b6001600160a01b031614610ea75760405162461bcd60e51b815260206004820152601c60248201527f596f7520646f6e2774206f776e2074686174207661756c7420626f78000000006044820152606401610891565b6010546040516319389b9560e01b8152600481018390526000918291610f2e916001600160a01b0316906319389b959060240160006040518083038186803b158015610ef257600080fd5b505afa158015610f06573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104c391908101906120a7565b90925090506000610f4783670de0b6b3a764000061234f565b90508115610f7b57610f593382611cdf565b6000858152600b60209081526040808320879055868352600c90915290208590555b5050505050565b6000818152600c6020526040812054610f9d57506000919050565b506001919050565b6000546001600160a01b03163314610fcf5760405162461bcd60e51b81526004016108919061219c565b600755565b6000546001600160a01b03163314610ffe5760405162461bcd60e51b81526004016108919061219c565b6110086000611dc5565b565b6000546001600160a01b031633146110345760405162461bcd60e51b81526004016108919061219c565b6001600160a01b03166000818152600a60205260409020805460ff19166001179055600d80546001600160a01b0319169091179055565b6060600580546105ed906123d8565b336000908152600a602052604090205460ff166110e55760405162461bcd60e51b815260206004820152602360248201527f596f7520617265206e6f7420617070726f76656420746f206275726e20746f6b604482015262656e7360e81b6064820152608401610891565b6110ef8282611e15565b5050565b6000546001600160a01b0316331461111d5760405162461bcd60e51b81526004016108919061219c565b6001600160a01b03166000908152600a60205260409020805460ff19166001179055565b6000546001600160a01b0316331461116b5760405162461bcd60e51b81526004016108919061219c565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600061067d33846106e1856040518060600160405280602581526020016124f6602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906119fd565b600061067d338484611877565b600d546001600160a01b0316331461120057600080fd5b6001600160a01b03811660009081526008602052604090205480156110ef576001600160a01b0382166000908152600860205260408120556112538261124e83670de0b6b3a764000061234f565b611cdf565b816001600160a01b03167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04868260405161128e91815260200190565b60405180910390a25050565b60008060005b835181101561138e57600060308583815181106112bf576112bf612444565b01602001516112d1919060f81c612385565b60ff1610806113085750600960308583815181106112f1576112f1612444565b0160200151611303919060f81c612385565b60ff16115b156113195750600093849350915050565b6001818551611328919061236e565b611332919061236e565b61133d90600a6122a7565b603085838151811061135157611351612444565b0160200151611363919060f81c612385565b60ff16611370919061234f565b61137a908461222a565b92508061138681612413565b9150506112a0565b509092600192509050565b600d546001600160a01b031633146113e55760405162461bcd60e51b815260206004820152600f60248201526e43616e27742063616c6c207468697360881b6044820152606401610891565b6001600160a01b03808316600090815260096020908152604080832054600d548251636514416560e11b815292519495919491169263ca2882ca9260048082019391829003018186803b15801561143b57600080fd5b505afa15801561144f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611473919061212e565b915080156114fd576114e36114c4620151806108326114928686611a37565b600d5460405163ea7cbff160e01b81526001600160a01b038b811660048301529091169063ea7cbff1906024016107dc565b6001600160a01b03861660009081526008602052604090205490611b41565b6001600160a01b0385166000908152600860205260409020555b600d54604051632eadf27d60e11b8152600481018590526000916001600160a01b031690635d5be4fa9060240160206040518083038186803b15801561154257600080fd5b505afa158015611556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157a919061212e565b600d54604051631208f9b360e21b8152600481018390526001600160a01b038881166024830152929350911690634823e6cc90604401600060405180830381600087803b1580156115ca57600080fd5b505af11580156115de573d6000803e3d6000fd5b5050506001600160a01b0390951660009081526009602052604090209290925550505050565b6000546001600160a01b0316331461162e5760405162461bcd60e51b81526004016108919061219c565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461167a5760405162461bcd60e51b81526004016108919061219c565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600b6020526040812054610f9d57506000919050565b6000546001600160a01b031633146116e15760405162461bcd60e51b81526004016108919061219c565b6001600160a01b0381166117465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610891565b61174f81611dc5565b50565b6001600160a01b0383166117b45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610891565b6001600160a01b0382166118155760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610891565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166118db5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610891565b6001600160a01b03821661193d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610891565b61197a816040518060600160405280602681526020016124a8602691396001600160a01b03861660009081526001602052604090205491906119fd565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546119a99082611b41565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061186a9085815260200190565b60008184841115611a215760405162461bcd60e51b81526004016108919190612169565b506000611a2e848661236e565b95945050505050565b6000611a7983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506119fd565b9392505050565b600082611a8f57506000610681565b6000611a9b838561234f565b905082611aa88583612242565b14611a795760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610891565b6000611a7983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611f19565b600080611b4e838561222a565b905083811015611a795760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610891565b60006108fc821015611c4457600e546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e9060240160206040518083038186803b158015611bf057600080fd5b505afa158015611c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c289190611f64565b6001600160a01b03161415611c3f57506001919050565b611cd7565b600f546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e9060240160206040518083038186803b158015611c8857600080fd5b505afa158015611c9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc09190611f64565b6001600160a01b03161415611cd757506001919050565b506000919050565b6001600160a01b038216611d355760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610891565b600354611d429082611b41565b6003556001600160a01b038216600090815260016020526040902054611d689082611b41565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611db99085815260200190565b60405180910390a35050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216611e755760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610891565b611eb281604051806060016040528060228152602001612486602291396001600160a01b03851660009081526001602052604090205491906119fd565b6001600160a01b038316600090815260016020526040902055600354611ed89082611a37565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611db9565b60008183611f3a5760405162461bcd60e51b81526004016108919190612169565b506000611a2e8486612242565b600060208284031215611f5957600080fd5b8135611a7981612470565b600060208284031215611f7657600080fd5b8151611a7981612470565b60008060408385031215611f9457600080fd5b8235611f9f81612470565b91506020830135611faf81612470565b809150509250929050565b600080600060608486031215611fcf57600080fd5b8335611fda81612470565b92506020840135611fea81612470565b929592945050506040919091013590565b6000806040838503121561200e57600080fd5b823561201981612470565b946020939093013593505050565b60006020828403121561203957600080fd5b813567ffffffffffffffff81111561205057600080fd5b8201601f8101841361206157600080fd5b803561207461206f82612202565b6121d1565b81815285602083850101111561208957600080fd5b81602084016020830137600091810160200191909152949350505050565b6000602082840312156120b957600080fd5b815167ffffffffffffffff8111156120d057600080fd5b8201601f810184136120e157600080fd5b80516120ef61206f82612202565b81815285602083850101111561210457600080fd5b611a2e8260208301602086016123a8565b60006020828403121561212757600080fd5b5035919050565b60006020828403121561214057600080fd5b5051919050565b6000806040838503121561215a57600080fd5b50508035926020909101359150565b60208152600082518060208401526121888160408501602087016123a8565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156121fa576121fa61245a565b604052919050565b600067ffffffffffffffff82111561221c5761221c61245a565b50601f01601f191660200190565b6000821982111561223d5761223d61242e565b500190565b60008261225f57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561229f5781600019048211156122855761228561242e565b8085161561229257918102915b93841c9390800290612269565b509250929050565b6000611a7983836000826122bd57506001610681565b816122ca57506000610681565b81600181146122e057600281146122ea57612306565b6001915050610681565b60ff8411156122fb576122fb61242e565b50506001821b610681565b5060208310610133831016604e8410600b8410161715612329575081810a610681565b6123338383612264565b80600019048211156123475761234761242e565b029392505050565b60008160001904831182151516156123695761236961242e565b500290565b6000828210156123805761238061242e565b500390565b600060ff821660ff84168082101561239f5761239f61242e565b90039392505050565b60005b838110156123c35781810151838201526020016123ab565b838111156123d2576000848401525b50505050565b600181811c908216806123ec57607f821691505b6020821081141561240d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124275761242761242e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461174f57600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206246260b165f5f16e755b584c4f4f83f85dd83787d27bb15c2b565efd3b746d764736f6c63430008060033

Deployed Bytecode Sourcemap

29132:6667:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20287:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29265:42;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;11382:25:1;;;11370:2;11355:18;29265:42:0;11337:76:1;22393:169:0;;;;;;:::i;:::-;;:::i;:::-;;;4015:14:1;;4008:22;3990:41;;3978:2;3963:18;22393:169:0;3945:92:1;29666:33:0;;;;;-1:-1:-1;;;;;29666:33:0;;;;;;-1:-1:-1;;;;;3806:32:1;;;3788:51;;3776:2;3761:18;29666:33:0;3743:102:1;21362:100:0;21442:12;;21362:100;;23036:321;;;;;;:::i;:::-;;:::i;35103:296::-;;;;;;:::i;:::-;;:::i;31613:126::-;;;;;;:::i;:::-;;:::i;:::-;;29418:52;;;;;;:::i;:::-;;;;;;;;;;;;;;33510:1164;;;;;;:::i;:::-;;:::i;21214:83::-;21280:9;;21214:83;;21280:9;;;;12102:36:1;;12090:2;12075:18;21214:83:0;12057:87:1;23766:218:0;;;;;;:::i;:::-;;:::i;29997:912::-;;;;;;:::i;:::-;;:::i;30917:212::-;;;;;;:::i;:::-;;:::i;31350:124::-;;;;;;:::i;:::-;;:::i;29580:33::-;;;;;-1:-1:-1;;;;;29580:33:0;;;21525:119;;;;;;:::i;:::-;-1:-1:-1;;;;;21618:18:0;21591:7;21618:18;;;:9;:18;;;;;;;21525:119;17505:94;;;:::i;32607:160::-;;;;;;:::i;:::-;;:::i;16854:87::-;16900:7;16927:6;-1:-1:-1;;;;;16927:6:0;16854:87;;20489;;;:::i;29477:59::-;;;;;;:::i;:::-;;;;;;;;;;;;;;34933:165;;;;;;:::i;:::-;;:::i;31482:123::-;;;;;;:::i;:::-;;:::i;32337:133::-;;;;;;:::i;:::-;;:::i;24487:269::-;;;;;;:::i;:::-;;:::i;21857:175::-;;;;;;:::i;:::-;;:::i;34679:249::-;;;;;;:::i;:::-;;:::i;35407:389::-;;;;;;:::i;:::-;;:::i;:::-;;;;11865:25:1;;;11933:14;;11926:22;11921:2;11906:18;;11899:50;11838:18;35407:389:0;11820:135:1;29363:46:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29542:31;;;;;-1:-1:-1;;;;;29542:31:0;;;29311:45;;;;;;:::i;:::-;;;;;;;;;;;;;;32813:612;;;;;;:::i;:::-;;:::i;22095:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;22211:18:0;;;22184:7;22211:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;22095:151;32478:121;;;;;;:::i;:::-;;:::i;32208:::-;;;;;;:::i;:::-;;:::i;29620:39::-;;;;;-1:-1:-1;;;;;29620:39:0;;;31137:205;;;;;;:::i;:::-;;:::i;17754:192::-;;;;;;:::i;:::-;;:::i;20287:83::-;20324:13;20357:5;20350:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20287:83;:::o;22393:169::-;22476:4;22493:39;7540:10;22516:7;22525:6;22493:8;:39::i;:::-;-1:-1:-1;22550:4:0;22393:169;;;;;:::o;23036:321::-;23142:4;23159:36;23169:6;23177:9;23188:6;23159:9;:36::i;:::-;23206:121;23215:6;7540:10;23237:89;23275:6;23237:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23237:19:0;;;;;;:11;:19;;;;;;;;7540:10;23237:33;;;;;;;;;;:37;:89::i;:::-;23206:8;:121::i;:::-;-1:-1:-1;23345:4:0;23036:321;;;;;:::o;35103:296::-;35167:7;35191:12;35206:15;;;;;;;;;-1:-1:-1;;;;;35206:15:0;-1:-1:-1;;;;;35206:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35327:17:0;;35258:15;35327:17;;;:10;:17;;;;;;35191:54;;-1:-1:-1;35258:15:0;35276:82;;35352:5;;35276:71;;35318:27;;35191:54;;35318:8;:27::i;:::-;35276:15;;:36;;-1:-1:-1;;;35276:36:0;;-1:-1:-1;;;;;3806:32:1;;;35276:36:0;;;3788:51:1;35276:15:0;;;;:29;;3761:18:1;;35276:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;:71::i;:::-;:75;;:82::i;:::-;-1:-1:-1;;;;;35370:14:0;;;;;;:7;:14;;;;;;35258:100;;-1:-1:-1;35370:24:0;;35258:100;;35370:24;:::i;:::-;35363:31;35103:296;-1:-1:-1;;;;35103:296:0:o;31613:126::-;16900:7;16927:6;-1:-1:-1;;;;;16927:6:0;7540:10;17074:23;17066:68;;;;-1:-1:-1;;;17066:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;31699:24:0::1;31726:5;31699:24:::0;;;:14:::1;:24;::::0;;;;:32;;-1:-1:-1;;31699:32:0::1;::::0;;31613:126::o;33510:1164::-;33622:15;;-1:-1:-1;;;;;33622:15:0;33600:10;:38;33592:47;;;;;;33659:21;;33648:8;:32;33644:1026;;;-1:-1:-1;;;;;33726:17:0;;;33688:12;33726:17;;;:10;:17;;;;;;;;;33774:15;;:24;;-1:-1:-1;;;33774:24:0;;;;33688:12;;33726:17;;33688:12;;33774:15;;;;;:22;;:24;;;;;33726:17;33774:24;;;;;33688:12;33774:15;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33760:38;;33822:15;;;;;;;;;-1:-1:-1;;;;;33822:15:0;-1:-1:-1;;;;;33822:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33898:15;;:50;;-1:-1:-1;;;33898:50:0;;;;;11382:25:1;;;33815:46:0;;-1:-1:-1;33878:17:0;;-1:-1:-1;;;;;33898:15:0;;;;:40;;11355:18:1;;33898:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33878:70;-1:-1:-1;33960:13:0;;33956:159;;34025:74;34093:5;34025:63;34067:19;:4;34076:9;34067:8;:19::i;:::-;34025:15;;:36;;-1:-1:-1;;;34025:36:0;;-1:-1:-1;;;;;3806:32:1;;;34025:36:0;;;3788:51:1;34025:15:0;;;;:29;;3761:18:1;;34025:36:0;3743:102:1;34025:74:0;-1:-1:-1;;;;;34007:14:0;;;;;;:7;:14;;;;;:92;;:14;;;:92;;;;;:::i;:::-;;;;-1:-1:-1;;33956:159:0;34137:3;34124:9;:16;34120:82;;-1:-1:-1;;;;;34162:17:0;;;;;;:10;:17;;;;;:24;;;34120:82;-1:-1:-1;;;;;34211:17:0;;;34207:332;;-1:-1:-1;;;;;34255:15:0;;34237;34255;;;:10;:15;;;;;;34281:11;;34277:163;;34350:70;34414:5;34350:59;34390:17;:4;34399:7;34390:8;:17::i;34350:70::-;-1:-1:-1;;;;;34334:12:0;;;;;;:7;:12;;;;;:86;;:12;;;:86;;;;;:::i;:::-;;;;-1:-1:-1;;34277:163:0;34461:3;34450:7;:14;34446:87;;-1:-1:-1;;;;;34491:15:0;;;;;;:10;:15;;;;;:22;;;34446:87;34230:309;34207:332;34555:15;;:47;;-1:-1:-1;;;34555:47:0;;;;;11592:25:1;;;-1:-1:-1;;;;;11653:32:1;;;11633:18;;;11626:60;34555:15:0;;;;:29;;11565:18:1;;34555:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34617:15:0;;:47;;-1:-1:-1;;;34617:47:0;;;;;11592:25:1;;;-1:-1:-1;;;;;11653:32:1;;;11633:18;;;11626:60;34617:15:0;;;;-1:-1:-1;34617:31:0;;-1:-1:-1;11565:18:1;;34617:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33682:988;;;;33644:1026;33510:1164;;;:::o;23766:218::-;7540:10;23854:4;23903:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;23903:34:0;;;;;;;;;;23854:4;;23871:83;;23894:7;;23903:50;;23942:10;23903:38;:50::i;29997:912::-;30101:34;;;;:17;:34;;;;;;:39;30093:90;;;;-1:-1:-1;;;30093:90:0;;7634:2:1;30093:90:0;;;7616:21:1;7673:2;7653:18;;;7646:30;7712:34;7692:18;;;7685:62;-1:-1:-1;;;7763:18:1;;;7756:36;7809:19;;30093:90:0;7606:228:1;30093:90:0;30202:41;;;;:24;:41;;;;;;:46;30194:91;;;;-1:-1:-1;;;30194:91:0;;8041:2:1;30194:91:0;;;8023:21:1;;;8060:18;;;8053:30;8119:34;8099:18;;;8092:62;8171:18;;30194:91:0;8013:182:1;30194:91:0;30304:33;30321:15;30304:16;:33::i;:::-;30296:73;;;;-1:-1:-1;;;30296:73:0;;9567:2:1;30296:73:0;;;9549:21:1;9606:2;9586:18;;;9579:30;9645:29;9625:18;;;9618:57;9692:18;;30296:73:0;9539:177:1;30296:73:0;30388:16;;:41;;-1:-1:-1;;;30388:41:0;;;;;11382:25:1;;;30433:10:0;;-1:-1:-1;;;;;30388:16:0;;:24;;11355:18:1;;30388:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30388:55:0;;30380:96;;;;-1:-1:-1;;;30380:96:0;;5707:2:1;30380:96:0;;;5689:21:1;5746:2;5726:18;;;5719:30;5785;5765:18;;;5758:58;5833:18;;30380:96:0;5679:178:1;30380:96:0;30579:16;;:44;;-1:-1:-1;;;30579:44:0;;;;;11382:25:1;;;30489:12:0;;;;30569:55;;-1:-1:-1;;;;;30579:16:0;;:27;;11355:18:1;;30579:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30579:44:0;;;;;;;;;;;;:::i;30569:55::-;30542:82;;-1:-1:-1;30542:82:0;-1:-1:-1;30637:11:0;30651:18;30542:82;30661:8;30651:18;:::i;:::-;30637:32;;30685:13;30682:220;;;30724:25;30730:10;30742:6;30724:5;:25::i;:::-;30764:34;;;;:17;:34;;;;;;;;:52;;;30831:41;;;:24;:41;;;;;:59;;;30682:220;30082:827;;;29997:912;;:::o;30917:212::-;30985:4;31010:33;;;:24;:33;;;;;;31007:91;;-1:-1:-1;31081:5:0;;30917:212;-1:-1:-1;30917:212:0:o;31007:91::-;-1:-1:-1;31117:4:0;;30917:212;-1:-1:-1;30917:212:0:o;31350:124::-;16900:7;16927:6;-1:-1:-1;;;;;16927:6:0;7540:10;17074:23;17066:68;;;;-1:-1:-1;;;17066:68:0;;;;;;;:::i;:::-;31435:21:::1;:31:::0;31350:124::o;17505:94::-;16900:7;16927:6;-1:-1:-1;;;;;16927:6:0;7540:10;17074:23;17066:68;;;;-1:-1:-1;;;17066:68:0;;;;;;;:::i;:::-;17570:21:::1;17588:1;17570:9;:21::i;:::-;17505:94::o:0;32607:160::-;16900:7;16927:6;-1:-1:-1;;;;;16927:6:0;7540:10;17074:23;17066:68;;;;-1:-1:-1;;;17066:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32681:24:0::1;;::::0;;;:14:::1;:24;::::0;;;;:31;;-1:-1:-1;;32681:31:0::1;32708:4;32681:31;::::0;;32723:15:::1;:36:::0;;-1:-1:-1;;;;;;32723:36:0::1;::::0;;::::1;::::0;;32607:160::o;20489:87::-;20528:13;20561:7;20554:14;;;;;:::i;34933:165::-;35016:10;35001:26;;;;:14;:26;;;;;;;;34993:74;;;;-1:-1:-1;;;34993:74:0;;6874:2:1;34993:74:0;;;6856:21:1;6913:2;6893:18;;;6886:30;6952:34;6932:18;;;6925:62;-1:-1:-1;;;7003:18:1;;;6996:33;7046:19;;34993:74:0;6846:225:1;34993:74:0;35072:21;35078:5;35085:7;35072:5;:21::i;:::-;34933:165;;:::o;31482:123::-;16900:7;16927:6;-1:-1:-1;;;;;16927:6:0;7540:10;17074:23;17066:68;;;;-1:-1:-1;;;17066:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31566:24:0::1;;::::0;;;:14:::1;:24;::::0;;;;:31;;-1:-1:-1;;31566:31:0::1;31593:4;31566:31;::::0;;31482:123::o;32337:133::-;16900:7;16927:6;-1:-1:-1;;;;;16927:6:0;7540:10;17074:23;17066:68;;;;-1:-1:-1;;;17066:68:0;;;;;;;:::i;:::-;32418:22:::1;:44:::0;;-1:-1:-1;;;;;;32418:44:0::1;-1:-1:-1::0;;;;;32418:44:0;;;::::1;::::0;;;::::1;::::0;;32337:133::o;24487:269::-;24580:4;24597:129;7540:10;24620:7;24629:96;24668:15;24629:96;;;;;;;;;;;;;;;;;7540:10;24629:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;24629:34:0;;;;;;;;;;;;:38;:96::i;21857:175::-;21943:4;21960:42;7540:10;21984:9;21995:6;21960:9;:42::i;34679:249::-;34755:15;;-1:-1:-1;;;;;34755:15:0;34733:10;:38;34725:47;;;;;;-1:-1:-1;;;;;34794:12:0;;34777:14;34794:12;;;:7;:12;;;;;;34815:10;;34811:113;;-1:-1:-1;;;;;34833:12:0;;34848:1;34833:12;;;:7;:12;;;;;:16;34855:29;34841:3;34866:17;:6;34875:8;34866:17;:::i;:::-;34855:5;:29::i;:::-;34906:3;-1:-1:-1;;;;;34895:23:0;;34911:6;34895:23;;;;11382:25:1;;11370:2;11355:18;;11337:76;34895:23:0;;;;;;;;34720:208;34679:249;:::o;35407:389::-;35466:11;35479:8;35501:9;35496:266;35526:4;35520:18;35516:1;:22;35496:266;;;35591:1;35585:2;35573:4;35579:1;35567:14;;;;;;;;:::i;:::-;;;;;35561:26;;;35567:14;;35561:26;:::i;:::-;35560:32;;;:68;;;;35627:1;35621:2;35609:4;35615:1;35603:14;;;;;;;;:::i;:::-;;;;;35597:26;;;35603:14;;35597:26;:::i;:::-;35596:32;;;35560:68;35556:118;;;-1:-1:-1;35653:1:0;;;;-1:-1:-1;35407:389:0;-1:-1:-1;;35407:389:0:o;35556:118::-;35752:1;35748;35733:4;35727:18;:22;;;;:::i;:::-;:26;;;;:::i;:::-;35722:32;;:2;:32;:::i;:::-;35716:2;35704:4;35710:1;35698:14;;;;;;;;:::i;:::-;;;;;35692:26;;;35698:14;;35692:26;:::i;:::-;35691:63;;;;;;:::i;:::-;35684:70;;;;:::i;:::-;;-1:-1:-1;35540:3:0;;;;:::i;:::-;;;;35496:266;;;-1:-1:-1;35782:3:0;;35787:4;;-1:-1:-1;35407:389:0;-1:-1:-1;35407:389:0:o;32813:612::-;32917:15;;-1:-1:-1;;;;;32917:15:0;32895:10;:38;32887:66;;;;-1:-1:-1;;;32887:66:0;;10734:2:1;32887:66:0;;;10716:21:1;10773:2;10753:18;;;10746:30;-1:-1:-1;;;10792:18:1;;;10785:45;10847:18;;32887:66:0;10706:165:1;32887:66:0;-1:-1:-1;;;;;32995:17:0;;;32958:12;32995:17;;;:10;:17;;;;;;;;;33032:15;;:39;;-1:-1:-1;;;33032:39:0;;;;32958:12;;32995:17;;33032:15;;;:37;;:39;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33025:46;-1:-1:-1;33084:13:0;;33080:166;;33140:94;33159:74;33227:5;33159:63;33201:19;:4;33210:9;33201:8;:19::i;:::-;33159:15;;:36;;-1:-1:-1;;;33159:36:0;;-1:-1:-1;;;;;3806:32:1;;;33159:36:0;;;3788:51:1;33159:15:0;;;;:29;;3761:18:1;;33159:36:0;3743:102:1;33159:74:0;-1:-1:-1;;;;;33140:14:0;;;;;;:7;:14;;;;;;;:18;:94::i;:::-;-1:-1:-1;;;;;33123:14:0;;;;;;:7;:14;;;;;:111;33080:166;33278:15;;:49;;-1:-1:-1;;;33278:49:0;;;;;11382:25:1;;;33258:17:0;;-1:-1:-1;;;;;33278:15:0;;:40;;11355:18:1;;33278:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33340:15;;:49;;-1:-1:-1;;;33340:49:0;;;;;11592:25:1;;;-1:-1:-1;;;;;11653:32:1;;;11633:18;;;11626:60;33258:69:0;;-1:-1:-1;33340:15:0;;;:31;;11565:18:1;;33340:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;33396:17:0;;;;;;;:10;:17;;;;;:24;;;;-1:-1:-1;;;;32813:612:0:o;32478:121::-;16900:7;16927:6;-1:-1:-1;;;;;16927:6:0;7540:10;17074:23;17066:68;;;;-1:-1:-1;;;17066:68:0;;;;;;;:::i;:::-;32553:16:::1;:38:::0;;-1:-1:-1;;;;;;32553:38:0::1;-1:-1:-1::0;;;;;32553:38:0;;;::::1;::::0;;;::::1;::::0;;32478:121::o;32208:::-;16900:7;16927:6;-1:-1:-1;;;;;16927:6:0;7540:10;17074:23;17066:68;;;;-1:-1:-1;;;17066:68:0;;;;;;;:::i;:::-;32283:16:::1;:38:::0;;-1:-1:-1;;;;;;32283:38:0::1;-1:-1:-1::0;;;;;32283:38:0;;;::::1;::::0;;;::::1;::::0;;32208:121::o;31137:205::-;31205:4;31230:26;;;:17;:26;;;;;;31227:84;;-1:-1:-1;31294:5:0;;31137:205;-1:-1:-1;31137:205:0:o;17754:192::-;16900:7;16927:6;-1:-1:-1;;;;;16927:6:0;7540:10;17074:23;17066:68;;;;-1:-1:-1;;;17066:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17843:22:0;::::1;17835:73;;;::::0;-1:-1:-1;;;17835:73:0;;6064:2:1;17835:73:0::1;::::0;::::1;6046:21:1::0;6103:2;6083:18;;;6076:30;6142:34;6122:18;;;6115:62;-1:-1:-1;;;6193:18:1;;;6186:36;6239:19;;17835:73:0::1;6036:228:1::0;17835:73:0::1;17919:19;17929:8;17919:9;:19::i;:::-;17754:192:::0;:::o;27632:346::-;-1:-1:-1;;;;;27734:19:0;;27726:68;;;;-1:-1:-1;;;27726:68:0;;10329:2:1;27726:68:0;;;10311:21:1;10368:2;10348:18;;;10341:30;10407:34;10387:18;;;10380:62;-1:-1:-1;;;10458:18:1;;;10451:34;10502:19;;27726:68:0;10301:226:1;27726:68:0;-1:-1:-1;;;;;27813:21:0;;27805:68;;;;-1:-1:-1;;;27805:68:0;;6471:2:1;27805:68:0;;;6453:21:1;6510:2;6490:18;;;6483:30;6549:34;6529:18;;;6522:62;-1:-1:-1;;;6600:18:1;;;6593:32;6642:19;;27805:68:0;6443:224:1;27805:68:0;-1:-1:-1;;;;;27886:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;27938:32;;11382:25:1;;;27938:32:0;;11355:18:1;27938:32:0;;;;;;;;27632:346;;;:::o;25246:539::-;-1:-1:-1;;;;;25352:20:0;;25344:70;;;;-1:-1:-1;;;25344:70:0;;9923:2:1;25344:70:0;;;9905:21:1;9962:2;9942:18;;;9935:30;10001:34;9981:18;;;9974:62;-1:-1:-1;;;10052:18:1;;;10045:35;10097:19;;25344:70:0;9895:227:1;25344:70:0;-1:-1:-1;;;;;25433:23:0;;25425:71;;;;-1:-1:-1;;;25425:71:0;;5303:2:1;25425:71:0;;;5285:21:1;5342:2;5322:18;;;5315:30;5381:34;5361:18;;;5354:62;-1:-1:-1;;;5432:18:1;;;5425:33;5475:19;;25425:71:0;5275:225:1;25425:71:0;25589;25611:6;25589:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25589:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;25569:17:0;;;;;;;:9;:17;;;;;;:91;;;;25694:20;;;;;;;:32;;25719:6;25694:24;:32::i;:::-;-1:-1:-1;;;;;25671:20:0;;;;;;;:9;:20;;;;;;;:55;;;;25742:35;;;;;;;;;;25770:6;11382:25:1;;11370:2;11355:18;;11337:76;12387:192:0;12473:7;12509:12;12501:6;;;;12493:29;;;;-1:-1:-1;;;12493:29:0;;;;;;;;:::i;:::-;-1:-1:-1;12533:9:0;12545:5;12549:1;12545;:5;:::i;:::-;12533:17;12387:192;-1:-1:-1;;;;;12387:192:0:o;11948:136::-;12006:7;12033:43;12037:1;12040;12033:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;12026:50;11948:136;-1:-1:-1;;;11948:136:0:o;12838:471::-;12896:7;13141:6;13137:47;;-1:-1:-1;13171:1:0;13164:8;;13137:47;13196:9;13208:5;13212:1;13208;:5;:::i;:::-;13196:17;-1:-1:-1;13241:1:0;13232:5;13236:1;13196:17;13232:5;:::i;:::-;:10;13224:56;;;;-1:-1:-1;;;13224:56:0;;8402:2:1;13224:56:0;;;8384:21:1;8441:2;8421:18;;;8414:30;8480:34;8460:18;;;8453:62;-1:-1:-1;;;8531:18:1;;;8524:31;8572:19;;13224:56:0;8374:223:1;13785:132:0;13843:7;13870:39;13874:1;13877;13870:39;;;;;;;;;;;;;;;;;:3;:39::i;11484:181::-;11542:7;;11574:5;11578:1;11574;:5;:::i;:::-;11562:17;;11603:1;11598;:6;;11590:46;;;;-1:-1:-1;;;11590:46:0;;7278:2:1;11590:46:0;;;7260:21:1;7317:2;7297:18;;;7290:30;7356:29;7336:18;;;7329:57;7403:18;;11590:46:0;7250:177:1;31747:453:0;31812:4;31847;31837:7;:14;31834:332;;;31880:16;;:33;;-1:-1:-1;;;31880:33:0;;;;;11382:25:1;;;31917:10:0;;-1:-1:-1;;;;;31880:16:0;;:24;;11355:18:1;;31880:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31880:47:0;;31877:111;;;-1:-1:-1;31968:4:0;;31747:453;-1:-1:-1;31747:453:0:o;31877:111::-;31834:332;;;32041:22;;:39;;-1:-1:-1;;;32041:39:0;;;;;11382:25:1;;;32084:10:0;;-1:-1:-1;;;;;32041:22:0;;:30;;11355:18:1;;32041:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32041:53:0;;32038:117;;;-1:-1:-1;32135:4:0;;31747:453;-1:-1:-1;31747:453:0:o;32038:117::-;-1:-1:-1;32185:5:0;;31747:453;-1:-1:-1;31747:453:0:o;26066:378::-;-1:-1:-1;;;;;26150:21:0;;26142:65;;;;-1:-1:-1;;;26142:65:0;;11078:2:1;26142:65:0;;;11060:21:1;11117:2;11097:18;;;11090:30;11156:33;11136:18;;;11129:61;11207:18;;26142:65:0;11050:181:1;26142:65:0;26297:12;;:24;;26314:6;26297:16;:24::i;:::-;26282:12;:39;-1:-1:-1;;;;;26353:18:0;;;;;;:9;:18;;;;;;:30;;26376:6;26353:22;:30::i;:::-;-1:-1:-1;;;;;26332:18:0;;;;;;:9;:18;;;;;;:51;;;;26399:37;;26332:18;;;26399:37;;;;26429:6;11382:25:1;;11370:2;11355:18;;11337:76;26399:37:0;;;;;;;;26066:378;;:::o;17954:173::-;18010:16;18029:6;;-1:-1:-1;;;;;18046:17:0;;;-1:-1:-1;;;;;;18046:17:0;;;;;;18079:40;;18029:6;;;;;;;18079:40;;18010:16;18079:40;17999:128;17954:173;:::o;26776:418::-;-1:-1:-1;;;;;26860:21:0;;26852:67;;;;-1:-1:-1;;;26852:67:0;;9165:2:1;26852:67:0;;;9147:21:1;9204:2;9184:18;;;9177:30;9243:34;9223:18;;;9216:62;-1:-1:-1;;;9294:18:1;;;9287:31;9335:19;;26852:67:0;9137:223:1;26852:67:0;27015:68;27038:6;27015:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27015:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;26994:18:0;;;;;;:9;:18;;;;;:89;27109:12;;:24;;27126:6;27109:16;:24::i;:::-;27094:12;:39;27149:37;;11382:25:1;;;27175:1:0;;-1:-1:-1;;;;;27149:37:0;;;;;11370:2:1;11355:18;27149:37:0;11337:76:1;14413:278:0;14499:7;14534:12;14527:5;14519:28;;;;-1:-1:-1;;;14519:28:0;;;;;;;;:::i;:::-;-1:-1:-1;14558:9:0;14570:5;14574:1;14570;:5;:::i;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;142:1;139;132:12;94:2;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:2;;;405:1;402;395:12;357:2;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:2;;;667:1;664;657:12;619:2;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;609:301;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:2;;;1077:1;1074;1067:12;1029:2;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;1019:352;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;1019:352::o;1376:315::-;1444:6;1452;1505:2;1493:9;1484:7;1480:23;1476:32;1473:2;;;1521:1;1518;1511:12;1473:2;1560:9;1547:23;1579:31;1604:5;1579:31;:::i;:::-;1629:5;1681:2;1666:18;;;;1653:32;;-1:-1:-1;;;1463:228:1:o;1696:673::-;1765:6;1818:2;1806:9;1797:7;1793:23;1789:32;1786:2;;;1834:1;1831;1824:12;1786:2;1874:9;1861:23;1907:18;1899:6;1896:30;1893:2;;;1939:1;1936;1929:12;1893:2;1962:22;;2015:4;2007:13;;2003:27;-1:-1:-1;1993:2:1;;2044:1;2041;2034:12;1993:2;2080;2067:16;2105:49;2121:32;2150:2;2121:32;:::i;:::-;2105:49;:::i;:::-;2177:2;2170:5;2163:17;2217:7;2212:2;2207;2203;2199:11;2195:20;2192:33;2189:2;;;2238:1;2235;2228:12;2189:2;2293;2288;2284;2280:11;2275:2;2268:5;2264:14;2251:45;2337:1;2316:14;;;2332:2;2312:23;2305:34;;;;2320:5;1776:593;-1:-1:-1;;;;1776:593:1:o;2374:636::-;2454:6;2507:2;2495:9;2486:7;2482:23;2478:32;2475:2;;;2523:1;2520;2513:12;2475:2;2556:9;2550:16;2589:18;2581:6;2578:30;2575:2;;;2621:1;2618;2611:12;2575:2;2644:22;;2697:4;2689:13;;2685:27;-1:-1:-1;2675:2:1;;2726:1;2723;2716:12;2675:2;2755;2749:9;2780:49;2796:32;2825:2;2796:32;:::i;2780:49::-;2852:2;2845:5;2838:17;2892:7;2887:2;2882;2878;2874:11;2870:20;2867:33;2864:2;;;2913:1;2910;2903:12;2864:2;2926:54;2977:2;2972;2965:5;2961:14;2956:2;2952;2948:11;2926:54;:::i;3015:180::-;3074:6;3127:2;3115:9;3106:7;3102:23;3098:32;3095:2;;;3143:1;3140;3133:12;3095:2;-1:-1:-1;3166:23:1;;3085:110;-1:-1:-1;3085:110:1:o;3200:184::-;3270:6;3323:2;3311:9;3302:7;3298:23;3294:32;3291:2;;;3339:1;3336;3329:12;3291:2;-1:-1:-1;3362:16:1;;3281:103;-1:-1:-1;3281:103:1:o;3389:248::-;3457:6;3465;3518:2;3506:9;3497:7;3493:23;3489:32;3486:2;;;3534:1;3531;3524:12;3486:2;-1:-1:-1;;3557:23:1;;;3627:2;3612:18;;;3599:32;;-1:-1:-1;3476:161:1:o;4713:383::-;4862:2;4851:9;4844:21;4825:4;4894:6;4888:13;4937:6;4932:2;4921:9;4917:18;4910:34;4953:66;5012:6;5007:2;4996:9;4992:18;4987:2;4979:6;4975:15;4953:66;:::i;:::-;5080:2;5059:15;-1:-1:-1;;5055:29:1;5040:45;;;;5087:2;5036:54;;4834:262;-1:-1:-1;;4834:262:1:o;8602:356::-;8804:2;8786:21;;;8823:18;;;8816:30;8882:34;8877:2;8862:18;;8855:62;8949:2;8934:18;;8776:182::o;12149:275::-;12220:2;12214:9;12285:2;12266:13;;-1:-1:-1;;12262:27:1;12250:40;;12320:18;12305:34;;12341:22;;;12302:62;12299:2;;;12367:18;;:::i;:::-;12403:2;12396:22;12194:230;;-1:-1:-1;12194:230:1:o;12429:187::-;12478:4;12511:18;12503:6;12500:30;12497:2;;;12533:18;;:::i;:::-;-1:-1:-1;12599:2:1;12578:15;-1:-1:-1;;12574:29:1;12605:4;12570:40;;12487:129::o;12621:128::-;12661:3;12692:1;12688:6;12685:1;12682:13;12679:2;;;12698:18;;:::i;:::-;-1:-1:-1;12734:9:1;;12669:80::o;12754:217::-;12794:1;12820;12810:2;;12864:10;12859:3;12855:20;12852:1;12845:31;12899:4;12896:1;12889:15;12927:4;12924:1;12917:15;12810:2;-1:-1:-1;12956:9:1;;12800:171::o;12976:422::-;13065:1;13108:5;13065:1;13122:270;13143:7;13133:8;13130:21;13122:270;;;13202:4;13198:1;13194:6;13190:17;13184:4;13181:27;13178:2;;;13211:18;;:::i;:::-;13261:7;13251:8;13247:22;13244:2;;;13281:16;;;;13244:2;13360:22;;;;13320:15;;;;13122:270;;;13126:3;13040:358;;;;;:::o;13403:131::-;13463:5;13492:36;13519:8;13513:4;13588:5;13618:8;13608:2;;-1:-1:-1;13659:1:1;13673:5;;13608:2;13707:4;13697:2;;-1:-1:-1;13744:1:1;13758:5;;13697:2;13789:4;13807:1;13802:59;;;;13875:1;13870:130;;;;13782:218;;13802:59;13832:1;13823:10;;13846:5;;;13870:130;13907:3;13897:8;13894:17;13891:2;;;13914:18;;:::i;:::-;-1:-1:-1;;13970:1:1;13956:16;;13985:5;;13782:218;;14084:2;14074:8;14071:16;14065:3;14059:4;14056:13;14052:36;14046:2;14036:8;14033:16;14028:2;14022:4;14019:12;14015:35;14012:77;14009:2;;;-1:-1:-1;14121:19:1;;;14153:5;;14009:2;14200:34;14225:8;14219:4;14200:34;:::i;:::-;14270:6;14266:1;14262:6;14258:19;14249:7;14246:32;14243:2;;;14281:18;;:::i;:::-;14319:20;;13598:747;-1:-1:-1;;;13598:747:1:o;14350:168::-;14390:7;14456:1;14452;14448:6;14444:14;14441:1;14438:21;14433:1;14426:9;14419:17;14415:45;14412:2;;;14463:18;;:::i;:::-;-1:-1:-1;14503:9:1;;14402:116::o;14523:125::-;14563:4;14591:1;14588;14585:8;14582:2;;;14596:18;;:::i;:::-;-1:-1:-1;14633:9:1;;14572:76::o;14653:195::-;14691:4;14728;14725:1;14721:12;14760:4;14757:1;14753:12;14785:3;14780;14777:12;14774:2;;;14792:18;;:::i;:::-;14829:13;;;14700:148;-1:-1:-1;;;14700:148:1:o;14853:258::-;14925:1;14935:113;14949:6;14946:1;14943:13;14935:113;;;15025:11;;;15019:18;15006:11;;;14999:39;14971:2;14964:10;14935:113;;;15066:6;15063:1;15060:13;15057:2;;;15101:1;15092:6;15087:3;15083:16;15076:27;15057:2;;14906:205;;;:::o;15116:380::-;15195:1;15191:12;;;;15238;;;15259:2;;15313:4;15305:6;15301:17;15291:27;;15259:2;15366;15358:6;15355:14;15335:18;15332:38;15329:2;;;15412:10;15407:3;15403:20;15400:1;15393:31;15447:4;15444:1;15437:15;15475:4;15472:1;15465:15;15329:2;;15171:325;;;:::o;15501:135::-;15540:3;-1:-1:-1;;15561:17:1;;15558:2;;;15581:18;;:::i;:::-;-1:-1:-1;15628:1:1;15617:13;;15548:88::o;15641:127::-;15702:10;15697:3;15693:20;15690:1;15683:31;15733:4;15730:1;15723:15;15757:4;15754:1;15747:15;15773:127;15834:10;15829:3;15825:20;15822:1;15815:31;15865:4;15862:1;15855:15;15889:4;15886:1;15879:15;15905:127;15966:10;15961:3;15957:20;15954:1;15947:31;15997:4;15994:1;15987:15;16021:4;16018:1;16011:15;16037:131;-1:-1:-1;;;;;16112:31:1;;16102:42;;16092:2;;16158:1;16155;16148:12

Swarm Source

ipfs://6246260b165f5f16e755b584c4f4f83f85dd83787d27bb15c2b565efd3b746d7
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.