ETH Price: $3,390.34 (+1.66%)

Token

EBitcoin Token (EBT)
 

Overview

Max Total Supply

57,803 EBT

Holders

4

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Balance
2 EBT

Value
$0.00
0x3db97f316c64b1df057610fae1652a87abf4894f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
EBitcoin

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 7: EBitcoin.sol
pragma solidity ^0.5.0;

import "./ERC20.sol";
import "./ERC20Detailed.sol";
import "./ERC20Pow.sol";
import "./Ownable.sol";

/**
* @dev EBitcoin Token (EBT)
*/
contract EBitcoin is IERC20, ERC20, ERC20Detailed, ERC20Pow, Ownable {

    using SafeMath for uint256;

    struct BankAccount {
        uint256 balance;
        uint256 interestSettled;
        uint256 lastBlockNumber;
    }

    mapping (address => BankAccount) private _bankAccounts;

    //Suppose one block in 10 minutes, one day is 144
    uint256 private _interestInterval = 144;

    /**
    * @dev Init
    */
    constructor ()
        ERC20Detailed("EBitcoin Token", "EBT", 8)
        ERC20Pow(2**16, 2**232, 210000, 5000000000, 504, 60, 144)
    public {}

    /**
    * @dev Returns the amount of bank balance owned by `account`
    */
    function bankBalanceOf(address account) public view returns (uint256) {
        return _bankAccounts[account].balance;
    }

    /**
    * @dev Returns the amount of bank interes owned by `account`
    */
    function bankInterestOf(address account) public view returns (uint256) {

        // No interest without deposit
        BankAccount storage item = _bankAccounts[account];
        if(0 == item.balance)  return 0;

        // balance * day / 365 * 0.01
        uint256 blockNumber = getBlockCount();
        uint256 intervalCount = blockNumber.sub(item.lastBlockNumber).div(_interestInterval);
        uint256 interest = item.balance.mul(intervalCount).div(365).div(100);
        return interest.add(item.interestSettled);
    }

    /**
    * @dev Deposit `amount` tokens in the bank
    *
    * Returns a boolean value indicating whether the operation succeeded
    *
    * Emits a {Transfer} event.
    */
    function bankDeposit(uint256 amount) public returns (bool) {

        // Deducting balance
        uint256 balance = _getBalance(msg.sender);
        _setBalance(msg.sender, balance.sub(amount, "Token: bank deposit amount exceeds balance"));

        // If have a bank balance, need to calculate interest first
        BankAccount storage item = _bankAccounts[msg.sender];
        if (0 != item.balance) {

            // balance * day / 365 * 0.01
            uint256 blockNumber = getBlockCount();
            uint256 intervalCount = blockNumber.sub(item.lastBlockNumber).div(_interestInterval);
            uint256 interest = item.balance.mul(intervalCount).div(365).div(100);

            // Append
            item.balance = item.balance.add(amount);
            item.interestSettled = item.interestSettled.add(interest);
            item.lastBlockNumber = blockNumber;
        }
        else {

            // Init
            item.balance = amount;
            item.interestSettled = 0;
            item.lastBlockNumber = getBlockCount();
        }

        emit Transfer(msg.sender, address(0), amount);
        return true;
    }

    /**
    * @dev Withdrawal `amount` tokens in the bank
    *
    * Returns a boolean value indicating whether the operation succeeded
    *
    * Emits a {Transfer} event.
    */
    function bankWithdrawal(uint256 amount) public returns (bool) {

        // Bank balance greater than or equal amount
        BankAccount storage item = _bankAccounts[msg.sender];
        require(0 == amount || 0 != item.balance, "Token: withdrawal amount exceeds bank balance");

        // balance * day / 365 * 0.01
        uint256 blockNumber = getBlockCount();
        uint256 intervalCount = blockNumber.sub(item.lastBlockNumber).div(_interestInterval);
        uint256 interest = item.balance.mul(intervalCount).div(365).div(100);
        interest = interest.add(item.interestSettled);

        // Interest is enough to pay
        if (interest >= amount) {

            // Deducting interest
            item.lastBlockNumber = blockNumber;
            item.interestSettled = interest.sub(amount);

            // Transfer balance and increase total supply
            _setBalance(msg.sender, _getBalance(msg.sender).add(amount));
            _setTotalSupply(_getTotalSupply().add(amount));
        }
        else {

            // Deducting interest and bank balance
            uint256 remainAmount = amount.sub(interest);
            item.balance = item.balance.sub(remainAmount, "Token: withdrawal amount exceeds bank balance");
            item.lastBlockNumber = blockNumber;
            item.interestSettled = 0;

            // Transfer balance and increase total supply
            _setBalance(msg.sender, _getBalance(msg.sender).add(amount));
            _setTotalSupply(_getTotalSupply().add(interest));
        }

        emit Transfer(address(0), msg.sender, amount);
        return true;
    }

    /**
    * @dev Owner can transfer out any accidentally sent ERC20 tokens
    */
    function transferAnyERC20Token(address tokenAddress, uint256 amount) public onlyOwner returns (bool) {
        return IERC20(tokenAddress).transfer(getOwner(), amount);
    }
}

File 2 of 7: ERC20.sol
pragma solidity ^0.5.0;

import "./IERC20.sol";
import "./SafeMath.sol";

/**
* @dev ERC20.
*/
contract ERC20 is IERC20 {

    using SafeMath for uint256;

    uint256 private _totalSupply;

    mapping (address => uint256) private _balances;

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

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

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

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

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

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

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

    /**
    * @dev Atomically increases the allowance granted to `spender` by the caller.
    *
    * This is an alternative to {approve} that can be used as a mitigation for
    * problems described in {IERC20-approve}.
    *
    * Emits an {Approval} event indicating the updated allowance.
    *
    * Requirements:
    *
    * - `spender` cannot be the zero address.
    */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(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, "ERC20: decreased allowance below zero"));
        return true;
    }

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

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

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

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

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

    /**
    * @dev Internal method
    */
    function _getTotalSupply() internal view returns (uint256) {
        return _totalSupply;
    }

    /**
    * @dev Internal method
    */
    function _setTotalSupply(uint256 value) internal {
        _totalSupply = value;
    }

    /**
    * @dev Internal method
    */
    function _getBalance(address account) internal view returns (uint256) {
        return _balances[account];
    }

    /**
    * @dev Internal method
    */
    function _setBalance(address account, uint256 value) internal {
        _balances[account] = value;
    }
}

File 3 of 7: ERC20Detailed.sol
pragma solidity ^0.5.0;

import "./ERC20.sol";

/**
* @dev Optional functions from the ERC20 standard.
*/
contract ERC20Detailed is ERC20 {

    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: 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;
    }
}

File 4 of 7: ERC20Pow.sol
pragma solidity ^0.5.0;

import "./SafeMath.sol";
import "./ERC20.sol";

