ETH Price: $3,465.70 (+2.89%)

Token

HK Monetary Token (HKMT)
 

Overview

Max Total Supply

7,000,000,000 HKMT

Holders

87 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 6 Decimals)

Balance
291.543452 HKMT

Value
$0.00
0x5d2f29aa18aef827317c48bd2b4f05fa24880038
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

HKMT is a Hong Kong dollar-backed stablecoin established by the Monetary Token Foundation. HKMT governance is defined by adhering to the highest standards of transparency and accountability.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
HKMT

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-05-31
*/

pragma solidity ^0.5.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

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

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


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

        return c;
    }

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

        return c;
    }

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

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

        return c;
    }

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

        return c;
    }

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

/**
 * @dev Optional functions from the ERC20 standard.
 */
contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
     * these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

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

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

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

contract MinterRole {
    using Roles for Roles.Role;

    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);

    Roles.Role private _minters;

    constructor () internal {
        _addMinter(msg.sender);
    }

    modifier onlyMinter() {
        require(isMinter(msg.sender), "MinterRole: caller does not have the Minter role");
        _;
    }

    function isMinter(address account) public view returns (bool) {
        return _minters.has(account);
    }

    function addMinter(address account) public onlyMinter {
        _addMinter(account);
    }

    function renounceMinter() public {
        _removeMinter(msg.sender);
    }

    function _addMinter(address account) internal {
        _minters.add(account);
        emit MinterAdded(account);
    }

    function _removeMinter(address account) internal {
        _minters.remove(account);
        emit MinterRemoved(account);
    }
}

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}


/**
 * @dev Derived From the `ERC20` .
 *
 */
contract HkmtFeePool is Ownable , IERC20, MinterRole {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

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

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

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

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

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

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

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

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

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

     /**
     * @dev Destoys `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 value) internal {
        require(account != address(0), "ERC20: burn from the zero address");

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

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

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

    /**
     * @dev Destoys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See `_burn` and `_approve`.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
    }


    using SafeMath for uint;
    uint public createdAt = block.timestamp;
    uint public difficultyIncreaseInPercentPerDay = 1;
    HKMT public hkmtContract;

    modifier onlySender(address _sender) {
        require(msg.sender == _sender);
        _;
    }
    event Claimed(
        address indexed by,
        uint256 tokenReturned,
        uint256 reward
    );
    constructor(address _hkmtContract) public {
        hkmtContract = HKMT(_hkmtContract);
    }

    function set_difficultyIncreaseInPercentPerDay(uint value) external onlyOwner returns (bool) {
        difficultyIncreaseInPercentPerDay = value;
        return true;
    }

    function currentReward(uint256 _value) public view returns (uint256) {
        uint timeDiff = block.timestamp.sub(createdAt);
        uint currentDifficulty = 100 + timeDiff.div(24 * 3600).mul(difficultyIncreaseInPercentPerDay);
        uint256 supposedReward = _value.mul(100).div(currentDifficulty);
        if (_balances[address(this)] > supposedReward) {
            return supposedReward;
        } else {
            return _balances[address(this)];
        }
    }

    function currentMined() public view returns (uint256) {
        return _totalSupply - _balances[address(this)];
    }

    function notifyTx(address _payer, uint256 _value) external onlySender(address(hkmtContract)) returns (bool) {
        require(_payer != address(0));
        uint256 reward = currentReward(_value);
        
        _balances[address(this)] = _balances[address(this)].sub(reward);
        _balances[_payer] = _balances[_payer].add(reward);

        emit Transfer(owner(), _payer, reward);

        return true;
    }

    function transfer(address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(_value <= _balances[msg.sender]);

        if (_to == address(this)) {
            uint256 currentPool = hkmtContract.balanceOf(address(this));
            uint256 currentPZ = currentMined();
            uint256 result = currentPool.mul(_value).div(currentPZ);

            _transfer(msg.sender, _to, _value);

            hkmtContract.feePoolTransfer(msg.sender, result);
            emit Claimed(msg.sender, _value, result);
        } else {
            _transfer(msg.sender, _to, _value);
        }

        return true;
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(_value <= _balances[_from]);
        require(_value <= _allowances[_from][msg.sender]);

        if (_to == address(this)) {
            uint256 currentPool = hkmtContract.balanceOf(address(this));
            uint256 currentPZ = currentMined();
            uint256 result = currentPool.mul(_value).div(currentPZ);

            _balances[_from] = _balances[_from].sub(_value);
            _balances[_to] = _balances[_to].add(_value);
            _allowances[_from][msg.sender] = _allowances[_from][msg.sender].sub(_value);
            emit Transfer(_from, _to, _value);

            hkmtContract.feePoolTransfer(msg.sender, result);
            emit Claimed(msg.sender, _value, result);
        } else {
            _balances[_from] = _balances[_from].sub(_value);
            _balances[_to] = _balances[_to].add(_value);
            _allowances[_from][msg.sender] = _allowances[_from][msg.sender].sub(_value);
            emit Transfer(_from, _to, _value);
        }

        return true;
    }

    function mint(address account, uint256 amount) public onlyMinter returns (bool) {
        _mint(account, amount);
        return true;
    }

    /**
     * @dev Destoys `amount` tokens from the caller.
     *
     * See `ERC20._burn`.
     */
    function burn(uint256 amount) public {
        _burn(msg.sender, amount);
    }

    /**
     * @dev See `ERC20._burnFrom`.
     */
    function burnFrom(address account, uint256 amount) public {
        _burnFrom(account, amount);
    }
}


/**
 * @dev Derived From the `ERC20` .
 *
 */
