ETH Price: $2,128.07 (+6.03%)

Token

Agrotoken SOYA (SOYA)
 

Overview

Max Total Supply

4.9981 SOYA

Holders

6 (0.00%)

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 4 Decimals)

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

OVERVIEW

Soya is a stablecoin. Farmer deposits soybeans in an Oracle, which immobilizes it and issues a Proof of Grain Reserve certificate. Farmer requests at Agrotoken.io platform to mint SOYA (1 Tn soybean = 1 SOYA Token) and transfers the PoGR as collateral for each token.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
AgroToken

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2021-02-22
*/

/*
SPDX-License-Identifier: UNLICENSED
(c) Developed by AgroToken
This work is unlicensed.
*/
pragma solidity 0.7.5;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

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

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

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

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

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

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

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

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


/**
 * @title AgroToken is token that refers to real grains
 * AgroToken is a token admnistrated by AgroToken company 
 * (represented by admin Ethereum address variable in this Smart Contract).
 * AgroToken performs all administrative
 * functions based on grain documentations and certifications in partnership
 * with agro traders (called Grain Oracles) and in complaince with local authorities.
 * */
contract AgroToken is IERC20 {
    using SafeMath for uint256;

    //
    // events
    //
    // mint/burn events
    event Mint(address indexed _to, uint256 _amount, uint256 _newTotalSupply);
    event Burn(address indexed _from, uint256 _amount, uint256 _newTotalSupply);

    // admin events
    event BlockLockSet(uint256 _value);
    event NewAdmin(address _newAdmin);
    event NewManager(address _newManager);
    event GrainStockChanged(
        uint256 indexed contractId,
        string grainCategory,
        string grainContractInfo,
        uint256 amount,
        uint8 status,
        uint256 newTotalSupplyAmount
    );

    modifier onlyAdmin {
        require(msg.sender == admin, "Only admin can perform this operation");
        _;
    }    

    modifier boardOrAdmin {
        require(
            msg.sender == board || msg.sender == admin,
            "Only admin or board can perform this operation"
        );
        _;
    }

    modifier blockLock(address _sender) {
        require(
            !isLocked() || _sender == admin,
            "Contract is locked except for the admin"
        );
        _;
    }

    struct Grain {
        string category;
        string contractInfo;
        uint256 amount;
        uint8 status;
    }

    uint256 override public totalSupply;
    string public name;
    uint8 public decimals;
    string public symbol;
    address public admin;
    address public board;    
    uint256 public lockedUntilBlock;
    uint256 public tokenizationFee;
    uint256 public deTokenizationFee;
    uint256 public transferFee;
    mapping(address => uint256) public balances;
    mapping(address => mapping(address => uint256)) public allowed;
    Grain[] public grains;

    /**
     * @dev Constructor
     */
    constructor() {
        name = "Agrotoken SOYA";
        decimals = 4;
        symbol = "SOYA";
        lockedUntilBlock = 0;
        admin = msg.sender;
        board = 0xA01cD92f06f60b9fdcCCdF6280CE9A10803bA720;
        totalSupply = 0;
        balances[address(this)] = totalSupply;
    }
    

    /**
     * @dev Add new grain contract to portfolio
     * @param _grainCategory - Grain category
     * @param _grainContractInfo - Grain Contract's details
     * @param _grainAmount - amount of grain in tons
     * @return success
     */
    function addNewGrainContract(        
        string memory _grainCategory,
        string memory _grainContractInfo,
        uint256 _grainAmount
    ) public onlyAdmin returns (bool success) {
        Grain memory newGrain = Grain(
            _grainCategory,
            _grainContractInfo,
            _grainAmount,
            1
        );
        grains.push(newGrain);
        _mint(address(this), _grainAmount);
        emit GrainStockChanged(
            grains.length-1,
            _grainCategory,
            _grainContractInfo,
            _grainAmount,
            1,
            totalSupply
        );
        success = true;
        return success;
    }

    /**
     * @dev Remove a contract from Portfolio
     * @param _contractIndex - Contract Index within Portfolio
     * @return True if success
     */
    function removeGrainContract(uint256 _contractIndex) public onlyAdmin returns (bool) {
        require(
            _contractIndex < grains.length,
            "Invalid contract index number. Greater than total grain contracts"
        );
        Grain storage grain = grains[_contractIndex];
        require(grain.status == 1, "This contract is no longer active");
        require(_burn(address(this), grain.amount), "Could not to burn tokens");
        grain.status = 0;
        emit GrainStockChanged( 
            _contractIndex,           
            grain.category,
            grain.contractInfo,
            grain.amount,
            grain.status,
            totalSupply
        );
        return true;
    }

    /**
     * @dev Updates a Contract
     * @param _contractIndex - Contract Index within Portfolio
     * @param _grainCategory - Grain category
     * @param _grainContractInfo - Grain Contract's details
     * @param _grainAmount - amount of grain in tons
     * @return True if success
     */
    function updateGrainContract(
        uint256 _contractIndex,
        string memory _grainCategory,
        string memory _grainContractInfo,
        uint256 _grainAmount
    ) public onlyAdmin returns (bool) {
        require(
            _contractIndex < grains.length,
            "Invalid contract index number. Greater than total grain contracts"
        );
        require(_grainAmount > 0, "Cannot set zero asset amount");
        Grain storage grain = grains[_contractIndex];
        require(grain.status == 1, "This contract is no longer active");
        grain.category = _grainCategory;
        grain.contractInfo = _grainContractInfo;
        if (grain.amount > _grainAmount) {
            _burn(address(this), grain.amount.sub(_grainAmount));
        } else if (grain.amount < _grainAmount) {
            _mint(address(this), _grainAmount.sub(grain.amount));           
        }
        grain.amount = _grainAmount;
        emit GrainStockChanged(
            _contractIndex,
            grain.category,
            grain.contractInfo,
            grain.amount,
            grain.status,
            totalSupply
        );
        return true;
    }

    /**
     * @return Number of Grain Contracts in Portfolio
     */
    function totalContracts() public view returns (uint256) {
        return grains.length;
    }

    /**
     * @dev ERC20 Transfer
     * @param _to - destination address
     * @param _value - value to transfer
     * @return True if success
     */
    function transfer(address _to, uint256 _value)
        override
        external
        blockLock(msg.sender)
        returns (bool)
    {
        address from = (admin == msg.sender) ? address(this) : msg.sender;
        require(
            isTransferValid(from, _to, _value),
            "Invalid Transfer Operation"
        );
        balances[from] = balances[from].sub(_value);
        uint256 serviceAmount = 0;
        uint256 netAmount = _value;      
        (serviceAmount, netAmount) = calcFees(transferFee, _value); 
        balances[_to] = balances[_to].add(netAmount);
        balances[address(this)] = balances[address(this)].add(serviceAmount);
        emit Transfer(from, _to, netAmount);
        emit Transfer(from, address(this), serviceAmount);
        return true;
    }


    /**
     * @dev ERC20 TransferFrom
     * @param _from - source address
     * @param _to - destination address
     * @param _value - value
     * @return True if success
     */
    function transferFrom(address _from, address _to, uint256 _value)
        override
        external
        blockLock(_from)
        returns (bool)
    {
        // check sufficient allowance
        require(
            _value <= allowed[_from][msg.sender],
            "Value informed is invalid"
        );
        require(
            isTransferValid(_from, _to, _value),
            "Invalid Transfer Operation"
        );
        // transfer tokens
        balances[_from] = balances[_from].sub(_value);
        uint256 serviceAmount = 0;
        uint256 netAmount = _value;      
        (serviceAmount, netAmount) = calcFees(transferFee, _value); 
        balances[_to] = balances[_to].add(netAmount);
        balances[address(this)] = balances[address(this)].add(serviceAmount);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(
            _value,
            "Value lower than approval"
        );

        emit Transfer(_from, _to, netAmount);
        emit Transfer(_from, address(this), serviceAmount);
        return true;
    }

    /**
     * @dev ERC20 Approve token transfers on behalf of other token owner
     * @param _spender - destination address
     * @param _value - value to be approved
     * @return True if success
     */
    function approve(address _spender, uint256 _value)
        override
        external
        blockLock(msg.sender)
        returns (bool)
    {
        require(_spender != address(0), "ERC20: approve to the zero address");

        address from = (admin == msg.sender) ? address(this) : msg.sender;
        require((_value == 0) || (allowed[from][_spender] == 0), "Allowance cannot be increased or decreased if value is different from zero");
        allowed[from][_spender] = _value;
        emit Approval(from, _spender, _value);
        return true;
    }

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

        address from = (admin == msg.sender) ? address(this) : msg.sender;
        require(allowed[from][_spender] >= _subtractedValue, "ERC20: decreased allowance below zero");
        _approve(from, _spender, allowed[from][_spender].sub(_subtractedValue));

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address _spender, uint256 _addedValue) public virtual returns (bool) {
        require(_spender != address(0), "ERC20: decreaseAllowance to the zero address");

        address from = (admin == msg.sender) ? address(this) : msg.sender;
        _approve(from, _spender, allowed[from][_spender].add(_addedValue));
        return true;
    }

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

        allowed[_owner][_spender] = _amount;
        emit Approval(_owner, _spender, _amount);
    }

    /**
     * @dev withdraw tokens collected after receive fees 
     * @param _to - destination address
     * @param _value - value to transfer
     * @return True if success
     */
    function withdraw(address _to, uint256 _value)
        external
        boardOrAdmin
        returns (bool)
    {
        address from = address(this);
        require(
            isTransferValid(from, _to, _value),
            "Invalid Transfer Operation"
        );
        balances[from] = balances[from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(from, _to, _value);
        return true;
    }

    /**
     * @dev Mint new tokens. Can only be called by mana
     * @param _to - destination address
     * @param _value - value
     * @return True if success
     */
    function _mint(address _to, uint256 _value)
        internal
        onlyAdmin        
        returns (bool)
    {
        require(_to != address(0), "ERC20: mint to the zero address");
        require(_to != admin, "Admin cannot mint tokens to herself");
        uint256 serviceAmount;
        uint256 netAmount;
        (serviceAmount, netAmount) = calcFees(tokenizationFee, _value);

        balances[_to] = balances[_to].add(netAmount);
        balances[address(this)] = balances[address(this)].add(serviceAmount);
        totalSupply = totalSupply.add(_value);

        emit Mint(_to, netAmount, totalSupply);
        emit Mint(address(this), serviceAmount, totalSupply);
        emit Transfer(address(0), _to, netAmount);
        emit Transfer(address(0), address(this), serviceAmount);

        return true;
    }

    /**
     * @dev Burn tokens
     * @param _account - address
     * @param _value - value
     * @return True if success
     */
    function _burn(address _account, uint256 _value)
        internal        
        onlyAdmin
        returns (bool)
    {
        require(_account != address(0), "ERC20: burn from the zero address");
        uint256 serviceAmount;
        uint256 netAmount;
        (serviceAmount, netAmount) = calcFees(deTokenizationFee, _value);
        totalSupply = totalSupply.sub(netAmount);
        balances[_account] = balances[_account].sub(_value);
        balances[address(this)] = balances[address(this)].add(serviceAmount);
        emit Transfer(_account, address(0), netAmount);
        emit Transfer(_account, address(this), serviceAmount);
        emit Burn(_account, netAmount, totalSupply);        
        return true;
    }

    /**
     * @dev Set block lock. Until that block (exclusive) transfers are disallowed
     * @param _lockedUntilBlock - Block Number
     * @return True if success
     */
    function setBlockLock(uint256 _lockedUntilBlock)
        public
        boardOrAdmin
        returns (bool)
    {
        lockedUntilBlock = _lockedUntilBlock;
        emit BlockLockSet(_lockedUntilBlock);
        return true;
    }

    /**
     * @dev Replace current admin with new one
     * @param _newAdmin New token admin
     * @return True if success
     */
    function replaceAdmin(address _newAdmin)
        public
        boardOrAdmin
        returns (bool)
    {
        require(_newAdmin != address(0x0), "Null address");
        admin = _newAdmin;
        emit NewAdmin(_newAdmin);
        return true;
    }

    /**
    * @dev Change AgroToken fee values
    * @param _feeType which fee is being changed. 1 = tokenizationFee, 2 = deTokenizationFee and 3 = transferFee
    * @param _newAmount new fee value
    * @return processing status
    */
    function changeFee(uint8 _feeType, uint256 _newAmount) external boardOrAdmin returns (bool) {
        require(_newAmount<=2, "Invalid or exceed white paper definition");
        require(_feeType >0 && _feeType<=3, "Invalid fee type");
        if (_feeType == 1) {
            tokenizationFee = _newAmount;
        } else if (_feeType == 2) {
            deTokenizationFee = _newAmount;
        } else if (_feeType == 3) {
            transferFee = _newAmount;
        }
        return true;
    }

    /**
     * @dev ERC20 balanceOf
     * @param _owner Owner address
     * @return True if success
     */
    function balanceOf(address _owner) public override view returns (uint256) {
        return balances[_owner];
    }

    /**
     * @dev ERC20 allowance
     * @param _owner Owner address
     * @param _spender Address allowed to spend from Owner's balance
     * @return uint256 allowance
     */
    function allowance(address _owner, address _spender)
        override
        external
        view
        returns (uint256)
    {
        return allowed[_owner][_spender];
    }

    /**
     * @dev Are transfers currently disallowed
     * @return True if disallowed
     */
    function isLocked() public view returns (bool) {
        return lockedUntilBlock > block.number;
    }

    /**
     * @dev Checks if transfer parameters are valid
     * @param _from Source address
     * @param _to Destination address
     * @param _amount Amount to check
     * @return True if valid
     */
    function isTransferValid(address _from, address _to, uint256 _amount)
        public
        view
        returns (bool)
    {
        if (_from == address(0)) {
            return false;
        }

        if (_to == address(0) || _to == admin) {
            return false;
        }

        bool fromOK = true;
        bool toOK = true;

        return
            balances[_from] >= _amount && // sufficient balance
            fromOK && // a seller holder within the whitelist
            toOK; // a buyer holder within the whitelist
    }

    /**
    * @dev Calculates AgroToken fees over mint, burn and transfer operations
    * @param _fee value of the fee
    * @param _amount amount involved in the transaction
    * @return serviceAmount value to be paid to AgroToken
    * @return netAmount amount after fees
    */
    function calcFees(uint256 _fee, uint256 _amount) public pure returns(uint256 serviceAmount, uint256 netAmount ) {
        serviceAmount = (_amount.mul(_fee)) / 100;
        netAmount = _amount.sub(serviceAmount);
        return (serviceAmount, netAmount);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"BlockLockSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newTotalSupply","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"contractId","type":"uint256"},{"indexed":false,"internalType":"string","name":"grainCategory","type":"string"},{"indexed":false,"internalType":"string","name":"grainContractInfo","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"status","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"newTotalSupplyAmount","type":"uint256"}],"name":"GrainStockChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newTotalSupply","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newAdmin","type":"address"}],"name":"NewAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newManager","type":"address"}],"name":"NewManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"_grainCategory","type":"string"},{"internalType":"string","name":"_grainContractInfo","type":"string"},{"internalType":"uint256","name":"_grainAmount","type":"uint256"}],"name":"addNewGrainContract","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"board","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calcFees","outputs":[{"internalType":"uint256","name":"serviceAmount","type":"uint256"},{"internalType":"uint256","name":"netAmount","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"_feeType","type":"uint8"},{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"changeFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deTokenizationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"grains","outputs":[{"internalType":"string","name":"category","type":"string"},{"internalType":"string","name":"contractInfo","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"isTransferValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedUntilBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_contractIndex","type":"uint256"}],"name":"removeGrainContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"replaceAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockedUntilBlock","type":"uint256"}],"name":"setBlockLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenizationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalContracts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_contractIndex","type":"uint256"},{"internalType":"string","name":"_grainCategory","type":"string"},{"internalType":"string","name":"_grainContractInfo","type":"string"},{"internalType":"uint256","name":"_grainAmount","type":"uint256"}],"name":"updateGrainContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600e81526020017f4167726f746f6b656e20534f5941000000000000000000000000000000000000815250600190805190602001906200005f929190620001bb565b506004600260006101000a81548160ff021916908360ff1602179055506040518060400160405280600481526020017f534f59410000000000000000000000000000000000000000000000000000000081525060039080519060200190620000c9929190620001bb565b50600060068190555033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a01cd92f06f60b9fdcccdf6280ce9a10803ba720600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008081905550600054600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555062000271565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001f357600085556200023f565b82601f106200020e57805160ff19168380011785556200023f565b828001600101855582156200023f579182015b828111156200023e57825182559160200191906001019062000221565b5b5090506200024e919062000252565b5090565b5b808211156200026d57600081600090555060010162000253565b5090565b61497680620002816000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806378d067dd1161010f578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e14610d53578063ed91e04414610dcb578063f3fef3a314610de9578063f851a44014610e4d576101e5565b8063a9059cbb14610c59578063acb2ad6f14610cbd578063c4f4face14610cdb578063d8162db714610d35576101e5565b8063a09037a9116100de578063a09037a914610a3b578063a40eb4de14610a59578063a457c2d714610bd5578063a4e2d63414610c39576101e5565b806378d067dd146108ed5780637cd3229a1461094057806391a76a5b1461097457806395d89b41146109b8576101e5565b806327e235e3116101875780633950935111610156578063395093511461073557806340ecb7f2146107995780635c6581651461081d57806370a0823114610895576101e5565b806327e235e3146105545780632eef5ff8146105ac578063313ce567146106d0578063366a68dc146106f1576101e5565b80631230a98a116101c35780631230a98a146102ef57806313a7e54e1461046157806318160ddd146104b257806323b872dd146104d0576101e5565b806306fdde03146101ea578063095ea7b31461026d5780630f621c25146102d1575b600080fd5b6101f2610e81565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610232578082015181840152602081019050610217565b50505050905090810190601f16801561025f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102b96004803603604081101561028357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f1f565b60405180821515815260200191505060405180910390f35b6102d9611291565b6040518082815260200191505060405180910390f35b6104496004803603606081101561030557600080fd5b810190808035906020019064010000000081111561032257600080fd5b82018360208201111561033457600080fd5b8035906020019184600183028401116401000000008311171561035657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103b957600080fd5b8201836020820111156103cb57600080fd5b803590602001918460018302840111640100000000831117156103ed57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611297565b60405180821515815260200191505060405180910390f35b61049a6004803603604081101561047757600080fd5b81019080803560ff16906020019092919080359060200190929190505050611545565b60405180821515815260200191505060405180910390f35b6104ba611778565b6040518082815260200191505060405180910390f35b61053c600480360360608110156104e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061177e565b60405180821515815260200191505060405180910390f35b6105966004803603602081101561056a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d9d565b6040518082815260200191505060405180910390f35b6105d8600480360360208110156105c257600080fd5b8101908080359060200190929190505050611db5565b6040518080602001806020018581526020018460ff168152602001838103835287818151815260200191508051906020019080838360005b8381101561062b578082015181840152602081019050610610565b50505050905090810190601f1680156106585780820380516001836020036101000a031916815260200191505b50838103825286818151815260200191508051906020019080838360005b83811015610691578082015181840152602081019050610676565b50505050905090810190601f1680156106be5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b6106d8611f32565b604051808260ff16815260200191505060405180910390f35b61071d6004803603602081101561070757600080fd5b8101908080359060200190929190505050611f45565b60405180821515815260200191505060405180910390f35b6107816004803603604081101561074b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061208c565b60405180821515815260200191505060405180910390f35b610805600480360360608110156107af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612218565b60405180821515815260200191505060405180910390f35b61087f6004803603604081101561083357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061235a565b6040518082815260200191505060405180910390f35b6108d7600480360360208110156108ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061237f565b6040518082815260200191505060405180910390f35b6109236004803603604081101561090357600080fd5b8101908080359060200190929190803590602001909291905050506123c8565b604051808381526020018281526020019250505060405180910390f35b610948612406565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109a06004803603602081101561098a57600080fd5b810190808035906020019092919050505061242c565b60405180821515815260200191505060405180910390f35b6109c06127e1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a005780820151818401526020810190506109e5565b50505050905090810190601f168015610a2d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610a4361287f565b6040518082815260200191505060405180910390f35b610bbd60048036036080811015610a6f57600080fd5b810190808035906020019092919080359060200190640100000000811115610a9657600080fd5b820183602082011115610aa857600080fd5b80359060200191846001830284011164010000000083111715610aca57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610b2d57600080fd5b820183602082011115610b3f57600080fd5b80359060200191846001830284011164010000000083111715610b6157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919050505061288c565b60405180821515815260200191505060405180910390f35b610c2160048036036040811015610beb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612cb8565b60405180821515815260200191505060405180910390f35b610c41612f19565b60405180821515815260200191505060405180910390f35b610ca560048036036040811015610c6f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612f25565b60405180821515815260200191505060405180910390f35b610cc561336d565b6040518082815260200191505060405180910390f35b610d1d60048036036020811015610cf157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613373565b60405180821515815260200191505060405180910390f35b610d3d6135ad565b6040518082815260200191505060405180910390f35b610db560048036036040811015610d6957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506135b3565b6040518082815260200191505060405180910390f35b610dd361363a565b6040518082815260200191505060405180910390f35b610e3560048036036040811015610dff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613640565b60405180821515815260200191505060405180910390f35b610e5561395c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f175780601f10610eec57610100808354040283529160200191610f17565b820191906000526020600020905b815481529060010190602001808311610efa57829003601f168201915b505050505081565b600033610f2a612f19565b1580610f835750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610fd8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806147476027913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561105e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806147256022913960400191505060405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110bb57336110bd565b305b9050600084148061114a57506000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b61119f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a815260200180614887604a913960600191505060405180910390fd5b83600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040518082815260200191505060405180910390a360019250505092915050565b60085481565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461133f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806147dc6025913960400191505060405180910390fd5b611347614620565b6040518060800160405280868152602001858152602001848152602001600160ff168152509050600c81908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000190805190602001906113b692919061464b565b5060208201518160010190805190602001906113d392919061464b565b506040820151816002015560608201518160030160006101000a81548160ff021916908360ff160217905550505061140b3084613982565b506001600c80549050037fb6ef0f3c9f270f5d9dc362588d6bdca7b4a93459de07af4ca0f475b64aef0f268686866001600054604051808060200180602001868152602001858152602001848152602001838103835288818151815260200191508051906020019080838360005b83811015611494578082015181840152602081019050611479565b50505050905090810190601f1680156114c15780820380516001836020036101000a031916815260200191505b50838103825287818151815260200191508051906020019080838360005b838110156114fa5780820151818401526020810190506114df565b50505050905090810190601f1680156115275780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a260019150509392505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115f05750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806146f7602e913960400191505060405180910390fd5b600282111561169f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148f46028913960400191505060405180910390fd5b60008360ff161180156116b6575060038360ff1611155b611728576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f496e76616c69642066656520747970650000000000000000000000000000000081525060200191505060405180910390fd5b60018360ff161415611740578160078190555061176e565b60028360ff161415611758578160088190555061176d565b60038360ff16141561176c57816009819055505b5b5b6001905092915050565b60005481565b600083611789612f19565b15806117e25750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611837576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806147476027913960400191505060405180910390fd5b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054831115611929576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f56616c756520696e666f726d656420697320696e76616c69640000000000000081525060200191505060405180910390fd5b611934858585612218565b6119a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e76616c6964205472616e73666572204f7065726174696f6e00000000000081525060200191505060405180910390fd5b6119f883600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e5890919063ffffffff16565b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080849050611a4d600954866123c8565b8092508193505050611aa781600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b3c82600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c45856040518060400160405280601981526020017f56616c7565206c6f776572207468616e20617070726f76616c00000000000000815250600b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613f2a9092919063ffffffff16565b600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a33073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600193505050509392505050565b600a6020528060005260406000206000915090505481565b600c8181548110611dc557600080fd5b9060005260206000209060040201600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e715780601f10611e4657610100808354040283529160200191611e71565b820191906000526020600020905b815481529060010190602001808311611e5457829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f0f5780601f10611ee457610100808354040283529160200191611f0f565b820191906000526020600020905b815481529060010190602001808311611ef257829003601f168201915b5050505050908060020154908060030160009054906101000a900460ff16905084565b600260009054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ff05750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806146f7602e913960400191505060405180910390fd5b816006819055507f6c04066f6ede40cc1642c211ba9d18f1a096ccc84fb8d11be28ea6c3c6f68b36826040518082815260200191505060405180910390a160019050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061476e602c913960400191505060405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121705733612172565b305b905061220d818561220886600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b613fea565b600191505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122575760009050612353565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806122df5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156122ed5760009050612353565b60006001905060006001905083600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101580156123455750815b801561234e5750805b925050505b9392505050565b600b602052816000526040600020602052806000526040600020600091509150505481565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008060646123e085856141e190919063ffffffff16565b816123e757fe5b0491506123fd8284613e5890919063ffffffff16565b90509250929050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806147dc6025913960400191505060405180910390fd5b600c805490508210612531576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260418152602001806148466041913960600191505060405180910390fd5b6000600c838154811061254057fe5b9060005260206000209060040201905060018160030160009054906101000a900460ff1660ff16146125bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061479a6021913960400191505060405180910390fd5b6125cb308260020154614267565b61263d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f436f756c64206e6f7420746f206275726e20746f6b656e73000000000000000081525060200191505060405180910390fd5b60008160030160006101000a81548160ff021916908360ff160217905550827fb6ef0f3c9f270f5d9dc362588d6bdca7b4a93459de07af4ca0f475b64aef0f26826000018360010184600201548560030160009054906101000a900460ff166000546040518080602001806020018681526020018560ff1681526020018481526020018381038352888181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156127415780601f1061271657610100808354040283529160200191612741565b820191906000526020600020905b81548152906001019060200180831161272457829003601f168201915b50508381038252878181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156127c45780601f10612799576101008083540402835291602001916127c4565b820191906000526020600020905b8154815290600101906020018083116127a757829003601f168201915b505097505050505050505060405180910390a26001915050919050565b60038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128775780601f1061284c57610100808354040283529160200191612877565b820191906000526020600020905b81548152906001019060200180831161285a57829003601f168201915b505050505081565b6000600c80549050905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612934576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806147dc6025913960400191505060405180910390fd5b600c805490508510612991576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260418152602001806148466041913960600191505060405180910390fd5b60008211612a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f43616e6e6f7420736574207a65726f20617373657420616d6f756e740000000081525060200191505060405180910390fd5b6000600c8681548110612a1657fe5b9060005260206000209060040201905060018160030160009054906101000a900460ff1660ff1614612a93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061479a6021913960400191505060405180910390fd5b84816000019080519060200190612aab92919061464b565b5083816001019080519060200190612ac492919061464b565b508281600201541115612af757612af130612aec858460020154613e5890919063ffffffff16565b614267565b50612b26565b8281600201541015612b2557612b2330612b1e836002015486613e5890919063ffffffff16565b613982565b505b5b828160020181905550857fb6ef0f3c9f270f5d9dc362588d6bdca7b4a93459de07af4ca0f475b64aef0f26826000018360010184600201548560030160009054906101000a900460ff166000546040518080602001806020018681526020018560ff168152602001848152602001838103835288818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015612c155780601f10612bea57610100808354040283529160200191612c15565b820191906000526020600020905b815481529060010190602001808311612bf857829003601f168201915b5050838103825287818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015612c985780601f10612c6d57610100808354040283529160200191612c98565b820191906000526020600020905b815481529060010190602001808311612c7b57829003601f168201915b505097505050505050505060405180910390a26001915050949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061476e602c913960400191505060405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d9c5733612d9e565b305b905082600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612e75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061491c6025913960400191505060405180910390fd5b612f0e8185612f0986600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e5890919063ffffffff16565b613fea565b600191505092915050565b60004360065411905090565b600033612f30612f19565b1580612f895750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612fde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806147476027913960400191505060405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461303b573361303d565b305b905061304a818686612218565b6130bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e76616c6964205472616e73666572204f7065726174696f6e00000000000081525060200191505060405180910390fd5b61310e84600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e5890919063ffffffff16565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080859050613163600954876123c8565b80925081935050506131bd81600a60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061325282600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a33073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600194505050505092915050565b60095481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061341e5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b613473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806146f7602e913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e756c6c2061646472657373000000000000000000000000000000000000000081525060200191505060405180910390fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a160019050919050565b60065481565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60075481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806136eb5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b613740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806146f7602e913960400191505060405180910390fd5b6000309050613750818585612218565b6137c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e76616c6964205472616e73666572204f7065726174696f6e00000000000081525060200191505060405180910390fd5b61381483600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e5890919063ffffffff16565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138a983600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600191505092915050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613a2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806147dc6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613acd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613b74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806148d16023913960400191505060405180910390fd5b600080613b83600754856123c8565b8092508193505050613bdd81600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c7282600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613cca84600054613ea290919063ffffffff16565b6000819055508473ffffffffffffffffffffffffffffffffffffffff167f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f82600054604051808381526020018281526020019250505060405180910390a23073ffffffffffffffffffffffffffffffffffffffff167f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f83600054604051808381526020018281526020019250505060405180910390a28473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a33073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019250505092915050565b6000613e9a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613f2a565b905092915050565b600080828401905083811015613f20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000838311158290613fd7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f9c578082015181840152602081019050613f81565b50505050905090810190601f168015613fc95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806148226024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156140f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806147256022913960400191505060405180910390fd5b80600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000808314156141f45760009050614261565b600082840290508284828161420557fe5b041461425c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147bb6021913960400191505060405180910390fd5b809150505b92915050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461430f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806147dc6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614395576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148016021913960400191505060405180910390fd5b6000806143a4600854856123c8565b80925081935050506143c181600054613e5890919063ffffffff16565b60008190555061441984600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e5890919063ffffffff16565b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506144ae82600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a33073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a38473ffffffffffffffffffffffffffffffffffffffff167f49995e5dd6158cf69ad3e9777c46755a1a826a446c6416992167462dad033b2a82600054604051808381526020018281526020019250505060405180910390a260019250505092915050565b6040518060800160405280606081526020016060815260200160008152602001600060ff1681525090565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261468157600085556146c8565b82601f1061469a57805160ff19168380011785556146c8565b828001600101855582156146c8579182015b828111156146c75782518255916020019190600101906146ac565b5b5090506146d591906146d9565b5090565b5b808211156146f25760008160009055506001016146da565b509056fe4f6e6c792061646d696e206f7220626f6172642063616e20706572666f726d2074686973206f7065726174696f6e45524332303a20617070726f766520746f20746865207a65726f2061646472657373436f6e7472616374206973206c6f636b65642065786365707420666f72207468652061646d696e45524332303a206465637265617365416c6c6f77616e636520746f20746865207a65726f20616464726573735468697320636f6e7472616374206973206e6f206c6f6e67657220616374697665536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6e6c792061646d696e2063616e20706572666f726d2074686973206f7065726174696f6e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373496e76616c696420636f6e747261637420696e646578206e756d6265722e2047726561746572207468616e20746f74616c20677261696e20636f6e747261637473416c6c6f77616e63652063616e6e6f7420626520696e63726561736564206f72206465637265617365642069662076616c756520697320646966666572656e742066726f6d207a65726f41646d696e2063616e6e6f74206d696e7420746f6b656e7320746f2068657273656c66496e76616c6964206f722065786365656420776869746520706170657220646566696e6974696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204075241fabc16298255a6a495fa152d1871012884ae28ca04d9dde4ee297cf3464736f6c63430007050033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806378d067dd1161010f578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e14610d53578063ed91e04414610dcb578063f3fef3a314610de9578063f851a44014610e4d576101e5565b8063a9059cbb14610c59578063acb2ad6f14610cbd578063c4f4face14610cdb578063d8162db714610d35576101e5565b8063a09037a9116100de578063a09037a914610a3b578063a40eb4de14610a59578063a457c2d714610bd5578063a4e2d63414610c39576101e5565b806378d067dd146108ed5780637cd3229a1461094057806391a76a5b1461097457806395d89b41146109b8576101e5565b806327e235e3116101875780633950935111610156578063395093511461073557806340ecb7f2146107995780635c6581651461081d57806370a0823114610895576101e5565b806327e235e3146105545780632eef5ff8146105ac578063313ce567146106d0578063366a68dc146106f1576101e5565b80631230a98a116101c35780631230a98a146102ef57806313a7e54e1461046157806318160ddd146104b257806323b872dd146104d0576101e5565b806306fdde03146101ea578063095ea7b31461026d5780630f621c25146102d1575b600080fd5b6101f2610e81565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610232578082015181840152602081019050610217565b50505050905090810190601f16801561025f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102b96004803603604081101561028357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f1f565b60405180821515815260200191505060405180910390f35b6102d9611291565b6040518082815260200191505060405180910390f35b6104496004803603606081101561030557600080fd5b810190808035906020019064010000000081111561032257600080fd5b82018360208201111561033457600080fd5b8035906020019184600183028401116401000000008311171561035657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103b957600080fd5b8201836020820111156103cb57600080fd5b803590602001918460018302840111640100000000831117156103ed57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611297565b60405180821515815260200191505060405180910390f35b61049a6004803603604081101561047757600080fd5b81019080803560ff16906020019092919080359060200190929190505050611545565b60405180821515815260200191505060405180910390f35b6104ba611778565b6040518082815260200191505060405180910390f35b61053c600480360360608110156104e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061177e565b60405180821515815260200191505060405180910390f35b6105966004803603602081101561056a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d9d565b6040518082815260200191505060405180910390f35b6105d8600480360360208110156105c257600080fd5b8101908080359060200190929190505050611db5565b6040518080602001806020018581526020018460ff168152602001838103835287818151815260200191508051906020019080838360005b8381101561062b578082015181840152602081019050610610565b50505050905090810190601f1680156106585780820380516001836020036101000a031916815260200191505b50838103825286818151815260200191508051906020019080838360005b83811015610691578082015181840152602081019050610676565b50505050905090810190601f1680156106be5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b6106d8611f32565b604051808260ff16815260200191505060405180910390f35b61071d6004803603602081101561070757600080fd5b8101908080359060200190929190505050611f45565b60405180821515815260200191505060405180910390f35b6107816004803603604081101561074b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061208c565b60405180821515815260200191505060405180910390f35b610805600480360360608110156107af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612218565b60405180821515815260200191505060405180910390f35b61087f6004803603604081101561083357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061235a565b6040518082815260200191505060405180910390f35b6108d7600480360360208110156108ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061237f565b6040518082815260200191505060405180910390f35b6109236004803603604081101561090357600080fd5b8101908080359060200190929190803590602001909291905050506123c8565b604051808381526020018281526020019250505060405180910390f35b610948612406565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109a06004803603602081101561098a57600080fd5b810190808035906020019092919050505061242c565b60405180821515815260200191505060405180910390f35b6109c06127e1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a005780820151818401526020810190506109e5565b50505050905090810190601f168015610a2d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610a4361287f565b6040518082815260200191505060405180910390f35b610bbd60048036036080811015610a6f57600080fd5b810190808035906020019092919080359060200190640100000000811115610a9657600080fd5b820183602082011115610aa857600080fd5b80359060200191846001830284011164010000000083111715610aca57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610b2d57600080fd5b820183602082011115610b3f57600080fd5b80359060200191846001830284011164010000000083111715610b6157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919050505061288c565b60405180821515815260200191505060405180910390f35b610c2160048036036040811015610beb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612cb8565b60405180821515815260200191505060405180910390f35b610c41612f19565b60405180821515815260200191505060405180910390f35b610ca560048036036040811015610c6f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612f25565b60405180821515815260200191505060405180910390f35b610cc561336d565b6040518082815260200191505060405180910390f35b610d1d60048036036020811015610cf157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613373565b60405180821515815260200191505060405180910390f35b610d3d6135ad565b6040518082815260200191505060405180910390f35b610db560048036036040811015610d6957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506135b3565b6040518082815260200191505060405180910390f35b610dd361363a565b6040518082815260200191505060405180910390f35b610e3560048036036040811015610dff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613640565b60405180821515815260200191505060405180910390f35b610e5561395c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f175780601f10610eec57610100808354040283529160200191610f17565b820191906000526020600020905b815481529060010190602001808311610efa57829003601f168201915b505050505081565b600033610f2a612f19565b1580610f835750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610fd8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806147476027913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561105e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806147256022913960400191505060405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110bb57336110bd565b305b9050600084148061114a57506000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b61119f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a815260200180614887604a913960600191505060405180910390fd5b83600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040518082815260200191505060405180910390a360019250505092915050565b60085481565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461133f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806147dc6025913960400191505060405180910390fd5b611347614620565b6040518060800160405280868152602001858152602001848152602001600160ff168152509050600c81908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000190805190602001906113b692919061464b565b5060208201518160010190805190602001906113d392919061464b565b506040820151816002015560608201518160030160006101000a81548160ff021916908360ff160217905550505061140b3084613982565b506001600c80549050037fb6ef0f3c9f270f5d9dc362588d6bdca7b4a93459de07af4ca0f475b64aef0f268686866001600054604051808060200180602001868152602001858152602001848152602001838103835288818151815260200191508051906020019080838360005b83811015611494578082015181840152602081019050611479565b50505050905090810190601f1680156114c15780820380516001836020036101000a031916815260200191505b50838103825287818151815260200191508051906020019080838360005b838110156114fa5780820151818401526020810190506114df565b50505050905090810190601f1680156115275780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a260019150509392505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115f05750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806146f7602e913960400191505060405180910390fd5b600282111561169f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148f46028913960400191505060405180910390fd5b60008360ff161180156116b6575060038360ff1611155b611728576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f496e76616c69642066656520747970650000000000000000000000000000000081525060200191505060405180910390fd5b60018360ff161415611740578160078190555061176e565b60028360ff161415611758578160088190555061176d565b60038360ff16141561176c57816009819055505b5b5b6001905092915050565b60005481565b600083611789612f19565b15806117e25750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611837576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806147476027913960400191505060405180910390fd5b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054831115611929576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f56616c756520696e666f726d656420697320696e76616c69640000000000000081525060200191505060405180910390fd5b611934858585612218565b6119a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e76616c6964205472616e73666572204f7065726174696f6e00000000000081525060200191505060405180910390fd5b6119f883600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e5890919063ffffffff16565b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080849050611a4d600954866123c8565b8092508193505050611aa781600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b3c82600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c45856040518060400160405280601981526020017f56616c7565206c6f776572207468616e20617070726f76616c00000000000000815250600b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613f2a9092919063ffffffff16565b600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a33073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600193505050509392505050565b600a6020528060005260406000206000915090505481565b600c8181548110611dc557600080fd5b9060005260206000209060040201600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e715780601f10611e4657610100808354040283529160200191611e71565b820191906000526020600020905b815481529060010190602001808311611e5457829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f0f5780601f10611ee457610100808354040283529160200191611f0f565b820191906000526020600020905b815481529060010190602001808311611ef257829003601f168201915b5050505050908060020154908060030160009054906101000a900460ff16905084565b600260009054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ff05750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806146f7602e913960400191505060405180910390fd5b816006819055507f6c04066f6ede40cc1642c211ba9d18f1a096ccc84fb8d11be28ea6c3c6f68b36826040518082815260200191505060405180910390a160019050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061476e602c913960400191505060405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121705733612172565b305b905061220d818561220886600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b613fea565b600191505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122575760009050612353565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806122df5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156122ed5760009050612353565b60006001905060006001905083600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101580156123455750815b801561234e5750805b925050505b9392505050565b600b602052816000526040600020602052806000526040600020600091509150505481565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008060646123e085856141e190919063ffffffff16565b816123e757fe5b0491506123fd8284613e5890919063ffffffff16565b90509250929050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806147dc6025913960400191505060405180910390fd5b600c805490508210612531576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260418152602001806148466041913960600191505060405180910390fd5b6000600c838154811061254057fe5b9060005260206000209060040201905060018160030160009054906101000a900460ff1660ff16146125bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061479a6021913960400191505060405180910390fd5b6125cb308260020154614267565b61263d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f436f756c64206e6f7420746f206275726e20746f6b656e73000000000000000081525060200191505060405180910390fd5b60008160030160006101000a81548160ff021916908360ff160217905550827fb6ef0f3c9f270f5d9dc362588d6bdca7b4a93459de07af4ca0f475b64aef0f26826000018360010184600201548560030160009054906101000a900460ff166000546040518080602001806020018681526020018560ff1681526020018481526020018381038352888181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156127415780601f1061271657610100808354040283529160200191612741565b820191906000526020600020905b81548152906001019060200180831161272457829003601f168201915b50508381038252878181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156127c45780601f10612799576101008083540402835291602001916127c4565b820191906000526020600020905b8154815290600101906020018083116127a757829003601f168201915b505097505050505050505060405180910390a26001915050919050565b60038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128775780601f1061284c57610100808354040283529160200191612877565b820191906000526020600020905b81548152906001019060200180831161285a57829003601f168201915b505050505081565b6000600c80549050905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612934576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806147dc6025913960400191505060405180910390fd5b600c805490508510612991576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260418152602001806148466041913960600191505060405180910390fd5b60008211612a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f43616e6e6f7420736574207a65726f20617373657420616d6f756e740000000081525060200191505060405180910390fd5b6000600c8681548110612a1657fe5b9060005260206000209060040201905060018160030160009054906101000a900460ff1660ff1614612a93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061479a6021913960400191505060405180910390fd5b84816000019080519060200190612aab92919061464b565b5083816001019080519060200190612ac492919061464b565b508281600201541115612af757612af130612aec858460020154613e5890919063ffffffff16565b614267565b50612b26565b8281600201541015612b2557612b2330612b1e836002015486613e5890919063ffffffff16565b613982565b505b5b828160020181905550857fb6ef0f3c9f270f5d9dc362588d6bdca7b4a93459de07af4ca0f475b64aef0f26826000018360010184600201548560030160009054906101000a900460ff166000546040518080602001806020018681526020018560ff168152602001848152602001838103835288818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015612c155780601f10612bea57610100808354040283529160200191612c15565b820191906000526020600020905b815481529060010190602001808311612bf857829003601f168201915b5050838103825287818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015612c985780601f10612c6d57610100808354040283529160200191612c98565b820191906000526020600020905b815481529060010190602001808311612c7b57829003601f168201915b505097505050505050505060405180910390a26001915050949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061476e602c913960400191505060405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d9c5733612d9e565b305b905082600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612e75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061491c6025913960400191505060405180910390fd5b612f0e8185612f0986600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e5890919063ffffffff16565b613fea565b600191505092915050565b60004360065411905090565b600033612f30612f19565b1580612f895750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612fde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806147476027913960400191505060405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461303b573361303d565b305b905061304a818686612218565b6130bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e76616c6964205472616e73666572204f7065726174696f6e00000000000081525060200191505060405180910390fd5b61310e84600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e5890919063ffffffff16565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080859050613163600954876123c8565b80925081935050506131bd81600a60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061325282600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a33073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600194505050505092915050565b60095481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061341e5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b613473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806146f7602e913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e756c6c2061646472657373000000000000000000000000000000000000000081525060200191505060405180910390fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a160019050919050565b60065481565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60075481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806136eb5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b613740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806146f7602e913960400191505060405180910390fd5b6000309050613750818585612218565b6137c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e76616c6964205472616e73666572204f7065726174696f6e00000000000081525060200191505060405180910390fd5b61381483600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e5890919063ffffffff16565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138a983600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600191505092915050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613a2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806147dc6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613acd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613b74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806148d16023913960400191505060405180910390fd5b600080613b83600754856123c8565b8092508193505050613bdd81600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c7282600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613cca84600054613ea290919063ffffffff16565b6000819055508473ffffffffffffffffffffffffffffffffffffffff167f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f82600054604051808381526020018281526020019250505060405180910390a23073ffffffffffffffffffffffffffffffffffffffff167f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f83600054604051808381526020018281526020019250505060405180910390a28473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a33073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019250505092915050565b6000613e9a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613f2a565b905092915050565b600080828401905083811015613f20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000838311158290613fd7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f9c578082015181840152602081019050613f81565b50505050905090810190601f168015613fc95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806148226024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156140f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806147256022913960400191505060405180910390fd5b80600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000808314156141f45760009050614261565b600082840290508284828161420557fe5b041461425c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147bb6021913960400191505060405180910390fd5b809150505b92915050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461430f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806147dc6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614395576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148016021913960400191505060405180910390fd5b6000806143a4600854856123c8565b80925081935050506143c181600054613e5890919063ffffffff16565b60008190555061441984600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e5890919063ffffffff16565b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506144ae82600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ea290919063ffffffff16565b600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a33073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a38473ffffffffffffffffffffffffffffffffffffffff167f49995e5dd6158cf69ad3e9777c46755a1a826a446c6416992167462dad033b2a82600054604051808381526020018281526020019250505060405180910390a260019250505092915050565b6040518060800160405280606081526020016060815260200160008152602001600060ff1681525090565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261468157600085556146c8565b82601f1061469a57805160ff19168380011785556146c8565b828001600101855582156146c8579182015b828111156146c75782518255916020019190600101906146ac565b5b5090506146d591906146d9565b5090565b5b808211156146f25760008160009055506001016146da565b509056fe4f6e6c792061646d696e206f7220626f6172642063616e20706572666f726d2074686973206f7065726174696f6e45524332303a20617070726f766520746f20746865207a65726f2061646472657373436f6e7472616374206973206c6f636b65642065786365707420666f72207468652061646d696e45524332303a206465637265617365416c6c6f77616e636520746f20746865207a65726f20616464726573735468697320636f6e7472616374206973206e6f206c6f6e67657220616374697665536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6e6c792061646d696e2063616e20706572666f726d2074686973206f7065726174696f6e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373496e76616c696420636f6e747261637420696e646578206e756d6265722e2047726561746572207468616e20746f74616c20677261696e20636f6e747261637473416c6c6f77616e63652063616e6e6f7420626520696e63726561736564206f72206465637265617365642069662076616c756520697320646966666572656e742066726f6d207a65726f41646d696e2063616e6e6f74206d696e7420746f6b656e7320746f2068657273656c66496e76616c6964206f722065786365656420776869746520706170657220646566696e6974696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204075241fabc16298255a6a495fa152d1871012884ae28ca04d9dde4ee297cf3464736f6c63430007050033

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.