/**
* @dev ERC20Pow
*/
contract ERC20Pow is ERC20 {

    using SafeMath for uint256;

    // recommended value is 2**16
    uint256 private _MINIMUM_TARGET;

    // a big number is easier, bitcoin uses 2**224
    uint256 private _MAXIMUM_TARGET;

    // Reward halving interval, bitcoin uses 210000
    uint256 private _REWARD_INTERVAL;

    // Difficulty adjustment interval, bitcoin uses 2016
    uint256 private _BLOCKS_PER_READJUSTMENT;

    // Suppose the block is 10 minutes, the ETH block is 10 seconds, then the value is 600/10=60
    uint256 private _ETHBLOCK_EXCHANGERATE;

    // Urgent adjustment threshold
    uint256 private _URGENTADJUST_THRESHOLD;

    // Block count
    uint256 private _blockCount;

    // Block reward, bitcoin uses 5000000000
    uint256 private _blockReward;

    // Mining related
    uint256 private _miningTarget;
    bytes32 private _challengeNumber;

    // Prevent duplication
    mapping(bytes32 => bytes32) private _solutionForChallenge;

    // Calculate the time interval
    uint256 private _latestDifficultyPeriodStarted;

    /**
    * @dev Init
    */
    constructor (
        uint256 minimumTarget,
        uint256 maximumTarget,
        uint256 rewardInterval,
        uint256 blockReward,
        uint256 blocksPerReadjustment,
        uint256 ethBlockExchangeRate,
        uint256 urgentAdjustThreshold
    ) public {
        _MINIMUM_TARGET = minimumTarget;
        _MAXIMUM_TARGET = maximumTarget;
        _REWARD_INTERVAL = rewardInterval;
        _BLOCKS_PER_READJUSTMENT = blocksPerReadjustment;
        _ETHBLOCK_EXCHANGERATE = ethBlockExchangeRate;
        _URGENTADJUST_THRESHOLD = urgentAdjustThreshold;
        _blockReward = blockReward;
        _miningTarget = _MAXIMUM_TARGET;
        _latestDifficultyPeriodStarted = uint256(block.number);
        _newMiningBlock();
    }

    /**
    * @dev Current block number
    */
    function getBlockCount() public view returns (uint256) {
        return _blockCount;
    }

    /**
    * @dev Current challenge number
    */
    function getChallengeNumber() public view returns (bytes32) {
        return _challengeNumber;
    }

    /**
    * @dev Current mining difficulty
    */
    function getMiningDifficulty() public view returns (uint256) {
        return _MAXIMUM_TARGET.div(_miningTarget);
    }

    /**
    * @dev Current mining target
    */
    function getMiningTarget() public view returns (uint256) {
        return _miningTarget;
    }

    /**
    * @dev Current mining reward
    */
    function getMiningReward() public view returns (uint256) {
        return _blockReward;
    }

    /**
    * @dev Submit proof
    * Emits a {SubmitProof} event
    */
    function submitProof(uint256 nonce, bytes32 challengeDigest) public returns (bool) {

        // Calculated hash
        bytes32 digest = keccak256(abi.encodePacked(_challengeNumber, msg.sender, nonce));

        // Verify digest
        require(digest == challengeDigest, "ERC20Pow: invalid params");
        require(uint256(digest) <= _miningTarget, "ERC20Pow: invalid nonce");

        // Prevent duplication
        bytes32 solution = _solutionForChallenge[_challengeNumber];
        _solutionForChallenge[_challengeNumber] = digest;
        require(solution == bytes32(0), "ERC20Pow: already exists");

        // Mint
        if (0 != _blockReward) {
            _mint(msg.sender, _blockReward);
        }

        // Next round of challenges
        _newMiningBlock();

        emit SubmitProof(msg.sender, _miningTarget, _challengeNumber);
        return true;
    }

    /**
    * @dev Urgent adjust difficulty
    * When the hash power suddenly drops sharply, the difficulty can be reduced
    * Emits a {UrgentAdjustDifficulty} event
    */
    function urgentAdjustDifficulty() public returns (bool) {

        // Must greatly exceed expectations
        uint256 targetEthBlocksPerDiffPeriod = _BLOCKS_PER_READJUSTMENT.mul(_ETHBLOCK_EXCHANGERATE);
        uint256 ethBlocksSinceLastDifficultyPeriod = uint256(block.number).sub(_latestDifficultyPeriodStarted);
        require(ethBlocksSinceLastDifficultyPeriod.div(targetEthBlocksPerDiffPeriod) > _URGENTADJUST_THRESHOLD, "ERC20Pow: invalid operation");

        _reAdjustDifficulty();
        _newChallengeNumber();

        emit UrgentAdjustDifficulty(msg.sender, _miningTarget, _challengeNumber);
        return true;
    }

    /**
    * @dev internal
    */
    function _newChallengeNumber() internal {
        _challengeNumber = keccak256(abi.encodePacked(blockhash(block.number - 1), msg.sender));
    }

    /**
    * @dev internal
    */
    function _newMiningBlock() internal {

        // Block number + 1
        _blockCount = _blockCount.add(1);

        // Block reward is cut in half
        if (0 == _blockCount.mod(_REWARD_INTERVAL)) {
            _blockReward = _blockReward.div(2);
        }

        // Re-Adjust difficulty
        if(0 == _blockCount.mod(_BLOCKS_PER_READJUSTMENT)) {
            _reAdjustDifficulty();
        }

        // Generate challenge number
        _newChallengeNumber();
    }

    /**
    * @dev internal
    */
    function _reAdjustDifficulty() internal {

        uint256 targetEthBlocksPerDiffPeriod = _BLOCKS_PER_READJUSTMENT.mul(_ETHBLOCK_EXCHANGERATE);
        uint256 ethBlocksSinceLastDifficultyPeriod = uint256(block.number).sub(_latestDifficultyPeriodStarted);

        // If there were less eth blocks passed in time than expected
        if (ethBlocksSinceLastDifficultyPeriod < targetEthBlocksPerDiffPeriod) {

            // Increase difficulty
            uint256 excessBlockPct = targetEthBlocksPerDiffPeriod.mul(100).div(ethBlocksSinceLastDifficultyPeriod);

            // Range 0 - 1000
            uint256 excessBlockPctExtra = excessBlockPct.sub(100);
            if(excessBlockPctExtra > 1000) excessBlockPctExtra = 1000;

            // Up to 50%
            _miningTarget = _miningTarget.sub(_miningTarget.div(2000).mul(excessBlockPctExtra));
        }
        else if(ethBlocksSinceLastDifficultyPeriod > targetEthBlocksPerDiffPeriod) {

            // Reduce difficulty
            uint256 shortageBlockPct = ethBlocksSinceLastDifficultyPeriod.mul(100).div(targetEthBlocksPerDiffPeriod);

            // Range 0 - 1000
            uint256 shortageBlockPctExtra = shortageBlockPct.sub(100);
            if(shortageBlockPctExtra > 1000) shortageBlockPctExtra = 1000;

            // Up to 50%
            _miningTarget = _miningTarget.add(_miningTarget.div(2000).mul(shortageBlockPctExtra));
        }

        if(_miningTarget < _MINIMUM_TARGET) _miningTarget = _MINIMUM_TARGET;
        if(_miningTarget > _MAXIMUM_TARGET) _miningTarget = _MAXIMUM_TARGET;
        _latestDifficultyPeriodStarted = block.number;
    }

    /**
    * @dev Emitted when new challenge number
    */
    event SubmitProof(address indexed miner, uint256 newMiningTarget, bytes32 newChallengeNumber);
    event UrgentAdjustDifficulty(address indexed miner, uint256 newMiningTarget, bytes32 newChallengeNumber);
}