contract HKMT is Ownable, IERC20, MinterRole, ERC20Detailed {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

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

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

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

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

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

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

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

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

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

     /**
     * @dev Destoys `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 value) internal {
        require(account != address(0), "ERC20: burn from the zero address");

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

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

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

    /**
     * @dev Destoys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See `_burn` and `_approve`.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
    }

    using SafeMath for uint;
    uint public txFeePerMillion = 0;
    uint256 public INITIAL_SUPPLY = 4000000000*(10**6);
    HkmtFeePool public feePool;

    constructor() public ERC20Detailed("HK Monetary Token", "HKMT", 6) {
        _totalSupply = INITIAL_SUPPLY;
        _balances[msg.sender] = INITIAL_SUPPLY;
    }

    modifier onlySender(address _sender) {
        require(msg.sender == _sender);
        _;
    }

    function setTxFee(uint _value) external onlyOwner returns (bool) {
        txFeePerMillion = _value;
        return true;
    }

    /**
    * @dev Set the fee pool to a specified address
    * @param _feePool The FeePool contract address
    */

    function setFeePool(address _feePool) external onlyOwner returns (bool) {
        require(_feePool != address(0));

        feePool = HkmtFeePool(_feePool);
        return true;
    }

    /**
    * @dev Change the fee pool to a specified address. Transfer the balance of current fee pool to the new one.
    * @param _newFeePool The new FeePool contract address
    */

    function changeFeePool(address _newFeePool) external onlyOwner returns (bool) {
        require(address(feePool) != address(0), "no FeePool set yet");
        require(_newFeePool != address(0));
        require(_balances[_newFeePool] == 0);

        uint256 currentPoolBalance = _balances[address(feePool)];
        delete _balances[address(feePool)];
        feePool = HkmtFeePool(_newFeePool);
        _balances[_newFeePool] = currentPoolBalance;

        return true;
    }

    // Fee pool transfer doesn't pay fee again.
    function feePoolTransfer(address _to, uint256 _value) external onlySender(address(feePool)) returns (bool) {
        require(_to != address(0));
        require(_value <= _balances[msg.sender]);

        _transfer(msg.sender, _to, _value);
        return true;
    }


    /**
    * @dev Transfer tokens to a specified address after diverting a fee to a central account.
    * @param _to The receiving address.
    * @param _value The number of tokens to transfer.
    */
    function transfer(address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(_value <= _balances[msg.sender]);

        uint256 fee = _value.mul(txFeePerMillion).div(10**6);
        uint256 taxedValue = _value.sub(fee);

        // SafeMath.sub will throw if there is not enough balance.
        _transfer(msg.sender, _to, taxedValue);

        if (address(feePool) != address(0)) {
            _balances[address(feePool)] = _balances[address(feePool)].add(fee);
            emit Transfer(msg.sender, address(feePool), fee);
            if (msg.sender != owner()) {
                feePool.notifyTx(msg.sender, _value);
            } 
        }
        return true;
    }


    /**
    * @dev Transfer tokens from one address to another
    * @param _from address The address which you want to send tokens from
    * @param _to address The address which you want to transfer to
    * @param _value uint256 the amount of tokens to be transferred
    */
    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    )
        public
        returns (bool)
    {
        require(_to != address(0));
        require(_value <= _balances[_from]);
        require(_value <= _allowances[_from][msg.sender]);

        uint256 fee = _value.mul(txFeePerMillion).div(10**6);
        uint256 taxedValue = _value.sub(fee);

        _balances[_from] = _balances[_from].sub(_value);
        _balances[_to] = _balances[_to].add(taxedValue);
        _allowances[_from][msg.sender] = _allowances[_from][msg.sender].sub(_value);
        emit Transfer(_from, _to, _value);
        
        if (address(feePool) != address(0)) {
            _balances[address(feePool)] = _balances[address(feePool)].add(fee);
            emit Transfer(msg.sender, address(feePool), fee);        
            feePool.notifyTx(msg.sender, _value);
        }
        return true;
    }

    function mint(address account, uint256 amount) public onlyMinter returns (bool) {
        _mint(account, amount);
        return true;
    }

    /**
     * @dev Destoys `amount` tokens from the caller.
     *
     * See `ERC20._burn`.
     */
    function burn(uint256 amount) public {
        _burn(msg.sender, amount);
    }

    /**
     * @dev See `ERC20._burnFrom`.
     */
    function burnFrom(address account, uint256 amount) public {
        _burnFrom(account, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"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":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newFeePool","type":"address"}],"name":"changeFeePool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feePool","outputs":[{"internalType":"contract HkmtFeePool","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"feePoolTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_feePool","type":"address"}],"name":"setFeePool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setTxFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"txFeePerMillion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040526000600855660e35fa931a00006009553480156200002157600080fd5b50604080518082018252601181527024259026b7b732ba30b93c902a37b5b2b760791b6020808301919091528251808401845260048152631212d35560e21b91810191909152600080546001600160a01b03191633178082559351929391926006926001600160a01b031691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3620000c7336001600160e01b036200012716565b8251620000dc9060029060208601906200026f565b508151620000f29060039060208501906200026f565b506004805460ff191660ff92909216919091179055505060095460078190553360009081526005602052604090205562000314565b620001428160016200017960201b620017371790919060201c565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6200018e82826001600160e01b036200020616565b15620001e1576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b0382166200024f5760405162461bcd60e51b815260040180806020018281038252602281526020018062001d216022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002b257805160ff1916838001178555620002e2565b82800160010185558215620002e2579182015b82811115620002e2578251825591602001919060010190620002c5565b50620002f0929150620002f4565b5090565b6200031191905b80821115620002f05760008155600101620002fb565b90565b6119fd80620003246000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063825b31b8116100f9578063a9059cbb11610097578063d367e2aa11610071578063d367e2aa1461050f578063dd62ed3e14610535578063f05d16f714610563578063f2fde38b14610580576101c4565b8063a9059cbb146104b5578063aa271e1a146104e1578063ae2e933b14610507576101c4565b806395d89b41116100d357806395d89b4114610453578063983b2d561461045b5780639865027514610481578063a457c2d714610489576101c4565b8063825b31b8146103fb5780638da5cb5b146104275780638f32d59b1461044b576101c4565b806339509351116101665780635f8c7fd8116101405780635f8c7fd81461039957806370a08231146103a1578063715018a6146103c757806379cc6790146103cf576101c4565b8063395093511461032257806340c10f191461034e57806342966c681461037a576101c4565b806319db2228116101a257806319db2228146102a057806323b872dd146102c65780632ff2e9dc146102fc578063313ce56714610304576101c4565b806306fdde03146101c9578063095ea7b31461024657806318160ddd14610286575b600080fd5b6101d16105a6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561020b5781810151838201526020016101f3565b50505050905090810190601f1680156102385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102726004803603604081101561025c57600080fd5b506001600160a01b038135169060200135610639565b604080519115158252519081900360200190f35b61028e610650565b60408051918252519081900360200190f35b610272600480360360208110156102b657600080fd5b50356001600160a01b0316610656565b610272600480360360608110156102dc57600080fd5b506001600160a01b038135811691602081013590911690604001356106d7565b61028e610988565b61030c61098e565b6040805160ff9092168252519081900360200190f35b6102726004803603604081101561033857600080fd5b506001600160a01b038135169060200135610997565b6102726004803603604081101561036457600080fd5b506001600160a01b0381351690602001356109d8565b6103976004803603602081101561039057600080fd5b5035610a28565b005b61028e610a35565b61028e600480360360208110156103b757600080fd5b50356001600160a01b0316610a3b565b610397610a56565b610397600480360360408110156103e557600080fd5b506001600160a01b038135169060200135610ae7565b6102726004803603604081101561041157600080fd5b506001600160a01b038135169060200135610af5565b61042f610b54565b604080516001600160a01b039092168252519081900360200190f35b610272610b63565b6101d1610b74565b6103976004803603602081101561047157600080fd5b50356001600160a01b0316610bd5565b610397610c22565b6102726004803603604081101561049f57600080fd5b506001600160a01b038135169060200135610c2d565b610272600480360360408110156104cb57600080fd5b506001600160a01b038135169060200135610c69565b610272600480360360208110156104f757600080fd5b50356001600160a01b0316610e0d565b61042f610e20565b6102726004803603602081101561052557600080fd5b50356001600160a01b0316610e2f565b61028e6004803603604081101561054b57600080fd5b506001600160a01b0381358116916020013516610f46565b6102726004803603602081101561057957600080fd5b5035610f71565b6103976004803603602081101561059657600080fd5b50356001600160a01b0316610fc3565b60028054604080516020601f600019610100600187161502019094168590049384018190048102820181019092528281526060939092909183018282801561062f5780601f106106045761010080835404028352916020019161062f565b820191906000526020600020905b81548152906001019060200180831161061257829003601f168201915b5050505050905090565b6000610646338484611013565b5060015b92915050565b60075490565b6000610660610b63565b61069f576040805162461bcd60e51b815260206004820181905260248201526000805160206118fd833981519152604482015290519081900360640190fd5b6001600160a01b0382166106b257600080fd5b50600a80546001600160a01b0383166001600160a01b03199091161790556001919050565b60006001600160a01b0383166106ec57600080fd5b6001600160a01b03841660009081526005602052604090205482111561071157600080fd5b6001600160a01b038416600090815260066020908152604080832033845290915290205482111561074157600080fd5b600061076b620f424061075f600854866110ff90919063ffffffff16565b9063ffffffff61115f16565b9050600061077f848363ffffffff6111c916565b6001600160a01b0387166000908152600560205260409020549091506107ab908563ffffffff6111c916565b6001600160a01b0380881660009081526005602052604080822093909355908716815220546107e0908263ffffffff61122616565b6001600160a01b038087166000908152600560209081526040808320949094559189168152600682528281203382529091522054610824908563ffffffff6111c916565b6001600160a01b038088166000818152600660209081526040808320338452825291829020949094558051888152905192891693919260008051602061193f833981519152929181900390910190a3600a546001600160a01b03161561097c57600a546001600160a01b03166000908152600560205260409020546108af908363ffffffff61122616565b600a80546001600160a01b0390811660009081526005602090815260409182902094909455915482518681529251911692339260008051602061193f833981519152929081900390910190a3600a5460408051636a15fe4960e01b81523360048201526024810187905290516001600160a01b0390921691636a15fe49916044808201926020929091908290030181600087803b15801561094f57600080fd5b505af1158015610963573d6000803e3d6000fd5b505050506040513d602081101561097957600080fd5b50505b50600195945050505050565b60095481565b60045460ff1690565b3360008181526006602090815260408083206001600160a01b038716845290915281205490916106469185906109d3908663ffffffff61122616565b611013565b60006109e333610e0d565b610a1e5760405162461bcd60e51b815260040180806020018281038252603081526020018061188b6030913960400191505060405180910390fd5b6106468383611280565b610a323382611360565b50565b60085481565b6001600160a01b031660009081526005602052604090205490565b610a5e610b63565b610a9d576040805162461bcd60e51b815260206004820181905260248201526000805160206118fd833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610af18282611429565b5050565b600a546000906001600160a01b0316338114610b1057600080fd5b6001600160a01b038416610b2357600080fd5b33600090815260056020526040902054831115610b3f57600080fd5b610b4a33858561146e565b5060019392505050565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561062f5780601f106106045761010080835404028352916020019161062f565b610bde33610e0d565b610c195760405162461bcd60e51b815260040180806020018281038252603081526020018061188b6030913960400191505060405180910390fd5b610a32816115a0565b610c2b336115e8565b565b3360008181526006602090815260408083206001600160a01b038716845290915281205490916106469185906109d3908663ffffffff6111c916565b60006001600160a01b038316610c7e57600080fd5b33600090815260056020526040902054821115610c9a57600080fd5b6000610cb8620f424061075f600854866110ff90919063ffffffff16565b90506000610ccc848363ffffffff6111c916565b9050610cd933868361146e565b600a546001600160a01b031615610e0257600a546001600160a01b0316600090815260056020526040902054610d15908363ffffffff61122616565b600a80546001600160a01b0390811660009081526005602090815260409182902094909455915482518681529251911692339260008051602061193f833981519152929081900390910190a3610d69610b54565b6001600160a01b0316336001600160a01b031614610e0257600a5460408051636a15fe4960e01b81523360048201526024810187905290516001600160a01b0390921691636a15fe49916044808201926020929091908290030181600087803b158015610dd557600080fd5b505af1158015610de9573d6000803e3d6000fd5b505050506040513d6020811015610dff57600080fd5b50505b506001949350505050565b600061064a60018363ffffffff61163016565b600a546001600160a01b031681565b6000610e39610b63565b610e78576040805162461bcd60e51b815260206004820181905260248201526000805160206118fd833981519152604482015290519081900360640190fd5b600a546001600160a01b0316610eca576040805162461bcd60e51b81526020600482015260126024820152711b9bc8119959541bdbdb081cd95d081e595d60721b604482015290519081900360640190fd5b6001600160a01b038216610edd57600080fd5b6001600160a01b03821660009081526005602052604090205415610f0057600080fd5b50600a80546001600160a01b0390811660009081526005602052604080822080549083905584546001600160a01b03191695909316948517909355928352912055600190565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6000610f7b610b63565b610fba576040805162461bcd60e51b815260206004820181905260248201526000805160206118fd833981519152604482015290519081900360640190fd5b50600855600190565b610fcb610b63565b61100a576040805162461bcd60e51b815260206004820181905260248201526000805160206118fd833981519152604482015290519081900360640190fd5b610a3281611697565b6001600160a01b0383166110585760405162461bcd60e51b81526004018080602001828103825260248152602001806119a56024913960400191505060405180910390fd5b6001600160a01b03821661109d5760405162461bcd60e51b81526004018080602001828103825260228152602001806118696022913960400191505060405180910390fd5b6001600160a01b03808416600081815260066020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008261110e5750600061064a565b8282028284828161111b57fe5b04146111585760405162461bcd60e51b81526004018080602001828103825260218152602001806118dc6021913960400191505060405180910390fd5b9392505050565b60008082116111b5576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816111c057fe5b04949350505050565b600082821115611220576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611158576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0382166112db576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6007546112ee908263ffffffff61122616565b6007556001600160a01b03821660009081526005602052604090205461131a908263ffffffff61122616565b6001600160a01b038316600081815260056020908152604080832094909455835185815293519293919260008051602061193f8339815191529281900390910190a35050565b6001600160a01b0382166113a55760405162461bcd60e51b815260040180806020018281038252602181526020018061195f6021913960400191505060405180910390fd5b6007546113b8908263ffffffff6111c916565b6007556001600160a01b0382166000908152600560205260409020546113e4908263ffffffff6111c916565b6001600160a01b03831660008181526005602090815260408083209490945583518581529351919360008051602061193f833981519152929081900390910190a35050565b6114338282611360565b6001600160a01b038216600090815260066020908152604080832033808552925290912054610af19184916109d3908563ffffffff6111c916565b6001600160a01b0383166114b35760405162461bcd60e51b81526004018080602001828103825260258152602001806119806025913960400191505060405180910390fd5b6001600160a01b0382166114f85760405162461bcd60e51b81526004018080602001828103825260238152602001806118206023913960400191505060405180910390fd5b6001600160a01b038316600090815260056020526040902054611521908263ffffffff6111c916565b6001600160a01b038085166000908152600560205260408082209390935590841681522054611556908263ffffffff61122616565b6001600160a01b03808416600081815260056020908152604091829020949094558051858152905191939287169260008051602061193f83398151915292918290030190a3505050565b6115b160018263ffffffff61173716565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6115f960018263ffffffff6117b816565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b60006001600160a01b0382166116775760405162461bcd60e51b815260040180806020018281038252602281526020018061191d6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b0381166116dc5760405162461bcd60e51b81526004018080602001828103825260268152602001806118436026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6117418282611630565b15611793576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6117c28282611630565b6117fd5760405162461bcd60e51b81526004018080602001828103825260218152602001806118bb6021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff1916905556fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a72315820df4a841a69cac45d168096af4d7f6df6c3205a5faefe872f12721aba3e3c4e9364736f6c63430005110032526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063825b31b8116100f9578063a9059cbb11610097578063d367e2aa11610071578063d367e2aa1461050f578063dd62ed3e14610535578063f05d16f714610563578063f2fde38b14610580576101c4565b8063a9059cbb146104b5578063aa271e1a146104e1578063ae2e933b14610507576101c4565b806395d89b41116100d357806395d89b4114610453578063983b2d561461045b5780639865027514610481578063a457c2d714610489576101c4565b8063825b31b8146103fb5780638da5cb5b146104275780638f32d59b1461044b576101c4565b806339509351116101665780635f8c7fd8116101405780635f8c7fd81461039957806370a08231146103a1578063715018a6146103c757806379cc6790146103cf576101c4565b8063395093511461032257806340c10f191461034e57806342966c681461037a576101c4565b806319db2228116101a257806319db2228146102a057806323b872dd146102c65780632ff2e9dc146102fc578063313ce56714610304576101c4565b806306fdde03146101c9578063095ea7b31461024657806318160ddd14610286575b600080fd5b6101d16105a6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561020b5781810151838201526020016101f3565b50505050905090810190601f1680156102385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102726004803603604081101561025c57600080fd5b506001600160a01b038135169060200135610639565b604080519115158252519081900360200190f35b61028e610650565b60408051918252519081900360200190f35b610272600480360360208110156102b657600080fd5b50356001600160a01b0316610656565b610272600480360360608110156102dc57600080fd5b506001600160a01b038135811691602081013590911690604001356106d7565b61028e610988565b61030c61098e565b6040805160ff9092168252519081900360200190f35b6102726004803603604081101561033857600080fd5b506001600160a01b038135169060200135610997565b6102726004803603604081101561036457600080fd5b506001600160a01b0381351690602001356109d8565b6103976004803603602081101561039057600080fd5b5035610a28565b005b61028e610a35565b61028e600480360360208110156103b757600080fd5b50356001600160a01b0316610a3b565b610397610a56565b610397600480360360408110156103e557600080fd5b506001600160a01b038135169060200135610ae7565b6102726004803603604081101561041157600080fd5b506001600160a01b038135169060200135610af5565b61042f610b54565b604080516001600160a01b039092168252519081900360200190f35b610272610b63565b6101d1610b74565b6103976004803603602081101561047157600080fd5b50356001600160a01b0316610bd5565b610397610c22565b6102726004803603604081101561049f57600080fd5b506001600160a01b038135169060200135610c2d565b610272600480360360408110156104cb57600080fd5b506001600160a01b038135169060200135610c69565b610272600480360360208110156104f757600080fd5b50356001600160a01b0316610e0d565b61042f610e20565b6102726004803603602081101561052557600080fd5b50356001600160a01b0316610e2f565b61028e6004803603604081101561054b57600080fd5b506001600160a01b0381358116916020013516610f46565b6102726004803603602081101561057957600080fd5b5035610f71565b6103976004803603602081101561059657600080fd5b50356001600160a01b0316610fc3565b60028054604080516020601f600019610100600187161502019094168590049384018190048102820181019092528281526060939092909183018282801561062f5780601f106106045761010080835404028352916020019161062f565b820191906000526020600020905b81548152906001019060200180831161061257829003601f168201915b5050505050905090565b6000610646338484611013565b5060015b92915050565b60075490565b6000610660610b63565b61069f576040805162461bcd60e51b815260206004820181905260248201526000805160206118fd833981519152604482015290519081900360640190fd5b6001600160a01b0382166106b257600080fd5b50600a80546001600160a01b0383166001600160a01b03199091161790556001919050565b60006001600160a01b0383166106ec57600080fd5b6001600160a01b03841660009081526005602052604090205482111561071157600080fd5b6001600160a01b038416600090815260066020908152604080832033845290915290205482111561074157600080fd5b600061076b620f424061075f600854866110ff90919063ffffffff16565b9063ffffffff61115f16565b9050600061077f848363ffffffff6111c916565b6001600160a01b0387166000908152600560205260409020549091506107ab908563ffffffff6111c916565b6001600160a01b0380881660009081526005602052604080822093909355908716815220546107e0908263ffffffff61122616565b6001600160a01b038087166000908152600560209081526040808320949094559189168152600682528281203382529091522054610824908563ffffffff6111c916565b6001600160a01b038088166000818152600660209081526040808320338452825291829020949094558051888152905192891693919260008051602061193f833981519152929181900390910190a3600a546001600160a01b03161561097c57600a546001600160a01b03166000908152600560205260409020546108af908363ffffffff61122616565b600a80546001600160a01b0390811660009081526005602090815260409182902094909455915482518681529251911692339260008051602061193f833981519152929081900390910190a3600a5460408051636a15fe4960e01b81523360048201526024810187905290516001600160a01b0390921691636a15fe49916044808201926020929091908290030181600087803b15801561094f57600080fd5b505af1158015610963573d6000803e3d6000fd5b505050506040513d602081101561097957600080fd5b50505b50600195945050505050565b60095481565b60045460ff1690565b3360008181526006602090815260408083206001600160a01b038716845290915281205490916106469185906109d3908663ffffffff61122616565b611013565b60006109e333610e0d565b610a1e5760405162461bcd60e51b815260040180806020018281038252603081526020018061188b6030913960400191505060405180910390fd5b6106468383611280565b610a323382611360565b50565b60085481565b6001600160a01b031660009081526005602052604090205490565b610a5e610b63565b610a9d576040805162461bcd60e51b815260206004820181905260248201526000805160206118fd833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610af18282611429565b5050565b600a546000906001600160a01b0316338114610b1057600080fd5b6001600160a01b038416610b2357600080fd5b33600090815260056020526040902054831115610b3f57600080fd5b610b4a33858561146e565b5060019392505050565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561062f5780601f106106045761010080835404028352916020019161062f565b610bde33610e0d565b610c195760405162461bcd60e51b815260040180806020018281038252603081526020018061188b6030913960400191505060405180910390fd5b610a32816115a0565b610c2b336115e8565b565b3360008181526006602090815260408083206001600160a01b038716845290915281205490916106469185906109d3908663ffffffff6111c916565b60006001600160a01b038316610c7e57600080fd5b33600090815260056020526040902054821115610c9a57600080fd5b6000610cb8620f424061075f600854866110ff90919063ffffffff16565b90506000610ccc848363ffffffff6111c916565b9050610cd933868361146e565b600a546001600160a01b031615610e0257600a546001600160a01b0316600090815260056020526040902054610d15908363ffffffff61122616565b600a80546001600160a01b0390811660009081526005602090815260409182902094909455915482518681529251911692339260008051602061193f833981519152929081900390910190a3610d69610b54565b6001600160a01b0316336001600160a01b031614610e0257600a5460408051636a15fe4960e01b81523360048201526024810187905290516001600160a01b0390921691636a15fe49916044808201926020929091908290030181600087803b158015610dd557600080fd5b505af1158015610de9573d6000803e3d6000fd5b505050506040513d6020811015610dff57600080fd5b50505b506001949350505050565b600061064a60018363ffffffff61163016565b600a546001600160a01b031681565b6000610e39610b63565b610e78576040805162461bcd60e51b815260206004820181905260248201526000805160206118fd833981519152604482015290519081900360640190fd5b600a546001600160a01b0316610eca576040805162461bcd60e51b81526020600482015260126024820152711b9bc8119959541bdbdb081cd95d081e595d60721b604482015290519081900360640190fd5b6001600160a01b038216610edd57600080fd5b6001600160a01b03821660009081526005602052604090205415610f0057600080fd5b50600a80546001600160a01b0390811660009081526005602052604080822080549083905584546001600160a01b03191695909316948517909355928352912055600190565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6000610f7b610b63565b610fba576040805162461bcd60e51b815260206004820181905260248201526000805160206118fd833981519152604482015290519081900360640190fd5b50600855600190565b610fcb610b63565b61100a576040805162461bcd60e51b815260206004820181905260248201526000805160206118fd833981519152604482015290519081900360640190fd5b610a3281611697565b6001600160a01b0383166110585760405162461bcd60e51b81526004018080602001828103825260248152602001806119a56024913960400191505060405180910390fd5b6001600160a01b03821661109d5760405162461bcd60e51b81526004018080602001828103825260228152602001806118696022913960400191505060405180910390fd5b6001600160a01b03808416600081815260066020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008261110e5750600061064a565b8282028284828161111b57fe5b04146111585760405162461bcd60e51b81526004018080602001828103825260218152602001806118dc6021913960400191505060405180910390fd5b9392505050565b60008082116111b5576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816111c057fe5b04949350505050565b600082821115611220576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611158576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0382166112db576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6007546112ee908263ffffffff61122616565b6007556001600160a01b03821660009081526005602052604090205461131a908263ffffffff61122616565b6001600160a01b038316600081815260056020908152604080832094909455835185815293519293919260008051602061193f8339815191529281900390910190a35050565b6001600160a01b0382166113a55760405162461bcd60e51b815260040180806020018281038252602181526020018061195f6021913960400191505060405180910390fd5b6007546113b8908263ffffffff6111c916565b6007556001600160a01b0382166000908152600560205260409020546113e4908263ffffffff6111c916565b6001600160a01b03831660008181526005602090815260408083209490945583518581529351919360008051602061193f833981519152929081900390910190a35050565b6114338282611360565b6001600160a01b038216600090815260066020908152604080832033808552925290912054610af19184916109d3908563ffffffff6111c916565b6001600160a01b0383166114b35760405162461bcd60e51b81526004018080602001828103825260258152602001806119806025913960400191505060405180910390fd5b6001600160a01b0382166114f85760405162461bcd60e51b81526004018080602001828103825260238152602001806118206023913960400191505060405180910390fd5b6001600160a01b038316600090815260056020526040902054611521908263ffffffff6111c916565b6001600160a01b038085166000908152600560205260408082209390935590841681522054611556908263ffffffff61122616565b6001600160a01b03808416600081815260056020908152604091829020949094558051858152905191939287169260008051602061193f83398151915292918290030190a3505050565b6115b160018263ffffffff61173716565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6115f960018263ffffffff6117b816565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b60006001600160a01b0382166116775760405162461bcd60e51b815260040180806020018281038252602281526020018061191d6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b0381166116dc5760405162461bcd60e51b81526004018080602001828103825260268152602001806118436026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6117418282611630565b15611793576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6117c28282611630565b6117fd5760405162461bcd60e51b81526004018080602001828103825260218152602001806118bb6021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff1916905556fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a72315820df4a841a69cac45d168096af4d7f6df6c3205a5faefe872f12721aba3e3c4e9364736f6c63430005110032

