ETH Price: $2,863.29 (-2.65%)

Token

Hope Finance (HOPE)

Overview

Max Total Supply

2,652,370.875568238211740327 HOPE

Holders

192

Transfers

-
0

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

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
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
Hope

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Arbiscan.io on 2023-02-02
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;

/*
 * @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;
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
 interface IERC20 {

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

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

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

    uint256 private _totalSupply;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(sender, recipient, amount);

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    using SafeMath for uint256;

    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");

        _approve(account, _msgSender(), decreasedAllowance);
        _burn(account, amount);
    }
}

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

/**
 * @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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

contract Operator is Context, Ownable {
    address private _operator;

    event OperatorTransferred(address indexed previousOperator, address indexed newOperator);

    constructor() {
        _operator = _msgSender();
        emit OperatorTransferred(address(0), _operator);
    }

    function operator() public view returns (address) {
        return _operator;
    }

    modifier onlyOperator() {
        require(_operator == msg.sender, "operator: caller is not the operator");
        _;
    }

    function isOperator() public view returns (bool) {
        return _msgSender() == _operator;
    }

    function transferOperator(address newOperator_) public onlyOwner {
        _transferOperator(newOperator_);
    }

    function _transferOperator(address newOperator_) internal {
        require(newOperator_ != address(0), "operator: zero address given for new operator");
        emit OperatorTransferred(address(0), newOperator_);
        _operator = newOperator_;
    }
}

interface IOracle {

    function update() external;
    function consult(address _token, uint256 _amountIn) external view returns (uint144 amountOut);
    function twap(address _token, uint256 _amountIn) external view returns (uint144 _amountOut);
}

contract Hope is ERC20Burnable, Operator {
    using SafeMath for uint256;

    // Initial distribution for the first 48h genesis pools
    uint256 public constant INITIAL_GENESIS_POOL_DISTRIBUTION = 30000 ether;

    // Have the rewards been distributed to the pools
    bool public rewardPoolDistributed = false;
    /* ================= Taxation =============== */
    // Address of the Oracle
    address public hopeOracle;
    // Address of the Tax Office
    address public taxOffice;

    // Current tax rate
    uint256 public taxRate;
    // Price threshold below which taxes will get burned
    uint256 public burnThreshold = 1.10e18;
    // Address of the tax collector wallet
    address public taxCollectorAddress;

    // Should the taxes be calculated using the tax tiers
    bool public autoCalculateTax;

    // Tax Tiers
    uint256[] public taxTiersTwaps = [0, 5e17, 6e17, 7e17, 8e17, 9e17, 9.5e17, 1e18, 1.05e18, 1.10e18, 1.20e18, 1.30e18, 1.40e18, 1.50e18];
    uint256[] public taxTiersRates = [2000, 1900, 1800, 1700, 1600, 1500, 1500, 1500, 1500, 1400, 900, 400, 200, 100];

    // Sender addresses excluded from Tax
    mapping(address => bool) public excludedAddresses;

    event TaxOfficeTransferred(address oldAddress, address newAddress);

    modifier onlyTaxOffice() {
        require(taxOffice == msg.sender, "Caller is not the tax office");
        _;
    }

    modifier onlyOperatorOrTaxOffice() {
        require(isOperator() || taxOffice == msg.sender, "Caller is not the operator or the tax office");
        _;
    }

    /**
     * @notice Constructs the HOPE ERC-20 contract.
     */
    constructor(uint256 _taxRate) ERC20("Hope Finance", "HOPE") {
        // Mints 1 HOPE to contract creator for initial pool setup
        require(_taxRate < 5000, "tax equal or bigger to 50%");

        excludeAddress(address(this));

        _mint(msg.sender, 1 ether);
        taxRate = _taxRate;
        taxCollectorAddress = msg.sender;
    }

    /* ============= Taxation ============= */

    function getTaxTiersTwapsCount() public view returns (uint256 count) {
        return taxTiersTwaps.length;
    }

    function getTaxTiersRatesCount() public view returns (uint256 count) {
        return taxTiersRates.length;
    }

    function isAddressExcluded(address _address) public view returns (bool) {
        return excludedAddresses[_address];
    }

    function setTaxTiersTwap(uint256 _index, uint256 _value) public onlyTaxOffice returns (bool) {
        require(_index >= 0, "Index has to be higher than 0");
        require(_index < getTaxTiersTwapsCount(), "Index has to lower than count of tax tiers");
        if (_index > 0) {
            require(_value > taxTiersTwaps[_index - 1]);
        }
        if (_index < getTaxTiersTwapsCount().sub(1)) {
            require(_value < taxTiersTwaps[_index + 1]);
        }
        taxTiersTwaps[_index] = _value;
        return true;
    }

    function setTaxTiersRate(uint256 _index, uint256 _value) public onlyTaxOffice returns (bool) {
        require(_index >= 0, "Index has to be higher than 0");
        require(_index < getTaxTiersRatesCount(), "Index has to lower than count of tax tiers");
        taxTiersRates[_index] = _value;
        return true;
    }

    function setBurnThreshold(uint256 _burnThreshold) public onlyTaxOffice {
        burnThreshold = _burnThreshold;
    }

    function _getHopePrice() internal view returns (uint256 _hopePrice) {
        try IOracle(hopeOracle).consult(address(this), 1e18) returns (uint144 _price) {
            return uint256(_price);
        } catch {
            revert("Hope: failed to fetch HOPE price from Oracle");
        }
    }

    function _updateTaxRate(uint256 _hopePrice) internal returns (uint256) {
        if (autoCalculateTax) {
            for (uint256 tierId = getTaxTiersTwapsCount().sub(1); tierId >= 0; --tierId) {
                if (_hopePrice >= taxTiersTwaps[tierId]) {
                    require(taxTiersRates[tierId] < 5000, "tax equal or bigger to 50%");
                    taxRate = taxTiersRates[tierId];
                    return taxTiersRates[tierId];
                }
            }
        }
        return 0;
    }

    function enableAutoCalculateTax() public onlyTaxOffice {
        autoCalculateTax = true;
    }

    function disableAutoCalculateTax() public onlyTaxOffice {
        autoCalculateTax = false;
    }

    function setHopeOracle(address _hopeOracle) public onlyOperatorOrTaxOffice {
        require(_hopeOracle != address(0), "oracle address cannot be 0 address");
        hopeOracle = _hopeOracle;
    }

    function setTaxOffice(address _taxOffice) public onlyOperatorOrTaxOffice {
        require(_taxOffice != address(0), "tax office address cannot be 0 address");
        emit TaxOfficeTransferred(taxOffice, _taxOffice);
        taxOffice = _taxOffice;
    }

    function setTaxCollectorAddress(address _taxCollectorAddress) public onlyTaxOffice {
        require(_taxCollectorAddress != address(0), "tax collector address must be non-zero address");
        taxCollectorAddress = _taxCollectorAddress;
    }

    function setTaxRate(uint256 _taxRate) public onlyTaxOffice {
        require(!autoCalculateTax, "auto calculate tax cannot be enabled");
        require(_taxRate < 5000, "tax equal or bigger to 50%");
        taxRate = _taxRate;
    }

    function excludeAddress(address _address) public onlyOperatorOrTaxOffice returns (bool) {
        require(!excludedAddresses[_address], "address can't be excluded");
        excludedAddresses[_address] = true;
        return true;
    }

    function includeAddress(address _address) public onlyOperatorOrTaxOffice returns (bool) {
        require(excludedAddresses[_address], "address can't be included");
        excludedAddresses[_address] = false;
        return true;
    }

    /**
     * @notice Operator mints HOPE to a recipient
     * @param recipient_ The address of recipient
     * @param amount_ The amount of HOPE to mint to
     * @return whether the process has been done
     */
    function mint(address recipient_, uint256 amount_) public onlyOperator returns (bool) {
        uint256 balanceBefore = balanceOf(recipient_);
        _mint(recipient_, amount_);
        uint256 balanceAfter = balanceOf(recipient_);

        return balanceAfter > balanceBefore;
    }

    function burn(uint256 amount) public override {
        super.burn(amount);
    }

    function burnFrom(address account, uint256 amount) public override onlyOperator {
        super.burnFrom(account, amount);
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        uint256 currentTaxRate = 0;
        bool burnTax = false;

        if (autoCalculateTax) {
            uint256 currentHopePrice = _getHopePrice();
            currentTaxRate = _updateTaxRate(currentHopePrice);
            if (currentHopePrice < burnThreshold) {
                burnTax = true;
            }
        }

        if (currentTaxRate == 0 || excludedAddresses[sender]) {
            _transfer(sender, recipient, amount);
        } else {
            _transferWithTax(sender, recipient, amount, burnTax);
        }

        _approve(sender, _msgSender(), allowance(sender, _msgSender()).sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function _transferWithTax(
        address sender,
        address recipient,
        uint256 amount,
        bool burnTax
    ) internal returns (bool) {
        uint256 taxAmount = amount.mul(taxRate).div(10000);
        uint256 amountAfterTax = amount.sub(taxAmount);

        if (burnTax) {
            // Burn tax
            super.burnFrom(sender, taxAmount);
        } else {
            // Transfer tax to tax collector
            _transfer(sender, taxCollectorAddress, taxAmount);
        }

        // Transfer amount after tax to recipient
        _transfer(sender, recipient, amountAfterTax);

        return true;
    }

    /**
     * @notice distribute to reward pool (only once)
     */
    function distributeReward(
        address _genesisPool
    ) external onlyOperator {
        require(!rewardPoolDistributed, "only can distribute once");
        require(_genesisPool != address(0), "!_genesisPool");
        rewardPoolDistributed = true;
        _mint(_genesisPool, INITIAL_GENESIS_POOL_DISTRIBUTION);
    }

    function governanceRecoverUnsupported(
        IERC20 _token,
        uint256 _amount,
        address _to
    ) external onlyOperator {
        _token.transfer(_to, _amount);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256","name":"_taxRate","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","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":false,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"TaxOfficeTransferred","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":[],"name":"INITIAL_GENESIS_POOL_DISTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"autoCalculateTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableAutoCalculateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_genesisPool","type":"address"}],"name":"distributeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAutoCalculateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"excludeAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxTiersRatesCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxTiersTwapsCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hopeOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"includeAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isAddressExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPoolDistributed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnThreshold","type":"uint256"}],"name":"setBurnThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hopeOracle","type":"address"}],"name":"setHopeOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxCollectorAddress","type":"address"}],"name":"setTaxCollectorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxOffice","type":"address"}],"name":"setTaxOffice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxRate","type":"uint256"}],"name":"setTaxRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setTaxTiersRate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setTaxTiersTwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxCollectorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxOffice","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"taxTiersRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"taxTiersTwaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"newOperator_","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6006805460ff60a01b19169055670f43fc2c04ee0000600a819055610240604052600060809081526706f05b59d3b2000060a052670853a0d2313c000060c0526709b6e64a8ec6000060e052670b1a2bc2ec50000061010052670c7d713b49da000061012052670d2f13f7789f000061014052670de0b6b3a764000061016052670e92596fd6290000610180526101a0919091526710a741a4627800006101c05267120a871cc00200006101e05267136dcc951d8c0000610200526714d1120d7b16000061022052620000d790600c90600e620005c1565b50604080516101c0810182526107d0815261076c6020820152610708918101919091526106a4606082015261064060808201526105dc60a0820181905260c0820181905260e0820181905261010082015261057861012082015261038461014082015261019061016082015260c861018082015260646101a08201526200016390600d90600e6200061c565b503480156200017157600080fd5b5060405162002b0238038062002b02833981016040819052620001949162000677565b6040518060400160405280600c81526020016b486f70652046696e616e636560a01b81525060405180604001604052806004815260200163484f504560e01b8152508160039081620001e7919062000735565b506004620001f6828262000735565b50506005805460ff19166012179055506000620002103390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600680546001600160a01b031916339081179091556040516000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a36113888110620002fd5760405162461bcd60e51b815260206004820152601a60248201527f74617820657175616c206f722062696767657220746f2035302500000000000060448201526064015b60405180910390fd5b620003083062000338565b506200031d33670de0b6b3a764000062000456565b600955600b80546001600160a01b0319163317905562000828565b6006546000906001600160a01b03163314806200035f57506008546001600160a01b031633145b620003c25760405162461bcd60e51b815260206004820152602c60248201527f43616c6c6572206973206e6f7420746865206f70657261746f72206f7220746860448201526b6520746178206f666669636560a01b6064820152608401620002f4565b6001600160a01b0382166000908152600e602052604090205460ff16156200042d5760405162461bcd60e51b815260206004820152601960248201527f616464726573732063616e2774206265206578636c75646564000000000000006044820152606401620002f4565b506001600160a01b03166000908152600e60205260409020805460ff1916600190811790915590565b6001600160a01b038216620004ae5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620002f4565b620004ca816002546200055760201b620013c81790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620004fd918390620013c862000557821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b60008062000566838562000801565b905083811015620005ba5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620002f4565b9392505050565b8280548282559060005260206000209081019282156200060a579160200282015b828111156200060a57825182906001600160401b0316905591602001919060010190620005e2565b506200061892915062000660565b5090565b8280548282559060005260206000209081019282156200060a579160200282015b828111156200060a578251829061ffff169055916020019190600101906200063d565b5b8082111562000618576000815560010162000661565b6000602082840312156200068a57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620006bc57607f821691505b602082108103620006dd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200055257600081815260208120601f850160051c810160208610156200070c5750805b601f850160051c820191505b818110156200072d5782815560010162000718565b505050505050565b81516001600160401b0381111562000751576200075162000691565b6200076981620007628454620006a7565b84620006e3565b602080601f831160018114620007a15760008415620007885750858301515b600019600386901b1c1916600185901b1785556200072d565b600085815260208120601f198616915b82811015620007d257888601518255948401946001909101908401620007b1565b5085821015620007f15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082198211156200082357634e487b7160e01b600052601160045260246000fd5b500190565b6122ca80620008386000396000f3fe608060405234801561001057600080fd5b50600436106102955760003560e01c806370a0823111610167578063a6431bba116100ce578063cf011b2611610087578063cf011b26146105b2578063dd62ed3e146105d5578063ebca1bd91461060e578063ee2a95351461063a578063f2fde38b14610642578063ff87fc7c1461065557600080fd5b8063a6431bba1461054b578063a9059cbb14610553578063bfcd844b14610566578063c3bdf61314610579578063c6d69a301461058c578063cc76e8851461059f57600080fd5b80638da5cb5b116101205780638da5cb5b146104e057806393995d4b146104f657806395d89b41146105095780639662676c146105115780639d6b5f2114610525578063a457c2d71461053857600080fd5b806370a082311461046c578063715018a61461049557806371a0fc6b1461049d578063771a3a1d146104b057806379cc6790146104b95780638d3cc818146104cc57600080fd5b80633f07d76a1161020b5780634f6d38d0116101c45780634f6d38d01461041157806354575af41461041a578063570ca7351461042d5780635c29908d1461043e57806365bbacd91461045157806369356d471461045957600080fd5b80633f07d76a146103a157806340c10f19146103b457806342966c68146103c757806342c6b4f1146103da5780634456eda2146103ed5780634e20a02c1461040057600080fd5b806329605e771161025d57806329605e77146103155780632bda8f9f14610328578063313ce5671461033b5780633758e6ce1461035057806339509351146103635780633e5f13d41461037657600080fd5b806306fdde031461029a578063092193ab146102b8578063095ea7b3146102cd57806318160ddd146102f057806323b872dd14610302575b600080fd5b6102a261065d565b6040516102af9190611db3565b60405180910390f35b6102cb6102c6366004611e1d565b6106ef565b005b6102e06102db366004611e3a565b6107ec565b60405190151581526020016102af565b6002545b6040519081526020016102af565b6102e0610310366004611e66565b610803565b6102cb610323366004611e1d565b6108d0565b6102e0610336366004611ea7565b610909565b60055460405160ff90911681526020016102af565b6102e061035e366004611e1d565b610a07565b6102e0610371366004611e3a565b610adb565b600854610389906001600160a01b031681565b6040516001600160a01b0390911681526020016102af565b6102cb6103af366004611e1d565b610b11565b6102e06103c2366004611e3a565b610c1e565b6102cb6103d5366004611ec9565b610c93565b6102f46103e8366004611ec9565b610c9c565b6006546001600160a01b031633146102e0565b6102f469065a4da25d3016c0000081565b6102f4600a5481565b6102cb610428366004611ee2565b610cbd565b6006546001600160a01b0316610389565b6102f461044c366004611ec9565b610d60565b6102cb610d70565b6102cb610467366004611e1d565b610da9565b6102f461047a366004611e1d565b6001600160a01b031660009081526020819052604090205490565b6102cb610e62565b6102e06104ab366004611ea7565b610ee2565b6102f460095481565b6102cb6104c7366004611e3a565b610f44565b600b546102e090600160a01b900460ff1681565b60055461010090046001600160a01b0316610389565b6102e0610504366004611e1d565b610f7c565b6102a261104b565b6006546102e090600160a01b900460ff1681565b6102cb610533366004611ec9565b61105a565b6102e0610546366004611e3a565b611089565b600c546102f4565b6102e0610561366004611e3a565b6110d8565b600754610389906001600160a01b031681565b600b54610389906001600160a01b031681565b6102cb61059a366004611ec9565b6110e5565b6102cb6105ad366004611e1d565b6111cb565b6102e06105c0366004611e1d565b600e6020526000908152604090205460ff1681565b6102f46105e3366004611f24565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102e061061c366004611e1d565b6001600160a01b03166000908152600e602052604090205460ff1690565b600d546102f4565b6102cb610650366004611e1d565b61128d565b6102cb611389565b60606003805461066c90611f5d565b80601f016020809104026020016040519081016040528092919081815260200182805461069890611f5d565b80156106e55780601f106106ba576101008083540402835291602001916106e5565b820191906000526020600020905b8154815290600101906020018083116106c857829003601f168201915b5050505050905090565b6006546001600160a01b031633146107225760405162461bcd60e51b815260040161071990611f97565b60405180910390fd5b600654600160a01b900460ff161561077c5760405162461bcd60e51b815260206004820152601860248201527f6f6e6c792063616e2064697374726962757465206f6e636500000000000000006044820152606401610719565b6001600160a01b0381166107c25760405162461bcd60e51b815260206004820152600d60248201526c0857d9d95b995cda5cd41bdbdb609a1b6044820152606401610719565b6006805460ff60a01b1916600160a01b1790556107e98169065a4da25d3016c0000061142e565b50565b60006107f933848461150d565b5060015b92915050565b600b5460009081908190600160a01b900460ff1615610844576000610826611632565b905061083181611714565b9250600a5481101561084257600191505b505b81158061086957506001600160a01b0386166000908152600e602052604090205460ff165b1561087e57610879868686611830565b61088c565b61088a868686846119b3565b505b6108c486336108bf87604051806060016040528060288152602001612224602891396108b88c336105e3565b9190611a2c565b61150d565b50600195945050505050565b6005546001600160a01b036101009091041633146109005760405162461bcd60e51b815260040161071990611fdb565b6107e981611a63565b6008546000906001600160a01b031633146109365760405162461bcd60e51b815260040161071990612010565b600c5483106109575760405162461bcd60e51b815260040161071990612047565b821561099057600c61096a6001856120a7565b8154811061097a5761097a6120be565b9060005260206000200154821161099057600080fd5b6109a4600161099e600c5490565b90611b27565b8310156109de57600c6109b88460016120d4565b815481106109c8576109c86120be565b906000526020600020015482106109de57600080fd5b81600c84815481106109f2576109f26120be565b60009182526020909120015550600192915050565b6006546000906001600160a01b0316331480610a2d57506008546001600160a01b031633145b610a495760405162461bcd60e51b8152600401610719906120ec565b6001600160a01b0382166000908152600e602052604090205460ff1615610ab25760405162461bcd60e51b815260206004820152601960248201527f616464726573732063616e2774206265206578636c75646564000000000000006044820152606401610719565b506001600160a01b03166000908152600e60205260409020805460ff1916600190811790915590565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107f99185906108bf90866113c8565b6006546001600160a01b0316331480610b3457506008546001600160a01b031633145b610b505760405162461bcd60e51b8152600401610719906120ec565b6001600160a01b038116610bb55760405162461bcd60e51b815260206004820152602660248201527f746178206f666669636520616464726573732063616e6e6f742062652030206160448201526564647265737360d01b6064820152608401610719565b600854604080516001600160a01b03928316815291831660208301527f75237613d1cfb394eb7979839ecbeacaca4592ef0cf96791979625803948a601910160405180910390a1600880546001600160a01b0319166001600160a01b0392909216919091179055565b6006546000906001600160a01b03163314610c4b5760405162461bcd60e51b815260040161071990611f97565b6001600160a01b038316600090815260208190526040902054610c6e848461142e565b6001600160a01b03841660009081526020819052604081205491909111949350505050565b6107e981611b83565b600c8181548110610cac57600080fd5b600091825260209091200154905081565b6006546001600160a01b03163314610ce75760405162461bcd60e51b815260040161071990611f97565b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284169063a9059cbb906044016020604051808303816000875af1158015610d36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5a9190612138565b50505050565b600d8181548110610cac57600080fd5b6008546001600160a01b03163314610d9a5760405162461bcd60e51b815260040161071990612010565b600b805460ff60a01b19169055565b6008546001600160a01b03163314610dd35760405162461bcd60e51b815260040161071990612010565b6001600160a01b038116610e405760405162461bcd60e51b815260206004820152602e60248201527f74617820636f6c6c6563746f722061646472657373206d757374206265206e6f60448201526d6e2d7a65726f206164647265737360901b6064820152608401610719565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03610100909104163314610e925760405162461bcd60e51b815260040161071990611fdb565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6008546000906001600160a01b03163314610f0f5760405162461bcd60e51b815260040161071990612010565b600d548310610f305760405162461bcd60e51b815260040161071990612047565b81600d84815481106109f2576109f26120be565b6006546001600160a01b03163314610f6e5760405162461bcd60e51b815260040161071990611f97565b610f788282611b8d565b5050565b6006546000906001600160a01b0316331480610fa257506008546001600160a01b031633145b610fbe5760405162461bcd60e51b8152600401610719906120ec565b6001600160a01b0382166000908152600e602052604090205460ff166110265760405162461bcd60e51b815260206004820152601960248201527f616464726573732063616e277420626520696e636c75646564000000000000006044820152606401610719565b506001600160a01b03166000908152600e60205260409020805460ff19169055600190565b60606004805461066c90611f5d565b6008546001600160a01b031633146110845760405162461bcd60e51b815260040161071990612010565b600a55565b60006107f933846108bf85604051806060016040528060258152602001612270602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611a2c565b60006107f9338484611830565b6008546001600160a01b0316331461110f5760405162461bcd60e51b815260040161071990612010565b600b54600160a01b900460ff16156111755760405162461bcd60e51b8152602060048201526024808201527f6175746f2063616c63756c617465207461782063616e6e6f7420626520656e61604482015263189b195960e21b6064820152608401610719565b61138881106111c65760405162461bcd60e51b815260206004820152601a60248201527f74617820657175616c206f722062696767657220746f203530250000000000006044820152606401610719565b600955565b6006546001600160a01b03163314806111ee57506008546001600160a01b031633145b61120a5760405162461bcd60e51b8152600401610719906120ec565b6001600160a01b03811661126b5760405162461bcd60e51b815260206004820152602260248201527f6f7261636c6520616464726573732063616e6e6f742062652030206164647265604482015261737360f01b6064820152608401610719565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146112bd5760405162461bcd60e51b815260040161071990611fdb565b6001600160a01b0381166113225760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610719565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6008546001600160a01b031633146113b35760405162461bcd60e51b815260040161071990612010565b600b805460ff60a01b1916600160a01b179055565b6000806113d583856120d4565b9050838110156114275760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610719565b9392505050565b6001600160a01b0382166114845760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610719565b60025461149190826113c8565b6002556001600160a01b0382166000908152602081905260409020546114b790826113c8565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b03831661156f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610719565b6001600160a01b0382166115d05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610719565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600754604051633ddac95360e01b8152306004820152670de0b6b3a764000060248201526000916001600160a01b031690633ddac95390604401602060405180830381865afa9250505080156116a5575060408051601f3d908101601f191682019092526116a29181019061215a565b60015b6117065760405162461bcd60e51b815260206004820152602c60248201527f486f70653a206661696c656420746f20666574636820484f504520707269636560448201526b2066726f6d204f7261636c6560a01b6064820152608401610719565b6001600160901b0316919050565b600b54600090600160a01b900460ff1615611828576000611739600161099e600c5490565b90505b600c818154811061174f5761174f6120be565b9060005260206000200154831061181857611388600d8281548110611776576117766120be565b9060005260206000200154106117ce5760405162461bcd60e51b815260206004820152601a60248201527f74617820657175616c206f722062696767657220746f203530250000000000006044820152606401610719565b600d81815481106117e1576117e16120be565b9060005260206000200154600981905550600d8181548110611805576118056120be565b9060005260206000200154915050919050565b61182181612183565b905061173c565b506000919050565b6001600160a01b0383166118945760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610719565b6001600160a01b0382166118f65760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610719565b611933816040518060600160405280602681526020016121fe602691396001600160a01b0386166000908152602081905260409020549190611a2c565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461196290826113c8565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611625565b6000806119d76127106119d160095487611bd290919063ffffffff16565b90611c54565b905060006119e58583611b27565b905083156119fc576119f78783611b8d565b611a14565b600b54611a149088906001600160a01b031684611830565b611a1f878783611830565b5060019695505050505050565b60008184841115611a505760405162461bcd60e51b81526004016107199190611db3565b50611a5b83856120a7565b949350505050565b6001600160a01b038116611acf5760405162461bcd60e51b815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201526c103732bb9037b832b930ba37b960991b6064820152608401610719565b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600082821115611b795760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610719565b61142782846120a7565b6107e93382611caf565b6000611bb68260405180606001604052806024815260200161224c602491396108b886336105e3565b9050611bc383338361150d565b611bcd8383611caf565b505050565b600082600003611be4575060006107fd565b6000611bf0838561219a565b905082611bfd85836121b9565b146114275760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610719565b6000808211611ca55760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610719565b61142782846121b9565b6001600160a01b038216611d0f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610719565b611d4c816040518060600160405280602281526020016121dc602291396001600160a01b0385166000908152602081905260409020549190611a2c565b6001600160a01b038316600090815260208190526040902055600254611d729082611b27565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611501565b600060208083528351808285015260005b81811015611de057858101830151858201604001528201611dc4565b81811115611df2576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146107e957600080fd5b600060208284031215611e2f57600080fd5b813561142781611e08565b60008060408385031215611e4d57600080fd5b8235611e5881611e08565b946020939093013593505050565b600080600060608486031215611e7b57600080fd5b8335611e8681611e08565b92506020840135611e9681611e08565b929592945050506040919091013590565b60008060408385031215611eba57600080fd5b50508035926020909101359150565b600060208284031215611edb57600080fd5b5035919050565b600080600060608486031215611ef757600080fd5b8335611f0281611e08565b9250602084013591506040840135611f1981611e08565b809150509250925092565b60008060408385031215611f3757600080fd5b8235611f4281611e08565b91506020830135611f5281611e08565b809150509250929050565b600181811c90821680611f7157607f821691505b602082108103611f9157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601c908201527f43616c6c6572206973206e6f742074686520746178206f666669636500000000604082015260600190565b6020808252602a908201527f496e6465782068617320746f206c6f776572207468616e20636f756e74206f666040820152692074617820746965727360b01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000828210156120b9576120b9612091565b500390565b634e487b7160e01b600052603260045260246000fd5b600082198211156120e7576120e7612091565b500190565b6020808252602c908201527f43616c6c6572206973206e6f7420746865206f70657261746f72206f7220746860408201526b6520746178206f666669636560a01b606082015260800190565b60006020828403121561214a57600080fd5b8151801515811461142757600080fd5b60006020828403121561216c57600080fd5b81516001600160901b038116811461142757600080fd5b60008161219257612192612091565b506000190190565b60008160001904831182151516156121b4576121b4612091565b500290565b6000826121d657634e487b7160e01b600052601260045260246000fd5b50049056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b6406ed44744c9e770a8b2a2267133896d446de7b013f97bf87628501605f98264736f6c634300080f00330000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102955760003560e01c806370a0823111610167578063a6431bba116100ce578063cf011b2611610087578063cf011b26146105b2578063dd62ed3e146105d5578063ebca1bd91461060e578063ee2a95351461063a578063f2fde38b14610642578063ff87fc7c1461065557600080fd5b8063a6431bba1461054b578063a9059cbb14610553578063bfcd844b14610566578063c3bdf61314610579578063c6d69a301461058c578063cc76e8851461059f57600080fd5b80638da5cb5b116101205780638da5cb5b146104e057806393995d4b146104f657806395d89b41146105095780639662676c146105115780639d6b5f2114610525578063a457c2d71461053857600080fd5b806370a082311461046c578063715018a61461049557806371a0fc6b1461049d578063771a3a1d146104b057806379cc6790146104b95780638d3cc818146104cc57600080fd5b80633f07d76a1161020b5780634f6d38d0116101c45780634f6d38d01461041157806354575af41461041a578063570ca7351461042d5780635c29908d1461043e57806365bbacd91461045157806369356d471461045957600080fd5b80633f07d76a146103a157806340c10f19146103b457806342966c68146103c757806342c6b4f1146103da5780634456eda2146103ed5780634e20a02c1461040057600080fd5b806329605e771161025d57806329605e77146103155780632bda8f9f14610328578063313ce5671461033b5780633758e6ce1461035057806339509351146103635780633e5f13d41461037657600080fd5b806306fdde031461029a578063092193ab146102b8578063095ea7b3146102cd57806318160ddd146102f057806323b872dd14610302575b600080fd5b6102a261065d565b6040516102af9190611db3565b60405180910390f35b6102cb6102c6366004611e1d565b6106ef565b005b6102e06102db366004611e3a565b6107ec565b60405190151581526020016102af565b6002545b6040519081526020016102af565b6102e0610310366004611e66565b610803565b6102cb610323366004611e1d565b6108d0565b6102e0610336366004611ea7565b610909565b60055460405160ff90911681526020016102af565b6102e061035e366004611e1d565b610a07565b6102e0610371366004611e3a565b610adb565b600854610389906001600160a01b031681565b6040516001600160a01b0390911681526020016102af565b6102cb6103af366004611e1d565b610b11565b6102e06103c2366004611e3a565b610c1e565b6102cb6103d5366004611ec9565b610c93565b6102f46103e8366004611ec9565b610c9c565b6006546001600160a01b031633146102e0565b6102f469065a4da25d3016c0000081565b6102f4600a5481565b6102cb610428366004611ee2565b610cbd565b6006546001600160a01b0316610389565b6102f461044c366004611ec9565b610d60565b6102cb610d70565b6102cb610467366004611e1d565b610da9565b6102f461047a366004611e1d565b6001600160a01b031660009081526020819052604090205490565b6102cb610e62565b6102e06104ab366004611ea7565b610ee2565b6102f460095481565b6102cb6104c7366004611e3a565b610f44565b600b546102e090600160a01b900460ff1681565b60055461010090046001600160a01b0316610389565b6102e0610504366004611e1d565b610f7c565b6102a261104b565b6006546102e090600160a01b900460ff1681565b6102cb610533366004611ec9565b61105a565b6102e0610546366004611e3a565b611089565b600c546102f4565b6102e0610561366004611e3a565b6110d8565b600754610389906001600160a01b031681565b600b54610389906001600160a01b031681565b6102cb61059a366004611ec9565b6110e5565b6102cb6105ad366004611e1d565b6111cb565b6102e06105c0366004611e1d565b600e6020526000908152604090205460ff1681565b6102f46105e3366004611f24565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102e061061c366004611e1d565b6001600160a01b03166000908152600e602052604090205460ff1690565b600d546102f4565b6102cb610650366004611e1d565b61128d565b6102cb611389565b60606003805461066c90611f5d565b80601f016020809104026020016040519081016040528092919081815260200182805461069890611f5d565b80156106e55780601f106106ba576101008083540402835291602001916106e5565b820191906000526020600020905b8154815290600101906020018083116106c857829003601f168201915b5050505050905090565b6006546001600160a01b031633146107225760405162461bcd60e51b815260040161071990611f97565b60405180910390fd5b600654600160a01b900460ff161561077c5760405162461bcd60e51b815260206004820152601860248201527f6f6e6c792063616e2064697374726962757465206f6e636500000000000000006044820152606401610719565b6001600160a01b0381166107c25760405162461bcd60e51b815260206004820152600d60248201526c0857d9d95b995cda5cd41bdbdb609a1b6044820152606401610719565b6006805460ff60a01b1916600160a01b1790556107e98169065a4da25d3016c0000061142e565b50565b60006107f933848461150d565b5060015b92915050565b600b5460009081908190600160a01b900460ff1615610844576000610826611632565b905061083181611714565b9250600a5481101561084257600191505b505b81158061086957506001600160a01b0386166000908152600e602052604090205460ff165b1561087e57610879868686611830565b61088c565b61088a868686846119b3565b505b6108c486336108bf87604051806060016040528060288152602001612224602891396108b88c336105e3565b9190611a2c565b61150d565b50600195945050505050565b6005546001600160a01b036101009091041633146109005760405162461bcd60e51b815260040161071990611fdb565b6107e981611a63565b6008546000906001600160a01b031633146109365760405162461bcd60e51b815260040161071990612010565b600c5483106109575760405162461bcd60e51b815260040161071990612047565b821561099057600c61096a6001856120a7565b8154811061097a5761097a6120be565b9060005260206000200154821161099057600080fd5b6109a4600161099e600c5490565b90611b27565b8310156109de57600c6109b88460016120d4565b815481106109c8576109c86120be565b906000526020600020015482106109de57600080fd5b81600c84815481106109f2576109f26120be565b60009182526020909120015550600192915050565b6006546000906001600160a01b0316331480610a2d57506008546001600160a01b031633145b610a495760405162461bcd60e51b8152600401610719906120ec565b6001600160a01b0382166000908152600e602052604090205460ff1615610ab25760405162461bcd60e51b815260206004820152601960248201527f616464726573732063616e2774206265206578636c75646564000000000000006044820152606401610719565b506001600160a01b03166000908152600e60205260409020805460ff1916600190811790915590565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107f99185906108bf90866113c8565b6006546001600160a01b0316331480610b3457506008546001600160a01b031633145b610b505760405162461bcd60e51b8152600401610719906120ec565b6001600160a01b038116610bb55760405162461bcd60e51b815260206004820152602660248201527f746178206f666669636520616464726573732063616e6e6f742062652030206160448201526564647265737360d01b6064820152608401610719565b600854604080516001600160a01b03928316815291831660208301527f75237613d1cfb394eb7979839ecbeacaca4592ef0cf96791979625803948a601910160405180910390a1600880546001600160a01b0319166001600160a01b0392909216919091179055565b6006546000906001600160a01b03163314610c4b5760405162461bcd60e51b815260040161071990611f97565b6001600160a01b038316600090815260208190526040902054610c6e848461142e565b6001600160a01b03841660009081526020819052604081205491909111949350505050565b6107e981611b83565b600c8181548110610cac57600080fd5b600091825260209091200154905081565b6006546001600160a01b03163314610ce75760405162461bcd60e51b815260040161071990611f97565b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284169063a9059cbb906044016020604051808303816000875af1158015610d36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5a9190612138565b50505050565b600d8181548110610cac57600080fd5b6008546001600160a01b03163314610d9a5760405162461bcd60e51b815260040161071990612010565b600b805460ff60a01b19169055565b6008546001600160a01b03163314610dd35760405162461bcd60e51b815260040161071990612010565b6001600160a01b038116610e405760405162461bcd60e51b815260206004820152602e60248201527f74617820636f6c6c6563746f722061646472657373206d757374206265206e6f60448201526d6e2d7a65726f206164647265737360901b6064820152608401610719565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03610100909104163314610e925760405162461bcd60e51b815260040161071990611fdb565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6008546000906001600160a01b03163314610f0f5760405162461bcd60e51b815260040161071990612010565b600d548310610f305760405162461bcd60e51b815260040161071990612047565b81600d84815481106109f2576109f26120be565b6006546001600160a01b03163314610f6e5760405162461bcd60e51b815260040161071990611f97565b610f788282611b8d565b5050565b6006546000906001600160a01b0316331480610fa257506008546001600160a01b031633145b610fbe5760405162461bcd60e51b8152600401610719906120ec565b6001600160a01b0382166000908152600e602052604090205460ff166110265760405162461bcd60e51b815260206004820152601960248201527f616464726573732063616e277420626520696e636c75646564000000000000006044820152606401610719565b506001600160a01b03166000908152600e60205260409020805460ff19169055600190565b60606004805461066c90611f5d565b6008546001600160a01b031633146110845760405162461bcd60e51b815260040161071990612010565b600a55565b60006107f933846108bf85604051806060016040528060258152602001612270602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611a2c565b60006107f9338484611830565b6008546001600160a01b0316331461110f5760405162461bcd60e51b815260040161071990612010565b600b54600160a01b900460ff16156111755760405162461bcd60e51b8152602060048201526024808201527f6175746f2063616c63756c617465207461782063616e6e6f7420626520656e61604482015263189b195960e21b6064820152608401610719565b61138881106111c65760405162461bcd60e51b815260206004820152601a60248201527f74617820657175616c206f722062696767657220746f203530250000000000006044820152606401610719565b600955565b6006546001600160a01b03163314806111ee57506008546001600160a01b031633145b61120a5760405162461bcd60e51b8152600401610719906120ec565b6001600160a01b03811661126b5760405162461bcd60e51b815260206004820152602260248201527f6f7261636c6520616464726573732063616e6e6f742062652030206164647265604482015261737360f01b6064820152608401610719565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146112bd5760405162461bcd60e51b815260040161071990611fdb565b6001600160a01b0381166113225760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610719565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6008546001600160a01b031633146113b35760405162461bcd60e51b815260040161071990612010565b600b805460ff60a01b1916600160a01b179055565b6000806113d583856120d4565b9050838110156114275760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610719565b9392505050565b6001600160a01b0382166114845760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610719565b60025461149190826113c8565b6002556001600160a01b0382166000908152602081905260409020546114b790826113c8565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b03831661156f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610719565b6001600160a01b0382166115d05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610719565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600754604051633ddac95360e01b8152306004820152670de0b6b3a764000060248201526000916001600160a01b031690633ddac95390604401602060405180830381865afa9250505080156116a5575060408051601f3d908101601f191682019092526116a29181019061215a565b60015b6117065760405162461bcd60e51b815260206004820152602c60248201527f486f70653a206661696c656420746f20666574636820484f504520707269636560448201526b2066726f6d204f7261636c6560a01b6064820152608401610719565b6001600160901b0316919050565b600b54600090600160a01b900460ff1615611828576000611739600161099e600c5490565b90505b600c818154811061174f5761174f6120be565b9060005260206000200154831061181857611388600d8281548110611776576117766120be565b9060005260206000200154106117ce5760405162461bcd60e51b815260206004820152601a60248201527f74617820657175616c206f722062696767657220746f203530250000000000006044820152606401610719565b600d81815481106117e1576117e16120be565b9060005260206000200154600981905550600d8181548110611805576118056120be565b9060005260206000200154915050919050565b61182181612183565b905061173c565b506000919050565b6001600160a01b0383166118945760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610719565b6001600160a01b0382166118f65760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610719565b611933816040518060600160405280602681526020016121fe602691396001600160a01b0386166000908152602081905260409020549190611a2c565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461196290826113c8565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611625565b6000806119d76127106119d160095487611bd290919063ffffffff16565b90611c54565b905060006119e58583611b27565b905083156119fc576119f78783611b8d565b611a14565b600b54611a149088906001600160a01b031684611830565b611a1f878783611830565b5060019695505050505050565b60008184841115611a505760405162461bcd60e51b81526004016107199190611db3565b50611a5b83856120a7565b949350505050565b6001600160a01b038116611acf5760405162461bcd60e51b815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201526c103732bb9037b832b930ba37b960991b6064820152608401610719565b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600082821115611b795760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610719565b61142782846120a7565b6107e93382611caf565b6000611bb68260405180606001604052806024815260200161224c602491396108b886336105e3565b9050611bc383338361150d565b611bcd8383611caf565b505050565b600082600003611be4575060006107fd565b6000611bf0838561219a565b905082611bfd85836121b9565b146114275760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610719565b6000808211611ca55760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610719565b61142782846121b9565b6001600160a01b038216611d0f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610719565b611d4c816040518060600160405280602281526020016121dc602291396001600160a01b0385166000908152602081905260409020549190611a2c565b6001600160a01b038316600090815260208190526040902055600254611d729082611b27565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611501565b600060208083528351808285015260005b81811015611de057858101830151858201604001528201611dc4565b81811115611df2576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146107e957600080fd5b600060208284031215611e2f57600080fd5b813561142781611e08565b60008060408385031215611e4d57600080fd5b8235611e5881611e08565b946020939093013593505050565b600080600060608486031215611e7b57600080fd5b8335611e8681611e08565b92506020840135611e9681611e08565b929592945050506040919091013590565b60008060408385031215611eba57600080fd5b50508035926020909101359150565b600060208284031215611edb57600080fd5b5035919050565b600080600060608486031215611ef757600080fd5b8335611f0281611e08565b9250602084013591506040840135611f1981611e08565b809150509250925092565b60008060408385031215611f3757600080fd5b8235611f4281611e08565b91506020830135611f5281611e08565b809150509250929050565b600181811c90821680611f7157607f821691505b602082108103611f9157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601c908201527f43616c6c6572206973206e6f742074686520746178206f666669636500000000604082015260600190565b6020808252602a908201527f496e6465782068617320746f206c6f776572207468616e20636f756e74206f666040820152692074617820746965727360b01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000828210156120b9576120b9612091565b500390565b634e487b7160e01b600052603260045260246000fd5b600082198211156120e7576120e7612091565b500190565b6020808252602c908201527f43616c6c6572206973206e6f7420746865206f70657261746f72206f7220746860408201526b6520746178206f666669636560a01b606082015260800190565b60006020828403121561214a57600080fd5b8151801515811461142757600080fd5b60006020828403121561216c57600080fd5b81516001600160901b038116811461142757600080fd5b60008161219257612192612091565b506000190190565b60008160001904831182151516156121b4576121b4612091565b500290565b6000826121d657634e487b7160e01b600052601260045260246000fd5b50049056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b6406ed44744c9e770a8b2a2267133896d446de7b013f97bf87628501605f98264736f6c634300080f0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _taxRate (uint256): 0

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