File 5 of 7: IERC20.sol
pragma solidity ^0.5.0;

/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see {ERC20Detailed}.
*/
interface IERC20 {

    /**
    * @dev Returns the amount of tokens in existence.
    */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

File 6 of 7: Ownable.sol
pragma solidity ^0.5.0;

/**
* @dev Ownable authentication.
*/
contract Ownable {

    /**
    * @dev Owner account.
    */
    address private _owner;

    /**
    * @dev Init owner as the contract creator.
    */
    constructor() public {
        _owner = msg.sender;
    }

    /**
    * @dev Owner authentication.
    */
    modifier onlyOwner() {
        require(msg.sender == _owner, "Ownable: authentication failed");
        _;
    }

    /**
    * @dev Get current owner.
    */
    function getOwner() public view returns (address) {
        return _owner;
    }

    /**
    * @dev Transfer owner.
    */
    function transferOwnership(address newOwner) public onlyOwner {
        require(_owner != newOwner, "Ownable: transfer ownership new owner and old owner are the same");
        address oldOwner = _owner; _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    /**
    * @dev Event transfer owner.
    */
    event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);
}

File 7 of 7: SafeMath.sol
pragma solidity ^0.5.0;

/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {

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

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

    /**
    * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
    * overflow (when the result is negative).
    *
    * Counterpart to Solidity's `-` operator.
    *
    * Requirements:
    * - Subtraction cannot overflow.
    *
    * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
    * @dev Get it via `npm install @openzeppelin/contracts@next`.
    */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }

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

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