Deployed Bytecode Sourcemap

22234:10334:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22234:10334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9414:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9414:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23171:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23171:148:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;22563:91;;;:::i;:::-;;;;;;;;;;;;;;;;28654:188;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28654:188:0;-1:-1:-1;;;;;28654:188:0;;:::i;31104:949::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31104:949:0;;;;;;;;;;;;;;;;;:::i;28023:50::-;;;:::i;10272:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23728:206;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23728:206:0;;;;;;;;:::i;32061:143::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;32061:143:0;;;;;;;;:::i;32319:81::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32319:81:0;;:::i;:::-;;27985:31;;;:::i;22717:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22717:110:0;-1:-1:-1;;;;;22717:110:0;;:::i;1654:140::-;;;:::i;32462:103::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;32462:103:0;;;;;;;;:::i;29585:272::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;29585:272:0;;;;;;;;:::i;843:79::-;;;:::i;:::-;;;;-1:-1:-1;;;;;843:79:0;;;;;;;;;;;;;;1209:92;;;:::i;9616:87::-;;;:::i;10894:92::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10894:92:0;-1:-1:-1;;;;;10894:92:0;;:::i;10994:77::-;;;:::i;24437:216::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24437:216:0;;;;;;;;:::i;30075:735::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30075:735:0;;;;;;;;:::i;10777:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10777:109:0;-1:-1:-1;;;;;10777:109:0;;:::i;28080:26::-;;;:::i;29041:487::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29041:487:0;-1:-1:-1;;;;;29041:487:0;;:::i;22890:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22890:134:0;;;;;;;;;;:::i;28393:130::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28393:130:0;;:::i;1949:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1949:109:0;-1:-1:-1;;;;;1949:109:0;;:::i;9414:83::-;9484:5;9477:12;;;;;;;-1:-1:-1;;9477:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9451:13;;9477:12;;9484:5;;9477:12;;9484:5;9477:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9414:83;:::o;23171:148::-;23236:4;23253:36;23262:10;23274:7;23283:5;23253:8;:36::i;:::-;-1:-1:-1;23307:4:0;23171:148;;;;;:::o;22563:91::-;22634:12;;22563:91;:::o;28654:188::-;28720:4;1055:9;:7;:9::i;:::-;1047:54;;;;;-1:-1:-1;;;1047:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1047:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28745:22:0;;28737:31;;;;;;-1:-1:-1;28781:7:0;:31;;-1:-1:-1;;;;;28781:31:0;;-1:-1:-1;;;;;;28781:31:0;;;;;;;28654:188;;;:::o;31104:949::-;31238:4;-1:-1:-1;;;;;31268:17:0;;31260:26;;;;;;-1:-1:-1;;;;;31315:16:0;;;;;;:9;:16;;;;;;31305:26;;;31297:35;;;;;;-1:-1:-1;;;;;31361:18:0;;;;;;:11;:18;;;;;;;;31380:10;31361:30;;;;;;;;31351:40;;;31343:49;;;;;;31405:11;31419:38;31451:5;31419:27;31430:15;;31419:6;:10;;:27;;;;:::i;:::-;:31;:38;:31;:38;:::i;:::-;31405:52;-1:-1:-1;31468:18:0;31489:15;:6;31405:52;31489:15;:10;:15;:::i;:::-;-1:-1:-1;;;;;31536:16:0;;;;;;:9;:16;;;;;;31468:36;;-1:-1:-1;31536:28:0;;31557:6;31536:28;:20;:28;:::i;:::-;-1:-1:-1;;;;;31517:16:0;;;;;;;:9;:16;;;;;;:47;;;;31592:14;;;;;;;:30;;31611:10;31592:30;:18;:30;:::i;:::-;-1:-1:-1;;;;;31575:14:0;;;;;;;:9;:14;;;;;;;;:47;;;;31666:18;;;;;:11;:18;;;;;31685:10;31666:30;;;;;;;:42;;31701:6;31666:42;:34;:42;:::i;:::-;-1:-1:-1;;;;;31633:18:0;;;;;;;:11;:18;;;;;;;;31652:10;31633:30;;;;;;;;:75;;;;31724:28;;;;;;;;;;;31633:18;;-1:-1:-1;;;;;;;;;;;31724:28:0;;;;;;;;;;31785:7;;-1:-1:-1;;;;;31785:7:0;31777:30;31773:251;;31872:7;;-1:-1:-1;;;;;31872:7:0;31854:27;;;;:9;:27;;;;;;:36;;31886:3;31854:36;:31;:36;:::i;:::-;31842:7;;;-1:-1:-1;;;;;31842:7:0;;;31824:27;;;;:9;:27;;;;;;;;;:66;;;;31939:7;;31910:43;;;;;;;31939:7;;;31919:10;;-1:-1:-1;;;;;;;;;;;31910:43:0;;;;;;;;;;31976:7;;:36;;;-1:-1:-1;;;31976:36:0;;31993:10;31976:36;;;;;;;;;;;;-1:-1:-1;;;;;31976:7:0;;;;:16;;:36;;;;;;;;;;;;;;;:7;;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;31976:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31976:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;31773:251:0;-1:-1:-1;32041:4:0;;31104:949;-1:-1:-1;;;;;31104:949:0:o;28023:50::-;;;;:::o;10272:83::-;10338:9;;;;10272:83;:::o;23728:206::-;23834:10;23808:4;23855:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;23855:32:0;;;;;;;;;;23808:4;;23825:79;;23846:7;;23855:48;;23892:10;23855:48;:36;:48;:::i;:::-;23825:8;:79::i;32061:143::-;32135:4;10676:20;10685:10;10676:8;:20::i;:::-;10668:81;;;;-1:-1:-1;;;10668:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32152:22;32158:7;32167:6;32152:5;:22::i;32319:81::-;32367:25;32373:10;32385:6;32367:5;:25::i;:::-;32319:81;:::o;27985:31::-;;;;:::o;22717:110::-;-1:-1:-1;;;;;22801:18:0;22774:7;22801:18;;;:9;:18;;;;;;;22717:110::o;1654:140::-;1055:9;:7;:9::i;:::-;1047:54;;;;;-1:-1:-1;;;1047:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1047:54:0;;;;;;;;;;;;;;;1753:1;1737:6;;1716:40;;-1:-1:-1;;;;;1737:6:0;;;;1716:40;;1753:1;;1716:40;1784:1;1767:19;;-1:-1:-1;;;;;;1767:19:0;;;1654:140::o;32462:103::-;32531:26;32541:7;32550:6;32531:9;:26::i;:::-;32462:103;;:::o;29585:272::-;29667:7;;29686:4;;-1:-1:-1;;;;;29667:7:0;28343:10;:21;;28335:30;;;;;;-1:-1:-1;;;;;29711:17:0;;29703:26;;;;;;29768:10;29758:21;;;;:9;:21;;;;;;29748:31;;;29740:40;;;;;;29793:34;29803:10;29815:3;29820:6;29793:9;:34::i;:::-;-1:-1:-1;29845:4:0;;29585:272;-1:-1:-1;;;29585:272:0:o;843:79::-;881:7;908:6;-1:-1:-1;;;;;908:6:0;843:79;:::o;1209:92::-;1249:4;1287:6;-1:-1:-1;;;;;1287:6:0;1273:10;:20;;1209:92::o;9616:87::-;9688:7;9681:14;;;;;;;;-1:-1:-1;;9681:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9655:13;;9681:14;;9688:7;;9681:14;;9688:7;9681:14;;;;;;;;;;;;;;;;;;;;;;;;10894:92;10676:20;10685:10;10676:8;:20::i;:::-;10668:81;;;;-1:-1:-1;;;10668:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10959:19;10970:7;10959:10;:19::i;10994:77::-;11038:25;11052:10;11038:13;:25::i;:::-;10994:77::o;24437:216::-;24548:10;24522:4;24569:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;24569:32:0;;;;;;;;;;24522:4;;24539:84;;24560:7;;24569:53;;24606:15;24569:53;:36;:53;:::i;30075:735::-;30138:4;-1:-1:-1;;;;;30163:17:0;;30155:26;;;;;;30220:10;30210:21;;;;:9;:21;;;;;;30200:31;;;30192:40;;;;;;30245:11;30259:38;30291:5;30259:27;30270:15;;30259:6;:10;;:27;;;;:::i;:38::-;30245:52;-1:-1:-1;30308:18:0;30329:15;:6;30245:52;30329:15;:10;:15;:::i;:::-;30308:36;;30425:38;30435:10;30447:3;30452:10;30425:9;:38::i;:::-;30488:7;;-1:-1:-1;;;;;30488:7:0;30480:30;30476:305;;30575:7;;-1:-1:-1;;;;;30575:7:0;30557:27;;;;:9;:27;;;;;;:36;;30589:3;30557:36;:31;:36;:::i;:::-;30545:7;;;-1:-1:-1;;;;;30545:7:0;;;30527:27;;;;:9;:27;;;;;;;;;:66;;;;30642:7;;30613:43;;;;;;;30642:7;;;30622:10;;-1:-1:-1;;;;;;;;;;;30613:43:0;;;;;;;;;;30689:7;:5;:7::i;:::-;-1:-1:-1;;;;;30675:21:0;:10;-1:-1:-1;;;;;30675:21:0;;30671:98;;30717:7;;:36;;;-1:-1:-1;;;30717:36:0;;30734:10;30717:36;;;;;;;;;;;;-1:-1:-1;;;;;30717:7:0;;;;:16;;:36;;;;;;;;;;;;;;;:7;;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;30717:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30717:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;30671:98:0;-1:-1:-1;30798:4:0;;30075:735;-1:-1:-1;;;;30075:735:0:o;10777:109::-;10833:4;10857:21;:8;10870:7;10857:21;:12;:21;:::i;28080:26::-;;;-1:-1:-1;;;;;28080:26:0;;:::o;29041:487::-;29113:4;1055:9;:7;:9::i;:::-;1047:54;;;;;-1:-1:-1;;;1047:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1047:54:0;;;;;;;;;;;;;;;29146:7;;-1:-1:-1;;;;;29146:7:0;29130:61;;;;;-1:-1:-1;;;29130:61:0;;;;;;;;;;;;-1:-1:-1;;;29130:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29210:25:0;;29202:34;;;;;;-1:-1:-1;;;;;29255:22:0;;;;;;:9;:22;;;;;;:27;29247:36;;;;;;-1:-1:-1;29343:7:0;;;-1:-1:-1;;;;;29343:7:0;;;29296:26;29325:27;;;:9;:27;;;;;;;;29363:34;;;;29408;;-1:-1:-1;;;;;;29408:34:0;;;;;;;;;;;29453:22;;;;;:43;-1:-1:-1;;29041:487:0:o;22890:134::-;-1:-1:-1;;;;;22989:18:0;;;22962:7;22989:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;22890:134::o;28393:130::-;28452:4;1055:9;:7;:9::i;:::-;1047:54;;;;;-1:-1:-1;;;1047:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1047:54:0;;;;;;;;;;;;;;;-1:-1:-1;28469:15:0;:24;28511:4;;28393:130::o;1949:109::-;1055:9;:7;:9::i;:::-;1047:54;;;;;-1:-1:-1;;;1047:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1047:54:0;;;;;;;;;;;;;;;2022:28;2041:8;2022:18;:28::i;27239:335::-;-1:-1:-1;;;;;27332:19:0;;27324:68;;;;-1:-1:-1;;;27324:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27411:21:0;;27403:68;;;;-1:-1:-1;;;27403:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27484:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;27535:31;;;;;;;;;;;;;;;;;27239:335;;;:::o;4125:470::-;4183:7;4427:6;4423:47;;-1:-1:-1;4457:1:0;4450:8;;4423:47;4494:5;;;4498:1;4494;:5;:1;4518:5;;;;;:10;4510:56;;;;-1:-1:-1;;;4510:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4586:1;4125:470;-1:-1:-1;;;4125:470:0:o;5063:333::-;5121:7;5220:1;5216;:5;5208:44;;;;;-1:-1:-1;;;5208:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5263:9;5279:1;5275;:5;;;;;;;5063:333;-1:-1:-1;;;;5063:333:0:o;3690:184::-;3748:7;3781:1;3776;:6;;3768:49;;;;;-1:-1:-1;;;3768:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3840:5:0;;;3690:184::o;3234:181::-;3292:7;3324:5;;;3348:6;;;;3340:46;;;;;-1:-1:-1;;;3340:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25853:308;-1:-1:-1;;;;;25929:21:0;;25921:65;;;;;-1:-1:-1;;;25921:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26014:12;;:24;;26031:6;26014:24;:16;:24;:::i;:::-;25999:12;:39;-1:-1:-1;;;;;26070:18:0;;;;;;:9;:18;;;;;;:30;;26093:6;26070:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;26049:18:0;;;;;;:9;:18;;;;;;;;:51;;;;26116:37;;;;;;;26049:18;;;;-1:-1:-1;;;;;;;;;;;26116:37:0;;;;;;;;;25853:308;;:::o;26493:306::-;-1:-1:-1;;;;;26568:21:0;;26560:67;;;;-1:-1:-1;;;26560:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26655:12;;:23;;26672:5;26655:23;:16;:23;:::i;:::-;26640:12;:38;-1:-1:-1;;;;;26710:18:0;;;;;;:9;:18;;;;;;:29;;26733:5;26710:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;26689:18:0;;;;;;:9;:18;;;;;;;;:50;;;;26755:36;;;;;;;26689:18;;-1:-1:-1;;;;;;;;;;;26755:36:0;;;;;;;;;;26493:306;;:::o;27759:188::-;27831:22;27837:7;27846:6;27831:5;:22::i;:::-;-1:-1:-1;;;;;27894:20:0;;;;;;:11;:20;;;;;;;;27882:10;27894:32;;;;;;;;;27864:75;;27873:7;;27894:44;;27931:6;27894:44;:36;:44;:::i;25143:429::-;-1:-1:-1;;;;;25241:20:0;;25233:70;;;;-1:-1:-1;;;25233:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25322:23:0;;25314:71;;;;-1:-1:-1;;;25314:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25418:17:0;;;;;;:9;:17;;;;;;:29;;25440:6;25418:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;25398:17:0;;;;;;;:9;:17;;;;;;:49;;;;25481:20;;;;;;;:32;;25506:6;25481:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;25458:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;25529:35;;;;;;;25458:20;;25529:35;;;;-1:-1:-1;;;;;;;;;;;25529:35:0;;;;;;;;25143:429;;;:::o;11079:122::-;11136:21;:8;11149:7;11136:21;:12;:21;:::i;:::-;11173:20;;-1:-1:-1;;;;;11173:20:0;;;;;;;;11079:122;:::o;11209:130::-;11269:24;:8;11285:7;11269:24;:15;:24;:::i;:::-;11309:22;;-1:-1:-1;;;;;11309:22:0;;;;;;;;11209:130;:::o;12129:203::-;12201:4;-1:-1:-1;;;;;12226:21:0;;12218:68;;;;-1:-1:-1;;;12218:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12304:20:0;:11;:20;;;;;;;;;;;;;;;12129:203::o;2164:229::-;-1:-1:-1;;;;;2238:22:0;;2230:73;;;;-1:-1:-1;;;2230:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2340:6;;;2319:38;;-1:-1:-1;;;;;2319:38:0;;;;2340:6;;;2319:38;;;2368:6;:17;;-1:-1:-1;;;;;;2368:17:0;-1:-1:-1;;;;;2368:17:0;;;;;;;;;;2164:229::o;11593:178::-;11671:18;11675:4;11681:7;11671:3;:18::i;:::-;11670:19;11662:63;;;;;-1:-1:-1;;;11662:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11736:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;11736:27:0;11759:4;11736:27;;;11593:178::o;11851:183::-;11931:18;11935:4;11941:7;11931:3;:18::i;:::-;11923:64;;;;-1:-1:-1;;;11923:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11998:20:0;12021:5;11998:20;;;;;;;;;;;:28;;-1:-1:-1;;11998:28:0;;;11851:183::o

Swarm Source

bzzr://df4a841a69cac45d168096af4d7f6df6c3205a5faefe872f12721aba3e3c4e93
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.