25414:8881:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11149:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33766:331;;;;;;:::i;:::-;;:::i;:::-;;13295:169;;;;;;:::i;:::-;;:::i;:::-;;;1489:14:1;;1482:22;1464:41;;1452:2;1437:18;13295:169:0;1324:187:1;12248:108:0;12336:12;;12248:108;;;1662:25:1;;;1650:2;1635:18;12248:108:0;1516:177:1;32174:850:0;;;;;;:::i;:::-;;:::i;24768:115::-;;;;;;:::i;:::-;;:::i;27881:547::-;;;;;;:::i;:::-;;:::i;12092:91::-;12166:9;;12092:91;;12166:9;;;;2554:36:1;;2542:2;2527:18;12092:91:0;2412:184:1;30928:240:0;;;;;;:::i;:::-;;:::i;14676:218::-;;;;;;:::i;:::-;;:::i;25891:24::-;;;;;-1:-1:-1;;;;;25891:24:0;;;;;;-1:-1:-1;;;;;2765:32:1;;;2747:51;;2735:2;2720:18;25891:24:0;2601:203:1;30159:259:0;;;;;;:::i;:::-;;:::i;31647:290::-;;;;;;:::i;:::-;;:::i;31945:83::-;;;;;;:::i;:::-;;:::i;26282:134::-;;;;;;:::i;:::-;;:::i;24660:100::-;24743:9;;-1:-1:-1;;;;;24743:9:0;699:10;24727:25;24660:100;;25558:71;;25618:11;25558:71;;26036:38;;;;;;34105:187;;;;;;:::i;:::-;;:::i;24432:85::-;24500:9;;-1:-1:-1;;;;;24500:9:0;24432:85;;26423:113;;;;;;:::i;:::-;;:::i;29843:99::-;;;:::i;30426:248::-;;;;;;:::i;:::-;;:::i;12419:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;12520:18:0;12493:7;12520:18;;;;;;;;;;;;12419:127;23579:148;;;:::i;28436:326::-;;;;;;:::i;:::-;;:::i;25949:22::-;;;;;;32036:130;;;;;;:::i;:::-;;:::i;26227:28::-;;;;;-1:-1:-1;;;26227:28:0;;;;;;22928:87;23001:6;;;;;-1:-1:-1;;;;;23001:6:0;22928:87;;31176:240;;;;;;:::i;:::-;;:::i;11359:95::-;;;:::i;25693:41::-;;;;;-1:-1:-1;;;25693:41:0;;;;;;28770:120;;;;;;:::i;:::-;;:::i;15397:269::-;;;;;;:::i;:::-;;:::i;27502:115::-;27589:13;:20;27502:115;;12759:175;;;;;;:::i;:::-;;:::i;25825:25::-;;;;;-1:-1:-1;;;;;25825:25:0;;;26125:34;;;;;-1:-1:-1;;;;;26125:34:0;;;30682:238;;;;;;:::i;:::-;;:::i;29950:201::-;;;;;;:::i;:::-;;:::i;26588:49::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;12997:151;;;;;;:::i;:::-;-1:-1:-1;;;;;13113:18:0;;;13086:7;13113:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;12997:151;27748:125;;;;;;:::i;:::-;-1:-1:-1;;;;;27838:27:0;27814:4;27838:27;;;:17;:27;;;;;;;;;27748:125;27625:115;27712:13;:20;27625:115;;23882:244;;;;;;:::i;:::-;;:::i;29738:97::-;;;:::i;11149:91::-;11194:13;11227:5;11220:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11149:91;:::o;33766:331::-;24568:9;;-1:-1:-1;;;;;24568:9:0;24581:10;24568:23;24560:72;;;;-1:-1:-1;;;24560:72:0;;;;;;;:::i;:::-;;;;;;;;;33872:21:::1;::::0;-1:-1:-1;;;33872:21:0;::::1;;;33871:22;33863:59;;;::::0;-1:-1:-1;;;33863:59:0;;4853:2:1;33863:59:0::1;::::0;::::1;4835:21:1::0;4892:2;4872:18;;;4865:30;4931:26;4911:18;;;4904:54;4975:18;;33863:59:0::1;4651:348:1::0;33863:59:0::1;-1:-1:-1::0;;;;;33941:26:0;::::1;33933:52;;;::::0;-1:-1:-1;;;33933:52:0;;5206:2:1;33933:52:0::1;::::0;::::1;5188:21:1::0;5245:2;5225:18;;;5218:30;-1:-1:-1;;;5264:18:1;;;5257:43;5317:18;;33933:52:0::1;5004:337:1::0;33933:52:0::1;33996:21;:28:::0;;-1:-1:-1;;;;33996:28:0::1;-1:-1:-1::0;;;33996:28:0::1;::::0;;34035:54:::1;34041:12:::0;25618:11:::1;34035:5;:54::i;:::-;33766:331:::0;:::o;13295:169::-;13378:4;13395:39;699:10;13418:7;13427:6;13395:8;:39::i;:::-;-1:-1:-1;13452:4:0;13295:169;;;;;:::o;32174:850::-;32397:16;;32306:4;;;;;;-1:-1:-1;;;32397:16:0;;;;32393:256;;;32430:24;32457:15;:13;:15::i;:::-;32430:42;;32504:32;32519:16;32504:14;:32::i;:::-;32487:49;;32574:13;;32555:16;:32;32551:87;;;32618:4;32608:14;;32551:87;32415:234;32393:256;32665:19;;;:48;;-1:-1:-1;;;;;;32688:25:0;;;;;;:17;:25;;;;;;;;32665:48;32661:202;;;32730:36;32740:6;32748:9;32759:6;32730:9;:36::i;:::-;32661:202;;;32799:52;32816:6;32824:9;32835:6;32843:7;32799:16;:52::i;:::-;;32661:202;32875:119;32884:6;699:10;32906:87;32942:6;32906:87;;;;;;;;;;;;;;;;;:31;32916:6;699:10;12997:151;:::i;32906:31::-;:35;:87;:35;:87::i;:::-;32875:8;:119::i;:::-;-1:-1:-1;33012:4:0;;32174:850;-1:-1:-1;;;;;32174:850:0:o;24768:115::-;23001:6;;-1:-1:-1;;;;;23001:6:0;;;;;699:10;23148:23;23140:68;;;;-1:-1:-1;;;23140:68:0;;;;;;;:::i;:::-;24844:31:::1;24862:12;24844:17;:31::i;27881:547::-:0;26765:9;;27968:4;;-1:-1:-1;;;;;26765:9:0;26778:10;26765:23;26757:64;;;;-1:-1:-1;;;26757:64:0;;;;;;;:::i;:::-;27589:13;:20;28057:6:::1;:32;28049:87;;;;-1:-1:-1::0;;;28049:87:0::1;;;;;;;:::i;:::-;28151:10:::0;;28147:86:::1;;28195:13;28209:10;28218:1;28209:6:::0;:10:::1;:::i;:::-;28195:25;;;;;;;;:::i;:::-;;;;;;;;;28186:6;:34;28178:43;;;::::0;::::1;;28256:30;28284:1;28256:23;27589:13:::0;:20;;27502:115;28256:23:::1;:27:::0;::::1;:30::i;:::-;28247:6;:39;28243:115;;;28320:13;28334:10;:6:::0;28343:1:::1;28334:10;:::i;:::-;28320:25;;;;;;;;:::i;:::-;;;;;;;;;28311:6;:34;28303:43;;;::::0;::::1;;28392:6;28368:13;28382:6;28368:21;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:30:::0;-1:-1:-1;28416:4:0::1;27881:547:::0;;;;:::o;30928:240::-;24743:9;;31010:4;;-1:-1:-1;;;;;24743:9:0;699:10;24727:25;26903:39;;;-1:-1:-1;26919:9:0;;-1:-1:-1;;;;;26919:9:0;26932:10;26919:23;26903:39;26895:96;;;;-1:-1:-1;;;26895:96:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31036:27:0;::::1;;::::0;;;:17:::1;:27;::::0;;;;;::::1;;31035:28;31027:66;;;::::0;-1:-1:-1;;;31027:66:0;;7975:2:1;31027:66:0::1;::::0;::::1;7957:21:1::0;8014:2;7994:18;;;7987:30;8053:27;8033:18;;;8026:55;8098:18;;31027:66:0::1;7773:349:1::0;31027:66:0::1;-1:-1:-1::0;;;;;;31104:27:0::1;;::::0;;;:17:::1;:27;::::0;;;;:34;;-1:-1:-1;;31104:34:0::1;31134:4;31104:34:::0;;::::1;::::0;;;31134:4;30928:240::o;14676:218::-;699:10;14764:4;14813:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14813:34:0;;;;;;;;;;14764:4;;14781:83;;14804:7;;14813:50;;14852:10;14813:38;:50::i;30159:259::-;24743:9;;-1:-1:-1;;;;;24743:9:0;699:10;24727:25;26903:39;;;-1:-1:-1;26919:9:0;;-1:-1:-1;;;;;26919:9:0;26932:10;26919:23;26903:39;26895:96;;;;-1:-1:-1;;;26895:96:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30251:24:0;::::1;30243:75;;;::::0;-1:-1:-1;;;30243:75:0;;8329:2:1;30243:75:0::1;::::0;::::1;8311:21:1::0;8368:2;8348:18;;;8341:30;8407:34;8387:18;;;8380:62;-1:-1:-1;;;8458:18:1;;;8451:36;8504:19;;30243:75:0::1;8127:402:1::0;30243:75:0::1;30355:9;::::0;30334:43:::1;::::0;;-1:-1:-1;;;;;30355:9:0;;::::1;8746:34:1::0;;8816:15;;;8811:2;8796:18;;8789:43;30334::0::1;::::0;8681:18:1;30334:43:0::1;;;;;;;30388:9;:22:::0;;-1:-1:-1;;;;;;30388:22:0::1;-1:-1:-1::0;;;;;30388:22:0;;;::::1;::::0;;;::::1;::::0;;30159:259::o;31647:290::-;24568:9;;31727:4;;-1:-1:-1;;;;;24568:9:0;24581:10;24568:23;24560:72;;;;-1:-1:-1;;;24560:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12520:18:0;;31744:21:::1;12520:18:::0;;;;;;;;;;;31800:26:::1;12520:18:::0;31818:7;31800:5:::1;:26::i;:::-;-1:-1:-1::0;;;;;12520:18:0;;31837:20:::1;12520:18:::0;;;;;;;;;;;31901:28;;;::::1;::::0;31647:290;-1:-1:-1;;;;31647:290:0:o;31945:83::-;32002:18;32013:6;32002:10;:18::i;26282:134::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26282:134:0;:::o;34105:187::-;24568:9;;-1:-1:-1;;;;;24568:9:0;24581:10;24568:23;24560:72;;;;-1:-1:-1;;;24560:72:0;;;;;;;:::i;:::-;34255:29:::1;::::0;-1:-1:-1;;;34255:29:0;;-1:-1:-1;;;;;9035:32:1;;;34255:29:0::1;::::0;::::1;9017:51:1::0;9084:18;;;9077:34;;;34255:15:0;::::1;::::0;::::1;::::0;8990:18:1;;34255:29:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34105:187:::0;;;:::o;26423:113::-;;;;;;;;;;;;29843:99;26765:9;;-1:-1:-1;;;;;26765:9:0;26778:10;26765:23;26757:64;;;;-1:-1:-1;;;26757:64:0;;;;;;;:::i;:::-;29910:16:::1;:24:::0;;-1:-1:-1;;;;29910:24:0::1;::::0;;29843:99::o;30426:248::-;26765:9;;-1:-1:-1;;;;;26765:9:0;26778:10;26765:23;26757:64;;;;-1:-1:-1;;;26757:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30528:34:0;::::1;30520:93;;;::::0;-1:-1:-1;;;30520:93:0;;9606:2:1;30520:93:0::1;::::0;::::1;9588:21:1::0;9645:2;9625:18;;;9618:30;9684:34;9664:18;;;9657:62;-1:-1:-1;;;9735:18:1;;;9728:44;9789:19;;30520:93:0::1;9404:410:1::0;30520:93:0::1;30624:19;:42:::0;;-1:-1:-1;;;;;;30624:42:0::1;-1:-1:-1::0;;;;;30624:42:0;;;::::1;::::0;;;::::1;::::0;;30426:248::o;23579:148::-;23001:6;;-1:-1:-1;;;;;23001:6:0;;;;;699:10;23148:23;23140:68;;;;-1:-1:-1;;;23140:68:0;;;;;;;:::i;:::-;23670:6:::1;::::0;23649:40:::1;::::0;23686:1:::1;::::0;23670:6:::1;::::0;::::1;-1:-1:-1::0;;;;;23670:6:0::1;::::0;23649:40:::1;::::0;23686:1;;23649:40:::1;23700:6;:19:::0;;-1:-1:-1;;;;;;23700:19:0::1;::::0;;23579:148::o;28436:326::-;26765:9;;28523:4;;-1:-1:-1;;;;;26765:9:0;26778:10;26765:23;26757:64;;;;-1:-1:-1;;;26757:64:0;;;;;;;:::i;:::-;27712:13;:20;28612:6:::1;:32;28604:87;;;;-1:-1:-1::0;;;28604:87:0::1;;;;;;;:::i;:::-;28726:6;28702:13;28716:6;28702:21;;;;;;;;:::i;32036:130::-:0;24568:9;;-1:-1:-1;;;;;24568:9:0;24581:10;24568:23;24560:72;;;;-1:-1:-1;;;24560:72:0;;;;;;;:::i;:::-;32127:31:::1;32142:7;32151:6;32127:14;:31::i;:::-;32036:130:::0;;:::o;31176:240::-;24743:9;;31258:4;;-1:-1:-1;;;;;24743:9:0;699:10;24727:25;26903:39;;;-1:-1:-1;26919:9:0;;-1:-1:-1;;;;;26919:9:0;26932:10;26919:23;26903:39;26895:96;;;;-1:-1:-1;;;26895:96:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31283:27:0;::::1;;::::0;;;:17:::1;:27;::::0;;;;;::::1;;31275:65;;;::::0;-1:-1:-1;;;31275:65:0;;10021:2:1;31275:65:0::1;::::0;::::1;10003:21:1::0;10060:2;10040:18;;;10033:30;10099:27;10079:18;;;10072:55;10144:18;;31275:65:0::1;9819:349:1::0;31275:65:0::1;-1:-1:-1::0;;;;;;31351:27:0::1;31381:5;31351:27:::0;;;:17:::1;:27;::::0;;;;:35;;-1:-1:-1;;31351:35:0::1;::::0;;-1:-1:-1;;31176:240:0:o;11359:95::-;11406:13;11439:7;11432:14;;;;;:::i;28770:120::-;26765:9;;-1:-1:-1;;;;;26765:9:0;26778:10;26765:23;26757:64;;;;-1:-1:-1;;;26757:64:0;;;;;;;:::i;:::-;28852:13:::1;:30:::0;28770:120::o;15397:269::-;15490:4;15507:129;699:10;15530:7;15539:96;15578:15;15539:96;;;;;;;;;;;;;;;;;699:10;15539:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;15539:34:0;;;;;;;;;;;;:38;:96::i;12759:175::-;12845:4;12862:42;699:10;12886:9;12897:6;12862:9;:42::i;30682:238::-;26765:9;;-1:-1:-1;;;;;26765:9:0;26778:10;26765:23;26757:64;;;;-1:-1:-1;;;26757:64:0;;;;;;;:::i;:::-;30761:16:::1;::::0;-1:-1:-1;;;30761:16:0;::::1;;;30760:17;30752:66;;;::::0;-1:-1:-1;;;30752:66:0;;10375:2:1;30752:66:0::1;::::0;::::1;10357:21:1::0;10414:2;10394:18;;;10387:30;10453:34;10433:18;;;10426:62;-1:-1:-1;;;10504:18:1;;;10497:34;10548:19;;30752:66:0::1;10173:400:1::0;30752:66:0::1;30848:4;30837:8;:15;30829:54;;;::::0;-1:-1:-1;;;30829:54:0;;10780:2:1;30829:54:0::1;::::0;::::1;10762:21:1::0;10819:2;10799:18;;;10792:30;10858:28;10838:18;;;10831:56;10904:18;;30829:54:0::1;10578:350:1::0;30829:54:0::1;30894:7;:18:::0;30682:238::o;29950:201::-;24743:9;;-1:-1:-1;;;;;24743:9:0;699:10;24727:25;26903:39;;;-1:-1:-1;26919:9:0;;-1:-1:-1;;;;;26919:9:0;26932:10;26919:23;26903:39;26895:96;;;;-1:-1:-1;;;26895:96:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30044:25:0;::::1;30036:72;;;::::0;-1:-1:-1;;;30036:72:0;;11135:2:1;30036:72:0::1;::::0;::::1;11117:21:1::0;11174:2;11154:18;;;11147:30;11213:34;11193:18;;;11186:62;-1:-1:-1;;;11264:18:1;;;11257:32;11306:19;;30036:72:0::1;10933:398:1::0;30036:72:0::1;30119:10;:24:::0;;-1:-1:-1;;;;;;30119:24:0::1;-1:-1:-1::0;;;;;30119:24:0;;;::::1;::::0;;;::::1;::::0;;29950:201::o;23882:244::-;23001:6;;-1:-1:-1;;;;;23001:6:0;;;;;699:10;23148:23;23140:68;;;;-1:-1:-1;;;23140:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23971:22:0;::::1;23963:73;;;::::0;-1:-1:-1;;;23963:73:0;;11538:2:1;23963:73:0::1;::::0;::::1;11520:21:1::0;11577:2;11557:18;;;11550:30;11616:34;11596:18;;;11589:62;-1:-1:-1;;;11667:18:1;;;11660:36;11713:19;;23963:73:0::1;11336:402:1::0;23963:73:0::1;24073:6;::::0;24052:38:::1;::::0;-1:-1:-1;;;;;24052:38:0;;::::1;::::0;24073:6:::1;::::0;::::1;;::::0;24052:38:::1;::::0;;;::::1;24101:6;:17:::0;;-1:-1:-1;;;;;24101:17:0;;::::1;;;-1:-1:-1::0;;;;;;24101:17:0;;::::1;::::0;;;::::1;::::0;;23882:244::o;29738:97::-;26765:9;;-1:-1:-1;;;;;26765:9:0;26778:10;26765:23;26757:64;;;;-1:-1:-1;;;26757:64:0;;;;;;;:::i;:::-;29804:16:::1;:23:::0;;-1:-1:-1;;;;29804:23:0::1;-1:-1:-1::0;;;29804:23:0::1;::::0;;29738:97::o;4426:179::-;4484:7;;4516:5;4520:1;4516;:5;:::i;:::-;4504:17;;4545:1;4540;:6;;4532:46;;;;-1:-1:-1;;;4532:46:0;;11945:2:1;4532:46:0;;;11927:21:1;11984:2;11964:18;;;11957:30;12023:29;12003:18;;;11996:57;12070:18;;4532:46:0;11743:351:1;4532:46:0;4596:1;4426:179;-1:-1:-1;;;4426:179:0:o;16977:378::-;-1:-1:-1;;;;;17061:21:0;;17053:65;;;;-1:-1:-1;;;17053:65:0;;12301:2:1;17053:65:0;;;12283:21:1;12340:2;12320:18;;;12313:30;12379:33;12359:18;;;12352:61;12430:18;;17053:65:0;12099:355:1;17053:65:0;17208:12;;:24;;17225:6;17208:16;:24::i;:::-;17193:12;:39;-1:-1:-1;;;;;17264:18:0;;:9;:18;;;;;;;;;;;:30;;17287:6;17264:22;:30::i;:::-;-1:-1:-1;;;;;17243:18:0;;:9;:18;;;;;;;;;;;:51;;;;17310:37;;1662:25:1;;;17243:18:0;;:9;;17310:37;;1635:18:1;17310:37:0;;;;;;;;16977:378;;:::o;18544:346::-;-1:-1:-1;;;;;18646:19:0;;18638:68;;;;-1:-1:-1;;;18638:68:0;;12661:2:1;18638:68:0;;;12643:21:1;12700:2;12680:18;;;12673:30;12739:34;12719:18;;;12712:62;-1:-1:-1;;;12790:18:1;;;12783:34;12834:19;;18638:68:0;12459:400:1;18638:68:0;-1:-1:-1;;;;;18725:21:0;;18717:68;;;;-1:-1:-1;;;18717:68:0;;13066:2:1;18717:68:0;;;13048:21:1;13105:2;13085:18;;;13078:30;13144:34;13124:18;;;13117:62;-1:-1:-1;;;13195:18:1;;;13188:32;13237:19;;18717:68:0;12864:398:1;18717:68:0;-1:-1:-1;;;;;18798:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18850:32;;1662:25:1;;;18850:32:0;;1635:18:1;18850:32:0;;;;;;;;18544:346;;;:::o;28898:301::-;28989:10;;28981:48;;-1:-1:-1;;;28981:48:0;;29017:4;28981:48;;;9017:51:1;29024:4:0;9084:18:1;;;9077:34;28946:18:0;;-1:-1:-1;;;;;28989:10:0;;28981:27;;8990:18:1;;28981:48:0;;;;;;;;;;;;;;;;;;-1:-1:-1;28981:48:0;;;;;;;;-1:-1:-1;;28981:48:0;;;;;;;;;;;;:::i;:::-;;;28977:215;;29126:54;;-1:-1:-1;;;29126:54:0;;14088:2:1;29126:54:0;;;14070:21:1;14127:2;14107:18;;;14100:30;14166:34;14146:18;;;14139:62;-1:-1:-1;;;14217:18:1;;;14210:42;14269:19;;29126:54:0;13886:408:1;28977:215:0;-1:-1:-1;;;;;29077:15:0;;28898:301;-1:-1:-1;28898:301:0:o;29207:523::-;29293:16;;29269:7;;-1:-1:-1;;;29293:16:0;;;;29289:415;;;29331:14;29348:30;29376:1;29348:23;27589:13;:20;;27502:115;29348:30;29331:47;;29326:367;29440:13;29454:6;29440:21;;;;;;;;:::i;:::-;;;;;;;;;29426:10;:35;29422:256;;29518:4;29494:13;29508:6;29494:21;;;;;;;;:::i;:::-;;;;;;;;;:28;29486:67;;;;-1:-1:-1;;;29486:67:0;;10780:2:1;29486:67:0;;;10762:21:1;10819:2;10799:18;;;10792:30;10858:28;10838:18;;;10831:56;10904:18;;29486:67:0;10578:350:1;29486:67:0;29586:13;29600:6;29586:21;;;;;;;;:::i;:::-;;;;;;;;;29576:7;:31;;;;29637:13;29651:6;29637:21;;;;;;;;:::i;:::-;;;;;;;;;29630:28;;;29207:523;;;:::o;29422:256::-;29393:8;;;:::i;:::-;;;29326:367;;29289:415;-1:-1:-1;29721:1:0;;29207:523;-1:-1:-1;29207:523:0:o;16156:539::-;-1:-1:-1;;;;;16262:20:0;;16254:70;;;;-1:-1:-1;;;16254:70:0;;14642:2:1;16254:70:0;;;14624:21:1;14681:2;14661:18;;;14654:30;14720:34;14700:18;;;14693:62;-1:-1:-1;;;14771:18:1;;;14764:35;14816:19;;16254:70:0;14440:401:1;16254:70:0;-1:-1:-1;;;;;16343:23:0;;16335:71;;;;-1:-1:-1;;;16335:71:0;;15048:2:1;16335:71:0;;;15030:21:1;15087:2;15067:18;;;15060:30;15126:34;15106:18;;;15099:62;-1:-1:-1;;;15177:18:1;;;15170:33;15220:19;;16335:71:0;14846:399:1;16335:71:0;16499;16521:6;16499:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16499:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;16479:17:0;;;:9;:17;;;;;;;;;;;:91;;;;16604:20;;;;;;;:32;;16629:6;16604:24;:32::i;:::-;-1:-1:-1;;;;;16581:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;16652:35;1662:25:1;;;16581:20:0;;16652:35;;;;;;1635:18:1;16652:35:0;1516:177:1;33032:654:0;33184:4;33201:17;33221:30;33245:5;33221:19;33232:7;;33221:6;:10;;:19;;;;:::i;:::-;:23;;:30::i;:::-;33201:50;-1:-1:-1;33262:22:0;33287:21;:6;33201:50;33287:10;:21::i;:::-;33262:46;;33325:7;33321:226;;;33374:33;33389:6;33397:9;33374:14;:33::i;:::-;33321:226;;;33504:19;;33486:49;;33496:6;;-1:-1:-1;;;;;33504:19:0;33525:9;33486;:49::i;:::-;33610:44;33620:6;33628:9;33639:14;33610:9;:44::i;:::-;-1:-1:-1;33674:4:0;;33032:654;-1:-1:-1;;;;;;33032:654:0:o;7253:166::-;7339:7;7375:12;7367:6;;;;7359:29;;;;-1:-1:-1;;;7359:29:0;;;;;;;;:::i;:::-;-1:-1:-1;7406:5:0;7410:1;7406;:5;:::i;:::-;7399:12;7253:166;-1:-1:-1;;;;7253:166:0:o;24891:257::-;-1:-1:-1;;;;;24968:26:0;;24960:84;;;;-1:-1:-1;;;24960:84:0;;15452:2:1;24960:84:0;;;15434:21:1;15491:2;15471:18;;;15464:30;15530:34;15510:18;;;15503:62;-1:-1:-1;;;15581:18:1;;;15574:43;15634:19;;24960:84:0;15250:409:1;24960:84:0;25060:45;;-1:-1:-1;;;;;25060:45:0;;;25088:1;;25060:45;;25088:1;;25060:45;25116:9;:24;;-1:-1:-1;;;;;;25116:24:0;-1:-1:-1;;;;;25116:24:0;;;;;;;;;;24891:257::o;4888:158::-;4946:7;4979:1;4974;:6;;4966:49;;;;-1:-1:-1;;;4966:49:0;;15866:2:1;4966:49:0;;;15848:21:1;15905:2;15885:18;;;15878:30;15944:32;15924:18;;;15917:60;15994:18;;4966:49:0;15664:354:1;4966:49:0;5033:5;5037:1;5033;:5;:::i;20436:91::-;20492:27;699:10;20512:6;20492:5;:27::i;20846:295::-;20923:26;20952:84;20989:6;20952:84;;;;;;;;;;;;;;;;;:32;20962:7;699:10;12997:151;:::i;20952:84::-;20923:113;-1:-1:-1;21049:51:0;21058:7;699:10;21081:18;21049:8;:51::i;:::-;21111:22;21117:7;21126:6;21111:5;:22::i;:::-;20912:229;20846:295;;:::o;5305:220::-;5363:7;5387:1;5392;5387:6;5383:20;;-1:-1:-1;5402:1:0;5395:8;;5383:20;5414:9;5426:5;5430:1;5426;:5;:::i;:::-;5414:17;-1:-1:-1;5459:1:0;5450:5;5454:1;5414:17;5450:5;:::i;:::-;:10;5442:56;;;;-1:-1:-1;;;5442:56:0;;16620:2:1;5442:56:0;;;16602:21:1;16659:2;16639:18;;;16632:30;16698:34;16678:18;;;16671:62;-1:-1:-1;;;16749:18:1;;;16742:31;16790:19;;5442:56:0;16418:397:1;6003:153:0;6061:7;6093:1;6089;:5;6081:44;;;;-1:-1:-1;;;6081:44:0;;17022:2:1;6081:44:0;;;17004:21:1;17061:2;17041:18;;;17034:30;17100:28;17080:18;;;17073:56;17146:18;;6081:44:0;16820:350:1;6081:44:0;6143:5;6147:1;6143;:5;:::i;17688:418::-;-1:-1:-1;;;;;17772:21:0;;17764:67;;;;-1:-1:-1;;;17764:67:0;;17377:2:1;17764:67:0;;;17359:21:1;17416:2;17396:18;;;17389:30;17455:34;17435:18;;;17428:62;-1:-1:-1;;;17506:18:1;;;17499:31;17547:19;;17764:67:0;17175:397:1;17764:67:0;17927:68;17950:6;17927:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17927:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;17906:18:0;;:9;:18;;;;;;;;;;:89;18021:12;;:24;;18038:6;18021:16;:24::i;:::-;18006:12;:39;18061:37;;1662:25:1;;;18087:1:0;;-1:-1:-1;;;;;18061:37:0;;;;;1650:2:1;1635:18;18061:37:0;1516:177:1;14:597;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:247;811:6;864:2;852:9;843:7;839:23;835:32;832:52;;;880:1;877;870:12;832:52;919:9;906:23;938:31;963:5;938:31;:::i;1004:315::-;1072:6;1080;1133:2;1121:9;1112:7;1108:23;1104:32;1101:52;;;1149:1;1146;1139:12;1101:52;1188:9;1175:23;1207:31;1232:5;1207:31;:::i;:::-;1257:5;1309:2;1294:18;;;;1281:32;;-1:-1:-1;;;1004:315:1:o;1698:456::-;1775:6;1783;1791;1844:2;1832:9;1823:7;1819:23;1815:32;1812:52;;;1860:1;1857;1850:12;1812:52;1899:9;1886:23;1918:31;1943:5;1918:31;:::i;:::-;1968:5;-1:-1:-1;2025:2:1;2010:18;;1997:32;2038:33;1997:32;2038:33;:::i;:::-;1698:456;;2090:7;;-1:-1:-1;;;2144:2:1;2129:18;;;;2116:32;;1698:456::o;2159:248::-;2227:6;2235;2288:2;2276:9;2267:7;2263:23;2259:32;2256:52;;;2304:1;2301;2294:12;2256:52;-1:-1:-1;;2327:23:1;;;2397:2;2382:18;;;2369:32;;-1:-1:-1;2159:248:1:o;2809:180::-;2868:6;2921:2;2909:9;2900:7;2896:23;2892:32;2889:52;;;2937:1;2934;2927:12;2889:52;-1:-1:-1;2960:23:1;;2809:180;-1:-1:-1;2809:180:1:o;2994:469::-;3084:6;3092;3100;3153:2;3141:9;3132:7;3128:23;3124:32;3121:52;;;3169:1;3166;3159:12;3121:52;3208:9;3195:23;3227:31;3252:5;3227:31;:::i;:::-;3277:5;-1:-1:-1;3329:2:1;3314:18;;3301:32;;-1:-1:-1;3385:2:1;3370:18;;3357:32;3398:33;3357:32;3398:33;:::i;:::-;3450:7;3440:17;;;2994:469;;;;;:::o;3468:388::-;3536:6;3544;3597:2;3585:9;3576:7;3572:23;3568:32;3565:52;;;3613:1;3610;3603:12;3565:52;3652:9;3639:23;3671:31;3696:5;3671:31;:::i;:::-;3721:5;-1:-1:-1;3778:2:1;3763:18;;3750:32;3791:33;3750:32;3791:33;:::i;:::-;3843:7;3833:17;;;3468:388;;;;;:::o;3861:380::-;3940:1;3936:12;;;;3983;;;4004:61;;4058:4;4050:6;4046:17;4036:27;;4004:61;4111:2;4103:6;4100:14;4080:18;4077:38;4074:161;;4157:10;4152:3;4148:20;4145:1;4138:31;4192:4;4189:1;4182:15;4220:4;4217:1;4210:15;4074:161;;3861:380;;;:::o;4246:400::-;4448:2;4430:21;;;4487:2;4467:18;;;4460:30;4526:34;4521:2;4506:18;;4499:62;-1:-1:-1;;;4592:2:1;4577:18;;4570:34;4636:3;4621:19;;4246:400::o;5346:356::-;5548:2;5530:21;;;5567:18;;;5560:30;5626:34;5621:2;5606:18;;5599:62;5693:2;5678:18;;5346:356::o;5707:352::-;5909:2;5891:21;;;5948:2;5928:18;;;5921:30;5987;5982:2;5967:18;;5960:58;6050:2;6035:18;;5707:352::o;6422:406::-;6624:2;6606:21;;;6663:2;6643:18;;;6636:30;6702:34;6697:2;6682:18;;6675:62;-1:-1:-1;;;6768:2:1;6753:18;;6746:40;6818:3;6803:19;;6422:406::o;6833:127::-;6894:10;6889:3;6885:20;6882:1;6875:31;6925:4;6922:1;6915:15;6949:4;6946:1;6939:15;6965:125;7005:4;7033:1;7030;7027:8;7024:34;;;7038:18;;:::i;:::-;-1:-1:-1;7075:9:1;;6965:125::o;7095:127::-;7156:10;7151:3;7147:20;7144:1;7137:31;7187:4;7184:1;7177:15;7211:4;7208:1;7201:15;7227:128;7267:3;7298:1;7294:6;7291:1;7288:13;7285:39;;;7304:18;;:::i;:::-;-1:-1:-1;7340:9:1;;7227:128::o;7360:408::-;7562:2;7544:21;;;7601:2;7581:18;;;7574:30;7640:34;7635:2;7620:18;;7613:62;-1:-1:-1;;;7706:2:1;7691:18;;7684:42;7758:3;7743:19;;7360:408::o;9122:277::-;9189:6;9242:2;9230:9;9221:7;9217:23;9213:32;9210:52;;;9258:1;9255;9248:12;9210:52;9290:9;9284:16;9343:5;9336:13;9329:21;9322:5;9319:32;9309:60;;9365:1;9362;9355:12;13572:309;13642:6;13695:2;13683:9;13674:7;13670:23;13666:32;13663:52;;;13711:1;13708;13701:12;13663:52;13743:9;13737:16;-1:-1:-1;;;;;13786:5:1;13782:50;13775:5;13772:61;13762:89;;13847:1;13844;13837:12;14299:136;14338:3;14366:5;14356:39;;14375:18;;:::i;:::-;-1:-1:-1;;;14411:18:1;;14299:136::o;16023:168::-;16063:7;16129:1;16125;16121:6;16117:14;16114:1;16111:21;16106:1;16099:9;16092:17;16088:45;16085:71;;;16136:18;;:::i;:::-;-1:-1:-1;16176:9:1;;16023:168::o;16196:217::-;16236:1;16262;16252:132;;16306:10;16301:3;16297:20;16294:1;16287:31;16341:4;16338:1;16331:15;16369:4;16366:1;16359:15;16252:132;-1:-1:-1;16398:9:1;;16196:217::o

Swarm Source

ipfs://b6406ed44744c9e770a8b2a2267133896d446de7b013f97bf87628501605f982
Loading...
Loading
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.