    /**
    * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
    * division by zero. The result is rounded towards zero.
    *
    * Counterpart to Solidity's `/` operator. Note: this function uses a
    * `revert` opcode (which leaves remaining gas untouched) while Solidity
    * uses an invalid opcode to revert (consuming all remaining gas).
    *
    * Requirements:
    * - The divisor cannot be zero.
    * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
    * @dev Get it via `npm install @openzeppelin/contracts@next`.
    */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

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

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

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":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"uint256","name":"newMiningTarget","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newChallengeNumber","type":"bytes32"}],"name":"SubmitProof","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"uint256","name":"newMiningTarget","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newChallengeNumber","type":"bytes32"}],"name":"UrgentAdjustDifficulty","type":"event"},{"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":"amount","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":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"bankBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bankDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"bankInterestOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bankWithdrawal","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":"getBlockCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getChallengeNumber","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMiningDifficulty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMiningReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMiningTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challengeDigest","type":"bytes32"}],"name":"submitProof","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAnyERC20Token","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"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":false,"inputs":[],"name":"urgentAdjustDifficulty","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405260906014553480156200001657600080fd5b50620100007d0100000000000000000000000000000000000000000000000000000000006203345064012a05f2006101f8603c60906040518060400160405280600e81526020017f45426974636f696e20546f6b656e0000000000000000000000000000000000008152506040518060400160405280600381526020017f454254000000000000000000000000000000000000000000000000000000000081525060088260039080519060200190620000d1929190620007a9565b508151620000e7906004906020850190620007a9565b506005805460ff191660ff9290921691909117905550506006879055600786905560088590556009839055600a829055600b819055600d849055600e869055436011556200013462000154565b5050601280546001600160a01b03191633179055506200084e9350505050565b620001716001600c546200020660201b62001ae31790919060201c565b600c8190555062000195600854600c546200028460201b62001c041790919060201c565b620001bb57620001b76002600d54620002ce60201b620013791790919060201c565b600d555b620001d9600954600c546200028460201b62001c041790919060201c565b620001f157620001f16001600160e01b036200031816565b620002046001600160e01b03620004f816565b565b6000828201838110156200027b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b60006200027b83836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506200052f60201b60201c565b60006200027b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620005ed60201b60201c565b600062000338600a546009546200067060201b620012bd1790919060201c565b905060006200035860115443620006e860201b620013371790919060201c565b905081811015620004285760006200039982620003856064866200067060201b620012bd1790919060201c565b620002ce60201b620013791790919060201c565b90506000620003b8606483620006e860201b620013371790919060201c565b90506103e8811115620003ca57506103e85b6200041c6200040582620003f16107d0600e54620002ce60201b620013791790919060201c565b6200067060201b620012bd1790919060201c565b600e54620006e860201b620013371790919060201c565b600e5550620004c89050565b81811115620004c85760006200045383620003856064856200067060201b620012bd1790919060201c565b9050600062000472606483620006e860201b620013371790919060201c565b90506103e88111156200048457506103e85b620004c2620004ab82620003f16107d0600e54620002ce60201b620013791790919060201c565b600e546200020660201b62001ae31790919060201c565b600e5550505b600654600e541015620004dc57600654600e555b600754600e541115620004f057600754600e555b505043601155565b604080516000194301406020808301919091523360601b828401528251603481840301815260549092019092528051910120600f55565b60008183620005d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200059d57818101518382015260200162000583565b50505050905090810190601f168015620005cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50828481620005e457fe5b06949350505050565b6000818362000659576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200059d57818101518382015260200162000583565b5060008385816200066657fe5b0495945050505050565b60008262000681575060006200027e565b828202828482816200068f57fe5b04146200027b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180620027096021913960400191505060405180910390fd5b60006200027b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506200073260201b60201c565b60008184841115620007a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200059d57818101518382015260200162000583565b505050900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620007ec57805160ff19168380011785556200081c565b828001600101855582156200081c579182015b828111156200081c578251825591602001919060010190620007ff565b506200082a9291506200082e565b5090565b6200084b91905b808211156200082a576000815560010162000835565b90565b611eab806200085e6000396000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c806365513fe5116100ee578063a457c2d711610097578063d281d05111610071578063d281d051146104da578063dc39d06d146104f7578063dd62ed3e14610530578063f2fde38b1461056b576101a3565b8063a457c2d714610460578063a9059cbb14610499578063cc0bd62e146104d2576101a3565b8063893d20e8116100c8578063893d20e81461040a57806395d89b411461043b5780639781e42514610443576101a3565b806365513fe51461037157806370a08231146103a457806372c24707146103d7576101a3565b80632f19c56a11610150578063395093511161012a5780633950935114610328578063490203a7146103615780634ef3762814610369576101a3565b80632f19c56a146102df578063313ce5671461030257806332e9970814610320576101a3565b806317da485f1161018157806317da485f1461027a57806318160ddd1461029457806323b872dd1461029c576101a3565b806306df7bf8146101a857806306fdde03146101c4578063095ea7b314610241575b600080fd5b6101b06105a0565b604080519115158252519081900360200190f35b6101cc6106b0565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102065781810151838201526020016101ee565b50505050905090810190601f1680156102335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101b06004803603604081101561025757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610764565b61028261077b565b60408051918252519081900360200190f35b610282610799565b6101b0600480360360608110156102b257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135909116906040013561079f565b6101b0600480360360408110156102f557600080fd5b508035906020013561081b565b61030a610a21565b6040805160ff9092168252519081900360200190f35b610282610a2a565b6101b06004803603604081101561033e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a30565b610282610a79565b610282610a7f565b6102826004803603602081101561038757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610a85565b610282600480360360208110156103ba57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610ab1565b610282600480360360208110156103ed57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610ad9565b610412610b8e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101cc610baa565b6101b06004803603602081101561045957600080fd5b5035610c29565b6101b06004803603604081101561047657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610e1a565b6101b0600480360360408110156104af57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610e7c565b610282610e89565b6101b0600480360360208110156104f057600080fd5b5035610e8f565b6101b06004803603604081101561050d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610fca565b6102826004803603604081101561054657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611114565b61059e6004803603602081101561058157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661114c565b005b6000806105ba600a546009546112bd90919063ffffffff16565b905060006105d36011544361133790919063ffffffff16565b600b549091506105e9828463ffffffff61137916565b1161065557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4552433230506f773a20696e76616c6964206f7065726174696f6e0000000000604482015290519081900360640190fd5b61065d6113bb565b61066561151e565b600e54600f54604080519283526020830191909152805133927fc3c2c7df5864b73a3622c8526c958de28ab4a4d93818f9db93c34285a4a2a41592908290030190a260019250505090565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561075a5780601f1061072f5761010080835404028352916020019161075a565b820191906000526020600020905b81548152906001019060200180831161073d57829003601f168201915b5050505050905090565b6000610771338484611573565b5060015b92915050565b6000610794600e5460075461137990919063ffffffff16565b905090565b60005490565b60006107ac8484846116ba565b610811843361080c85604051806060016040528060288152602001611db46028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600260209081526040808320338452909152902054919063ffffffff61188d16565b611573565b5060019392505050565b600f54604080516020808201939093523360601b81830152605480820186905282518083039091018152607490910190915280519101206000908281146108c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4552433230506f773a20696e76616c696420706172616d730000000000000000604482015290519081900360640190fd5b600e5481111561093457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4552433230506f773a20696e76616c6964206e6f6e6365000000000000000000604482015290519081900360640190fd5b600f54600090815260106020526040902080549082905580156109b857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4552433230506f773a20616c7265616479206578697374730000000000000000604482015290519081900360640190fd5b600d54156109cc576109cc33600d5461193e565b6109d4611a70565b600e54600f54604080519283526020830191909152805133927f9bc9e6ae57db5b0044f2ba7b7a5914dd4b8f17778511a9a91dda3466452afa6192908290030190a2506001949350505050565b60055460ff1690565b600e5490565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161077191859061080c908663ffffffff611ae316565b600d5490565b600f5490565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601360205260409020545b919050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff811660009081526013602052604081208054610b0e576000915050610aac565b6000610b18610e89565b90506000610b45601454610b3985600201548561133790919063ffffffff16565b9063ffffffff61137916565b90506000610b6b6064610b3961016d610b398689600001546112bd90919063ffffffff16565b9050610b84846001015482611ae390919063ffffffff16565b9695505050505050565b60125473ffffffffffffffffffffffffffffffffffffffff1690565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561075a5780601f1061072f5761010080835404028352916020019161075a565b336000908152601360205260408120821580610c455750805415155b610c9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180611e25602d913960400191505060405180910390fd5b6000610ca4610e89565b90506000610cc5601454610b3985600201548561133790919063ffffffff16565b90506000610ceb6064610b3961016d610b398689600001546112bd90919063ffffffff16565b9050610d04846001015482611ae390919063ffffffff16565b9050858110610d645760028401839055610d24818763ffffffff61133716565b6001850155610d4b33610d4688610d3a83610ab1565b9063ffffffff611ae316565b611b57565b610d5f610d5a87610d3a610799565b611b80565b610dd6565b6000610d76878363ffffffff61133716565b9050610da4816040518060600160405280602d8152602001611e25602d91398754919063ffffffff61188d16565b85556002850184905560006001860155610dc533610d4689610d3a83610ab1565b610dd4610d5a83610d3a610799565b505b60408051878152905133916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350600195945050505050565b6000610771338461080c85604051806060016040528060258152602001611e526025913933600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d168452909152902054919063ffffffff61188d16565b60006107713384846116ba565b600c5490565b600080610e9b33610ab1565b9050610ecc33610d46856040518060600160405280602a8152602001611ce1602a913985919063ffffffff61188d16565b336000908152601360205260409020805415610f70576000610eec610e89565b90506000610f0d601454610b3985600201548561133790919063ffffffff16565b90506000610f336064610b3961016d610b398689600001546112bd90919063ffffffff16565b8454909150610f48908863ffffffff611ae316565b84556001840154610f5f908263ffffffff611ae316565b600185015550506002820155610f88565b83815560006001820155610f82610e89565b60028201555b60408051858152905160009133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35060019392505050565b60125460009073ffffffffffffffffffffffffffffffffffffffff16331461105357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4f776e61626c653a2061757468656e7469636174696f6e206661696c65640000604482015290519081900360640190fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611077610b8e565b846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110e157600080fd5b505af11580156110f5573d6000803e3d6000fd5b505050506040513d602081101561110b57600080fd5b50519392505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b60125473ffffffffffffffffffffffffffffffffffffffff1633146111d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4f776e61626c653a2061757468656e7469636174696f6e206661696c65640000604482015290519081900360640190fd5b60125473ffffffffffffffffffffffffffffffffffffffff82811691161415611246576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526040815260200180611d536040913960400191505060405180910390fd5b6012805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826112cc57506000610775565b828202828482816112d957fe5b0414611330576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180611d936021913960400191505060405180910390fd5b9392505050565b600061133083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061188d565b600061133083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611b85565b60006113d4600a546009546112bd90919063ffffffff16565b905060006113ed6011544361133790919063ffffffff16565b90508181101561147857600061140e82610b3985606463ffffffff6112bd16565b9050600061142382606463ffffffff61133716565b90506103e881111561143457506103e85b61146d61145e826114526107d0600e5461137990919063ffffffff16565b9063ffffffff6112bd16565b600e549063ffffffff61133716565b600e55506114f09050565b818111156114f057600061149783610b3984606463ffffffff6112bd16565b905060006114ac82606463ffffffff61133716565b90506103e88111156114bd57506103e85b6114ea6114db826114526107d0600e5461137990919063ffffffff16565b600e549063ffffffff611ae316565b600e5550505b600654600e54101561150357600654600e555b600754600e54111561151657600754600e555b505043601155565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4301406020808301919091523360601b828401528251603481840301815260549092019092528051910120600f55565b73ffffffffffffffffffffffffffffffffffffffff83166115df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180611e016024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661164b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611d0b6022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316611726576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611ddc6025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611792576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611cbe6023913960400191505060405180910390fd5b6117e281604051806060016040528060268152602001611d2d6026913973ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040902054919063ffffffff61188d16565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160205260408082209390935590841681522054611824908263ffffffff611ae316565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611936576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156118fb5781810151838201526020016118e3565b50505050905090810190601f1680156119285780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b73ffffffffffffffffffffffffffffffffffffffff82166119c057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6000546119d3908263ffffffff611ae316565b600090815573ffffffffffffffffffffffffffffffffffffffff8316815260016020526040902054611a0b908263ffffffff611ae316565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600c54611a8490600163ffffffff611ae316565b600c819055600854611a9c919063ffffffff611c0416565b611ab857600d54611ab490600263ffffffff61137916565b600d555b600954600c54611acd9163ffffffff611c0416565b611ad957611ad96113bb565b611ae161151e565b565b60008282018381101561133057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff909116600090815260016020526040902055565b600055565b60008183611bee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156118fb5781810151838201526020016118e3565b506000838581611bfa57fe5b0495945050505050565b600061133083836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f000000000000000081525060008183611caa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156118fb5781810151838201526020016118e3565b50828481611cb457fe5b0694935050505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373546f6b656e3a2062616e6b206465706f73697420616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654f776e61626c653a207472616e73666572206f776e657273686970206e6577206f776e657220616e64206f6c64206f776e657220617265207468652073616d65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373546f6b656e3a207769746864726177616c20616d6f756e7420657863656564732062616e6b2062616c616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820ae71d5392e9961f62d0e91dfdcdef9464b3c1ba09c7d9e049a03e3fe204ae53664736f6c634300050c0032536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a35760003560e01c806365513fe5116100ee578063a457c2d711610097578063d281d05111610071578063d281d051146104da578063dc39d06d146104f7578063dd62ed3e14610530578063f2fde38b1461056b576101a3565b8063a457c2d714610460578063a9059cbb14610499578063cc0bd62e146104d2576101a3565b8063893d20e8116100c8578063893d20e81461040a57806395d89b411461043b5780639781e42514610443576101a3565b806365513fe51461037157806370a08231146103a457806372c24707146103d7576101a3565b80632f19c56a11610150578063395093511161012a5780633950935114610328578063490203a7146103615780634ef3762814610369576101a3565b80632f19c56a146102df578063313ce5671461030257806332e9970814610320576101a3565b806317da485f1161018157806317da485f1461027a57806318160ddd1461029457806323b872dd1461029c576101a3565b806306df7bf8146101a857806306fdde03146101c4578063095ea7b314610241575b600080fd5b6101b06105a0565b604080519115158252519081900360200190f35b6101cc6106b0565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102065781810151838201526020016101ee565b50505050905090810190601f1680156102335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101b06004803603604081101561025757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610764565b61028261077b565b60408051918252519081900360200190f35b610282610799565b6101b0600480360360608110156102b257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135909116906040013561079f565b6101b0600480360360408110156102f557600080fd5b508035906020013561081b565b61030a610a21565b6040805160ff9092168252519081900360200190f35b610282610a2a565b6101b06004803603604081101561033e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a30565b610282610a79565b610282610a7f565b6102826004803603602081101561038757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610a85565b610282600480360360208110156103ba57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610ab1565b610282600480360360208110156103ed57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610ad9565b610412610b8e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101cc610baa565b6101b06004803603602081101561045957600080fd5b5035610c29565b6101b06004803603604081101561047657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610e1a565b6101b0600480360360408110156104af57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610e7c565b610282610e89565b6101b0600480360360208110156104f057600080fd5b5035610e8f565b6101b06004803603604081101561050d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610fca565b6102826004803603604081101561054657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611114565b61059e6004803603602081101561058157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661114c565b005b6000806105ba600a546009546112bd90919063ffffffff16565b905060006105d36011544361133790919063ffffffff16565b600b549091506105e9828463ffffffff61137916565b1161065557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4552433230506f773a20696e76616c6964206f7065726174696f6e0000000000604482015290519081900360640190fd5b61065d6113bb565b61066561151e565b600e54600f54604080519283526020830191909152805133927fc3c2c7df5864b73a3622c8526c958de28ab4a4d93818f9db93c34285a4a2a41592908290030190a260019250505090565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561075a5780601f1061072f5761010080835404028352916020019161075a565b820191906000526020600020905b81548152906001019060200180831161073d57829003601f168201915b5050505050905090565b6000610771338484611573565b5060015b92915050565b6000610794600e5460075461137990919063ffffffff16565b905090565b60005490565b60006107ac8484846116ba565b610811843361080c85604051806060016040528060288152602001611db46028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600260209081526040808320338452909152902054919063ffffffff61188d16565b611573565b5060019392505050565b600f54604080516020808201939093523360601b81830152605480820186905282518083039091018152607490910190915280519101206000908281146108c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4552433230506f773a20696e76616c696420706172616d730000000000000000604482015290519081900360640190fd5b600e5481111561093457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4552433230506f773a20696e76616c6964206e6f6e6365000000000000000000604482015290519081900360640190fd5b600f54600090815260106020526040902080549082905580156109b857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4552433230506f773a20616c7265616479206578697374730000000000000000604482015290519081900360640190fd5b600d54156109cc576109cc33600d5461193e565b6109d4611a70565b600e54600f54604080519283526020830191909152805133927f9bc9e6ae57db5b0044f2ba7b7a5914dd4b8f17778511a9a91dda3466452afa6192908290030190a2506001949350505050565b60055460ff1690565b600e5490565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161077191859061080c908663ffffffff611ae316565b600d5490565b600f5490565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601360205260409020545b919050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff811660009081526013602052604081208054610b0e576000915050610aac565b6000610b18610e89565b90506000610b45601454610b3985600201548561133790919063ffffffff16565b9063ffffffff61137916565b90506000610b6b6064610b3961016d610b398689600001546112bd90919063ffffffff16565b9050610b84846001015482611ae390919063ffffffff16565b9695505050505050565b60125473ffffffffffffffffffffffffffffffffffffffff1690565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561075a5780601f1061072f5761010080835404028352916020019161075a565b336000908152601360205260408120821580610c455750805415155b610c9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180611e25602d913960400191505060405180910390fd5b6000610ca4610e89565b90506000610cc5601454610b3985600201548561133790919063ffffffff16565b90506000610ceb6064610b3961016d610b398689600001546112bd90919063ffffffff16565b9050610d04846001015482611ae390919063ffffffff16565b9050858110610d645760028401839055610d24818763ffffffff61133716565b6001850155610d4b33610d4688610d3a83610ab1565b9063ffffffff611ae316565b611b57565b610d5f610d5a87610d3a610799565b611b80565b610dd6565b6000610d76878363ffffffff61133716565b9050610da4816040518060600160405280602d8152602001611e25602d91398754919063ffffffff61188d16565b85556002850184905560006001860155610dc533610d4689610d3a83610ab1565b610dd4610d5a83610d3a610799565b505b60408051878152905133916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350600195945050505050565b6000610771338461080c85604051806060016040528060258152602001611e526025913933600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d168452909152902054919063ffffffff61188d16565b60006107713384846116ba565b600c5490565b600080610e9b33610ab1565b9050610ecc33610d46856040518060600160405280602a8152602001611ce1602a913985919063ffffffff61188d16565b336000908152601360205260409020805415610f70576000610eec610e89565b90506000610f0d601454610b3985600201548561133790919063ffffffff16565b90506000610f336064610b3961016d610b398689600001546112bd90919063ffffffff16565b8454909150610f48908863ffffffff611ae316565b84556001840154610f5f908263ffffffff611ae316565b600185015550506002820155610f88565b83815560006001820155610f82610e89565b60028201555b60408051858152905160009133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35060019392505050565b60125460009073ffffffffffffffffffffffffffffffffffffffff16331461105357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4f776e61626c653a2061757468656e7469636174696f6e206661696c65640000604482015290519081900360640190fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611077610b8e565b846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110e157600080fd5b505af11580156110f5573d6000803e3d6000fd5b505050506040513d602081101561110b57600080fd5b50519392505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b60125473ffffffffffffffffffffffffffffffffffffffff1633146111d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4f776e61626c653a2061757468656e7469636174696f6e206661696c65640000604482015290519081900360640190fd5b60125473ffffffffffffffffffffffffffffffffffffffff82811691161415611246576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526040815260200180611d536040913960400191505060405180910390fd5b6012805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826112cc57506000610775565b828202828482816112d957fe5b0414611330576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180611d936021913960400191505060405180910390fd5b9392505050565b600061133083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061188d565b600061133083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611b85565b60006113d4600a546009546112bd90919063ffffffff16565b905060006113ed6011544361133790919063ffffffff16565b90508181101561147857600061140e82610b3985606463ffffffff6112bd16565b9050600061142382606463ffffffff61133716565b90506103e881111561143457506103e85b61146d61145e826114526107d0600e5461137990919063ffffffff16565b9063ffffffff6112bd16565b600e549063ffffffff61133716565b600e55506114f09050565b818111156114f057600061149783610b3984606463ffffffff6112bd16565b905060006114ac82606463ffffffff61133716565b90506103e88111156114bd57506103e85b6114ea6114db826114526107d0600e5461137990919063ffffffff16565b600e549063ffffffff611ae316565b600e5550505b600654600e54101561150357600654600e555b600754600e54111561151657600754600e555b505043601155565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4301406020808301919091523360601b828401528251603481840301815260549092019092528051910120600f55565b73ffffffffffffffffffffffffffffffffffffffff83166115df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180611e016024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661164b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611d0b6022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316611726576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611ddc6025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611792576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611cbe6023913960400191505060405180910390fd5b6117e281604051806060016040528060268152602001611d2d6026913973ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040902054919063ffffffff61188d16565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160205260408082209390935590841681522054611824908263ffffffff611ae316565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611936576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156118fb5781810151838201526020016118e3565b50505050905090810190601f1680156119285780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b73ffffffffffffffffffffffffffffffffffffffff82166119c057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6000546119d3908263ffffffff611ae316565b600090815573ffffffffffffffffffffffffffffffffffffffff8316815260016020526040902054611a0b908263ffffffff611ae316565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600c54611a8490600163ffffffff611ae316565b600c819055600854611a9c919063ffffffff611c0416565b611ab857600d54611ab490600263ffffffff61137916565b600d555b600954600c54611acd9163ffffffff611c0416565b611ad957611ad96113bb565b611ae161151e565b565b60008282018381101561133057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff909116600090815260016020526040902055565b600055565b60008183611bee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156118fb5781810151838201526020016118e3565b506000838581611bfa57fe5b0495945050505050565b600061133083836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f000000000000000081525060008183611caa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156118fb5781810151838201526020016118e3565b50828481611cb457fe5b0694935050505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373546f6b656e3a2062616e6b206465706f73697420616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654f776e61626c653a207472616e73666572206f776e657273686970206e6577206f776e657220616e64206f6c64206f776e657220617265207468652073616d65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373546f6b656e3a207769746864726177616c20616d6f756e7420657863656564732062616e6b2062616c616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820ae71d5392e9961f62d0e91dfdcdef9464b3c1ba09c7d9e049a03e3fe204ae53664736f6c634300050c0032

Deployed Bytecode Sourcemap

172:4919:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;172:4919:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3963:644:3;;;:::i;:::-;;;;;;;;;;;;;;;;;;662:83:2;;;:::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;662:83:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1356:150:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1356:150:1;;;;;;;;;:::i;2361:121:3:-;;;:::i;:::-;;;;;;;;;;;;;;;;397:91:1;;;:::i;1967:300::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1967:300:1;;;;;;;;;;;;;;;;;;:::i;2876:898:3:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2876:898:3;;;;;;;:::i;1500:83:2:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2541:96:3;;;:::i;2665:206:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2665:206:1;;;;;;;;;:::i;2696:95:3:-;;;:::i;2196:102::-;;;:::i;852:126:0:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;852:126:0;;;;:::i;549:110:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;549:110:1;;;;:::i;1069:538:0:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1069:538:0;;;;:::i;523:82:5:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;861:87:2;;;:::i;3166:1651:0:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3166:1651:0;;:::i;3361:257:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3361:257:1;;;;;;;;;:::i;865:155::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;865:155:1;;;;;;;;;:::i;2042:92:3:-;;;:::i;1801:1168:0:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1801:1168:0;;:::i;4912:176::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4912:176:0;;;;;;;;;:::i;1081:134:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1081:134:1;;;;;;;;;;;:::i;658:287:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;658:287:5;;;;:::i;:::-;;3963:644:3;4013:4;4077:36;4116:52;4145:22;;4116:24;;:28;;:52;;;;:::i;:::-;4077:91;;4179:42;4224:57;4250:30;;4232:12;4224:25;;:57;;;;:::i;:::-;4371:23;;4179:102;;-1:-1:-1;4300:68:3;4179:102;4339:28;4300:68;:38;:68;:::i;:::-;:94;4292:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4439:21;:19;:21::i;:::-;4471;:19;:21::i;:::-;4545:13;;4560:16;;4510:67;;;;;;;;;;;;;;;4533:10;;4510:67;;;;;;;;;4595:4;4588:11;;;;3963:644;:::o;662:83:2:-;732:5;725:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;699:13;;725:12;;732:5;;725:12;;732:5;725:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;662:83;:::o;1356:150:1:-;1422:4;1439:37;1448:10;1460:7;1469:6;1439:8;:37::i;:::-;-1:-1:-1;1494:4:1;1356:150;;;;;:::o;2361:121:3:-;2413:7;2440:34;2460:13;;2440:15;;:19;;:34;;;;:::i;:::-;2433:41;;2361:121;:::o;397:91:1:-;441:7;468:12;397:91;:::o;1967:300::-;2056:4;2073:36;2083:6;2091:9;2102:6;2073:9;:36::i;:::-;2120:117;2129:6;2137:10;2149:87;2185:6;2149:87;;;;;;;;;;;;;;;;;:19;;;;;;;:11;:19;;;;;;;;2169:10;2149:31;;;;;;;;;:87;;:35;:87;:::i;:::-;2120:8;:117::i;:::-;-1:-1:-1;2255:4:1;1967:300;;;;;:::o;2876:898:3:-;3044:16;;3027:53;;;;;;;;;;;3062:10;3027:53;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3027:53:3;;;;;;;3017:64;;;;;2953:4;;3128:25;;;3120:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3220:13;;3201:32;;;3193:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3347:16;;3306;3325:39;;;:21;:39;;;;;;;3375:48;;;;3442:22;;3434:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3532:12;;3527:17;3523:81;;3561:31;3567:10;3579:12;;3561:5;:31::i;:::-;3653:17;:15;:17::i;:::-;3712:13;;3727:16;;3688:56;;;;;;;;;;;;;;;3700:10;;3688:56;;;;;;;;;-1:-1:-1;3762:4:3;;2876:898;-1:-1:-1;;;;2876:898:3:o;1500:83:2:-;1566:9;;;;1500:83;:::o;2541:96:3:-;2616:13;;2541:96;:::o;2665:206:1:-;2771:10;2745:4;2792:23;;;:11;:23;;;;;;;;;:32;;;;;;;;;;2745:4;;2762:79;;2783:7;;2792:48;;2829:10;2792:48;:36;:48;:::i;2696:95:3:-;2771:12;;2696:95;:::o;2196:102::-;2274:16;;2196:102;:::o;852:126:0:-;940:22;;;913:7;940:22;;;:13;:22;;;;;:30;852:126;;;;:::o;549:110:1:-;633:18;;606:7;633:18;;;:9;:18;;;;;;;549:110::o;1069:538:0:-;1220:22;;;1131:7;1220:22;;;:13;:22;;;;;1261:12;;1253:31;;1283:1;1276:8;;;;;1253:31;1336:19;1358:15;:13;:15::i;:::-;1336:37;;1384:21;1408:60;1450:17;;1408:37;1424:4;:20;;;1408:11;:15;;:37;;;;:::i;:::-;:41;:60;:41;:60;:::i;:::-;1384:84;;1479:16;1498:49;1543:3;1498:40;1534:3;1498:31;1515:13;1498:4;:12;;;:16;;:31;;;;:::i;:49::-;1479:68;;1565:34;1578:4;:20;;;1565:8;:12;;:34;;;;:::i;:::-;1558:41;1069:538;-1:-1:-1;;;;;;1069:538:0:o;523:82:5:-;591:6;;;;523:82;:::o;861:87:2:-;933:7;926:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;900:13;;926:14;;933:7;;926:14;;933:7;926:14;;;;;;;;;;;;;;;;;;;;;;;;3166:1651:0;3336:10;3222:4;3322:25;;;:13;:25;;;;;3366:11;;;:32;;-1:-1:-1;3386:12:0;;3381:17;;3366:32;3358:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3500:19;3522:15;:13;:15::i;:::-;3500:37;;3548:21;3572:60;3614:17;;3572:37;3588:4;:20;;;3572:11;:15;;:37;;;;:::i;:60::-;3548:84;;3643:16;3662:49;3707:3;3662:40;3698:3;3662:31;3679:13;3662:4;:12;;;:16;;:31;;;;:::i;:49::-;3643:68;;3733:34;3746:4;:20;;;3733:8;:12;;:34;;;;:::i;:::-;3722:45;;3834:6;3822:8;:18;3818:912;;3894:20;;;:34;;;3966:20;:8;3979:6;3966:20;:12;:20;:::i;:::-;3943;;;:43;4062:60;4074:10;4086:35;4114:6;4086:23;4074:10;4086:11;:23::i;:::-;:27;:35;:27;:35;:::i;:::-;4062:11;:60::i;:::-;4137:46;4153:29;4175:6;4153:17;:15;:17::i;:29::-;4137:15;:46::i;:::-;3818:912;;;4279:20;4302;:6;4313:8;4302:20;:10;:20;:::i;:::-;4279:43;;4352:79;4369:12;4352:79;;;;;;;;;;;;;;;;;:12;;;:79;;:16;:79;:::i;:::-;4337:94;;4446:20;;;:34;;;4337:12;4495:20;;;:24;4595:60;4607:10;4619:35;4647:6;4619:23;4607:10;4619:11;:23::i;4595:60::-;4670:48;4686:31;4708:8;4686:17;:15;:17::i;4670:48::-;3818:912;;4747:40;;;;;;;;4768:10;;4764:1;;4747:40;;;;;;;;;-1:-1:-1;4805:4:0;;3166:1651;-1:-1:-1;;;;;3166:1651:0:o;3361:257:1:-;3446:4;3463:125;3472:10;3484:7;3493:94;3530:15;3493:94;;;;;;;;;;;;;;;;;3505:10;3493:23;;;;:11;:23;;;;;;;;;:32;;;;;;;;;;;:94;;:36;:94;:::i;865:155::-;934:4;950:40;960:10;972:9;983:6;950:9;:40::i;2042:92:3:-;2115:11;;2042:92;:::o;1801:1168:0:-;1854:4;1903:15;1921:23;1933:10;1921:11;:23::i;:::-;1903:41;;1955:90;1967:10;1979:65;1991:6;1979:65;;;;;;;;;;;;;;;;;:7;;:65;;:11;:65;:::i;1955:90::-;2168:10;2127:24;2154:25;;;:13;:25;;;;;2199:12;;2194:17;2190:692;;2273:19;2295:15;:13;:15::i;:::-;2273:37;;2325:21;2349:60;2391:17;;2349:37;2365:4;:20;;;2349:11;:15;;:37;;;;:::i;:60::-;2325:84;;2424:16;2443:49;2488:3;2443:40;2479:3;2443:31;2460:13;2443:4;:12;;;:16;;:31;;;;:::i;:49::-;2547:12;;2424:68;;-1:-1:-1;2547:24:0;;2564:6;2547:24;:16;:24;:::i;:::-;2532:39;;2609:20;;;;:34;;2634:8;2609:34;:24;:34;:::i;:::-;2586:20;;;:57;-1:-1:-1;;2658:20:0;;;:34;2190:692;;;2757:21;;;:12;2793:20;;;:24;2855:15;:13;:15::i;:::-;2832:20;;;:38;2190:692;2899:40;;;;;;;;2928:1;;2908:10;;2899:40;;;;;;;;;-1:-1:-1;2957:4:0;;1801:1168;-1:-1:-1;;;1801:1168:0:o;4912:176::-;406:6:5;;5007:4:0;;406:6:5;;392:10;:20;384:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5038:12:0;5031:29;;;5061:10;:8;:10::i;:::-;5073:6;5031:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5031:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5031:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5031:49:0;;4912:176;-1:-1:-1;;;4912:176:0:o;1081:134:1:-;1180:18;;;;1153:7;1180:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;1081:134::o;658:287:5:-;406:6;;;;392:10;:20;384:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;739:6;;:18;;;;:6;;:18;;731:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;856:6;;;;864:17;;;;;;;;;;;897:40;;856:6;;;864:17;856:6;;897:40;;837:16;;897:40;458:1;658:287;:::o;2295:442:6:-;2353:7;2598:6;2594:21;;-1:-1:-1;2614:1:6;2607:8;;2594:21;2638:5;;;2642:1;2638;:5;:1;2662:5;;;;;:10;2654:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2728:1;2295:442;-1:-1:-1;;;2295:442:6:o;1287:136::-;1345:7;1372:43;1376:1;1379;1372:43;;;;;;;;;;;;;;;;;:3;:43::i;3195:132::-;3253:7;3280:39;3284:1;3287;3280:39;;;;;;;;;;;;;;;;;:3;:39::i;5382:1660:3:-;5435:36;5474:52;5503:22;;5474:24;;:28;;:52;;;;:::i;:::-;5435:91;;5537:42;5582:57;5608:30;;5590:12;5582:25;;:57;;;;:::i;:::-;5537:102;;5764:28;5727:34;:65;5723:1098;;;5847:22;5872:77;5914:34;5872:37;:28;5905:3;5872:37;:32;:37;:::i;:77::-;5847:102;-1:-1:-1;5997:27:3;6027:23;5847:102;6046:3;6027:23;:18;:23;:::i;:::-;5997:53;;6090:4;6068:19;:26;6065:57;;;-1:-1:-1;6118:4:3;6065:57;6181:67;6199:48;6227:19;6199:23;6217:4;6199:13;;:17;;:23;;;;:::i;:::-;:27;:48;:27;:48;:::i;:::-;6181:13;;;:67;:17;:67;:::i;:::-;6165:13;:83;-1:-1:-1;5723:1098:3;;-1:-1:-1;5723:1098:3;;6315:28;6278:34;:65;6275:546;;;6396:24;6423:77;6471:28;6423:43;:34;6462:3;6423:43;:38;:43;:::i;:77::-;6396:104;-1:-1:-1;6548:29:3;6580:25;6396:104;6601:3;6580:25;:20;:25;:::i;:::-;6548:57;;6647:4;6623:21;:28;6620:61;;;-1:-1:-1;6677:4:3;6620:61;6740:69;6758:50;6786:21;6758:23;6776:4;6758:13;;:17;;:23;;;;:::i;:50::-;6740:13;;;:69;:17;:69;:::i;:::-;6724:13;:85;-1:-1:-1;;6275:546:3;6852:15;;6836:13;;:31;6833:67;;;6885:15;;6869:13;:31;6833:67;6930:15;;6914:13;;:31;6911:67;;;6963:15;;6947:13;:31;6911:67;-1:-1:-1;;7022:12:3;6989:30;:45;5382:1660::o;4653:146::-;4733:57;;;4760:16;:12;:16;4750:27;4733:57;;;;;;;;4779:10;4733:57;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;4733:57:3;;;;;;;4723:68;;;;;4704:16;:87;4653:146::o;4992:336:1:-;5086:19;;;5078:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5165:21;;;5157:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5236:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;5288:32;;;;;;;;;;;;;;;;;4992:336;;;:::o;4095:469::-;4193:20;;;4185:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4274:23;;;4266:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4368;4390:6;4368:71;;;;;;;;;;;;;;;;;:17;;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;4348:17;;;;;;;;:9;:17;;;;;;:91;;;;4473:20;;;;;;;:32;;4498:6;4473:32;:24;:32;:::i;:::-;4450:20;;;;;;;;:9;:20;;;;;;;;;:55;;;;4521:35;;;;;;;4450:20;;4521:35;;;;;;;;;;;;;4095:469;;;:::o;1862:190:6:-;1948:7;1984:12;1976:6;;;;1968:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1968:29:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2020:5:6;;;1862:190::o;5601:306:1:-;5677:21;;;5669:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5760:12;;:24;;5777:6;5760:24;:16;:24;:::i;:::-;5745:12;:39;;;5816:18;;;;;:9;:18;;;;;;:30;;5839:6;5816:30;:22;:30;:::i;:::-;5795:18;;;;;;;:9;:18;;;;;;;;:51;;;;5862:37;;;;;;;5795:18;;;;5862:37;;;;;;;;;;5601:306;;:::o;4845:491:3:-;4937:11;;:18;;4953:1;4937:18;:15;:18;:::i;:::-;4923:11;:32;;;5033:16;;5017:33;;4923:32;5017:33;:15;:33;:::i;:::-;5008:105;;5082:12;;:19;;5099:1;5082:19;:16;:19;:::i;:::-;5067:12;:34;5008:105;5182:24;;5166:11;;:41;;;:15;:41;:::i;:::-;5158:99;;5224:21;:19;:21::i;:::-;5307;:19;:21::i;:::-;4845:491::o;841:179:6:-;899:7;931:5;;;955:6;;;;947:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7495:107:1;7568:18;;;;;;;;:9;:18;;;;;:26;7495:107::o;7187:88::-;7247:12;:20;7187:88::o;3950:256:6:-;4036:7;4138:12;4131:5;4123:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4123:28:6;;4162:9;4178:1;4174;:5;;;;;;;3950:256;-1:-1:-1;;;;;3950:256:6:o;4653:130::-;4711:7;4738:37;4742:1;4745;4738:37;;;;;;;;;;;;;;;;;5488:7;5524:12;5516:6;5508:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;5508:29:6;;5559:1;5555;:5;;;;;;;5402:166;-1:-1:-1;;;;5402:166:6:o

Swarm Source

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