Contract 0x8F9ad58819CB11036D5Ff69d0e1a6392f9e9172a 2

Contract Overview

Balance:
0 Ether
Txn Hash
Method
Block
From
To
Value
0x59ad5c34d2019a07d53e1ab0238f2aca7ee4684127079c42d2c3a7506db5a522Mint111470722022-08-05 3:10:1155 days 10 hrs ago0xd71cb0c4a82c36312b5b83c43f351b882756957f IN  0x8f9ad58819cb11036d5ff69d0e1a6392f9e9172a0 Ether0.00008362 2.23604885
0xcdc883902a47af399b06528fda754d806d8f8166755ab02f782e5b251f7b732cApply Minter111469982022-08-05 2:51:4155 days 10 hrs ago0xd71cb0c4a82c36312b5b83c43f351b882756957f IN  0x8f9ad58819cb11036d5ff69d0e1a6392f9e9172a0 Ether0.00019909 2.5
0x85f03d4875a8f9daf214a3b522c3af83c9b9ce3a09a4a4ac44210dd46b41d69eSet Minter111469962022-08-05 2:51:1155 days 10 hrs ago0xd71cb0c4a82c36312b5b83c43f351b882756957f IN  0x8f9ad58819cb11036d5ff69d0e1a6392f9e9172a0 Ether0.00009692 2.5
0x77b62166eafe63ef2639f104b0bcfc8cdf6c05147db7772384d790bac6df6a2eMint111469942022-08-05 2:50:4155 days 10 hrs ago0xd71cb0c4a82c36312b5b83c43f351b882756957f IN  0x8f9ad58819cb11036d5ff69d0e1a6392f9e9172a0 Ether0.00017899 2.50000001
0x3e8eeea5dec286be197f86fb4c26e36d5dc37cb1a52efaed2902c149efd3db54Apply Minter111381742022-08-03 14:00:0156 days 23 hrs ago0xd71cb0c4a82c36312b5b83c43f351b882756957f IN  0x8f9ad58819cb11036d5ff69d0e1a6392f9e9172a0 Ether0.00019909 2.50000001
0x8d0eee793e0f6e641936811bb32699a0dadd696dc8c973847914c07d329c321eSet Minter111381722022-08-03 13:59:3156 days 23 hrs ago0xd71cb0c4a82c36312b5b83c43f351b882756957f IN  0x8f9ad58819cb11036d5ff69d0e1a6392f9e9172a0 Ether0.00009692 2.50000001
0xe3a0f720de6623aa805a9f04c455f271fa476b804077578288c1e962a52bd597Apply Minter111381702022-08-03 13:59:0156 days 23 hrs ago0xd71cb0c4a82c36312b5b83c43f351b882756957f IN  0x8f9ad58819cb11036d5ff69d0e1a6392f9e9172a0 Ether0.0001451 1.50000001
0x3ef1e35d525758c3649a1182563f2448e60e012bbeb6fdb117d210365afda1f1Set Minter111381682022-08-03 13:58:3156 days 23 hrs ago0xd71cb0c4a82c36312b5b83c43f351b882756957f IN  0x8f9ad58819cb11036d5ff69d0e1a6392f9e9172a0 Ether0.00018242 2.50000001
0x98d418cd0e518cb286f937bed30cca685cb9af14842de64316e7d3c86a18936d0x60e06040111376242022-08-03 11:42:1257 days 1 hr ago0xd71cb0c4a82c36312b5b83c43f351b882756957f IN  Create: AnyswapV6ERC200 Ether0.00872149 2
[ Download CSV Export 
Latest 6 internal transactions
Parent Txn Hash Block From To Value
0x2368cf7fe5a9c3f0d4aec9bd129155c22565430d9dbb0d7757cfedec77cadf51111527852022-08-06 3:06:4254 days 10 hrs ago 0xc29d6110f18b1d03c75e8756617e7d0a5f5f9d70 0x8f9ad58819cb11036d5ff69d0e1a6392f9e9172a0 Ether
0x2368cf7fe5a9c3f0d4aec9bd129155c22565430d9dbb0d7757cfedec77cadf51111527852022-08-06 3:06:4254 days 10 hrs ago 0xc29d6110f18b1d03c75e8756617e7d0a5f5f9d70 0x8f9ad58819cb11036d5ff69d0e1a6392f9e9172a0 Ether
0xb731f15a68ac7da8d54a4d88e8ad1316b83016308a071fbdba1944dd841bc269111473082022-08-05 4:09:3855 days 9 hrs ago 0xc29d6110f18b1d03c75e8756617e7d0a5f5f9d70 0x8f9ad58819cb11036d5ff69d0e1a6392f9e9172a0 Ether
0xb731f15a68ac7da8d54a4d88e8ad1316b83016308a071fbdba1944dd841bc269111473082022-08-05 4:09:3855 days 9 hrs ago 0xc29d6110f18b1d03c75e8756617e7d0a5f5f9d70 0x8f9ad58819cb11036d5ff69d0e1a6392f9e9172a0 Ether
0xdf9337061e5650aaaf6f66e8daadedb5c3ea1381dd1578ee3a9d1f004c904824111469792022-08-05 2:46:5655 days 10 hrs ago 0xc29d6110f18b1d03c75e8756617e7d0a5f5f9d70 0x8f9ad58819cb11036d5ff69d0e1a6392f9e9172a0 Ether
0xdf9337061e5650aaaf6f66e8daadedb5c3ea1381dd1578ee3a9d1f004c904824111469792022-08-05 2:46:5655 days 10 hrs ago 0xc29d6110f18b1d03c75e8756617e7d0a5f5f9d70 0x8f9ad58819cb11036d5ff69d0e1a6392f9e9172a0 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AnyswapV6ERC20

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : AnyErc20.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.8.2;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Interface of the ERC2612 standard as defined in the EIP.
 *
 * Adds the {permit} method, which can be used to change one's
 * {IERC20-allowance} without having to send a transaction, by signing a
 * message. This allows users to spend tokens without having to hold Ether.
 *
 * See https://eips.ethereum.org/EIPS/eip-2612.
 */
interface IERC2612 {

    /**
     * @dev Returns the current ERC2612 nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);
    function permit(address target, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
    function transferWithPermit(address target, address to, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external returns (bool);

}

/// @dev Wrapped ERC-20 v10 (AnyswapV3ERC20) is an ERC-20 ERC-20 wrapper. You can `deposit` ERC-20 and obtain an AnyswapV3ERC20 balance which can then be operated as an ERC-20 token. You can
/// `withdraw` ERC-20 from AnyswapV3ERC20, which will then burn AnyswapV3ERC20 token in your wallet. The amount of AnyswapV3ERC20 token in any wallet is always identical to the
/// balance of ERC-20 deposited minus the ERC-20 withdrawn with that specific wallet.
interface IAnyswapV3ERC20 is IERC20, IERC2612 {

    /// @dev Sets `value` as allowance of `spender` account over caller account's AnyswapV3ERC20 token,
    /// after which a call is executed to an ERC677-compliant contract with the `data` parameter.
    /// Emits {Approval} event.
    /// Returns boolean value indicating whether operation succeeded.
    /// For more information on approveAndCall format, see https://github.com/ethereum/EIPs/issues/677.
    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);

    /// @dev Moves `value` AnyswapV3ERC20 token from caller's account to account (`to`),
    /// after which a call is executed to an ERC677-compliant contract with the `data` parameter.
    /// A transfer to `address(0)` triggers an ERC-20 withdraw matching the sent AnyswapV3ERC20 token in favor of caller.
    /// Emits {Transfer} event.
    /// Returns boolean value indicating whether operation succeeded.
    /// Requirements:
    ///   - caller account must have at least `value` AnyswapV3ERC20 token.
    /// For more information on transferAndCall format, see https://github.com/ethereum/EIPs/issues/677.
    function transferAndCall(address to, uint value, bytes calldata data) external returns (bool);
}

interface ITransferReceiver {
    function onTokenTransfer(address, uint, bytes calldata) external returns (bool);
}

interface IApprovalReceiver {
    function onTokenApproval(address, uint, bytes calldata) external returns (bool);
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

contract AnyswapV6ERC20 is IAnyswapV3ERC20 {
    using SafeERC20 for IERC20;
    string public name;
    string public symbol;
    uint8  public immutable override decimals;

    address public immutable underlying;

    bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant TRANSFER_TYPEHASH = keccak256("Transfer(address owner,address to,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public immutable DOMAIN_SEPARATOR;

    /// @dev Records amount of AnyswapV3ERC20 token owned by account.
    mapping (address => uint256) public override balanceOf;
    uint256 private _totalSupply;

    // init flag for setting immediate vault, needed for CREATE2 support
    bool private _init;

    // flag to enable/disable swapout vs vault.burn so multiple events are triggered
    bool private _vaultOnly;

    // set to 1 second for testing purpose
    uint public delay = 1;


    // set of minters, can be this bridge or other bridges
    mapping(address => bool) public isMinter;
    address[] public minters;

    // primary controller of the token contract
    address public vault;

    address public pendingMinter;
    uint public delayMinter;

    address public pendingVault;
    uint public delayVault;

    modifier onlyAuth() {
        require(isMinter[msg.sender], "AnyswapV4ERC20: FORBIDDEN");
        _;
    }

    modifier onlyVault() {
        require(msg.sender == mpc(), "AnyswapV3ERC20: FORBIDDEN");
        _;
    }

    function owner() public view returns (address) {
        return mpc();
    }

    function mpc() public view returns (address) {
        if (block.timestamp >= delayVault) {
            return pendingVault;
        }
        return vault;
    }

    function setVaultOnly(bool enabled) external onlyVault {
        _vaultOnly = enabled;
    }

    function initVault(address _vault) external onlyVault {
        require(_init);
        vault = _vault;
        pendingVault = _vault;
        isMinter[_vault] = true;
        minters.push(_vault);
        delayVault = block.timestamp;
        _init = false;
    }

    function setVault(address _vault) external onlyVault {
        require(_vault != address(0), "AnyswapV3ERC20: address(0x0)");
        pendingVault = _vault;
        delayVault = block.timestamp + delay;
    }

    function applyVault() external onlyVault {
        require(block.timestamp >= delayVault);
        vault = pendingVault;
    }

    function setMinter(address _auth) external onlyVault {
        require(_auth != address(0), "AnyswapV3ERC20: address(0x0)");
        pendingMinter = _auth;
        delayMinter = block.timestamp + delay;
    }

    function applyMinter() external onlyVault {
        require(block.timestamp >= delayMinter);
        isMinter[pendingMinter] = true;
        minters.push(pendingMinter);
    }

    // No time delay revoke minter emergency function
    function revokeMinter(address _auth) external onlyVault {
        isMinter[_auth] = false;
    }

    function getAllMinters() external view returns (address[] memory) {
        return minters;
    }

    function changeVault(address newVault) external onlyVault returns (bool) {
        require(newVault != address(0), "AnyswapV3ERC20: address(0x0)");
        vault = newVault;
        pendingVault = newVault;
        emit LogChangeVault(vault, pendingVault, block.timestamp);
        return true;
    }

    function mint(address to, uint256 amount) external onlyAuth returns (bool) {
        _mint(to, amount);
        return true;
    }

    function burn(address from, uint256 amount) external onlyAuth returns (bool) {
        require(from != address(0), "AnyswapV3ERC20: address(0x0)");
        _burn(from, amount);
        return true;
    }

    function Swapin(bytes32 txhash, address account, uint256 amount) public onlyAuth returns (bool) {
        _mint(account, amount);
        emit LogSwapin(txhash, account, amount);
        return true;
    }

    function Swapout(uint256 amount, address bindaddr) public returns (bool) {
        require(!_vaultOnly, "AnyswapV4ERC20: onlyAuth");
        require(bindaddr != address(0), "AnyswapV3ERC20: address(0x0)");
        _burn(msg.sender, amount);
        emit LogSwapout(msg.sender, bindaddr, amount);
        return true;
    }

    /// @dev Records current ERC2612 nonce for account. This value must be included whenever signature is generated for {permit}.
    /// Every successful call to {permit} increases account's nonce by one. This prevents signature from being used multiple times.
    mapping (address => uint256) public override nonces;

    /// @dev Records number of AnyswapV3ERC20 token that account (second) will be allowed to spend on behalf of another account (first) through {transferFrom}.
    mapping (address => mapping (address => uint256)) public override allowance;

    event LogChangeVault(address indexed oldVault, address indexed newVault, uint indexed effectiveTime);
    event LogSwapin(bytes32 indexed txhash, address indexed account, uint amount);
    event LogSwapout(address indexed account, address indexed bindaddr, uint amount);

    constructor(string memory _name, string memory _symbol, uint8 _decimals, address _underlying, address _vault) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        underlying = _underlying;
        if (_underlying != address(0x0)) {
            require(_decimals == IERC20(_underlying).decimals());
        }

        // Use init to allow for CREATE2 accross all chains
        _init = true;

        // Disable/Enable swapout for v1 tokens vs mint/burn for v3 tokens
        _vaultOnly = false;

        vault = _vault;
        pendingVault = _vault;
        delayVault = block.timestamp;

        uint256 chainId;
        assembly {chainId := chainid()}
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(name)),
                keccak256(bytes("1")),
                chainId,
                address(this)));
    }

    /// @dev Returns the total supply of AnyswapV3ERC20 token as the ETH held in this contract.
    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    function deposit() external returns (uint) {
        uint _amount = IERC20(underlying).balanceOf(msg.sender);
        IERC20(underlying).safeTransferFrom(msg.sender, address(this), _amount);
        return _deposit(_amount, msg.sender);
    }

    function deposit(uint amount) external returns (uint) {
        IERC20(underlying).safeTransferFrom(msg.sender, address(this), amount);
        return _deposit(amount, msg.sender);
    }

    function deposit(uint amount, address to) external returns (uint) {
        IERC20(underlying).safeTransferFrom(msg.sender, address(this), amount);
        return _deposit(amount, to);
    }

    function depositVault(uint amount, address to) external onlyVault returns (uint) {
        return _deposit(amount, to);
    }

    function _deposit(uint amount, address to) internal returns (uint) {
        require(underlying != address(0x0) && underlying != address(this));
        _mint(to, amount);
        return amount;
    }

    function withdraw() external returns (uint) {
        return _withdraw(msg.sender, balanceOf[msg.sender], msg.sender);
    }

    function withdraw(uint amount) external returns (uint) {
        return _withdraw(msg.sender, amount, msg.sender);
    }

    function withdraw(uint amount, address to) external returns (uint) {
        return _withdraw(msg.sender, amount, to);
    }

    function withdrawVault(address from, uint amount, address to) external onlyVault returns (uint) {
        return _withdraw(from, amount, to);
    }

    function _withdraw(address from, uint amount, address to) internal returns (uint) {
        _burn(from, amount);
        IERC20(underlying).safeTransfer(to, amount);
        return amount;
    }

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

        _totalSupply += amount;
        balanceOf[account] += amount;
        emit Transfer(address(0), account, amount);
    }

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

        balanceOf[account] -= amount;
        _totalSupply -= amount;
        emit Transfer(account, address(0), amount);
    }

    /// @dev Sets `value` as allowance of `spender` account over caller account's AnyswapV3ERC20 token.
    /// Emits {Approval} event.
    /// Returns boolean value indicating whether operation succeeded.
    function approve(address spender, uint256 value) external override returns (bool) {
        // _approve(msg.sender, spender, value);
        allowance[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);

        return true;
    }

    /// @dev Sets `value` as allowance of `spender` account over caller account's AnyswapV3ERC20 token,
    /// after which a call is executed to an ERC677-compliant contract with the `data` parameter.
    /// Emits {Approval} event.
    /// Returns boolean value indicating whether operation succeeded.
    /// For more information on approveAndCall format, see https://github.com/ethereum/EIPs/issues/677.
    function approveAndCall(address spender, uint256 value, bytes calldata data) external override returns (bool) {
        // _approve(msg.sender, spender, value);
        allowance[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);

        return IApprovalReceiver(spender).onTokenApproval(msg.sender, value, data);
    }

    /// @dev Sets `value` as allowance of `spender` account over `owner` account's AnyswapV3ERC20 token, given `owner` account's signed approval.
    /// Emits {Approval} event.
    /// Requirements:
    ///   - `deadline` must be timestamp in future.
    ///   - `v`, `r` and `s` must be valid `secp256k1` signature from `owner` account over EIP712-formatted function arguments.
    ///   - the signature must use `owner` account's current nonce (see {nonces}).
    ///   - the signer cannot be zero address and must be `owner` account.
    /// For more information on signature format, see https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP section].
    /// AnyswapV3ERC20 token implementation adapted from https://github.com/albertocuestacanada/ERC20Permit/blob/master/contracts/ERC20Permit.sol.
    function permit(address target, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external override {
        require(block.timestamp <= deadline, "AnyswapV3ERC20: Expired permit");

        bytes32 hashStruct = keccak256(
            abi.encode(
                PERMIT_TYPEHASH,
                target,
                spender,
                value,
                nonces[target]++,
                deadline));

        require(verifyEIP712(target, hashStruct, v, r, s) || verifyPersonalSign(target, hashStruct, v, r, s));

        // _approve(owner, spender, value);
        allowance[target][spender] = value;
        emit Approval(target, spender, value);
    }

    function transferWithPermit(address target, address to, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external override returns (bool) {
        require(block.timestamp <= deadline, "AnyswapV3ERC20: Expired permit");

        bytes32 hashStruct = keccak256(
            abi.encode(
                TRANSFER_TYPEHASH,
                target,
                to,
                value,
                nonces[target]++,
                deadline));

        require(verifyEIP712(target, hashStruct, v, r, s) || verifyPersonalSign(target, hashStruct, v, r, s));

        require(to != address(0) || to != address(this));

        uint256 balance = balanceOf[target];
        require(balance >= value, "AnyswapV3ERC20: transfer amount exceeds balance");

        balanceOf[target] = balance - value;
        balanceOf[to] += value;
        emit Transfer(target, to, value);

        return true;
    }

    function verifyEIP712(address target, bytes32 hashStruct, uint8 v, bytes32 r, bytes32 s) internal view returns (bool) {
        bytes32 hash = keccak256(
            abi.encodePacked(
                "\x19\x01",
                DOMAIN_SEPARATOR,
                hashStruct));
        address signer = ecrecover(hash, v, r, s);
        return (signer != address(0) && signer == target);
    }

    function verifyPersonalSign(address target, bytes32 hashStruct, uint8 v, bytes32 r, bytes32 s) internal view returns (bool) {
        bytes32 hash = keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                DOMAIN_SEPARATOR,
                hashStruct));
        address signer = ecrecover(hash, v, r, s);
        return (signer != address(0) && signer == target);
    }

    /// @dev Moves `value` AnyswapV3ERC20 token from caller's account to account (`to`).
    /// A transfer to `address(0)` triggers an ETH withdraw matching the sent AnyswapV3ERC20 token in favor of caller.
    /// Emits {Transfer} event.
    /// Returns boolean value indicating whether operation succeeded.
    /// Requirements:
    ///   - caller account must have at least `value` AnyswapV3ERC20 token.
    function transfer(address to, uint256 value) external override returns (bool) {
        require(to != address(0) || to != address(this));
        uint256 balance = balanceOf[msg.sender];
        require(balance >= value, "AnyswapV3ERC20: transfer amount exceeds balance");

        balanceOf[msg.sender] = balance - value;
        balanceOf[to] += value;
        emit Transfer(msg.sender, to, value);

        return true;
    }

    /// @dev Moves `value` AnyswapV3ERC20 token from account (`from`) to account (`to`) using allowance mechanism.
    /// `value` is then deducted from caller account's allowance, unless set to `type(uint256).max`.
    /// A transfer to `address(0)` triggers an ETH withdraw matching the sent AnyswapV3ERC20 token in favor of caller.
    /// Emits {Approval} event to reflect reduced allowance `value` for caller account to spend from account (`from`),
    /// unless allowance is set to `type(uint256).max`
    /// Emits {Transfer} event.
    /// Returns boolean value indicating whether operation succeeded.
    /// Requirements:
    ///   - `from` account must have at least `value` balance of AnyswapV3ERC20 token.
    ///   - `from` account must have approved caller to spend at least `value` of AnyswapV3ERC20 token, unless `from` and caller are the same account.
    function transferFrom(address from, address to, uint256 value) external override returns (bool) {
        require(to != address(0) || to != address(this));
        if (from != msg.sender) {
            // _decreaseAllowance(from, msg.sender, value);
            uint256 allowed = allowance[from][msg.sender];
            if (allowed != type(uint256).max) {
                require(allowed >= value, "AnyswapV3ERC20: request exceeds allowance");
                uint256 reduced = allowed - value;
                allowance[from][msg.sender] = reduced;
                emit Approval(from, msg.sender, reduced);
            }
        }

        uint256 balance = balanceOf[from];
        require(balance >= value, "AnyswapV3ERC20: transfer amount exceeds balance");

        balanceOf[from] = balance - value;
        balanceOf[to] += value;
        emit Transfer(from, to, value);

        return true;
    }

    /// @dev Moves `value` AnyswapV3ERC20 token from caller's account to account (`to`),
    /// after which a call is executed to an ERC677-compliant contract with the `data` parameter.
    /// A transfer to `address(0)` triggers an ETH withdraw matching the sent AnyswapV3ERC20 token in favor of caller.
    /// Emits {Transfer} event.
    /// Returns boolean value indicating whether operation succeeded.
    /// Requirements:
    ///   - caller account must have at least `value` AnyswapV3ERC20 token.
    /// For more information on transferAndCall format, see https://github.com/ethereum/EIPs/issues/677.
    function transferAndCall(address to, uint value, bytes calldata data) external override returns (bool) {
        require(to != address(0) || to != address(this));

        uint256 balance = balanceOf[msg.sender];
        require(balance >= value, "AnyswapV3ERC20: transfer amount exceeds balance");

        balanceOf[msg.sender] = balance - value;
        balanceOf[to] += value;
        emit Transfer(msg.sender, to, value);

        return ITransferReceiver(to).onTokenTransfer(msg.sender, value, data);
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldVault","type":"address"},{"indexed":true,"internalType":"address","name":"newVault","type":"address"},{"indexed":true,"internalType":"uint256","name":"effectiveTime","type":"uint256"}],"name":"LogChangeVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txhash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogSwapin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"bindaddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogSwapout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txhash","type":"bytes32"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Swapin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"bindaddr","type":"address"}],"name":"Swapout","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TRANSFER_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"applyMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyVault","outputs":[],"stateMutability":"nonpayable","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":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"approveAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVault","type":"address"}],"name":"changeVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayMinter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"depositVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllMinters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"initVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"minters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mpc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auth","type":"address"}],"name":"revokeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auth","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setVaultOnly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"address","name":"target","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferWithPermit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

60e060405260016005553480156200001657600080fd5b50604051620053bf380380620053bf83398181016040528101906200003c9190620005d6565b846000908051906020019062000054929190620002e6565b5083600190805190602001906200006d929190620002e6565b508260ff1660808160ff16815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200016a578173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000131573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200015791906200069c565b60ff168360ff16146200016957600080fd5b5b6001600460006101000a81548160ff0219169083151502179055506000600460016101000a81548160ff02191690831515021790555080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600c8190555060004690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051620002609190620007de565b60405180910390206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001208330604051602001620002bd9594939291906200083e565b6040516020818303038152906040528051906020012060c081815250505050505050506200089b565b828054620002f490620006fd565b90600052602060002090601f01602090048101928262000318576000855562000364565b82601f106200033357805160ff191683800117855562000364565b8280016001018555821562000364579182015b828111156200036357825182559160200191906001019062000346565b5b50905062000373919062000377565b5090565b5b808211156200039257600081600090555060010162000378565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003ff82620003b4565b810181811067ffffffffffffffff82111715620004215762000420620003c5565b5b80604052505050565b60006200043662000396565b9050620004448282620003f4565b919050565b600067ffffffffffffffff821115620004675762000466620003c5565b5b6200047282620003b4565b9050602081019050919050565b60005b838110156200049f57808201518184015260208101905062000482565b83811115620004af576000848401525b50505050565b6000620004cc620004c68462000449565b6200042a565b905082815260208101848484011115620004eb57620004ea620003af565b5b620004f88482856200047f565b509392505050565b600082601f830112620005185762000517620003aa565b5b81516200052a848260208601620004b5565b91505092915050565b600060ff82169050919050565b6200054b8162000533565b81146200055757600080fd5b50565b6000815190506200056b8162000540565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200059e8262000571565b9050919050565b620005b08162000591565b8114620005bc57600080fd5b50565b600081519050620005d081620005a5565b92915050565b600080600080600060a08688031215620005f557620005f4620003a0565b5b600086015167ffffffffffffffff811115620006165762000615620003a5565b5b620006248882890162000500565b955050602086015167ffffffffffffffff811115620006485762000647620003a5565b5b620006568882890162000500565b945050604062000669888289016200055a565b93505060606200067c88828901620005bf565b92505060806200068f88828901620005bf565b9150509295509295909350565b600060208284031215620006b557620006b4620003a0565b5b6000620006c5848285016200055a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200071657607f821691505b602082108114156200072d576200072c620006ce565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546200076281620006fd565b6200076e818662000733565b945060018216600081146200078c57600181146200079e57620007d5565b60ff19831686528186019350620007d5565b620007a9856200073e565b60005b83811015620007cd57815481890152600182019150602081019050620007ac565b838801955050505b50505092915050565b6000620007ec828462000753565b915081905092915050565b6000819050919050565b6200080c81620007f7565b82525050565b6000819050919050565b620008278162000812565b82525050565b620008388162000591565b82525050565b600060a08201905062000855600083018862000801565b62000864602083018762000801565b62000873604083018662000801565b6200088260608301856200081c565b6200089160808301846200082d565b9695505050505050565b60805160a05160c051614ab56200090a6000396000818161141b0152818161315f0152613275015260008181611fa90152818161200201528181612534015281816128f30152818161299501528181612fc30152818161357301526135ca015260006113f70152614ab56000f3fe608060405234801561001057600080fd5b50600436106102b85760003560e01c806370a0823111610182578063bebbf4d0116100e9578063d505accf116100a2578063ec126c771161007c578063ec126c771461094b578063f75c26641461097b578063fbfa77cf14610999578063fca3b5aa146109b7576102b8565b8063d505accf146108f5578063d93f244514610911578063dd62ed3e1461091b576102b8565b8063bebbf4d014610821578063c308124014610851578063c4b740f51461086f578063cae9ca511461088b578063cfbd4885146108bb578063d0e30db0146108d7576102b8565b806395d89b411161013b57806395d89b41146107255780639dc29fac14610743578063a045442c14610773578063a9059cbb14610791578063aa271e1a146107c1578063b6b55f25146107f1576102b8565b806370a082311461063b5780637ecebe001461066b5780638623ec7b1461069b57806387689e28146106cb5780638da5cb5b146106e957806391c5df4914610707576102b8565b80633644e5151161022657806360e232a9116101df57806360e232a914610553578063628d6cba146105835780636817031b146105b35780636a42b8f8146105cf5780636e553f65146105ed5780636f307dc31461061d576102b8565b80633644e515146104695780633ccfd60b146104875780634000aea0146104a557806340c10f19146104d557806352113ba714610505578063605629d614610523576102b8565b806318160ddd1161027857806318160ddd1461039357806323b872dd146103b15780632e1a7d4d146103e15780632ebe3fbb1461041157806330adf81f1461042d578063313ce5671461044b576102b8565b806239d6ec146102bd578062bf26f4146102ed578062f714ce1461030b57806306fdde031461033b578063095ea7b3146103595780630d707df814610389575b600080fd5b6102d760048036038101906102d291906138fe565b6109d3565b6040516102e49190613960565b60405180910390f35b6102f5610a5e565b6040516103029190613994565b60405180910390f35b610325600480360381019061032091906139af565b610a82565b6040516103329190613960565b60405180910390f35b610343610a97565b6040516103509190613a88565b60405180910390f35b610373600480360381019061036e9190613aaa565b610b25565b6040516103809190613b05565b60405180910390f35b610391610c17565b005b61039b610d9c565b6040516103a89190613960565b60405180910390f35b6103cb60048036038101906103c69190613b20565b610da6565b6040516103d89190613b05565b60405180910390f35b6103fb60048036038101906103f69190613b73565b6111cd565b6040516104089190613960565b60405180910390f35b61042b60048036038101906104269190613ba0565b6111e1565b005b6104356113d1565b6040516104429190613994565b60405180910390f35b6104536113f5565b6040516104609190613be9565b60405180910390f35b610471611419565b60405161047e9190613994565b60405180910390f35b61048f61143d565b60405161049c9190613960565b60405180910390f35b6104bf60048036038101906104ba9190613c69565b61148e565b6040516104cc9190613b05565b60405180910390f35b6104ef60048036038101906104ea9190613aaa565b61171e565b6040516104fc9190613b05565b60405180910390f35b61050d6117c0565b60405161051a9190613cec565b60405180910390f35b61053d60048036038101906105389190613d5f565b6117e6565b60405161054a9190613b05565b60405180910390f35b61056d60048036038101906105689190613ba0565b611b10565b60405161057a9190613b05565b60405180910390f35b61059d600480360381019061059891906139af565b611d21565b6040516105aa9190613b05565b60405180910390f35b6105cd60048036038101906105c89190613ba0565b611e5c565b005b6105d7611f99565b6040516105e49190613960565b60405180910390f35b610607600480360381019061060291906139af565b611f9f565b6040516106149190613960565b60405180910390f35b610625612000565b6040516106329190613cec565b60405180910390f35b61065560048036038101906106509190613ba0565b612024565b6040516106629190613960565b60405180910390f35b61068560048036038101906106809190613ba0565b61203c565b6040516106929190613960565b60405180910390f35b6106b560048036038101906106b09190613b73565b612054565b6040516106c29190613cec565b60405180910390f35b6106d3612093565b6040516106e09190613960565b60405180910390f35b6106f1612099565b6040516106fe9190613cec565b60405180910390f35b61070f6120a8565b60405161071c9190613cec565b60405180910390f35b61072d6120ce565b60405161073a9190613a88565b60405180910390f35b61075d60048036038101906107589190613aaa565b61215c565b60405161076a9190613b05565b60405180910390f35b61077b61226e565b6040516107889190613ebf565b60405180910390f35b6107ab60048036038101906107a69190613aaa565b6122fc565b6040516107b89190613b05565b60405180910390f35b6107db60048036038101906107d69190613ba0565b61250a565b6040516107e89190613b05565b60405180910390f35b61080b60048036038101906108069190613b73565b61252a565b6040516108189190613960565b60405180910390f35b61083b600480360381019061083691906139af565b61258a565b6040516108489190613960565b60405180910390f35b610859612613565b6040516108669190613960565b60405180910390f35b61088960048036038101906108849190613f0d565b612619565b005b6108a560048036038101906108a09190613c69565b6126ab565b6040516108b29190613b05565b60405180910390f35b6108d560048036038101906108d09190613ba0565b61281e565b005b6108df6128ee565b6040516108ec9190613960565b60405180910390f35b61090f600480360381019061090a9190613d5f565b6129ea565b005b610919612bef565b005b61093560048036038101906109309190613f3a565b612cd8565b6040516109429190613960565b60405180910390f35b61096560048036038101906109609190613f7a565b612cfd565b6040516109729190613b05565b60405180910390f35b610983612def565b6040516109909190613cec565b60405180910390f35b6109a1612e4d565b6040516109ae9190613cec565b60405180910390f35b6109d160048036038101906109cc9190613ba0565b612e73565b005b60006109dd612def565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4190614019565b60405180910390fd5b610a55848484612fb0565b90509392505050565b7f42ce63790c28229c123925d83266e77c04d28784552ab68b350a9003226cbd5981565b6000610a8f338484612fb0565b905092915050565b60008054610aa490614068565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad090614068565b8015610b1d5780601f10610af257610100808354040283529160200191610b1d565b820191906000526020600020905b815481529060010190602001808311610b0057829003601f168201915b505050505081565b600081600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610c059190613960565b60405180910390a36001905092915050565b610c1f612def565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8390614019565b60405180910390fd5b600a54421015610c9b57600080fd5b600160066000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506007600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600354905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580610e0f57503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b610e1857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611030576000600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461102e5782811015610f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2d9061410c565b60405180910390fd5b60008382610f44919061415b565b905080600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516110249190613960565b60405180910390a3505b505b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae90614201565b60405180910390fd5b82816110c3919061415b565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111559190614221565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516111b99190613960565b60405180910390a360019150509392505050565b60006111da338333612fb0565b9050919050565b6111e9612def565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d90614019565b60405180910390fd5b600460009054906101000a900460ff1661126f57600080fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506007819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600c819055506000600460006101000a81548160ff02191690831515021790555050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061148933600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205433612fb0565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415806114f757503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b61150057600080fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90614201565b60405180910390fd5b8481611593919061415b565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555084600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116259190614221565b925050819055508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516116899190613960565b60405180910390a38573ffffffffffffffffffffffffffffffffffffffff1663a4c0ed36338787876040518563ffffffff1660e01b81526004016116d094939291906142c4565b6020604051808303816000875af11580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117139190614319565b915050949350505050565b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166117ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a390614392565b60405180910390fd5b6117b68383613011565b6001905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008442111561182b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611822906143fe565b60405180910390fd5b60007f42ce63790c28229c123925d83266e77c04d28784552ab68b350a9003226cbd59898989600d60008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906118a19061441e565b919050558a6040516020016118bb96959493929190614467565b6040516020818303038152906040528051906020012090506118e0898287878761315a565b806118f457506118f38982878787613270565b5b6118fd57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614158061196557503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b61196e57600080fd5b6000600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050878110156119f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ec90614201565b60405180910390fd5b8781611a01919061415b565b600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555087600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a939190614221565b925050819055508873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a604051611af79190613960565b60405180910390a3600192505050979650505050505050565b6000611b1a612def565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7e90614019565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bee90614514565b60405180910390fd5b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f5c364079e7102c27c608f9b237c735a1b7bfa0b67f27c2ad26bad447bf965cac60405160405180910390a460019050919050565b6000600460019054906101000a900460ff1615611d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6a90614580565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dda90614514565b60405180910390fd5b611ded3384613386565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f6b616089d04950dc06c45c6dd787d657980543f89651aec47924752c7d16c88885604051611e4a9190613960565b60405180910390a36001905092915050565b611e64612def565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec890614019565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3890614514565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060055442611f909190614221565b600c8190555050565b60055481565b6000611fee3330857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166134cf909392919063ffffffff16565b611ff88383613558565b905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026020528060005260406000206000915090505481565b600d6020528060005260406000206000915090505481565b6007818154811061206457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b60006120a3612def565b905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600180546120db90614068565b80601f016020809104026020016040519081016040528092919081815260200182805461210790614068565b80156121545780601f1061212957610100808354040283529160200191612154565b820191906000526020600020905b81548152906001019060200180831161213757829003601f168201915b505050505081565b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e190614392565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561225a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225190614514565b60405180910390fd5b6122648383613386565b6001905092915050565b606060078054806020026020016040519081016040528092919081815260200182805480156122f257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116122a8575b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158061236557503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b61236e57600080fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156123f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ec90614201565b60405180910390fd5b8281612401919061415b565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124939190614221565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516124f79190613960565b60405180910390a3600191505092915050565b60066020528060005260406000206000915054906101000a900460ff1681565b60006125793330847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166134cf909392919063ffffffff16565b6125838233613558565b9050919050565b6000612594612def565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f890614019565b60405180910390fd5b61260b8383613558565b905092915050565b600a5481565b612621612def565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268590614019565b60405180910390fd5b80600460016101000a81548160ff02191690831515021790555050565b600083600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258660405161278b9190613960565b60405180910390a38473ffffffffffffffffffffffffffffffffffffffff1662ba451f338686866040518563ffffffff1660e01b81526004016127d194939291906142c4565b6020604051808303816000875af11580156127f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128149190614319565b9050949350505050565b612826612def565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288a90614019565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161294a9190613cec565b602060405180830381865afa158015612967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298b91906145b5565b90506129da3330837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166134cf909392919063ffffffff16565b6129e48133613558565b91505090565b83421115612a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a24906143fe565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888600d60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612aa39061441e565b9190505589604051602001612abd96959493929190614467565b604051602081830303815290604052805190602001209050612ae2888286868661315a565b80612af65750612af58882868686613270565b5b612aff57600080fd5b85600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92588604051612bdd9190613960565b60405180910390a35050505050505050565b612bf7612def565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5b90614019565b60405180910390fd5b600c54421015612c7357600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600e602052816000526040600020602052806000526040600020600091509150505481565b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8290614392565b60405180910390fd5b612d958383613011565b8273ffffffffffffffffffffffffffffffffffffffff16847f05d0634fe981be85c22e2942a880821b70095d84e152c3ea3c17a4e4250d9d6184604051612ddc9190613960565b60405180910390a3600190509392505050565b6000600c544210612e2457600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612e4a565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b90565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612e7b612def565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edf90614019565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4f90614514565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060055442612fa79190614221565b600a8190555050565b6000612fbc8484613386565b61300782847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661361e9092919063ffffffff16565b8290509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613081576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130789061462e565b60405180910390fd5b80600360008282546130939190614221565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130e99190614221565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161314e9190613960565b60405180910390a35050565b6000807f0000000000000000000000000000000000000000000000000000000000000000866040516020016131909291906146c6565b6040516020818303038152906040528051906020012090506000600182878787604051600081526020016040526040516131cd94939291906146fd565b6020604051602081039080840390855afa1580156131ef573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561326357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b9250505095945050505050565b6000807f0000000000000000000000000000000000000000000000000000000000000000866040516020016132a692919061478e565b6040516020818303038152906040528051906020012090506000600182878787604051600081526020016040526040516132e394939291906146fd565b6020604051602081039080840390855afa158015613305573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561337957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b9250505095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ed90614837565b60405180910390fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613445919061415b565b92505081905550806003600082825461345e919061415b565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516134c39190613960565b60405180910390a35050565b613552846323b872dd60e01b8585856040516024016134f093929190614857565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506136a4565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161415801561360257503073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614155b61360b57600080fd5b6136158284613011565b82905092915050565b61369f8363a9059cbb60e01b848460405160240161363d92919061488e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506136a4565b505050565b6136c38273ffffffffffffffffffffffffffffffffffffffff16613815565b613702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f990614903565b60405180910390fd5b6000808373ffffffffffffffffffffffffffffffffffffffff168360405161372a919061496a565b6000604051808303816000865af19150503d8060008114613767576040519150601f19603f3d011682016040523d82523d6000602084013e61376c565b606091505b5091509150816137b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a8906149cd565b60405180910390fd5b60008151111561380f57808060200190518101906137cf9190614319565b61380e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380590614a5f565b60405180910390fd5b5b50505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156138575750808214155b92505050919050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138958261386a565b9050919050565b6138a58161388a565b81146138b057600080fd5b50565b6000813590506138c28161389c565b92915050565b6000819050919050565b6138db816138c8565b81146138e657600080fd5b50565b6000813590506138f8816138d2565b92915050565b60008060006060848603121561391757613916613860565b5b6000613925868287016138b3565b9350506020613936868287016138e9565b9250506040613947868287016138b3565b9150509250925092565b61395a816138c8565b82525050565b60006020820190506139756000830184613951565b92915050565b6000819050919050565b61398e8161397b565b82525050565b60006020820190506139a96000830184613985565b92915050565b600080604083850312156139c6576139c5613860565b5b60006139d4858286016138e9565b92505060206139e5858286016138b3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a29578082015181840152602081019050613a0e565b83811115613a38576000848401525b50505050565b6000601f19601f8301169050919050565b6000613a5a826139ef565b613a6481856139fa565b9350613a74818560208601613a0b565b613a7d81613a3e565b840191505092915050565b60006020820190508181036000830152613aa28184613a4f565b905092915050565b60008060408385031215613ac157613ac0613860565b5b6000613acf858286016138b3565b9250506020613ae0858286016138e9565b9150509250929050565b60008115159050919050565b613aff81613aea565b82525050565b6000602082019050613b1a6000830184613af6565b92915050565b600080600060608486031215613b3957613b38613860565b5b6000613b47868287016138b3565b9350506020613b58868287016138b3565b9250506040613b69868287016138e9565b9150509250925092565b600060208284031215613b8957613b88613860565b5b6000613b97848285016138e9565b91505092915050565b600060208284031215613bb657613bb5613860565b5b6000613bc4848285016138b3565b91505092915050565b600060ff82169050919050565b613be381613bcd565b82525050565b6000602082019050613bfe6000830184613bda565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c2957613c28613c04565b5b8235905067ffffffffffffffff811115613c4657613c45613c09565b5b602083019150836001820283011115613c6257613c61613c0e565b5b9250929050565b60008060008060608587031215613c8357613c82613860565b5b6000613c91878288016138b3565b9450506020613ca2878288016138e9565b935050604085013567ffffffffffffffff811115613cc357613cc2613865565b5b613ccf87828801613c13565b925092505092959194509250565b613ce68161388a565b82525050565b6000602082019050613d016000830184613cdd565b92915050565b613d1081613bcd565b8114613d1b57600080fd5b50565b600081359050613d2d81613d07565b92915050565b613d3c8161397b565b8114613d4757600080fd5b50565b600081359050613d5981613d33565b92915050565b600080600080600080600060e0888a031215613d7e57613d7d613860565b5b6000613d8c8a828b016138b3565b9750506020613d9d8a828b016138b3565b9650506040613dae8a828b016138e9565b9550506060613dbf8a828b016138e9565b9450506080613dd08a828b01613d1e565b93505060a0613de18a828b01613d4a565b92505060c0613df28a828b01613d4a565b91505092959891949750929550565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e368161388a565b82525050565b6000613e488383613e2d565b60208301905092915050565b6000602082019050919050565b6000613e6c82613e01565b613e768185613e0c565b9350613e8183613e1d565b8060005b83811015613eb2578151613e998882613e3c565b9750613ea483613e54565b925050600181019050613e85565b5085935050505092915050565b60006020820190508181036000830152613ed98184613e61565b905092915050565b613eea81613aea565b8114613ef557600080fd5b50565b600081359050613f0781613ee1565b92915050565b600060208284031215613f2357613f22613860565b5b6000613f3184828501613ef8565b91505092915050565b60008060408385031215613f5157613f50613860565b5b6000613f5f858286016138b3565b9250506020613f70858286016138b3565b9150509250929050565b600080600060608486031215613f9357613f92613860565b5b6000613fa186828701613d4a565b9350506020613fb2868287016138b3565b9250506040613fc3868287016138e9565b9150509250925092565b7f416e7973776170563345524332303a20464f5242494444454e00000000000000600082015250565b60006140036019836139fa565b915061400e82613fcd565b602082019050919050565b6000602082019050818103600083015261403281613ff6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061408057607f821691505b6020821081141561409457614093614039565b5b50919050565b7f416e7973776170563345524332303a207265717565737420657863656564732060008201527f616c6c6f77616e63650000000000000000000000000000000000000000000000602082015250565b60006140f66029836139fa565b91506141018261409a565b604082019050919050565b60006020820190508181036000830152614125816140e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614166826138c8565b9150614171836138c8565b9250828210156141845761418361412c565b5b828203905092915050565b7f416e7973776170563345524332303a207472616e7366657220616d6f756e742060008201527f657863656564732062616c616e63650000000000000000000000000000000000602082015250565b60006141eb602f836139fa565b91506141f68261418f565b604082019050919050565b6000602082019050818103600083015261421a816141de565b9050919050565b600061422c826138c8565b9150614237836138c8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561426c5761426b61412c565b5b828201905092915050565b600082825260208201905092915050565b82818337600083830152505050565b60006142a38385614277565b93506142b0838584614288565b6142b983613a3e565b840190509392505050565b60006060820190506142d96000830187613cdd565b6142e66020830186613951565b81810360408301526142f9818486614297565b905095945050505050565b60008151905061431381613ee1565b92915050565b60006020828403121561432f5761432e613860565b5b600061433d84828501614304565b91505092915050565b7f416e7973776170563445524332303a20464f5242494444454e00000000000000600082015250565b600061437c6019836139fa565b915061438782614346565b602082019050919050565b600060208201905081810360008301526143ab8161436f565b9050919050565b7f416e7973776170563345524332303a2045787069726564207065726d69740000600082015250565b60006143e8601e836139fa565b91506143f3826143b2565b602082019050919050565b60006020820190508181036000830152614417816143db565b9050919050565b6000614429826138c8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561445c5761445b61412c565b5b600182019050919050565b600060c08201905061447c6000830189613985565b6144896020830188613cdd565b6144966040830187613cdd565b6144a36060830186613951565b6144b06080830185613951565b6144bd60a0830184613951565b979650505050505050565b7f416e7973776170563345524332303a2061646472657373283078302900000000600082015250565b60006144fe601c836139fa565b9150614509826144c8565b602082019050919050565b6000602082019050818103600083015261452d816144f1565b9050919050565b7f416e7973776170563445524332303a206f6e6c79417574680000000000000000600082015250565b600061456a6018836139fa565b915061457582614534565b602082019050919050565b600060208201905081810360008301526145998161455d565b9050919050565b6000815190506145af816138d2565b92915050565b6000602082840312156145cb576145ca613860565b5b60006145d9848285016145a0565b91505092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000614618601f836139fa565b9150614623826145e2565b602082019050919050565b600060208201905081810360008301526146478161460b565b9050919050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061468f60028361464e565b915061469a82614659565b600282019050919050565b6000819050919050565b6146c06146bb8261397b565b6146a5565b82525050565b60006146d182614682565b91506146dd82856146af565b6020820191506146ed82846146af565b6020820191508190509392505050565b60006080820190506147126000830187613985565b61471f6020830186613bda565b61472c6040830185613985565b6147396060830184613985565b95945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000614778601c8361464e565b915061478382614742565b601c82019050919050565b60006147998261476b565b91506147a582856146af565b6020820191506147b582846146af565b6020820191508190509392505050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006148216021836139fa565b915061482c826147c5565b604082019050919050565b6000602082019050818103600083015261485081614814565b9050919050565b600060608201905061486c6000830186613cdd565b6148796020830185613cdd565b6148866040830184613951565b949350505050565b60006040820190506148a36000830185613cdd565b6148b06020830184613951565b9392505050565b7f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400600082015250565b60006148ed601f836139fa565b91506148f8826148b7565b602082019050919050565b6000602082019050818103600083015261491c816148e0565b9050919050565b600081519050919050565b600081905092915050565b600061494482614923565b61494e818561492e565b935061495e818560208601613a0b565b80840191505092915050565b60006149768284614939565b915081905092915050565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564600082015250565b60006149b76020836139fa565b91506149c282614981565b602082019050919050565b600060208201905081810360008301526149e6816149aa565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614a49602a836139fa565b9150614a54826149ed565b604082019050919050565b60006020820190508181036000830152614a7881614a3c565b905091905056fea2646970667358221220a683bfdb9e7fe03a7c1b27eb69dc8ef3ec521bb0c77c0be9e64e3a80e1226e9464736f6c634300080a003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d71cb0c4a82c36312b5b83c43f351b882756957f0000000000000000000000000000000000000000000000000000000000000006416e7965726300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006416e796572630000000000000000000000000000000000000000000000000000

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d71cb0c4a82c36312b5b83c43f351b882756957f0000000000000000000000000000000000000000000000000000000000000006416e7965726300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006416e796572630000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Anyerc
Arg [1] : _symbol (string): Anyerc
Arg [2] : _decimals (uint8): 18
Arg [3] : _underlying (address): 0x0000000000000000000000000000000000000000
Arg [4] : _vault (address): 0xD71Cb0C4A82C36312B5b83c43F351B882756957F

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 000000000000000000000000d71cb0c4a82c36312b5b83c43f351b882756957f
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 416e796572630000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [8] : 416e796572630000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.