ETH Price: $2,952.52 (+0.53%)

Token

Drum'roll' please... because TAIBO... (TAIBOI)

Overview

Max Total Supply

4,435.399215217349026844 TAIBOI

Holders

17

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
bolson.linea.eth
Balance
0.000000001591987812 TAIBOI

Value
$0.00
0x05528ff08664d75c86289e7b11a1165f79768cfb
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
TokenSlave

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 100 runs

Other Settings:
paris EvmVersion
File 1 of 25 : TokenSlave.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {SlaveTokenBase} from "./lib/SlaveTokenBase.sol";

contract TokenSlave is SlaveTokenBase {
    constructor(
        address _vizingPad,
        uint64 _masterChainId
    ) SlaveTokenBase("Drum'roll' please... because TAIBOI is here to turn things up!", "TAIBOI", _vizingPad, address(0), _masterChainId) {}
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        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) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev 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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import {IMessageStruct} from "./IMessageStruct.sol";

interface IMessageChannel is IMessageStruct {
    /*
        /// @notice LaunchPad is the function that user or DApps send omni-chain message to other chain
        ///         Once the message is sent, the Relay will validate the message and send it to the target chain
        /// @dev 1. we will call the LaunchPad.Launch function to emit the message
        /// @dev 2. the message will be sent to the destination chain
        /// @param earliestArrivalTimestamp The earliest arrival time for the message
        ///        set to 0, vizing will forward the information ASAP.
        /// @param latestArrivalTimestamp The latest arrival time for the message
        ///        set to 0, vizing will forward the information ASAP.
        /// @param relayer the specify relayer for your message
        ///        set to 0, all the relayers will be able to forward the message
        /// @param sender The sender address for the message
        ///        most likely the address of the EOA, the user of some DApps
        /// @param value native token amount, will be sent to the target contract
        /// @param destChainid The destination chain id for the message
        /// @param additionParams The addition params for the message
        ///        if not in expert mode, set to 0 (`new bytes(0)`)
        /// @param message Arbitrary information
        ///
        ///    bytes                         
        ///   message  = abi.encodePacked(
        ///         byte1           uint256         uint24        uint64        bytes
        ///     messageType, activateContract, executeGasLimit, maxFeePerGas, signature
        ///   )
        ///        
    */
    function Launch(
        uint64 earliestArrivalTimestamp,
        uint64 latestArrivalTimestamp,
        address relayer,
        address sender,
        uint256 value,
        uint64 destChainid,
        bytes calldata additionParams,
        bytes calldata message
    ) external payable;

    ///
    ///    bytes                          byte1           uint256         uint24        uint64        bytes
    ///   message  = abi.encodePacked(messageType, activateContract, executeGasLimit, maxFeePerGas, signature)
    ///
    function launchMultiChain(
        launchEnhanceParams calldata params
    ) external payable;

    /// @notice batch landing message to the chain, execute the landing message
    /// @dev trusted relayer will call this function to send omni-chain message to the Station
    /// @param params the landing message params
    /// @param proofs the  proof of the validated message
    function Landing(
        landingParams[] calldata params,
        bytes[][] calldata proofs
    ) external payable;

    /// @notice similar to the Landing function, but with gasLimit
    function LandingSpecifiedGas(
        landingParams[] calldata params,
        uint24 gasLimit,
        bytes[][] calldata proofs
    ) external payable;

    /// @dev feel free to call this function before pass message to the Station,
    ///      this method will return the protocol fee that the message need to pay, longer message will pay more
    function estimateGas(
        uint256[] calldata value,
        uint64[] calldata destChainid,
        bytes[] calldata additionParams,
        bytes[] calldata message
    ) external view returns (uint256);

    function estimateGas(
        uint256 value,
        uint64 destChainid,
        bytes calldata additionParams,
        bytes calldata message
    ) external view returns (uint256);

    function estimatePrice(
        address sender,
        uint64 destChainid
    ) external view returns (uint64);

    function gasSystemAddr() external view returns (address);

    /// @dev get the message launch nonce of the sender on the specific chain
    /// @param chainId the chain id of the sender
    /// @param sender the address of the sender
    function GetNonceLaunch(
        uint64 chainId,
        address sender
    ) external view returns (uint32);

    /// @dev get the message landing nonce of the sender on the specific chain
    /// @param chainId the chain id of the sender
    /// @param sender the address of the sender
    function GetNonceLanding(
        uint64 chainId,
        address sender
    ) external view returns (uint32);

    /// @dev get the version of the Station
    /// @return the version of the Station, like "v1.0.0"
    function Version() external view returns (string memory);

    /// @dev get the chainId of current Station
    /// @return chainId, defined in the L2SupportLib.sol
    function Chainid() external view returns (uint64);

    function minArrivalTime() external view returns (uint64);

    function maxArrivalTime() external view returns (uint64);

    function expertLandingHook(bytes1 hook) external view returns (address);

    function expertLaunchHook(bytes1 hook) external view returns (address);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import {IMessageStruct} from "./IMessageStruct.sol";

interface IMessageDashboard is IMessageStruct {
    /// @dev Only owner can call this function to stop or restart the engine
    /// @param stop true is stop, false is start
    function PauseEngine(bool stop) external;

    /// @notice return the states of the engine
    /// @return 0x01 is stop, 0x02 is start
    function engineState() external view returns (uint8);

    /// @notice return the states of the engine & Landing Pad
    function padState() external view returns (uint8, uint8);

    // function mptRoot() external view returns (bytes32);

    /// @dev withdraw the protocol fee from the contract, only owner can call this function
    /// @param amount the amount of the withdraw protocol fee
    function Withdraw(uint256 amount, address to) external;

    /// @dev set the payment system address, only owner can call this function
    /// @param gasSystemAddress the address of the payment system
    function setGasSystem(address gasSystemAddress) external;

    function setExpertLaunchHooks(
        bytes1[] calldata ids,
        address[] calldata hooks
    ) external;

    function setExpertLandingHooks(
        bytes1[] calldata ids,
        address[] calldata hooks
    ) external;

    /// notice reset the permission of the contract, only owner can call this function
    function roleConfiguration(
        bytes32 role,
        address[] calldata accounts,
        bool[] calldata states
    ) external;

    function stationAdminSetRole(
        bytes32 role,
        address[] calldata accounts,
        bool[] calldata states
    ) external;

    /// @notice transfer the ownership of the contract, only owner can call this function
    function transferOwnership(address newOwner) external;
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import "./IMessageSpaceStation.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IMessageEmitter {
    function minArrivalTime() external view returns (uint64);

    function maxArrivalTime() external view returns (uint64);

    function minGasLimit() external view returns (uint24);

    function maxGasLimit() external view returns (uint24);

    function defaultBridgeMode() external view returns (bytes1);

    function selectedRelayer() external view returns (address);
}

File 12 of 25 : IMessageEvent.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import {IMessageStruct} from "./IMessageStruct.sol";

interface IMessageEvent is IMessageStruct {
    /// @notice Throws event after a  message which attempts to omni-chain is submitted to LaunchPad contract
    event SuccessfulLaunchMessage(
        uint32 indexed nonce,
        uint64 earliestArrivalTimestamp,
        uint64 latestArrivalTimestamp,
        address relayer,
        address sender,
        address srcContract,
        uint256 value,
        uint64 destChainid,
        bytes additionParams,
        bytes message
    );

    /// @notice Throws event after a  message which attempts to omni-chain is submitted to LaunchPad contract
    event SuccessfulLaunchMultiMessages(
        uint32[] indexed nonce,
        uint64 earliestArrivalTimestamp,
        uint64 latestArrivalTimestamp,
        address relayer,
        address sender,
        address srcContract,
        uint256[] value,
        uint64[] destChainid,
        bytes[] additionParams,
        bytes[] message
    );

    /// @notice Throws event after a omni-chain message is submitted from source chain to target chain
    event SuccessfulLanding(bytes32 indexed messageId, landingParams params);

    /// @notice Throws event after protocol state is changed, such as pause or resume
    event EngineStateRefreshing(bool indexed isPause);

    /// @notice Throws event after protocol fee calculation is changed
    event PaymentSystemChanging(address indexed gasSystemAddress);

    /// @notice Throws event after successful withdrawa
    event WithdrawRequest(address indexed to, uint256 amount);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

interface IMessageReceiver {
    function receiveStandardMessage(
        uint64 srcChainId,
        uint256 srcContract,
        bytes calldata message
    ) external payable;
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import {IMessageStruct} from "./IMessageStruct.sol";

interface IMessageSimulation is IMessageStruct {
    /// @dev for sequencer to simulate the landing message, call this function before call Landing
    /// @param params the landing message params
    /// check the revert message "SimulateResult" to get the result of the simulation
    /// for example, if the result is [true, false, true], it means the first and third message is valid, the second message is invalid
    function SimulateLanding(landingParams[] calldata params) external payable;

    /// @dev call this function off-chain to estimate the gas of excute the landing message
    /// @param params the landing message params
    /// @return the result of the estimation, true is valid, false is invalid
    function EstimateExecuteGas(
        landingParams[] calldata params
    ) external returns (bool[] memory);
}

File 15 of 25 : IMessageSpaceStation.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import {IMessageStruct} from "./IMessageStruct.sol";
import {IMessageDashboard} from "./IMessageDashboard.sol";
import {IMessageEvent} from "../interface/IMessageEvent.sol";
import {IMessageChannel} from "../interface/IMessageChannel.sol";
import {IMessageSimulation} from "../interface/IMessageSimulation.sol";

interface IMessageSpaceStation is
    IMessageStruct,
    IMessageDashboard,
    IMessageEvent,
    IMessageChannel,
    IMessageSimulation
{}

File 16 of 25 : IMessageStruct.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

interface IMessageStruct {
    struct launchParams {
        uint64 earliestArrivalTimestamp;
        uint64 latestArrivalTimestamp;
        address relayer;
        address sender;
        uint256 value;
        uint64 destChainid;
        bytes additionParams;
        bytes message;
    }

    struct landingParams {
        bytes32 messageId;
        uint64 earliestArrivalTimestamp;
        uint64 latestArrivalTimestamp;
        uint64 srcChainid;
        bytes32 srcTxHash;
        uint256 srcContract;
        uint32 srcChainNonce;
        uint256 sender;
        uint256 value;
        bytes additionParams;
        bytes message;
    }

    struct launchEnhanceParams {
        uint64 earliestArrivalTimestamp;
        uint64 latestArrivalTimestamp;
        address relayer;
        address sender;
        uint256[] value;
        uint64[] destChainid;
        bytes[] additionParams;
        bytes[] message;
    }

    struct RollupMessageStruct {
        SignedMessageBase base;
        IMessageStruct.launchParams params;
    }

    struct SignedMessageBase {
        uint64 srcChainId;
        uint24 nonceLaunch;
        bytes32 srcTxHash;
        bytes32 destTxHash;
        uint64 srcTxTimestamp;
        uint64 destTxTimestamp;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

interface IVizingGasSystemChannel {
    /*
        /// @notice Estimate how many native token we should spend to exchange the amountOut in the destChainid
        /// @param destChainid The chain id of the destination chain
        /// @param amountOut The value we want to receive in the destination chain
        /// @return amountIn the native token amount on the source chain we should spend
    */
    function exactOutput(
        uint64 destChainid,
        uint256 amountOut
    ) external view returns (uint256 amountIn);

    /*
        /// @notice Estimate how many native token we could get in the destChainid if we input the amountIn
        /// @param destChainid The chain id of the destination chain
        /// @param amountIn The value we spent in the source chain
        /// @return amountOut the native token amount the destination chain will receive
    */
    function exactInput(
        uint64 destChainid,
        uint256 amountIn
    ) external view returns (uint256 amountOut);

    /*
        /// @notice Estimate the gas fee we should pay to vizing
        /// @param destChainid The chain id of the destination chain
        /// @param message The message we want to send to the destination chain
    */
    function estimateGas(
        uint256 amountOut,
        uint64 destChainid,
        bytes calldata message
    ) external view returns (uint256);

    /*
        /// @notice Estimate the gas fee & native token we should pay to vizing
        /// @param amountOut amountOut in the destination chain
        /// @param destChainid The chain id of the destination chain
        /// @param message The message we want to send to the destination chain
    */
    function batchEstimateTotalFee(
        uint256[] calldata amountOut,
        uint64[] calldata destChainid,
        bytes[] calldata message
    ) external view returns (uint256 totalFee);

    /*
        /// @notice Estimate the total fee we should pay to vizing
        /// @param value The value we spent in the source chain
        /// @param destChainid The chain id of the destination chain
        /// @param message The message we want to send to the destination chain
    */
    function estimateTotalFee(
        uint256 value,
        uint64 destChainid,
        bytes calldata message
    ) external view returns (uint256 totalFee);

    /*
        /// @notice Estimate the gas price we need to encode in message
        /// @param sender most likely the address of the DApp, which forward the message from user
        /// @param destChainid The chain id of the destination chain
    */
    function estimatePrice(
        address targetContract,
        uint64 destChainid
    ) external view returns (uint64);

    /*
        /// @notice Estimate the gas price we need to encode in message
        /// @param destChainid The chain id of the destination chain
    */
    function estimatePrice(uint64 destChainid) external view returns (uint64);

    /*
        /// @notice Calculate the fee for the native token transfer
        /// @param amount The value we spent in the source chain
    */
    function computeTradeFee(
        uint64 destChainid,
        uint256 amountOut
    ) external view returns (uint256 fee);

    /*
        /// @notice Calculate the fee for the native token transfer
        /// @param amount The value we spent in the source chain
    */
    function computeTradeFee(
        address targetContract,
        uint64 destChainid,
        uint256 amountOut
    ) external view returns (uint256 fee);
}

File 18 of 25 : MessageTypeLib.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

library MessageTypeLib {
    bytes1 constant DEFAULT = 0x00;

    /* ********************* message type **********************/
    bytes1 constant STANDARD_ACTIVATE = 0x01;
    bytes1 constant ARBITRARY_ACTIVATE = 0x02;
    bytes1 constant MESSAGE_POST = 0x03;
    bytes1 constant NATIVE_TOKEN_SEND = 0x04;

    /**
     * additionParams type *********************
     */
    // Single-Send mode
    bytes1 constant SINGLE_SEND = 0x01;
    bytes1 constant ERC20_HANDLER = 0x03;
    bytes1 constant MULTI_MANY_2_ONE = 0x04;
    bytes1 constant MULTI_UNIVERSAL = 0x05;

    bytes1 constant MAX_MODE = 0xFF;

    function fetchMsgMode(
        bytes calldata message
    ) internal pure returns (bytes1) {
        if (message.length < 1) {
            return DEFAULT;
        }
        bytes1 messageSlice = bytes1(message[0:1]);
        return messageSlice;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import {IMessageStruct} from "./interface/IMessageStruct.sol";
import {IMessageChannel} from "./interface/IMessageChannel.sol";
import {IMessageEmitter} from "./interface/IMessageEmitter.sol";
import {IMessageReceiver} from "./interface/IMessageReceiver.sol";
import {IVizingGasSystemChannel} from "./interface/IVizingGasSystemChannel.sol";

abstract contract MessageEmitter is IMessageEmitter {
    /// @dev bellow are the default parameters for the OmniToken,
    ///      we **Highly recommended** to use immutable variables to store these parameters
    /// @notice minArrivalTime the minimal arrival timestamp for the omni-chain message
    /// @notice maxArrivalTime the maximal arrival timestamp for the omni-chain message
    /// @notice minGasLimit the minimal gas limit for target chain execute omni-chain message
    /// @notice maxGasLimit the maximal gas limit for target chain execute omni-chain message
    /// @notice defaultBridgeMode the default mode for the omni-chain message,
    ///        in OmniToken, we use MessageTypeLib.ARBITRARY_ACTIVATE (0x02), target chain will **ACTIVATE** the message
    /// @notice selectedRelayer the specify relayer for your message
    ///        set to 0, all the relayers will be able to forward the message
    /// see https://docs.vizing.com/docs/BuildOnVizing/Contract

    function minArrivalTime() external view virtual override returns (uint64) {}

    function maxArrivalTime() external view virtual override returns (uint64) {}

    function minGasLimit() external view virtual override returns (uint24) {}

    function maxGasLimit() external view virtual override returns (uint24) {}

    function defaultBridgeMode()
        external
        view
        virtual
        override
        returns (bytes1)
    {}

    function selectedRelayer()
        external
        view
        virtual
        override
        returns (address)
    {}

    IMessageChannel public LaunchPad;

    constructor(address _LaunchPad) {
        __LaunchPadInit(_LaunchPad);
    }

    /*
        /// rewrite set LaunchPad address function
        /// @notice call this function to reset the LaunchPad contract address
        /// @param _LaunchPad The new LaunchPad contract address
    */
    function __LaunchPadInit(address _LaunchPad) internal virtual {
        LaunchPad = IMessageChannel(_LaunchPad);
    }

    /*
        /// @notice call this function to packet the message before sending it to the LandingPad contract
        /// @param mode the emitter mode, check MessageTypeLib.sol for more details
        ///        eg: 0x02 for ARBITRARY_ACTIVATE, your message will be activated on the target chain
        /// @param gasLimit the gas limit for executing the specific function on the target contract
        /// @param targetContract the target contract address on the destination chain
        /// @param message the message to be sent to the target contract
        /// @return the packed message
        /// see https://docs.vizing.com/docs/BuildOnVizing/Contract
    */
    function _packetMessage(
        bytes1 mode,
        address targetContract,
        uint24 gasLimit,
        uint64 price,
        bytes memory message
    ) internal pure returns (bytes memory) {
        return
            abi.encodePacked(
                mode,
                uint256(uint160(targetContract)),
                gasLimit,
                price,
                message
            );
    }

    /*
        /// @notice use this function to send the ERC20 token to the destination chain
        /// @param tokenSymbol The token symbol
        /// @param sender The sender address for the message
        /// @param receiver The receiver address for the message
        /// @param amount The amount of tokens to be sent
        /// see https://docs.vizing.com/docs/DApp/Omni-ERC20-Transfer
    */
    function _packetAdditionParams(
        bytes1 mode,
        bytes1 tokenSymbol,
        address sender,
        address receiver,
        uint256 amount
    ) internal pure returns (bytes memory) {
        return abi.encodePacked(mode, tokenSymbol, sender, receiver, amount);
    }

    /*
        /// @notice Calculate the amount of native tokens obtained on the target chain
        /// @param value The value we send to vizing on the source chain
    */
    function _computeTradeFee(
        uint64 destChainid,
        uint256 value
    ) internal view returns (uint256 amountIn) {
        return
            IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).computeTradeFee(
                destChainid,
                value
            );
    }

    /*
        /// @notice Fetch the nonce of the user with specific destination chain
        /// @param destChainid The chain id of the destination chain
        /// see https://docs.vizing.com/docs/BuildOnVizing/Contract
    */
    function _fetchNonce(
        uint64 destChainid
    ) internal view virtual returns (uint32 nonce) {
        nonce = LaunchPad.GetNonceLaunch(destChainid, msg.sender);
    }

    /*
        /// @notice Estimate the gas price we need to encode in message
        /// @param destChainid The chain id of the destination chain
        /// see https://docs.vizing.com/docs/BuildOnVizing/Contract
    */
    function _fetchPrice(
        uint64 destChainid
    ) internal view virtual returns (uint64) {
        return
            IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).estimatePrice(
                destChainid
            );
    }

    /*
        /// @notice Estimate the gas price we need to encode in message
        /// @param targetContract The target contract address on the destination chain
        /// @param destChainid The chain id of the destination chain
        /// see https://docs.vizing.com/docs/BuildOnVizing/Contract
    */
    function _fetchPrice(
        address targetContract,
        uint64 destChainid
    ) internal view virtual returns (uint64) {
        return
            IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).estimatePrice(
                targetContract,
                destChainid
            );
    }

    /*
        /// @notice similar to uniswap Swap Router
        /// @notice Estimate how many native token we should spend to exchange the amountOut in the destChainid
        /// @param destChainid The chain id of the destination chain
        /// @param amountOut The value we want to exchange in the destination chain
        /// @return amountIn the native token amount on the source chain we should spend
        /// see https://docs.vizing.com/docs/BuildOnVizing/Contract
    */
    function _exactOutput(
        uint64 destChainid,
        uint256 amountOut
    ) internal view returns (uint256 amountIn) {
        return
            IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).exactOutput(
                destChainid,
                amountOut
            );
    }

    /*
        /// @notice similar to uniswap Swap Router
        /// @notice Estimate how many native token we could get in the destChainid if we input the amountIn
        /// @param destChainid The chain id of the destination chain
        /// @param amountIn The value we spent in the source chain
        /// @return amountOut the native token amount the destination chain will receive
        /// see https://docs.vizing.com/docs/BuildOnVizing/Contract
    */
    function _exactInput(
        uint64 destChainid,
        uint256 amountIn
    ) internal view returns (uint256 amountOut) {
        return
            IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).exactInput(
                destChainid,
                amountIn
            );
    }

    /*
        /// @notice Estimate the gas price we need to encode in message
        /// @param value The native token that value target address will receive in the destination chain
        /// @param destChainid The chain id of the destination chain
        /// @param additionParams The addition params for the message
        ///        if not in expert mode, set to 0 (`new bytes(0)`)
        /// @param message The message we want to send to the destination chain
        /// see https://docs.vizing.com/docs/BuildOnVizing/Contract
    */
    function _estimateVizingGasFee(
        uint256 value,
        uint64 destChainid,
        bytes memory additionParams,
        bytes memory message
    ) internal view returns (uint256 vizingGasFee) {
        return
            LaunchPad.estimateGas(value, destChainid, additionParams, message);
    }

    /*  
        /// @notice **Highly recommend** to call this function in your frontend program
        /// @notice Estimate the gas price we need to encode in message
        /// @param value The native token that value target address will receive in the destination chain
        /// @param destChainid The chain id of the destination chain
        /// @param additionParams The addition params for the message
        ///        if not in expert mode, set to 0 (`new bytes(0)`)
        /// @param message The message we want to send to the destination chain
        /// see https://docs.vizing.com/docs/BuildOnVizing/Contract
    */
    function estimateVizingGasFee(
        uint256 value,
        uint64 destChainid,
        bytes calldata additionParams,
        bytes calldata message
    ) external view returns (uint256 vizingGasFee) {
        return
            _estimateVizingGasFee(value, destChainid, additionParams, message);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import {IMessageChannel} from "./interface/IMessageChannel.sol";
import {IMessageReceiver} from "./interface/IMessageReceiver.sol";

abstract contract MessageReceiver is IMessageReceiver {
    error LandingPadAccessDenied();
    error NotImplement();
    IMessageChannel public LandingPad;

    modifier onlyVizingPad() {
        if (msg.sender != address(LandingPad)) revert LandingPadAccessDenied();
        _;
    }

    constructor(address _LandingPad) {
        __LandingPadInit(_LandingPad);
    }

    /*
        /// rewrite set LandingPad address function
        /// @notice call this function to reset the LaunchPad contract address
        /// @param _LaunchPad The new LaunchPad contract address
    */
    function __LandingPadInit(address _LandingPad) internal virtual {
        LandingPad = IMessageChannel(_LandingPad);
    }

    /// @notice the standard function to receive the omni-chain message
    function receiveStandardMessage(
        uint64 srcChainId,
        uint256 srcContract,
        bytes calldata message
    ) external payable virtual override onlyVizingPad {
        _receiveMessage(srcChainId, srcContract, message);
    }

    /// @dev override this function to handle the omni-chain message
    /// @param srcChainId the source chain id
    /// @param srcContract the source contract address
    /// @param message the message from the source chain
    function _receiveMessage(
        uint64 srcChainId,
        uint256 srcContract,
        bytes calldata message
    ) internal virtual {
        (srcChainId, srcContract, message);
        revert NotImplement();
    }
}

File 21 of 25 : VizingOmni.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import {MessageEmitter} from "./MessageEmitter.sol";
import {MessageReceiver} from "./MessageReceiver.sol";

abstract contract VizingOmni is MessageEmitter, MessageReceiver {
    constructor(
        address _vizingPad
    ) MessageEmitter(_vizingPad) MessageReceiver(_vizingPad) {}
}

File 22 of 25 : ERC314PlusCore.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {VizingOmni} from "@vizing/contracts/VizingOmni.sol";
import {MessageTypeLib} from "@vizing/contracts/library/MessageTypeLib.sol";
import "@openzeppelin/contracts/security/Pausable.sol";


import "./ExcessivelySafeCall.sol";
import "./NonblockingApp.sol";

abstract contract ERC314PlusCore is ERC20, Ownable, ReentrancyGuard, VizingOmni, NonblockingApp, Pausable {
    using ExcessivelySafeCall for address;

    enum ActionType {
        depositPing,
        depositPong,
        launch,
        claimPing,
        claimPong,
        buyPing,
        buyPong,
        sellPing,
        sellPong,
        crossPing
    }
    struct DebitAmount {
        uint native;
        uint token;
    }
    
    function pause() external onlyOwner {
        bool isPaused = paused() ;
        if(isPaused) {
            _unpause();
        } else {
            _pause();
        }
    }

    event MessageReceived(uint64 _srcChainId, address _srcAddress, uint value, bytes _payload);
    event PongfeeFailed(uint64 _srcChainId, address _srcAddress, uint8 _action, uint _pongFee, uint _expectPongFee);
    event Launch(
        uint earmarkedSupply,
        uint earmarkedNative,
        uint presaleRefundRatio,
        uint presaleSupply,
        uint presaleNative,
        uint omniSupply,
        uint presaleAccumulate
    );
    event Swap(address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out,uint nonce);
    event AssetLocked(ActionType _action, uint64 _srcChainId, address _owner, uint _lockedNative, uint _lockedToken,uint nonce);
    event Deposited(uint64 _srcChainId, address _sender, uint _native,uint nonce);
    event Claimed(uint64 _srcChainId, address _sender, address _to, uint _native, uint _token,uint nonce);
    event Crossed(uint64 _srcChainId, address _sender, address _to, uint _token,uint nonce);
    event Unlocked(address _owner,address _to, uint _native, uint _token);

    uint64 public immutable override minArrivalTime;
    uint64 public immutable override maxArrivalTime;
    uint24 public immutable override minGasLimit;
    uint24 public immutable override maxGasLimit;
    bytes1 public immutable override defaultBridgeMode;
    address public immutable override selectedRelayer;

    mapping(uint => mapping(address => mapping(uint => bool))) public crossNoncePing;
    mapping(uint => mapping(address => uint)) public crossNonce;


    uint64 public masterChainId;
    bool public launched;
    uint public messageReceived;
    address public feeAddress;
    uint public totalSupplyInit = 20000000 ether;
    uint public launchFunds = 10 ether;
    uint public launchTime = 1720252800;//2024-07-06 
    uint public launchHardCap = 10000 ether;
    uint public tokenomics = 4;
    address public airdropAddr;
    function setFeeAddress(address addr) public virtual onlyOwner {
        feeAddress = addr;
    }
    function setAirdropAddr(address addr) public virtual onlyOwner {
        airdropAddr = addr;
    }
    function setLaunchHardCap(uint amount) public virtual onlyOwner {
        launchHardCap = amount;
    }
    function setLaunchTime(uint launchTime_) public virtual onlyOwner {
        launchTime = launchTime_;
    }

    uint public nativeMax = 5 ether;
    uint public nativeMin = 0.0001 ether;
    uint public tokenMin = 1 ether;
    uint public nativeTotal = 50 ether;
    uint public depositTotal = 50 ether;
    function setDepositTotal(uint amount) public virtual onlyOwner {
        depositTotal = amount;
    }
    function setNativeTotal(uint amount) public virtual onlyOwner {
        nativeTotal = amount;
    }
    function setNativeMax(uint amount) public virtual onlyOwner {
        nativeMax = amount;
    }

    function setNativeMin(uint amount) public virtual onlyOwner {
        nativeMin = amount;
    }

    function setTokenMin(uint amount) public virtual onlyOwner {
        tokenMin = amount;
    }

    function nowTime() public view returns (uint)  {
        return block.timestamp;
    }
    constructor(
        string memory _name,
        string memory _symbol,
        address _vizingPad,
        uint64 _masterChainId
    ) VizingOmni(_vizingPad) ERC20(_name, _symbol) {
        masterChainId = _masterChainId;
        launched = false;
        defaultBridgeMode = MessageTypeLib.STANDARD_ACTIVATE;
        feeAddress = owner();
        airdropAddr = owner();
    }

    //----vizing bridge common----
    function paramsEstimateGas(
        uint64 dstChainId,
        address dstContract,
        uint value,
        bytes memory params
    ) public view virtual returns (uint) {
        bytes memory message = _packetMessage(
            defaultBridgeMode,
            dstContract,
            maxGasLimit,
            _fetchPrice(dstContract, dstChainId),
            abi.encode(_msgSender(), params)
        );
        return LaunchPad.estimateGas(value, dstChainId, new bytes(0), message);
    }

    function paramsEmit2LaunchPad(
        uint bridgeFee,
        uint64 dstChainId,
        address dstContract,
        uint value,
        bytes memory params,
        address sender
    ) internal virtual {
        bytes memory message = _packetMessage(
            defaultBridgeMode,
            dstContract,
            maxGasLimit,
            _fetchPrice(dstContract, dstChainId),
            abi.encode(_msgSender(), params)
        );
        /*
        emit2LaunchPad(
            0, //uint64(block.timestamp + minArrivalTime),
            0, //uint64(block.timestamp + maxArrivalTime),
            selectedRelayer,
            sender,
            value,
            dstChainId,
            new bytes(0),
            message
        );
        */
        uint bridgeValue = value + bridgeFee;
        require(msg.value >= bridgeValue, "bridgeFee err.");
        LaunchPad.Launch{value: bridgeValue}(0, 0, selectedRelayer, sender, value, dstChainId, new bytes(0), message);
    }

    //----  message call function----

    function master_deposit(
        uint pongFee,
        uint64 srcChainId,
        address sender,
        address target,
        uint amount,
        uint nonce
    ) internal virtual {
        revert NotImplement();
    }

    function master_claim(uint pongFee, uint64 srcChainId, address sender, address target,uint nonce) internal virtual {
        revert NotImplement();
    }

    function master_buy(uint pongFee, uint64 srcChainId, address sender, address target, uint native,uint nonce ) internal virtual {
        revert NotImplement();
    }

    function master_sell(uint pongFee, uint64 srcChainId, address sender, address target, uint token,uint nonce) internal virtual {
        revert NotImplement();
    }

    function slave_launch(uint64 srcChainId, address sender) internal virtual {
        revert NotImplement();
    }

    function slave_deposit(uint64 srcChainId, address sender, address target, uint amount, uint accumulate,uint nonce) internal virtual {
        revert NotImplement();
    }

    function slave_claim(uint64 srcChainId, address sender, address target, uint native, uint token,uint nonce) internal virtual {
        revert NotImplement();
    }

    function slave_buy(uint64 srcChainId, address sender, address target, uint native, uint token,uint nonce) internal virtual {
        revert NotImplement();
    }

    function slave_sell(uint64 srcChainId, address sender, address target, uint native, uint token,uint nonce) internal virtual {
        revert NotImplement();
    }

    function master_cross(
        uint64 srcChainId,
        address sender,
        uint64 dstChainId,
        address to,
        uint token,
        uint nonce
    ) internal virtual {
        revert NotImplement();
    }

    function slave_cross(
        uint64 srcChainId,
        address sender,
        uint64 dstChainId,
        address to,
        uint token,
        uint nonce
    ) internal virtual {
        revert NotImplement();
    }

    function action_master(
        uint64 srcChainId,
        address sender,
        uint8 action,
        uint pongFee,
        bytes memory params
    ) internal virtual {
        if (action == uint8(ActionType.depositPing)) {
            (uint nonce ,address target, uint amount) = abi.decode(params, (uint, address, uint));
            master_deposit(pongFee, srcChainId, sender, target, amount,nonce);
        } else if (action == uint8(ActionType.claimPing)) {
            (uint nonce ,address target) = abi.decode(params, (uint,address));
            master_claim(pongFee, srcChainId, sender, target,nonce);
        } else if (action == uint8(ActionType.buyPing)) {
            (uint nonce ,address target, uint native) = abi.decode(params, (uint,address, uint));
            master_buy(pongFee, srcChainId, sender, target, native,nonce);
        } else if (action == uint8(ActionType.sellPing)) {
            (uint nonce,address target, uint token) = abi.decode(params, (uint,address, uint));
            master_sell(pongFee, srcChainId, sender, target, token,nonce);
        } else if (action == uint8(ActionType.crossPing)) {
            (uint nonce,uint64 chainid, address to, uint token) = abi.decode(params, (uint,uint64, address, uint));
            master_cross(srcChainId, sender, chainid, to, token,nonce);
        } else revert NotImplement();
    }

    function action_slave(
        uint64 srcChainId,
        address sender,
        uint8 action,
        uint pongFee,
        bytes memory params
    ) internal virtual {
        if (action == uint8(ActionType.depositPong)) {
            (uint nonce,address target, uint amount,uint accumulate) = abi.decode(params, (uint,address, uint, uint));
            slave_deposit(srcChainId, sender, target, amount, accumulate,nonce);
        } else if (action == uint8(ActionType.claimPong)) {
            (uint nonce,address target, uint native, uint token) = abi.decode(params, (uint, address, uint, uint));
            slave_claim(srcChainId, sender, target, native, token,nonce);
        } else if (action == uint8(ActionType.buyPong)) {
            (uint nonce,address target, uint native, uint token) = abi.decode(params, (uint,address, uint, uint));
            slave_buy(srcChainId, sender, target, native, token,nonce);
        } else if (action == uint8(ActionType.sellPong)) {
            (uint nonce,address target, uint token, uint native) = abi.decode(params, (uint,address, uint, uint));
            slave_sell(srcChainId, sender, target, native, token,nonce);
        } else if (action == uint8(ActionType.launch)) {
            slave_launch(srcChainId, sender);
        } else if (action == uint8(ActionType.crossPing)) {
            (uint nonce,uint64 chainid, address to, uint token) = abi.decode(params, (uint,uint64, address, uint));
            slave_cross(srcChainId, sender, chainid, to, token,nonce);
        } else revert NotImplement();
    }

    //---- message----

    function _computePongValueWithOutPongFee(
        uint8 action,
        uint64 srcChainId,
        uint pongFee,
        bytes memory params
    ) internal view virtual returns (uint value, uint sendToFee) {
        value = msg.value - pongFee;
        sendToFee = 0;
    }

    function _nonblockingReceive(
        uint64 srcChainId,
        address sender,
        uint8 action,
        uint pongFee,
        bytes calldata params
    ) public payable virtual override {
        require(_msgSender() == address(this), "ERC314PlusCore: caller must be self");
        if (srcChainId == masterChainId) action_slave(srcChainId, sender, action, pongFee, params);
        else action_master(srcChainId, sender, action, pongFee, params);
    }

    function _callSelf(
        uint64 srcChainId,
        address sender,
        uint8 action,
        uint pongFee,
        uint callValue,
        bytes memory params
    ) internal returns (bool success, bytes memory reason) {
        (success, reason) = address(this).excessivelySafeCall(
            gasleft(),
            callValue,
            150,
            abi.encodeWithSelector(this._nonblockingReceive.selector, srcChainId, sender, action, pongFee, params)
        );
    }

    function verifySource(uint64 srcChainId, address srcContract) internal view virtual returns (bool authorized);

    function _receiveMessage(
        uint64 srcChainId,
        uint256 srcContract,
        bytes calldata _payload
    ) internal virtual override {
        require(verifySource(srcChainId, address(uint160(srcContract))), "unauthorized.");
        (address sender, bytes memory message) = abi.decode(_payload, (address, bytes));
        messageReceived += 1;
        emit MessageReceived(srcChainId, sender, msg.value, message);

        (uint8 action, uint pongFee, bytes memory params) = abi.decode(message, (uint8, uint, bytes));

        (uint value, uint sendToFee) = _computePongValueWithOutPongFee(action, srcChainId, pongFee, params);
        uint callValue = pongFee + value - sendToFee;
        if (sendToFee > 0)
            transferNative(feeAddress, sendToFee);
        (bool success, bytes memory reason) = _callSelf(srcChainId, sender, action, pongFee, callValue, params);
        if (!success) {
            _storeFailedMessage(srcChainId, sender, message, reason, callValue);
        }
        require(success, "cross-chain failed");
    }
    
    function transferNative(address to, uint amount) internal {
        (bool success, ) = to.call{value: amount}("");
        require(success, "Transfer failed.");
    }

    function _transfer(address from, address to, uint256 amount) internal virtual override {
        if (_msgSender() != address(this) && to == address(this)) {
            revert("Unsupported");
        } else {
            super._transfer(from, to, amount);
        }
    }

    //----Signature---
    /*
    function _fetchSignature(bytes memory message) internal view virtual returns (bytes memory signature) {
        //signature = abi.encodeCall(this.receiveMessage, (deployChainId, address(this), msg.sender, message));
        signature = message;
    }
    */

    function _depositPingSignature(
        uint nonce,
        address target,
        uint pongFee,
        uint amount
    ) internal view virtual returns (bytes memory) {
        return abi.encode(uint8(ActionType.depositPing), pongFee, abi.encode(nonce,target, amount));
    }
    function _depositPongSignature(
        uint nonce,
        address target,
        uint pongFee,
        uint amount,
        uint accumulate
    ) internal view virtual returns (bytes memory) {
        return abi.encode(uint8(ActionType.depositPong), pongFee, abi.encode(nonce,target, amount,accumulate));
    }

    function _claimPingSignature(uint nonce,address target, uint pongFee) internal view virtual returns (bytes memory) {
        return abi.encode(uint8(ActionType.claimPing), pongFee, abi.encode(nonce,target));
    }

    function _claimPongSignature(
        uint nonce,
        address target,
        uint refund,
        uint amount
    ) internal view virtual returns (bytes memory) {
        return abi.encode(uint8(ActionType.claimPong), 0, abi.encode(nonce,target, refund, amount));
    }

    function withdrawFee(address to, uint amount) public onlyOwner nonReentrant {
        transferNative(to, amount);
    }

    function _buyPingSignature(
        uint nonce,
        address target,
        uint pongFee,
        uint amountIn
    ) internal view virtual returns (bytes memory) {
        return abi.encode(uint8(ActionType.buyPing), pongFee, abi.encode(nonce,target, amountIn));
    }

    function _buyPongSignature(uint nonce,address target, uint native, uint token) internal view virtual returns (bytes memory) {
        return abi.encode(uint8(ActionType.buyPong), 0, abi.encode(nonce,target, native, token));
    }

    function _sellPingSignature(
        uint nonce,
        address target,
        uint pongFee,
        uint amountIn
    ) internal view virtual returns (bytes memory) {
        return abi.encode(uint8(ActionType.sellPing), pongFee, abi.encode(nonce,target, amountIn));
    }

    function _sellPongSignature(uint nonce,address target, uint native, uint token) internal view virtual returns (bytes memory) {
        return abi.encode(uint8(ActionType.sellPong), 0, abi.encode(nonce,target, native, token));
    }

    function _crossPingSignature(
        uint nonce,
        uint64 dstChainId,
        address target,
        uint token
    ) internal view virtual returns (bytes memory) {
        return abi.encode(uint8(ActionType.crossPing), 0, abi.encode(nonce,dstChainId, target, token));
    }
}

// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.7.6;

library ExcessivelySafeCall {
    uint256 constant LOW_28_MASK = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff;

    /// @notice Use when you _really_ really _really_ don't trust the called
    /// contract. This prevents the called contract from causing reversion of
    /// the caller in as many ways as we can.
    /// @dev The main difference between this and a solidity low-level call is
    /// that we limit the number of bytes that the callee can cause to be
    /// copied to caller memory. This prevents stupid things like malicious
    /// contracts returning 10,000,000 bytes causing a local OOG when copying
    /// to memory.
    /// @param _target The address to call
    /// @param _gas The amount of gas to forward to the remote contract
    /// @param _value The value in wei to send to the remote contract
    /// @param _maxCopy The maximum number of bytes of returndata to copy
    /// to memory.
    /// @param _calldata The data to send to the remote contract
    /// @return success and returndata, as `.call()`. Returndata is capped to
    /// `_maxCopy` bytes.
    function excessivelySafeCall(
        address _target,
        uint256 _gas,
        uint256 _value,
        uint16 _maxCopy,
        bytes memory _calldata
    ) internal returns (bool, bytes memory) {
        // set up for assembly call
        uint256 _toCopy;
        bool _success;
        bytes memory _returnData = new bytes(_maxCopy);
        // dispatch message to recipient
        // by assembly calling "handle" function
        // we call via assembly to avoid memcopying a very large returndata
        // returned by a malicious contract
        assembly {
            _success := call(
                _gas, // gas
                _target, // recipient
                _value, // ether value
                add(_calldata, 0x20), // inloc
                mload(_calldata), // inlen
                0, // outloc
                0 // outlen
            )
            // limit our copy to 256 bytes
            _toCopy := returndatasize()
            if gt(_toCopy, _maxCopy) {
                _toCopy := _maxCopy
            }
            // Store the length of the copied bytes
            mstore(_returnData, _toCopy)
            // copy the bytes from returndata[0:_toCopy]
            returndatacopy(add(_returnData, 0x20), 0, _toCopy)
        }
        return (_success, _returnData);
    }

    /// @notice Use when you _really_ really _really_ don't trust the called
    /// contract. This prevents the called contract from causing reversion of
    /// the caller in as many ways as we can.
    /// @dev The main difference between this and a solidity low-level call is
    /// that we limit the number of bytes that the callee can cause to be
    /// copied to caller memory. This prevents stupid things like malicious
    /// contracts returning 10,000,000 bytes causing a local OOG when copying
    /// to memory.
    /// @param _target The address to call
    /// @param _gas The amount of gas to forward to the remote contract
    /// @param _maxCopy The maximum number of bytes of returndata to copy
    /// to memory.
    /// @param _calldata The data to send to the remote contract
    /// @return success and returndata, as `.call()`. Returndata is capped to
    /// `_maxCopy` bytes.
    function excessivelySafeStaticCall(
        address _target,
        uint256 _gas,
        uint16 _maxCopy,
        bytes memory _calldata
    ) internal view returns (bool, bytes memory) {
        // set up for assembly call
        uint256 _toCopy;
        bool _success;
        bytes memory _returnData = new bytes(_maxCopy);
        // dispatch message to recipient
        // by assembly calling "handle" function
        // we call via assembly to avoid memcopying a very large returndata
        // returned by a malicious contract
        assembly {
            _success := staticcall(
                _gas, // gas
                _target, // recipient
                add(_calldata, 0x20), // inloc
                mload(_calldata), // inlen
                0, // outloc
                0 // outlen
            )
            // limit our copy to 256 bytes
            _toCopy := returndatasize()
            if gt(_toCopy, _maxCopy) {
                _toCopy := _maxCopy
            }
            // Store the length of the copied bytes
            mstore(_returnData, _toCopy)
            // copy the bytes from returndata[0:_toCopy]
            returndatacopy(add(_returnData, 0x20), 0, _toCopy)
        }
        return (_success, _returnData);
    }

    /**
     * @notice Swaps function selectors in encoded contract calls
     * @dev Allows reuse of encoded calldata for functions with identical
     * argument types but different names. It simply swaps out the first 4 bytes
     * for the new selector. This function modifies memory in place, and should
     * only be used with caution.
     * @param _newSelector The new 4-byte selector
     * @param _buf The encoded contract args
     */
    function swapSelector(bytes4 _newSelector, bytes memory _buf) internal pure {
        require(_buf.length >= 4);
        uint256 _mask = LOW_28_MASK;
        assembly {
            // load the first word of
            let _word := mload(add(_buf, 0x20))
            // mask out the top 4 bytes
            // /x
            _word := and(_word, _mask)
            _word := or(_newSelector, _word)
            mstore(add(_buf, 0x20), _word)
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ExcessivelySafeCall.sol";

abstract contract NonblockingApp {
    //mapping(uint64 => mapping(address => bytes32)) public failedMessages;
    uint public messageFailed;

    event MessageFailed(
        uint64 _srcChainId,
        address _srcAddress,
        bytes _payload,
        bytes _reason,
        uint _value,
        uint _callValue
    );
    event RetryMessageSuccess(uint64 _srcChainId, address _srcAddress, bytes32 _payloadHash);

    function _nonblockingReceive(
        uint64 srcChainId,
        address sender,
        uint8 action,
        uint pongFee,
        bytes calldata message
    ) public payable virtual;

    function _storeFailedMessage(
        uint64 _srcChainId,
        address _srcAddress,
        bytes memory _payload,
        bytes memory _reason,
        uint _callValue
    ) internal virtual {
        messageFailed += 1;
        //failedMessages[_srcChainId][_srcAddress] = keccak256(_payload);
        emit MessageFailed(_srcChainId, _srcAddress, _payload, _reason, msg.value, _callValue);
    }
    /*
    function retryMessage(uint64 _srcChainId, address _srcAddress, bytes calldata _payload) public payable virtual {
        // assert there is message to retry
        bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress];
        require(payloadHash != bytes32(0), "NonblockingApp: no stored message");
        require(keccak256(_payload) == payloadHash, "NonblockingApp: invalid payload");
        // clear the stored message
        failedMessages[_srcChainId][_srcAddress] = bytes32(0);
        // execute the message. revert if it fails again
        _nonblockingReceive(_srcChainId, _srcAddress, _payload);
        emit RetryMessageSuccess(_srcChainId, _srcAddress, payloadHash);
    }
    */
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {ERC314PlusCore} from "./ERC314PlusCore.sol";
import {IMessageStruct} from "@vizing/contracts/interface/IMessageStruct.sol";


contract SlaveTokenBase is ERC314PlusCore {
    address public masterContract;

    constructor(
        string memory _name,
        string memory _symbol,
        address _vizingPad,
        address _defaultRelayer,
        uint64 _masterChainId
    ) ERC314PlusCore(_name, _symbol, _vizingPad, _masterChainId) {
        minArrivalTime = 1 minutes;
        maxArrivalTime = 1 days;
        minGasLimit = 100000;
        maxGasLimit = 1000000;
        selectedRelayer = _defaultRelayer;
    }
    mapping(address => uint) public deposited; //local chain deposited address=>amount
    mapping(address => uint) public depositPing;
    mapping(address => bool) public claimed;
    mapping(address => uint) public depositNonce;
    mapping(address => mapping(uint => bool)) public depositNoncePong;

    mapping(address => uint) public claimNonce;
    mapping(address => mapping(uint => bool)) public claimNoncePong;

    mapping(address => uint) public buyNonce;
    mapping(address => mapping(uint => bool)) public buyNoncePong;

    mapping(address => uint) public sellNonce;
    mapping(address => mapping(uint => bool)) public sellNoncePong;
    uint public calcAccumulate;

    function setMasterContract(address addr) public virtual onlyOwner {
        masterContract = addr;
    }

    function verifySource(
        uint64 srcChainId,
        address srcContract
    ) internal view virtual override returns (bool authorized) {
        return masterContract == srcContract && masterChainId == srcChainId;
    }

    uint public gottenTime;
    //----slave call
    function slave_launch(uint64 srcChainId, address sender) internal virtual override {
        if(!launched){
            launched = true;
            gottenTime = block.timestamp;
        }
    }

    function slave_deposit(uint64 srcChainId, address sender, address target, uint amount,uint accumulate,uint nonce) internal virtual override {
        require(!depositNoncePong[target][nonce], "nonce repetition");
        depositNoncePong[target][nonce] = true;
        deposited[target] += amount;
        if(accumulate > calcAccumulate){
            calcAccumulate = accumulate;
        }
    }

    function slave_claim(
        uint64 srcChainId,
        address sender,
        address target,
        uint native,
        uint token,
        uint nonce
    ) internal virtual override {
        require(!claimNoncePong[target][nonce], "nonce repetition");
        claimNoncePong[target][nonce] = true;
        require(!claimed[target], "claim repetition");
        if (token > 0) _mint(target, token);
        if (native > 0) transferNative(target,native);
        claimed[target] = true;
    }

    function slave_buy(
        uint64 srcChainId,
        address sender,
        address target,
        uint native,
        uint token,
        uint nonce
    ) internal virtual override {
        require(!buyNoncePong[target][nonce], "nonce repetition");
        buyNoncePong[target][nonce] = true;
        if (token > 0) _mint(target, token);
        if (native > 0) transferNative(target,native);
    }

    function slave_sell(
        uint64 srcChainId,
        address sender,
        address target,
        uint native,
        uint token,
        uint nonce
    ) internal virtual override {
        require(!sellNoncePong[target][nonce], "nonce repetition");
        sellNoncePong[target][nonce] = true;
        if (token > 0) _mint(target, token);
        if (native > 0) transferNative(target,native);
    }

    //----deposit
    function depositPingEstimateGas(
        uint pongFee,
        address target,
        uint amount
    ) public view virtual returns (uint pingFee) {
        uint nonce = depositNonce[target];
        pingFee = paramsEstimateGas(
            masterChainId,
            masterContract,
            amount + pongFee,
            _depositPingSignature(nonce+1, target, pongFee, amount)
        );
    }
    uint public cutShortTime = 600;//10 minute
    function setCutShortTime(uint time) public virtual onlyOwner {
        cutShortTime = time;
    }
    function depositIsEnd() public view returns (bool)  {
        return block.timestamp > (launchTime-cutShortTime);
    }
    bool public depositPause = false;
    function setDepositPause(bool pause_) public onlyOwner {
        depositPause = pause_;
    }
    function deposit(uint pongFee, uint amount) public payable virtual nonReentrant {
        require(masterContract != address(0),"In contract deployment ...");
        require(!depositPause,"deposit pause");
        require(launchFunds > 0 , "launch funds err");
        require(totalSupplyInit > 0 , "total supply init err");
        require(!depositIsEnd() ,"deposit end");
        require(!launched, "launched");
        uint pingFee = depositPingEstimateGas(pongFee, _msgSender(), amount);
        require(msg.value >= amount + pingFee + pongFee, "bridge fee not enough");
        require(depositPing[_msgSender()] + amount <= depositTotal,"exceeding the maximum value");
        require(amount >= nativeMin, "the amount cannot be too small");
        require(amount <= nativeMax,"the amount cannot be too large");
        require(calcAccumulate <= launchHardCap,"hard cap");
        depositPing[_msgSender()] += amount;
        uint nonce = depositNonce[_msgSender()];
        paramsEmit2LaunchPad(
            pingFee,
            masterChainId,
            masterContract,
            amount + pongFee,
            _depositPingSignature(nonce+1, _msgSender(), pongFee, amount),
            _msgSender()
        );
        depositNonce[_msgSender()]++;
    }

    //----claim

    function claimPingEstimateGas(uint pongFee, address target) public view virtual returns (uint pingFee) {
        uint nonce = claimNonce[_msgSender()];
        pingFee = paramsEstimateGas(masterChainId, masterContract, pongFee, _claimPingSignature(nonce+1,target, pongFee));
    }

    uint public intervalTime = 1200;//20 minute
    function interval(address addr) public view returns (bool)  {
        return block.timestamp > (claimTime[addr]+intervalTime);
    }
    mapping(address => uint) public claimTime;

    function claim(uint pongFee) public payable virtual nonReentrant whenNotPaused{
        require(launched, "unlaunched");
        require(!claimed[_msgSender()], "claimed");
        uint pingFee = claimPingEstimateGas(pongFee, _msgSender());
        require(msg.value >= pingFee + pongFee, "bridge fee not enough");
        uint nonce = claimNonce[_msgSender()];
        if(nonce > 0){
            require(interval(_msgSender()), "already claim, please wait for completion");
        }
        claimTime[_msgSender()] = block.timestamp;
        paramsEmit2LaunchPad(
            pingFee,
            masterChainId,
            masterContract,
            pongFee,
            _claimPingSignature(nonce+1,_msgSender(), pongFee),
            _msgSender()
        );
        claimNonce[_msgSender()]++;
    }

    //----_buy

    function buyPingEstimateGas(
        uint pongFee,
        address target,
        uint amountIn
    ) public view virtual returns (uint pingFee) {
        uint nonce = buyNonce[_msgSender()];
        pingFee = paramsEstimateGas(
            masterChainId,
            masterContract,
            pongFee,
            _buyPingSignature(nonce+1,target, pongFee, amountIn)
        );
    }
    uint public swapTime = 3600; //60 minute
    function setSwapTime(uint time) public virtual onlyOwner {
        swapTime = time;
    }
    function swapIsStart() public view returns (bool)  {
        return block.timestamp > (gottenTime + swapTime);
    }
    function _buy(uint pongFee, address to, uint deadline) internal {
        require(launched, "unlaunched");
        require(swapIsStart() ,"swap has not started yet");
        require(deadline == 0 || deadline > block.timestamp, "deadline err.");
        uint pingFee = buyPingEstimateGas(pongFee, to, msg.value);
        uint amountIn = msg.value - pingFee - pongFee;
        require(amountIn >= nativeMin, "the amount cannot be too small");
        require(amountIn <= nativeMax,"the amount cannot be too large");
        uint nonce = buyNonce[_msgSender()];
        paramsEmit2LaunchPad(
            pingFee,
            masterChainId,
            masterContract,
            amountIn + pongFee,
            _buyPingSignature(nonce+1,to, pongFee, amountIn),
            _msgSender()
        );
        buyNonce[_msgSender()]++;
    }

    //----_sell

    function sellPingEstimateGas(
        uint pongFee,
        address target,
        uint amountIn
    ) public view virtual returns (uint pingFee) {
        uint nonce = sellNonce[_msgSender()];

        pingFee = paramsEstimateGas(
            masterChainId,
            masterContract,
            pongFee,
            _sellPingSignature(nonce+1,target, pongFee, amountIn)
        );
    }

    function _sell(uint pongFee, address from, address to, uint amountIn, uint deadline) internal {
        require(launched, "unlaunched");
        require(swapIsStart() ,"swap has not started yet");
        require(amountIn > 0, "amount in err.");
        require(deadline == 0 || deadline > block.timestamp, "deadline err.");
        require(balanceOf(from) >= amountIn, "sell amount exceeds balance");
        uint pingFee = sellPingEstimateGas(pongFee, to, amountIn);
        require(msg.value >= pingFee + pongFee, "bridge fee not enough");

        require(amountIn >= tokenMin, "the amount cannot be too small");

        uint nonce = sellNonce[_msgSender()];

        _burn(from, amountIn);
        paramsEmit2LaunchPad(
            pingFee,
            masterChainId,
            masterContract,
            pongFee,
            _sellPingSignature(nonce+1,to, pongFee, amountIn),
            _msgSender()
        );
        sellNonce[_msgSender()]++;
    }

    //----314token
    function getReserves() public view returns (uint, uint) {
        revert NotImplement();
    }

    function getAmountOut(uint value, bool isBuy) public view returns (uint) {
        revert NotImplement();
    }
    bool public swapPause = true;
    function setSwapPause(bool pause_) public onlyOwner {
        swapPause = pause_;
    }
    function swapExactETHForTokens(
        uint pongFee,
        address to,
        uint deadline
    ) external payable virtual nonReentrant{
        require(!swapPause,"swap pause");
        _buy(pongFee, to, deadline);
    }

    function swapExactTokensForETH(
        uint pongFee,
        uint amountIn,
        address to,
        uint deadline
    ) external payable virtual nonReentrant{
        require(!swapPause,"swap pause");
        _sell(pongFee, _msgSender(), to, amountIn, deadline);
    }

    function slave_cross(uint64 srcChainId, address sender, uint64 dstChainId, address to, uint token,uint nonce) internal virtual override {
        require(!crossNoncePing[srcChainId][sender][nonce], "nonce repetition");
        crossNoncePing[srcChainId][sender][nonce] = true;
        require(dstChainId == block.chainid, "chain id err");
        if (token > 0) _mint(to, token);
        emit Crossed(srcChainId, sender, to, token, nonce);
    }

    function crossToEstimateGas(uint64 dstChainId, address to, uint amount) public view virtual returns (uint pingFee) {
        require(dstChainId == masterChainId, "not master chain");
        uint nonce = crossNonce[dstChainId][to];
        pingFee = paramsEstimateGas(masterChainId, masterContract, 0, _crossPingSignature(nonce+1,dstChainId, to, amount));
    }

    function crossTo(uint64 dstChainId, address to, uint amount) external payable virtual whenNotPaused{
        require(dstChainId == masterChainId, "not master chain");
        address owner = _msgSender();
        require(balanceOf(owner) >= amount, "insufficient balance");
        _burn(owner, amount);
        uint nonce = crossNonce[block.chainid][_msgSender()];
        uint pingFee = crossToEstimateGas(dstChainId, to, amount);
        paramsEmit2LaunchPad(
            pingFee,
            masterChainId,
            masterContract,
            0,
            _crossPingSignature(nonce+1,dstChainId, to, amount),
            _msgSender()
        );
        crossNonce[block.chainid][_msgSender()]++;
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_vizingPad","type":"address"},{"internalType":"uint64","name":"_masterChainId","type":"uint64"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"LandingPadAccessDenied","type":"error"},{"inputs":[],"name":"NotImplement","type":"error"},{"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":"enum ERC314PlusCore.ActionType","name":"_action","type":"uint8"},{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_lockedNative","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_lockedToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"AssetLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_native","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"Crossed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_native","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"earmarkedSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"earmarkedNative","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"presaleRefundRatio","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"presaleSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"presaleNative","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"omniSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"presaleAccumulate","type":"uint256"}],"name":"Launch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_callValue","type":"uint256"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"uint8","name":"_action","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"_pongFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_expectPongFee","type":"uint256"}],"name":"PongfeeFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_native","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"}],"name":"Unlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"LandingPad","outputs":[{"internalType":"contract IMessageChannel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LaunchPad","outputs":[{"internalType":"contract IMessageChannel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint8","name":"action","type":"uint8"},{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"_nonblockingReceive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"airdropAddr","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":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"buyNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"buyNoncePong","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"buyPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calcAccumulate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimNoncePong","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"}],"name":"claimPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"crossNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"crossNoncePing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"dstChainId","type":"uint64"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"crossTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"dstChainId","type":"uint64"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"crossToEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cutShortTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultBridgeMode","outputs":[{"internalType":"bytes1","name":"","type":"bytes1"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositIsEnd","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"depositNoncePong","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositPing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint64","name":"destChainid","type":"uint64"},{"internalType":"bytes","name":"additionParams","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"estimateVizingGasFee","outputs":[{"internalType":"uint256","name":"vizingGasFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bool","name":"isBuy","type":"bool"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gottenTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"addr","type":"address"}],"name":"interval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"intervalTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchHardCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterChainId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxArrivalTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasLimit","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageFailed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minArrivalTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minGasLimit","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nowTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"dstChainId","type":"uint64"},{"internalType":"address","name":"dstContract","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"paramsEstimateGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"uint256","name":"srcContract","type":"uint256"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"receiveStandardMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"selectedRelayer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sellNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"sellNoncePong","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"sellPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setAirdropAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setCutShortTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pause_","type":"bool"}],"name":"setDepositPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setDepositTotal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setLaunchHardCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"launchTime_","type":"uint256"}],"name":"setLaunchTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setMasterContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setNativeMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setNativeMin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setNativeTotal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pause_","type":"bool"}],"name":"setSwapPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setSwapTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setTokenMin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"swapIsStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenomics","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyInit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","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":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101406040526a108b2a2c28029094000000601055678ac7230489e80000601155636688f98060125569021e19e0c9bab24000006013556004601455674563918244f40000601655655af3107a4000601755670de0b6b3a76400006018556802b5e3af16b18800006019819055601a55610258602955602a805460ff199081169091556104b0602b55610e10602d55602e80549091166001179055348015620000a757600080fd5b5060405162004c9c38038062004c9c833981016040819052620000ca916200028c565b6040518060600160405280603e815260200162004c5e603e9139604080518082019091526006815265544149424f4960d01b60208201528360008484848483818080868660036200011c838262000388565b5060046200012b828262000388565b50505062000148620001426200023660201b60201c565b6200023a565b6001600655600780546001600160a01b0319166001600160a01b03831617905550600880546001600160a01b0319166001600160a01b0383161790555050600a805460ff19169055600d80546001600160481b0319166001600160401b038316179055600160f81b61010052620001c76005546001600160a01b031690565b600f80546001600160a01b0319166001600160a01b0392831617905560055416601580546001600160a01b0319166001600160a01b03928316179055603c6080526201518060a052620186a060c052620f424060e0529590951661012052506200045498505050505050505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008060408385031215620002a057600080fd5b82516001600160a01b0381168114620002b857600080fd5b60208401519092506001600160401b0381168114620002d657600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200030c57607f821691505b6020821081036200032d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000383576000816000526020600020601f850160051c810160208610156200035e5750805b601f850160051c820191505b818110156200037f578281556001016200036a565b5050505b505050565b81516001600160401b03811115620003a457620003a4620002e1565b620003bc81620003b58454620002f7565b8462000333565b602080601f831160018114620003f45760008415620003db5750858301515b600019600386901b1c1916600185901b1785556200037f565b600085815260208120601f198616915b82811015620004255788860151825594840194600190910190840162000404565b5085821015620004445787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516101005161012051614797620004c760003960008181610f6c015261279b015260008181610931015281816114a301526126e8015260008181610b37015281816114c5015261270a01526000610ac4015260006110dc01526000610a9001526147976000f3fe60806040526004361061052d5760003560e01c806370a08231116102ad578063a0bf3c3911610170578063db5c011d116100d7578063e2bbb15811610090578063e2bbb1581461113e578063e40afab214611151578063f2fde38b1461117e578063f765d1c61461119e578063fd3c9144146111b4578063fd9be522146111ca578063ffee770f146111ea57600080fd5b8063db5c011d14611077578063dd62ed3e14611097578063de2a60f7146110b7578063de8aeda0146110ca578063e0b838e9146110fe578063e0d313ab1461111e57600080fd5b8063b883d89c11610129578063b883d89c14610fa4578063c84333a114610fc4578063c884ef8314610fda578063cb13cddb1461100a578063cd446e2214611037578063d65c07101461105757600080fd5b8063a0bf3c3914610ecc578063a457c2d714610ee2578063a9059cbb14610f02578063acbd65e614610f22578063b0cfd4d214610f5a578063b3affc5114610f8e57600080fd5b806386d192e511610214578063944d928d116101cd578063944d928d14610e2257806395d89b4114610e4257806397945d2d14610e575780639a93883614610e775780639b62625814610e975780639ff46e7414610eac57600080fd5b806386d192e514610d3c5780638705fcd414610d5c5780638708fbbc14610d7c578063871109fb14610d9c57806387e306f514610dd75780638da5cb5b14610e0457600080fd5b80637be36869116102665780637be3686914610c7f5780637d189f1714610cba5780637fb181c114610cd05780638014f74914610ce65780638091f3bf14610d065780638456cb5914610d2757600080fd5b806370a0823114610be8578063715018a614610c08578063763b45ba14610c1d57806376c8131214610c33578063786627ce14610c53578063790ca41314610c6957600080fd5b806339509351116103f557806351932c9a1161035c5780635c975abb116103155780635c975abb14610b0d5780635e45da2314610b255780635f04a79114610b595780636715f70914610b945780636723b96214610bb45780636e22558d14610bce57600080fd5b806351932c9a14610a325780635252281a14610a52578063575580d714610a685780635ad3ad0614610a7e5780635aeb4d7714610ab25780635c7e072b14610afa57600080fd5b806346093c1b116103ae57806346093c1b1461096c5780634ac7251d1461098c5780634adae0da146109a25780634c2c8370146109b85780634c443127146109d85780634fa5794114610a0557600080fd5b8063395093511461087c5780633ee22fcd1461089c57806341275358146108c95780634431665e146108e95780634475cefd14610909578063456362791461091f57600080fd5b8063116d464f1161049957806324fbafb01161045257806324fbafb0146107cd5780632a3a236f146107fa578063313ce5671461081a57806333195d5114610836578063335f1b3714610856578063379607f51461086957600080fd5b8063116d464f1461072f57806314ed913c1461074557806315c3fc211461075857806318160ddd146107785780631b6fa94a1461078d57806323b872dd146107ad57600080fd5b80630d7d9fe6116104eb5780630d7d9fe61461061a5780630e82845d1461063a5780630eefd8861461067257806310c3cf06146106b357806311106ee2146106eb57806311232b881461071957600080fd5b806273b5551461053257806306fdde03146105475780630902f1ac14610572578063095ea7b31461059c5780630abef1f7146105cc5780630bf9e4f214610605575b600080fd5b610545610540366004613ba4565b6111fd565b005b34801561055357600080fd5b5061055c61123a565b6040516105699190613c4f565b60405180910390f35b34801561057e57600080fd5b506105876112cc565b60408051928352602083019190915201610569565b3480156105a857600080fd5b506105bc6105b7366004613c77565b6112eb565b6040519015158152602001610569565b3480156105d857600080fd5b506105bc6105e7366004613c77565b60208080526000928352604080842090915290825290205460ff1681565b34801561061157600080fd5b506105bc611305565b34801561062657600080fd5b50610545610635366004613ca3565b61131e565b34801561064657600080fd5b5060085461065a906001600160a01b031681565b6040516001600160a01b039091168152602001610569565b34801561067e57600080fd5b506105bc61068d366004613cbc565b600b60209081526000938452604080852082529284528284209052825290205460ff1681565b3480156106bf57600080fd5b50600d546106d3906001600160401b031681565b6040516001600160401b039091168152602001610569565b3480156106f757600080fd5b5061070b610706366004613d09565b61132b565b604051908152602001610569565b34801561072557600080fd5b5061070b60175481565b34801561073b57600080fd5b5061070b60115481565b610545610753366004613d35565b611349565b34801561076457600080fd5b50610545610773366004613ca3565b61148e565b34801561078457600080fd5b5060025461070b565b34801561079957600080fd5b5061070b6107a8366004613e28565b61149b565b3480156107b957600080fd5b506105bc6107c8366004613e93565b6115a3565b3480156107d957600080fd5b5061070b6107e8366004613eb3565b60256020526000908152604090205481565b34801561080657600080fd5b50610545610815366004613eb3565b6115c7565b34801561082657600080fd5b5060405160128152602001610569565b34801561084257600080fd5b50610545610851366004613ca3565b6115f1565b34801561086257600080fd5b504261070b565b610545610877366004613ca3565b6115fe565b34801561088857600080fd5b506105bc610897366004613c77565b6117ad565b3480156108a857600080fd5b5061070b6108b7366004613eb3565b60216020526000908152604090205481565b3480156108d557600080fd5b50600f5461065a906001600160a01b031681565b3480156108f557600080fd5b50610545610904366004613ed0565b6117cf565b34801561091557600080fd5b5061070b60275481565b34801561092b57600080fd5b506109537f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160f81b03199091168152602001610569565b34801561097857600080fd5b5061070b610987366004613eeb565b6117ea565b34801561099857600080fd5b5061070b60145481565b3480156109ae57600080fd5b5061070b601a5481565b3480156109c457600080fd5b5061070b6109d3366004613cbc565b611835565b3480156109e457600080fd5b5061070b6109f3366004613eb3565b602c6020526000908152604090205481565b348015610a1157600080fd5b5061070b610a20366004613eb3565b601d6020526000908152604090205481565b348015610a3e57600080fd5b50610545610a4d366004613ca3565b611882565b348015610a5e57600080fd5b5061070b60195481565b348015610a7457600080fd5b5061070b60095481565b348015610a8a57600080fd5b506106d37f000000000000000000000000000000000000000000000000000000000000000081565b348015610abe57600080fd5b50610ae67f000000000000000000000000000000000000000000000000000000000000000081565b60405162ffffff9091168152602001610569565b610545610b08366004613f1b565b61188f565b348015610b1957600080fd5b50600a5460ff166105bc565b348015610b3157600080fd5b50610ae67f000000000000000000000000000000000000000000000000000000000000000081565b348015610b6557600080fd5b506105bc610b74366004613c77565b602460209081526000928352604080842090915290825290205460ff1681565b348015610ba057600080fd5b5061070b610baf366004613cbc565b6118d1565b348015610bc057600080fd5b50602e546105bc9060ff1681565b348015610bda57600080fd5b50602a546105bc9060ff1681565b348015610bf457600080fd5b5061070b610c03366004613eb3565b611915565b348015610c1457600080fd5b50610545611930565b348015610c2957600080fd5b5061070b60185481565b348015610c3f57600080fd5b5061070b610c4e366004613f5a565b611944565b348015610c5f57600080fd5b5061070b600e5481565b348015610c7557600080fd5b5061070b60125481565b348015610c8b57600080fd5b506105bc610c9a366004613c77565b602660209081526000928352604080842090915290825290205460ff1681565b348015610cc657600080fd5b5061070b60135481565b348015610cdc57600080fd5b5061070b602d5481565b348015610cf257600080fd5b5061070b610d01366004613d35565b6119c6565b348015610d1257600080fd5b50600d546105bc90600160401b900460ff1681565b348015610d3357600080fd5b50610545611a4e565b348015610d4857600080fd5b50610545610d57366004613ed0565b611a7c565b348015610d6857600080fd5b50610545610d77366004613eb3565b611a97565b348015610d8857600080fd5b50610545610d97366004613ca3565b611ac1565b348015610da857600080fd5b506105bc610db7366004613c77565b602260209081526000928352604080842090915290825290205460ff1681565b348015610de357600080fd5b5061070b610df2366004613eb3565b601f6020526000908152604090205481565b348015610e1057600080fd5b506005546001600160a01b031661065a565b348015610e2e57600080fd5b50610545610e3d366004613ca3565b611ace565b348015610e4e57600080fd5b5061055c611adb565b348015610e6357600080fd5b5061070b610e72366004613cbc565b611aea565b348015610e8357600080fd5b50610545610e92366004613ca3565b611b3f565b348015610ea357600080fd5b506105bc611b4c565b348015610eb857600080fd5b50610545610ec7366004613ca3565b611b5e565b348015610ed857600080fd5b5061070b60285481565b348015610eee57600080fd5b506105bc610efd366004613c77565b611b6b565b348015610f0e57600080fd5b506105bc610f1d366004613c77565b611be6565b348015610f2e57600080fd5b5061070b610f3d366004613eeb565b600c60209081526000928352604080842090915290825290205481565b348015610f6657600080fd5b5061065a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610f9a57600080fd5b5061070b60165481565b348015610fb057600080fd5b50610545610fbf366004613eb3565b611bf4565b348015610fd057600080fd5b5061070b60105481565b348015610fe657600080fd5b506105bc610ff5366004613eb3565b601e6020526000908152604090205460ff1681565b34801561101657600080fd5b5061070b611025366004613eb3565b601c6020526000908152604090205481565b34801561104357600080fd5b50601b5461065a906001600160a01b031681565b34801561106357600080fd5b50610545611072366004613ca3565b611c1e565b34801561108357600080fd5b506105bc611092366004613eb3565b611c2b565b3480156110a357600080fd5b5061070b6110b2366004613fe5565b611c5a565b6105456110c5366004614022565b611c85565b3480156110d657600080fd5b506106d37f000000000000000000000000000000000000000000000000000000000000000081565b34801561110a57600080fd5b5060075461065a906001600160a01b031681565b34801561112a57600080fd5b5060155461065a906001600160a01b031681565b61054561114c366004614094565b611d89565b34801561115d57600080fd5b5061070b61116c366004613eb3565b60236020526000908152604090205481565b34801561118a57600080fd5b50610545611199366004613eb3565b61211a565b3480156111aa57600080fd5b5061070b60295481565b3480156111c057600080fd5b5061070b602b5481565b3480156111d657600080fd5b506105456111e5366004613c77565b612190565b6105456111f8366004613cbc565b6121b4565b6008546001600160a01b0316331461122857604051637d92a0f560e11b815260040160405180910390fd5b611234848484846121f9565b50505050565b606060038054611249906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611275906140b6565b80156112c25780601f10611297576101008083540402835291602001916112c2565b820191906000526020600020905b8154815290600101906020018083116112a557829003601f168201915b5050505050905090565b60008060405160016235f76760e11b0319815260040160405180910390fd5b6000336112f9818585612389565b60019150505b92915050565b60006029546012546113179190614106565b4211905090565b6113266124ad565b601655565b600060405160016235f76760e11b0319815260040160405180910390fd5b611351612507565b600d546001600160401b038481169116146113875760405162461bcd60e51b815260040161137e90614119565b60405180910390fd5b338161139282611915565b10156113d75760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015260640161137e565b6113e1818361254d565b466000908152600c60209081526040808320338452909152812054906114088686866119c6565b600d54601b549192506114489183916001600160401b0316906001600160a01b0316600061144261143a886001614143565b8c8c8c61266d565b336126e1565b466000908152600c6020526040812090335b6001600160a01b031681526020810191909152604001600090812080549161148183614156565b9190505550505050505050565b6114966124ad565b602955565b6000806115157f0000000000000000000000000000000000000000000000000000000000000000867f00000000000000000000000000000000000000000000000000000000000000006114ee898b612849565b338860405160200161150192919061416f565b604051602081830303815290604052612939565b600754604080516000815260208101918290526342feeaa160e11b9091529192506001600160a01b0316906385fdd542906115589087908a908660248201614193565b602060405180830381865afa158015611575573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159991906141cd565b9695505050505050565b6000336115b1858285612977565b6115bc8585856129eb565b506001949350505050565b6115cf6124ad565b601b80546001600160a01b0319166001600160a01b0392909216919091179055565b6115f96124ad565b601955565b611606612a49565b61160e612507565b600d54600160401b900460ff166116375760405162461bcd60e51b815260040161137e906141e6565b336000908152601e602052604090205460ff16156116815760405162461bcd60e51b815260206004820152600760248201526618db185a5b595960ca1b604482015260640161137e565b600061168d82336117ea565b90506116998282614143565b3410156116b85760405162461bcd60e51b815260040161137e9061420a565b336000908152602160205260409020548015611735576116d733611c2b565b6117355760405162461bcd60e51b815260206004820152602960248201527f616c726561647920636c61696d2c20706c65617365207761697420666f72206360448201526837b6b83632ba34b7b760b91b606482015260840161137e565b336000908152602c60205260409020429055600d54601b5461177e9184916001600160401b03909116906001600160a01b031686611442611777876001614143565b338a612aa2565b33600090815260216020526040812080549161179983614156565b919050555050506117aa6001600655565b50565b6000336112f98185856117c08383611c5a565b6117ca9190614143565b612389565b6117d76124ad565b602e805460ff1916911515919091179055565b33600090815260216020526040812054600d54601b5461182d916001600160401b0316906001600160a01b0316866107a8611826866001614143565b888a612aa2565b949350505050565b33600090815260236020526040812054600d54601b54611879916001600160401b0316906001600160a01b0316876107a8611871866001614143565b898b8a612b03565b95945050505050565b61188a6124ad565b601755565b611897612a49565b602e5460ff16156118ba5760405162461bcd60e51b815260040161137e90614239565b6118c78433848685612b49565b6112346001600655565b33600090815260256020526040812054600d54601b54611879916001600160401b0316906001600160a01b0316876107a861190d866001614143565b898b8a612d2c565b6001600160a01b031660009081526020819052604090205490565b6119386124ad565b6119426000612d35565b565b60006119bb878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250612d8792505050565b979650505050505050565b600d546000906001600160401b038581169116146119f65760405162461bcd60e51b815260040161137e90614119565b6001600160401b038085166000908152600c602090815260408083206001600160a01b0380891685529252822054600d54601b5491946118799491169291909116906107a8611a46866001614143565b8a8a8a61266d565b611a566124ad565b6000611a64600a5460ff1690565b90508015611a74576117aa612dff565b6117aa612e51565b611a846124ad565b602a805460ff1916911515919091179055565b611a9f6124ad565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b611ac96124ad565b602d55565b611ad66124ad565b601855565b606060048054611249906140b6565b6001600160a01b038083166000908152601f6020526040812054600d54601b5492939192611879926001600160401b039092169116611b298887614143565b6107a8611b37866001614143565b898b8a612e8e565b611b476124ad565b601355565b6000602d546028546113179190614143565b611b666124ad565b601255565b60003381611b798286611c5a565b905083811015611bd95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161137e565b6115bc8286868403612389565b6000336112f98185856129eb565b611bfc6124ad565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b611c266124ad565b601a55565b602b546001600160a01b0382166000908152602c60205260408120549091611c5291614143565b421192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b333014611ce05760405162461bcd60e51b815260206004820152602360248201527f455243333134506c7573436f72653a2063616c6c6572206d757374206265207360448201526232b63360e91b606482015260840161137e565b600d546001600160401b0390811690871603611d3e57611d398686868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e9792505050565b611d81565b611d818686868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061300a92505050565b505050505050565b611d91612a49565b601b546001600160a01b0316611de95760405162461bcd60e51b815260206004820152601a60248201527f496e20636f6e7472616374206465706c6f796d656e74202e2e2e000000000000604482015260640161137e565b602a5460ff1615611e2c5760405162461bcd60e51b815260206004820152600d60248201526c6465706f73697420706175736560981b604482015260640161137e565b600060115411611e715760405162461bcd60e51b815260206004820152601060248201526f3630bab731b410333ab732399032b93960811b604482015260640161137e565b600060105411611ebb5760405162461bcd60e51b81526020600482015260156024820152743a37ba30b61039bab838363c9034b734ba1032b93960591b604482015260640161137e565b611ec3611305565b15611efe5760405162461bcd60e51b815260206004820152600b60248201526a19195c1bdcda5d08195b9960aa1b604482015260640161137e565b600d54600160401b900460ff1615611f435760405162461bcd60e51b81526020600482015260086024820152671b185d5b98da195960c21b604482015260640161137e565b6000611f50833384611aea565b905082611f5d8284614143565b611f679190614143565b341015611f865760405162461bcd60e51b815260040161137e9061420a565b601a54336000908152601d6020526040902054611fa4908490614143565b1115611ff25760405162461bcd60e51b815260206004820152601b60248201527f657863656564696e6720746865206d6178696d756d2076616c75650000000000604482015260640161137e565b6017548210156120145760405162461bcd60e51b815260040161137e9061425d565b6016548211156120365760405162461bcd60e51b815260040161137e90614294565b60135460275411156120755760405162461bcd60e51b8152602060048201526008602482015267068617264206361760c41b604482015260640161137e565b336000908152601d602052604081208054849290612094908490614143565b9091555050336000908152601f6020526040902054600d54601b546120ea9184916001600160401b03909116906001600160a01b03166120d48888614143565b6114426120e2876001614143565b338b8b612e8e565b336000908152601f6020526040812080549161210583614156565b919050555050506121166001600655565b5050565b6121226124ad565b6001600160a01b0381166121875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161137e565b6117aa81612d35565b6121986124ad565b6121a0612a49565b6121aa8282613108565b6121166001600655565b6121bc612a49565b602e5460ff16156121df5760405162461bcd60e51b815260040161137e90614239565b6121ea83838361319e565b6121f46001600655565b505050565b61220384846132da565b61223f5760405162461bcd60e51b815260206004820152600d60248201526c3ab730baba3437b934bd32b21760991b604482015260640161137e565b60008061224e838501856142cb565b915091506001600e60008282546122659190614143565b90915550506040517ff496afe4c96f98ccadfe979e32fee625d67b649ab3b164a018eedbaecdcb7b2a906122a090889085903490869061431a565b60405180910390a16000806000838060200190518101906122c19190614350565b9250925092506000806122d6858c868661330f565b90925090506000816122e88487614143565b6122f29190614106565b9050811561231057600f54612310906001600160a01b031683613108565b6000806123218e8b8a8a878b613329565b9150915081612337576123378e8b8b84876133a0565b816123795760405162461bcd60e51b815260206004820152601260248201527118dc9bdcdccb58da185a5b8819985a5b195960721b604482015260640161137e565b5050505050505050505050505050565b6001600160a01b0383166123eb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161137e565b6001600160a01b03821661244c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161137e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146119425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161137e565b600a5460ff16156119425760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161137e565b6001600160a01b0382166125ad5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161137e565b6001600160a01b038216600090815260208190526040902054818110156126215760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161137e565b6001600160a01b038316600081815260208181526040808320868603905560028054879003905551858152919291600080516020614742833981519152910160405180910390a3505050565b6060600960408051602081018890526001600160401b038716918101919091526001600160a01b03851660608201526080810184905260009060a00160408051601f19818403018152908290526126c89392916020016143e5565b6040516020818303038152906040529050949350505050565b60006127337f0000000000000000000000000000000000000000000000000000000000000000867f00000000000000000000000000000000000000000000000000000000000000006114ee898b612849565b905060006127418886614143565b9050803410156127845760405162461bcd60e51b815260206004820152600e60248201526d313934b233b2a332b29032b9391760911b604482015260640161137e565b6007546001600160a01b031663209afe56826000807f0000000000000000000000000000000000000000000000000000000000000000888b8e846040519080825280601f01601f1916602001820160405280156127e8576020820181803683370190505b508b6040518a63ffffffff1660e01b815260040161280d98979695949392919061440a565b6000604051808303818588803b15801561282657600080fd5b505af115801561283a573d6000803e3d6000fd5b50505050505050505050505050565b6007546040805163425e3ad360e11b815290516000926001600160a01b0316916384bc75a69160048083019260209291908290030181865afa158015612893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128b79190614480565b604051632aee183f60e21b81526001600160a01b0385811660048301526001600160401b0385166024830152919091169063abb860fc90604401602060405180830381865afa15801561290e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612932919061449d565b9392505050565b606085856001600160a01b031685858560405160200161295d9594939291906144ba565b604051602081830303815290604052905095945050505050565b60006129838484611c5a565b9050600019811461123457818110156129de5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161137e565b6112348484848403612389565b333014801590612a0357506001600160a01b03821630145b15612a3e5760405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b604482015260640161137e565b6121f4838383613401565b600260065403612a9b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161137e565b6002600655565b60606003828585604051602001612acc9291909182526001600160a01b0316602082015260400190565b60408051601f1981840301815290829052612aeb93929160200161451d565b60405160208183030381529060405290509392505050565b606060055b60408051602081018890526001600160a01b03871681830152606080820186905282518083039091018152608082019092526126c89291869160a00161451d565b600d54600160401b900460ff16612b725760405162461bcd60e51b815260040161137e906141e6565b612b7a611b4c565b612b965760405162461bcd60e51b815260040161137e9061453f565b60008211612bd75760405162461bcd60e51b815260206004820152600e60248201526d30b6b7bab73a1034b71032b9391760911b604482015260640161137e565b801580612be357504281115b612bff5760405162461bcd60e51b815260040161137e90614571565b81612c0985611915565b1015612c575760405162461bcd60e51b815260206004820152601b60248201527f73656c6c20616d6f756e7420657863656564732062616c616e63650000000000604482015260640161137e565b6000612c648685856118d1565b9050612c708682614143565b341015612c8f5760405162461bcd60e51b815260040161137e9061420a565b601854831015612cb15760405162461bcd60e51b815260040161137e9061425d565b33600090815260256020526040902054612ccb868561254d565b600d54601b54612d039184916001600160401b03909116906001600160a01b03168a611442612cfb876001614143565b8b8e8c612d2c565b336000908152602560205260408120805491612d1e83614156565b919050555050505050505050565b60606007612b08565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6007546040516342feeaa160e11b81526000916001600160a01b0316906385fdd54290612dbe908890889088908890600401614193565b602060405180830381865afa158015612ddb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187991906141cd565b612e07613593565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b612e59612507565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e343390565b60606000612b08565b60001960ff841601612edc5760008060008084806020019051810190612ebd9190614598565b9350935093509350612ed38989858585896135dc565b50505050613003565b60031960ff841601612f185760008060008084806020019051810190612f029190614598565b9350935093509350612ed389898585858961367d565b60051960ff841601612f545760008060008084806020019051810190612f3e9190614598565b9350935093509350612ed3898985858589613784565b60071960ff841601612f905760008060008084806020019051810190612f7a9190614598565b9350935093509350612ed3898985848689613816565b60011960ff841601612fab57612fa68585613898565b613003565b60081960ff841601612fe75760008060008084806020019051810190612fd191906145d6565b9350935093509350612ed38989858585896138c4565b60405160016235f76760e11b0319815260040160405180910390fd5b5050505050565b60ff83166130475760008060008380602001905181019061302b919061461f565b92509250925061303f858989858588612fe7565b505050613003565b60021960ff841601613082576000808280602001905181019061306a9190614658565b9150915061307b8488888486612fe7565b5050613003565b60041960ff8416016130a75760008060008380602001905181019061302b919061461f565b60061960ff8416016130cc5760008060008380602001905181019061302b919061461f565b60081960ff841601612fe757600080600080848060200190518101906130f291906145d6565b9350935093509350612ed3898985858589612fe7565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613155576040519150601f19603f3d011682016040523d82523d6000602084013e61315a565b606091505b50509050806121f45760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161137e565b600d54600160401b900460ff166131c75760405162461bcd60e51b815260040161137e906141e6565b6131cf611b4c565b6131eb5760405162461bcd60e51b815260040161137e9061453f565b8015806131f757504281115b6132135760405162461bcd60e51b815260040161137e90614571565b6000613220848434611835565b905060008461322f8334614106565b6132399190614106565b905060175481101561325d5760405162461bcd60e51b815260040161137e9061425d565b60165481111561327f5760405162461bcd60e51b815260040161137e90614294565b33600090815260236020526040902054600d54601b546132d09185916001600160401b03909116906001600160a01b03166132ba8a87614143565b6114426132c8876001614143565b8b8d8a612b03565b602360003361145a565b601b546000906001600160a01b0383811691161480156129325750600d546001600160401b0390811690841614905092915050565b60008061331c8434614106565b9660009650945050505050565b600060606133915a85609663de2a60f760e01b8c8c8c8c8b60405160240161335595949392919061467d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091523093929190613a10565b90999098509650505050505050565b6001600960008282546133b39190614143565b90915550506040517ff0b808371c16e9cdc7de5c17ebb6bc3166c06a15d8112e2b44164fde17efadfe906133f2908790879087908790349088906146bc565b60405180910390a15050505050565b6001600160a01b0383166134655760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161137e565b6001600160a01b0382166134c75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161137e565b6001600160a01b0383166000908152602081905260409020548181101561353f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161137e565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020614742833981519152910160405180910390a3611234565b600a5460ff166119425760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161137e565b6001600160a01b03841660009081526020808052604080832084845290915290205460ff161561361e5760405162461bcd60e51b815260040161137e90614717565b6001600160a01b0384166000818152602080805260408083208584528252808320805460ff19166001179055928252601c90529081208054859290613664908490614143565b9091555050602754821115611d81575060275550505050565b6001600160a01b038416600090815260226020908152604080832084845290915290205460ff16156136c15760405162461bcd60e51b815260040161137e90614717565b6001600160a01b03841660008181526022602090815260408083208584528252808320805460ff19166001179055928252601e9052205460ff161561373b5760405162461bcd60e51b815260206004820152601060248201526f31b630b4b6903932b832ba34ba34b7b760811b604482015260640161137e565b811561374b5761374b8483613a9a565b821561375b5761375b8484613108565b5050506001600160a01b03166000908152601e60205260409020805460ff191660011790555050565b6001600160a01b038416600090815260246020908152604080832084845290915290205460ff16156137c85760405162461bcd60e51b815260040161137e90614717565b6001600160a01b03841660009081526024602090815260408083208484529091529020805460ff191660011790558115613806576138068483613a9a565b8215611d8157611d818484613108565b6001600160a01b038416600090815260266020908152604080832084845290915290205460ff161561385a5760405162461bcd60e51b815260040161137e90614717565b6001600160a01b03841660009081526026602090815260408083208484529091529020805460ff191660011790558115613806576138068483613a9a565b600d54600160401b900460ff1661211657600d805460ff60401b1916600160401b179055426028555050565b6001600160401b0386166000908152600b602090815260408083206001600160a01b0389168452825280832084845290915290205460ff16156139195760405162461bcd60e51b815260040161137e90614717565b6001600160401b038087166000908152600b602090815260408083206001600160a01b038a16845282528083208584529091529020805460ff19166001179055841646146139985760405162461bcd60e51b815260206004820152600c60248201526b31b430b4b71034b21032b93960a11b604482015260640161137e565b81156139a8576139a88383613a9a565b604080516001600160401b03881681526001600160a01b038781166020830152851681830152606081018490526080810183905290517f1c632a7a248c29ea7884a8324f916f13dbb7519f10f16833f711879a8aa670d29181900360a00190a1505050505050565b6000606060008060008661ffff166001600160401b03811115613a3557613a35613d65565b6040519080825280601f01601f191660200182016040528015613a5f576020820181803683370190505b5090506000808751602089018b8e8ef191503d925086831115613a80578692505b828152826000602083013e90999098509650505050505050565b6001600160a01b038216613af05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161137e565b8060026000828254613b029190614143565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020614742833981519152910160405180910390a35050565b6001600160401b03811681146117aa57600080fd5b60008083601f840112613b6e57600080fd5b5081356001600160401b03811115613b8557600080fd5b602083019150836020828501011115613b9d57600080fd5b9250929050565b60008060008060608587031215613bba57600080fd5b8435613bc581613b47565b93506020850135925060408501356001600160401b03811115613be757600080fd5b613bf387828801613b5c565b95989497509550505050565b60005b83811015613c1a578181015183820152602001613c02565b50506000910152565b60008151808452613c3b816020860160208601613bff565b601f01601f19169290920160200192915050565b6020815260006129326020830184613c23565b6001600160a01b03811681146117aa57600080fd5b60008060408385031215613c8a57600080fd5b8235613c9581613c62565b946020939093013593505050565b600060208284031215613cb557600080fd5b5035919050565b600080600060608486031215613cd157600080fd5b833592506020840135613ce381613c62565b929592945050506040919091013590565b80358015158114613d0457600080fd5b919050565b60008060408385031215613d1c57600080fd5b82359150613d2c60208401613cf4565b90509250929050565b600080600060608486031215613d4a57600080fd5b8335613d5581613b47565b92506020840135613ce381613c62565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613da357613da3613d65565b604052919050565b60006001600160401b03821115613dc457613dc4613d65565b50601f01601f191660200190565b600082601f830112613de357600080fd5b8135613df6613df182613dab565b613d7b565b818152846020838601011115613e0b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215613e3e57600080fd5b8435613e4981613b47565b93506020850135613e5981613c62565b92506040850135915060608501356001600160401b03811115613e7b57600080fd5b613e8787828801613dd2565b91505092959194509250565b600080600060608486031215613ea857600080fd5b8335613d5581613c62565b600060208284031215613ec557600080fd5b813561293281613c62565b600060208284031215613ee257600080fd5b61293282613cf4565b60008060408385031215613efe57600080fd5b823591506020830135613f1081613c62565b809150509250929050565b60008060008060808587031215613f3157600080fd5b84359350602085013592506040850135613f4a81613c62565b9396929550929360600135925050565b60008060008060008060808789031215613f7357600080fd5b863595506020870135613f8581613b47565b945060408701356001600160401b0380821115613fa157600080fd5b613fad8a838b01613b5c565b90965094506060890135915080821115613fc657600080fd5b50613fd389828a01613b5c565b979a9699509497509295939492505050565b60008060408385031215613ff857600080fd5b823561400381613c62565b91506020830135613f1081613c62565b60ff811681146117aa57600080fd5b60008060008060008060a0878903121561403b57600080fd5b863561404681613b47565b9550602087013561405681613c62565b9450604087013561406681614013565b93506060870135925060808701356001600160401b0381111561408857600080fd5b613fd389828a01613b5c565b600080604083850312156140a757600080fd5b50508035926020909101359150565b600181811c908216806140ca57607f821691505b6020821081036140ea57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156112ff576112ff6140f0565b60208082526010908201526f3737ba1036b0b9ba32b91031b430b4b760811b604082015260600190565b808201808211156112ff576112ff6140f0565b600060018201614168576141686140f0565b5060010190565b6001600160a01b038316815260406020820181905260009061182d90830184613c23565b8481526001600160401b03841660208201526080604082015260006141bb6080830185613c23565b82810360608401526119bb8185613c23565b6000602082840312156141df57600080fd5b5051919050565b6020808252600a90820152691d5b9b185d5b98da195960b21b604082015260600190565b6020808252601590820152740c4e4d2c8ceca40cccaca40dcdee840cadcdeeaced605b1b604082015260600190565b6020808252600a90820152697377617020706175736560b01b604082015260600190565b6020808252601e908201527f74686520616d6f756e742063616e6e6f7420626520746f6f20736d616c6c0000604082015260600190565b6020808252601e908201527f74686520616d6f756e742063616e6e6f7420626520746f6f206c617267650000604082015260600190565b600080604083850312156142de57600080fd5b82356142e981613c62565b915060208301356001600160401b0381111561430457600080fd5b61431085828601613dd2565b9150509250929050565b6001600160401b038516815260018060a01b03841660208201528260408201526080606082015260006115996080830184613c23565b60008060006060848603121561436557600080fd5b835161437081614013565b6020850151604086015191945092506001600160401b0381111561439357600080fd5b8401601f810186136143a457600080fd5b80516143b2613df182613dab565b8181528760208385010111156143c757600080fd5b6143d8826020830160208601613bff565b8093505050509250925092565b60ff8416815260ff831660208201526060604082015260006118796060830184613c23565b6001600160401b03898116825288811660208301526001600160a01b0388811660408401528716606083015260808201869052841660a082015261010060c0820181905260009061445d83820186613c23565b905082810360e08401526144718185613c23565b9b9a5050505050505050505050565b60006020828403121561449257600080fd5b815161293281613c62565b6000602082840312156144af57600080fd5b815161293281613b47565b6001600160f81b0319861681526001810185905260e884901b6001600160e81b031916602182015260c083901b6001600160c01b0319166024820152815160009061450c81602c850160208701613bff565b91909101602c019695505050505050565b60ff841681528260208201526060604082015260006118796060830184613c23565b6020808252601890820152771cddd85c081a185cc81b9bdd081cdd185c9d1959081e595d60421b604082015260600190565b6020808252600d908201526c3232b0b23634b7329032b9391760991b604082015260600190565b600080600080608085870312156145ae57600080fd5b8451935060208501516145c081613c62565b6040860151606090960151949790965092505050565b600080600080608085870312156145ec57600080fd5b8451935060208501516145fe81613b47565b604086015190935061460f81613c62565b6060959095015193969295505050565b60008060006060848603121561463457600080fd5b83519250602084015161464681613c62565b80925050604084015190509250925092565b6000806040838503121561466b57600080fd5b825191506020830151613f1081613c62565b6001600160401b038616815260018060a01b038516602082015260ff8416604082015282606082015260a0608082015260006119bb60a0830184613c23565b6001600160401b03871681526001600160a01b038616602082015260c0604082018190526000906146ef90830187613c23565b82810360608401526147018187613c23565b6080840195909552505060a00152949350505050565b60208082526010908201526f3737b731b2903932b832ba34ba34b7b760811b60408201526060019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a6d3dda090cd1c90a8f76f177a1084dc6b7c6f4d5c6bd47817d8883359fe577564736f6c634300081700334472756d27726f6c6c2720706c656173652e2e2e206265636175736520544149424f49206973206865726520746f207475726e207468696e6773207570210000000000000000000000005d77b0c9855f44a8fbef34e670e243e988682a820000000000000000000000000000000000000000000000000000000000006f66

Deployed Bytecode

0x60806040526004361061052d5760003560e01c806370a08231116102ad578063a0bf3c3911610170578063db5c011d116100d7578063e2bbb15811610090578063e2bbb1581461113e578063e40afab214611151578063f2fde38b1461117e578063f765d1c61461119e578063fd3c9144146111b4578063fd9be522146111ca578063ffee770f146111ea57600080fd5b8063db5c011d14611077578063dd62ed3e14611097578063de2a60f7146110b7578063de8aeda0146110ca578063e0b838e9146110fe578063e0d313ab1461111e57600080fd5b8063b883d89c11610129578063b883d89c14610fa4578063c84333a114610fc4578063c884ef8314610fda578063cb13cddb1461100a578063cd446e2214611037578063d65c07101461105757600080fd5b8063a0bf3c3914610ecc578063a457c2d714610ee2578063a9059cbb14610f02578063acbd65e614610f22578063b0cfd4d214610f5a578063b3affc5114610f8e57600080fd5b806386d192e511610214578063944d928d116101cd578063944d928d14610e2257806395d89b4114610e4257806397945d2d14610e575780639a93883614610e775780639b62625814610e975780639ff46e7414610eac57600080fd5b806386d192e514610d3c5780638705fcd414610d5c5780638708fbbc14610d7c578063871109fb14610d9c57806387e306f514610dd75780638da5cb5b14610e0457600080fd5b80637be36869116102665780637be3686914610c7f5780637d189f1714610cba5780637fb181c114610cd05780638014f74914610ce65780638091f3bf14610d065780638456cb5914610d2757600080fd5b806370a0823114610be8578063715018a614610c08578063763b45ba14610c1d57806376c8131214610c33578063786627ce14610c53578063790ca41314610c6957600080fd5b806339509351116103f557806351932c9a1161035c5780635c975abb116103155780635c975abb14610b0d5780635e45da2314610b255780635f04a79114610b595780636715f70914610b945780636723b96214610bb45780636e22558d14610bce57600080fd5b806351932c9a14610a325780635252281a14610a52578063575580d714610a685780635ad3ad0614610a7e5780635aeb4d7714610ab25780635c7e072b14610afa57600080fd5b806346093c1b116103ae57806346093c1b1461096c5780634ac7251d1461098c5780634adae0da146109a25780634c2c8370146109b85780634c443127146109d85780634fa5794114610a0557600080fd5b8063395093511461087c5780633ee22fcd1461089c57806341275358146108c95780634431665e146108e95780634475cefd14610909578063456362791461091f57600080fd5b8063116d464f1161049957806324fbafb01161045257806324fbafb0146107cd5780632a3a236f146107fa578063313ce5671461081a57806333195d5114610836578063335f1b3714610856578063379607f51461086957600080fd5b8063116d464f1461072f57806314ed913c1461074557806315c3fc211461075857806318160ddd146107785780631b6fa94a1461078d57806323b872dd146107ad57600080fd5b80630d7d9fe6116104eb5780630d7d9fe61461061a5780630e82845d1461063a5780630eefd8861461067257806310c3cf06146106b357806311106ee2146106eb57806311232b881461071957600080fd5b806273b5551461053257806306fdde03146105475780630902f1ac14610572578063095ea7b31461059c5780630abef1f7146105cc5780630bf9e4f214610605575b600080fd5b610545610540366004613ba4565b6111fd565b005b34801561055357600080fd5b5061055c61123a565b6040516105699190613c4f565b60405180910390f35b34801561057e57600080fd5b506105876112cc565b60408051928352602083019190915201610569565b3480156105a857600080fd5b506105bc6105b7366004613c77565b6112eb565b6040519015158152602001610569565b3480156105d857600080fd5b506105bc6105e7366004613c77565b60208080526000928352604080842090915290825290205460ff1681565b34801561061157600080fd5b506105bc611305565b34801561062657600080fd5b50610545610635366004613ca3565b61131e565b34801561064657600080fd5b5060085461065a906001600160a01b031681565b6040516001600160a01b039091168152602001610569565b34801561067e57600080fd5b506105bc61068d366004613cbc565b600b60209081526000938452604080852082529284528284209052825290205460ff1681565b3480156106bf57600080fd5b50600d546106d3906001600160401b031681565b6040516001600160401b039091168152602001610569565b3480156106f757600080fd5b5061070b610706366004613d09565b61132b565b604051908152602001610569565b34801561072557600080fd5b5061070b60175481565b34801561073b57600080fd5b5061070b60115481565b610545610753366004613d35565b611349565b34801561076457600080fd5b50610545610773366004613ca3565b61148e565b34801561078457600080fd5b5060025461070b565b34801561079957600080fd5b5061070b6107a8366004613e28565b61149b565b3480156107b957600080fd5b506105bc6107c8366004613e93565b6115a3565b3480156107d957600080fd5b5061070b6107e8366004613eb3565b60256020526000908152604090205481565b34801561080657600080fd5b50610545610815366004613eb3565b6115c7565b34801561082657600080fd5b5060405160128152602001610569565b34801561084257600080fd5b50610545610851366004613ca3565b6115f1565b34801561086257600080fd5b504261070b565b610545610877366004613ca3565b6115fe565b34801561088857600080fd5b506105bc610897366004613c77565b6117ad565b3480156108a857600080fd5b5061070b6108b7366004613eb3565b60216020526000908152604090205481565b3480156108d557600080fd5b50600f5461065a906001600160a01b031681565b3480156108f557600080fd5b50610545610904366004613ed0565b6117cf565b34801561091557600080fd5b5061070b60275481565b34801561092b57600080fd5b506109537f010000000000000000000000000000000000000000000000000000000000000081565b6040516001600160f81b03199091168152602001610569565b34801561097857600080fd5b5061070b610987366004613eeb565b6117ea565b34801561099857600080fd5b5061070b60145481565b3480156109ae57600080fd5b5061070b601a5481565b3480156109c457600080fd5b5061070b6109d3366004613cbc565b611835565b3480156109e457600080fd5b5061070b6109f3366004613eb3565b602c6020526000908152604090205481565b348015610a1157600080fd5b5061070b610a20366004613eb3565b601d6020526000908152604090205481565b348015610a3e57600080fd5b50610545610a4d366004613ca3565b611882565b348015610a5e57600080fd5b5061070b60195481565b348015610a7457600080fd5b5061070b60095481565b348015610a8a57600080fd5b506106d37f000000000000000000000000000000000000000000000000000000000000003c81565b348015610abe57600080fd5b50610ae67f00000000000000000000000000000000000000000000000000000000000186a081565b60405162ffffff9091168152602001610569565b610545610b08366004613f1b565b61188f565b348015610b1957600080fd5b50600a5460ff166105bc565b348015610b3157600080fd5b50610ae67f00000000000000000000000000000000000000000000000000000000000f424081565b348015610b6557600080fd5b506105bc610b74366004613c77565b602460209081526000928352604080842090915290825290205460ff1681565b348015610ba057600080fd5b5061070b610baf366004613cbc565b6118d1565b348015610bc057600080fd5b50602e546105bc9060ff1681565b348015610bda57600080fd5b50602a546105bc9060ff1681565b348015610bf457600080fd5b5061070b610c03366004613eb3565b611915565b348015610c1457600080fd5b50610545611930565b348015610c2957600080fd5b5061070b60185481565b348015610c3f57600080fd5b5061070b610c4e366004613f5a565b611944565b348015610c5f57600080fd5b5061070b600e5481565b348015610c7557600080fd5b5061070b60125481565b348015610c8b57600080fd5b506105bc610c9a366004613c77565b602660209081526000928352604080842090915290825290205460ff1681565b348015610cc657600080fd5b5061070b60135481565b348015610cdc57600080fd5b5061070b602d5481565b348015610cf257600080fd5b5061070b610d01366004613d35565b6119c6565b348015610d1257600080fd5b50600d546105bc90600160401b900460ff1681565b348015610d3357600080fd5b50610545611a4e565b348015610d4857600080fd5b50610545610d57366004613ed0565b611a7c565b348015610d6857600080fd5b50610545610d77366004613eb3565b611a97565b348015610d8857600080fd5b50610545610d97366004613ca3565b611ac1565b348015610da857600080fd5b506105bc610db7366004613c77565b602260209081526000928352604080842090915290825290205460ff1681565b348015610de357600080fd5b5061070b610df2366004613eb3565b601f6020526000908152604090205481565b348015610e1057600080fd5b506005546001600160a01b031661065a565b348015610e2e57600080fd5b50610545610e3d366004613ca3565b611ace565b348015610e4e57600080fd5b5061055c611adb565b348015610e6357600080fd5b5061070b610e72366004613cbc565b611aea565b348015610e8357600080fd5b50610545610e92366004613ca3565b611b3f565b348015610ea357600080fd5b506105bc611b4c565b348015610eb857600080fd5b50610545610ec7366004613ca3565b611b5e565b348015610ed857600080fd5b5061070b60285481565b348015610eee57600080fd5b506105bc610efd366004613c77565b611b6b565b348015610f0e57600080fd5b506105bc610f1d366004613c77565b611be6565b348015610f2e57600080fd5b5061070b610f3d366004613eeb565b600c60209081526000928352604080842090915290825290205481565b348015610f6657600080fd5b5061065a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610f9a57600080fd5b5061070b60165481565b348015610fb057600080fd5b50610545610fbf366004613eb3565b611bf4565b348015610fd057600080fd5b5061070b60105481565b348015610fe657600080fd5b506105bc610ff5366004613eb3565b601e6020526000908152604090205460ff1681565b34801561101657600080fd5b5061070b611025366004613eb3565b601c6020526000908152604090205481565b34801561104357600080fd5b50601b5461065a906001600160a01b031681565b34801561106357600080fd5b50610545611072366004613ca3565b611c1e565b34801561108357600080fd5b506105bc611092366004613eb3565b611c2b565b3480156110a357600080fd5b5061070b6110b2366004613fe5565b611c5a565b6105456110c5366004614022565b611c85565b3480156110d657600080fd5b506106d37f000000000000000000000000000000000000000000000000000000000001518081565b34801561110a57600080fd5b5060075461065a906001600160a01b031681565b34801561112a57600080fd5b5060155461065a906001600160a01b031681565b61054561114c366004614094565b611d89565b34801561115d57600080fd5b5061070b61116c366004613eb3565b60236020526000908152604090205481565b34801561118a57600080fd5b50610545611199366004613eb3565b61211a565b3480156111aa57600080fd5b5061070b60295481565b3480156111c057600080fd5b5061070b602b5481565b3480156111d657600080fd5b506105456111e5366004613c77565b612190565b6105456111f8366004613cbc565b6121b4565b6008546001600160a01b0316331461122857604051637d92a0f560e11b815260040160405180910390fd5b611234848484846121f9565b50505050565b606060038054611249906140b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611275906140b6565b80156112c25780601f10611297576101008083540402835291602001916112c2565b820191906000526020600020905b8154815290600101906020018083116112a557829003601f168201915b5050505050905090565b60008060405160016235f76760e11b0319815260040160405180910390fd5b6000336112f9818585612389565b60019150505b92915050565b60006029546012546113179190614106565b4211905090565b6113266124ad565b601655565b600060405160016235f76760e11b0319815260040160405180910390fd5b611351612507565b600d546001600160401b038481169116146113875760405162461bcd60e51b815260040161137e90614119565b60405180910390fd5b338161139282611915565b10156113d75760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015260640161137e565b6113e1818361254d565b466000908152600c60209081526040808320338452909152812054906114088686866119c6565b600d54601b549192506114489183916001600160401b0316906001600160a01b0316600061144261143a886001614143565b8c8c8c61266d565b336126e1565b466000908152600c6020526040812090335b6001600160a01b031681526020810191909152604001600090812080549161148183614156565b9190505550505050505050565b6114966124ad565b602955565b6000806115157f0100000000000000000000000000000000000000000000000000000000000000867f00000000000000000000000000000000000000000000000000000000000f42406114ee898b612849565b338860405160200161150192919061416f565b604051602081830303815290604052612939565b600754604080516000815260208101918290526342feeaa160e11b9091529192506001600160a01b0316906385fdd542906115589087908a908660248201614193565b602060405180830381865afa158015611575573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159991906141cd565b9695505050505050565b6000336115b1858285612977565b6115bc8585856129eb565b506001949350505050565b6115cf6124ad565b601b80546001600160a01b0319166001600160a01b0392909216919091179055565b6115f96124ad565b601955565b611606612a49565b61160e612507565b600d54600160401b900460ff166116375760405162461bcd60e51b815260040161137e906141e6565b336000908152601e602052604090205460ff16156116815760405162461bcd60e51b815260206004820152600760248201526618db185a5b595960ca1b604482015260640161137e565b600061168d82336117ea565b90506116998282614143565b3410156116b85760405162461bcd60e51b815260040161137e9061420a565b336000908152602160205260409020548015611735576116d733611c2b565b6117355760405162461bcd60e51b815260206004820152602960248201527f616c726561647920636c61696d2c20706c65617365207761697420666f72206360448201526837b6b83632ba34b7b760b91b606482015260840161137e565b336000908152602c60205260409020429055600d54601b5461177e9184916001600160401b03909116906001600160a01b031686611442611777876001614143565b338a612aa2565b33600090815260216020526040812080549161179983614156565b919050555050506117aa6001600655565b50565b6000336112f98185856117c08383611c5a565b6117ca9190614143565b612389565b6117d76124ad565b602e805460ff1916911515919091179055565b33600090815260216020526040812054600d54601b5461182d916001600160401b0316906001600160a01b0316866107a8611826866001614143565b888a612aa2565b949350505050565b33600090815260236020526040812054600d54601b54611879916001600160401b0316906001600160a01b0316876107a8611871866001614143565b898b8a612b03565b95945050505050565b61188a6124ad565b601755565b611897612a49565b602e5460ff16156118ba5760405162461bcd60e51b815260040161137e90614239565b6118c78433848685612b49565b6112346001600655565b33600090815260256020526040812054600d54601b54611879916001600160401b0316906001600160a01b0316876107a861190d866001614143565b898b8a612d2c565b6001600160a01b031660009081526020819052604090205490565b6119386124ad565b6119426000612d35565b565b60006119bb878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250612d8792505050565b979650505050505050565b600d546000906001600160401b038581169116146119f65760405162461bcd60e51b815260040161137e90614119565b6001600160401b038085166000908152600c602090815260408083206001600160a01b0380891685529252822054600d54601b5491946118799491169291909116906107a8611a46866001614143565b8a8a8a61266d565b611a566124ad565b6000611a64600a5460ff1690565b90508015611a74576117aa612dff565b6117aa612e51565b611a846124ad565b602a805460ff1916911515919091179055565b611a9f6124ad565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b611ac96124ad565b602d55565b611ad66124ad565b601855565b606060048054611249906140b6565b6001600160a01b038083166000908152601f6020526040812054600d54601b5492939192611879926001600160401b039092169116611b298887614143565b6107a8611b37866001614143565b898b8a612e8e565b611b476124ad565b601355565b6000602d546028546113179190614143565b611b666124ad565b601255565b60003381611b798286611c5a565b905083811015611bd95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161137e565b6115bc8286868403612389565b6000336112f98185856129eb565b611bfc6124ad565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b611c266124ad565b601a55565b602b546001600160a01b0382166000908152602c60205260408120549091611c5291614143565b421192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b333014611ce05760405162461bcd60e51b815260206004820152602360248201527f455243333134506c7573436f72653a2063616c6c6572206d757374206265207360448201526232b63360e91b606482015260840161137e565b600d546001600160401b0390811690871603611d3e57611d398686868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e9792505050565b611d81565b611d818686868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061300a92505050565b505050505050565b611d91612a49565b601b546001600160a01b0316611de95760405162461bcd60e51b815260206004820152601a60248201527f496e20636f6e7472616374206465706c6f796d656e74202e2e2e000000000000604482015260640161137e565b602a5460ff1615611e2c5760405162461bcd60e51b815260206004820152600d60248201526c6465706f73697420706175736560981b604482015260640161137e565b600060115411611e715760405162461bcd60e51b815260206004820152601060248201526f3630bab731b410333ab732399032b93960811b604482015260640161137e565b600060105411611ebb5760405162461bcd60e51b81526020600482015260156024820152743a37ba30b61039bab838363c9034b734ba1032b93960591b604482015260640161137e565b611ec3611305565b15611efe5760405162461bcd60e51b815260206004820152600b60248201526a19195c1bdcda5d08195b9960aa1b604482015260640161137e565b600d54600160401b900460ff1615611f435760405162461bcd60e51b81526020600482015260086024820152671b185d5b98da195960c21b604482015260640161137e565b6000611f50833384611aea565b905082611f5d8284614143565b611f679190614143565b341015611f865760405162461bcd60e51b815260040161137e9061420a565b601a54336000908152601d6020526040902054611fa4908490614143565b1115611ff25760405162461bcd60e51b815260206004820152601b60248201527f657863656564696e6720746865206d6178696d756d2076616c75650000000000604482015260640161137e565b6017548210156120145760405162461bcd60e51b815260040161137e9061425d565b6016548211156120365760405162461bcd60e51b815260040161137e90614294565b60135460275411156120755760405162461bcd60e51b8152602060048201526008602482015267068617264206361760c41b604482015260640161137e565b336000908152601d602052604081208054849290612094908490614143565b9091555050336000908152601f6020526040902054600d54601b546120ea9184916001600160401b03909116906001600160a01b03166120d48888614143565b6114426120e2876001614143565b338b8b612e8e565b336000908152601f6020526040812080549161210583614156565b919050555050506121166001600655565b5050565b6121226124ad565b6001600160a01b0381166121875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161137e565b6117aa81612d35565b6121986124ad565b6121a0612a49565b6121aa8282613108565b6121166001600655565b6121bc612a49565b602e5460ff16156121df5760405162461bcd60e51b815260040161137e90614239565b6121ea83838361319e565b6121f46001600655565b505050565b61220384846132da565b61223f5760405162461bcd60e51b815260206004820152600d60248201526c3ab730baba3437b934bd32b21760991b604482015260640161137e565b60008061224e838501856142cb565b915091506001600e60008282546122659190614143565b90915550506040517ff496afe4c96f98ccadfe979e32fee625d67b649ab3b164a018eedbaecdcb7b2a906122a090889085903490869061431a565b60405180910390a16000806000838060200190518101906122c19190614350565b9250925092506000806122d6858c868661330f565b90925090506000816122e88487614143565b6122f29190614106565b9050811561231057600f54612310906001600160a01b031683613108565b6000806123218e8b8a8a878b613329565b9150915081612337576123378e8b8b84876133a0565b816123795760405162461bcd60e51b815260206004820152601260248201527118dc9bdcdccb58da185a5b8819985a5b195960721b604482015260640161137e565b5050505050505050505050505050565b6001600160a01b0383166123eb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161137e565b6001600160a01b03821661244c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161137e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146119425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161137e565b600a5460ff16156119425760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161137e565b6001600160a01b0382166125ad5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161137e565b6001600160a01b038216600090815260208190526040902054818110156126215760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161137e565b6001600160a01b038316600081815260208181526040808320868603905560028054879003905551858152919291600080516020614742833981519152910160405180910390a3505050565b6060600960408051602081018890526001600160401b038716918101919091526001600160a01b03851660608201526080810184905260009060a00160408051601f19818403018152908290526126c89392916020016143e5565b6040516020818303038152906040529050949350505050565b60006127337f0100000000000000000000000000000000000000000000000000000000000000867f00000000000000000000000000000000000000000000000000000000000f42406114ee898b612849565b905060006127418886614143565b9050803410156127845760405162461bcd60e51b815260206004820152600e60248201526d313934b233b2a332b29032b9391760911b604482015260640161137e565b6007546001600160a01b031663209afe56826000807f0000000000000000000000000000000000000000000000000000000000000000888b8e846040519080825280601f01601f1916602001820160405280156127e8576020820181803683370190505b508b6040518a63ffffffff1660e01b815260040161280d98979695949392919061440a565b6000604051808303818588803b15801561282657600080fd5b505af115801561283a573d6000803e3d6000fd5b50505050505050505050505050565b6007546040805163425e3ad360e11b815290516000926001600160a01b0316916384bc75a69160048083019260209291908290030181865afa158015612893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128b79190614480565b604051632aee183f60e21b81526001600160a01b0385811660048301526001600160401b0385166024830152919091169063abb860fc90604401602060405180830381865afa15801561290e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612932919061449d565b9392505050565b606085856001600160a01b031685858560405160200161295d9594939291906144ba565b604051602081830303815290604052905095945050505050565b60006129838484611c5a565b9050600019811461123457818110156129de5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161137e565b6112348484848403612389565b333014801590612a0357506001600160a01b03821630145b15612a3e5760405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b604482015260640161137e565b6121f4838383613401565b600260065403612a9b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161137e565b6002600655565b60606003828585604051602001612acc9291909182526001600160a01b0316602082015260400190565b60408051601f1981840301815290829052612aeb93929160200161451d565b60405160208183030381529060405290509392505050565b606060055b60408051602081018890526001600160a01b03871681830152606080820186905282518083039091018152608082019092526126c89291869160a00161451d565b600d54600160401b900460ff16612b725760405162461bcd60e51b815260040161137e906141e6565b612b7a611b4c565b612b965760405162461bcd60e51b815260040161137e9061453f565b60008211612bd75760405162461bcd60e51b815260206004820152600e60248201526d30b6b7bab73a1034b71032b9391760911b604482015260640161137e565b801580612be357504281115b612bff5760405162461bcd60e51b815260040161137e90614571565b81612c0985611915565b1015612c575760405162461bcd60e51b815260206004820152601b60248201527f73656c6c20616d6f756e7420657863656564732062616c616e63650000000000604482015260640161137e565b6000612c648685856118d1565b9050612c708682614143565b341015612c8f5760405162461bcd60e51b815260040161137e9061420a565b601854831015612cb15760405162461bcd60e51b815260040161137e9061425d565b33600090815260256020526040902054612ccb868561254d565b600d54601b54612d039184916001600160401b03909116906001600160a01b03168a611442612cfb876001614143565b8b8e8c612d2c565b336000908152602560205260408120805491612d1e83614156565b919050555050505050505050565b60606007612b08565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6007546040516342feeaa160e11b81526000916001600160a01b0316906385fdd54290612dbe908890889088908890600401614193565b602060405180830381865afa158015612ddb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187991906141cd565b612e07613593565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b612e59612507565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e343390565b60606000612b08565b60001960ff841601612edc5760008060008084806020019051810190612ebd9190614598565b9350935093509350612ed38989858585896135dc565b50505050613003565b60031960ff841601612f185760008060008084806020019051810190612f029190614598565b9350935093509350612ed389898585858961367d565b60051960ff841601612f545760008060008084806020019051810190612f3e9190614598565b9350935093509350612ed3898985858589613784565b60071960ff841601612f905760008060008084806020019051810190612f7a9190614598565b9350935093509350612ed3898985848689613816565b60011960ff841601612fab57612fa68585613898565b613003565b60081960ff841601612fe75760008060008084806020019051810190612fd191906145d6565b9350935093509350612ed38989858585896138c4565b60405160016235f76760e11b0319815260040160405180910390fd5b5050505050565b60ff83166130475760008060008380602001905181019061302b919061461f565b92509250925061303f858989858588612fe7565b505050613003565b60021960ff841601613082576000808280602001905181019061306a9190614658565b9150915061307b8488888486612fe7565b5050613003565b60041960ff8416016130a75760008060008380602001905181019061302b919061461f565b60061960ff8416016130cc5760008060008380602001905181019061302b919061461f565b60081960ff841601612fe757600080600080848060200190518101906130f291906145d6565b9350935093509350612ed3898985858589612fe7565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613155576040519150601f19603f3d011682016040523d82523d6000602084013e61315a565b606091505b50509050806121f45760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161137e565b600d54600160401b900460ff166131c75760405162461bcd60e51b815260040161137e906141e6565b6131cf611b4c565b6131eb5760405162461bcd60e51b815260040161137e9061453f565b8015806131f757504281115b6132135760405162461bcd60e51b815260040161137e90614571565b6000613220848434611835565b905060008461322f8334614106565b6132399190614106565b905060175481101561325d5760405162461bcd60e51b815260040161137e9061425d565b60165481111561327f5760405162461bcd60e51b815260040161137e90614294565b33600090815260236020526040902054600d54601b546132d09185916001600160401b03909116906001600160a01b03166132ba8a87614143565b6114426132c8876001614143565b8b8d8a612b03565b602360003361145a565b601b546000906001600160a01b0383811691161480156129325750600d546001600160401b0390811690841614905092915050565b60008061331c8434614106565b9660009650945050505050565b600060606133915a85609663de2a60f760e01b8c8c8c8c8b60405160240161335595949392919061467d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091523093929190613a10565b90999098509650505050505050565b6001600960008282546133b39190614143565b90915550506040517ff0b808371c16e9cdc7de5c17ebb6bc3166c06a15d8112e2b44164fde17efadfe906133f2908790879087908790349088906146bc565b60405180910390a15050505050565b6001600160a01b0383166134655760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161137e565b6001600160a01b0382166134c75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161137e565b6001600160a01b0383166000908152602081905260409020548181101561353f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161137e565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020614742833981519152910160405180910390a3611234565b600a5460ff166119425760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161137e565b6001600160a01b03841660009081526020808052604080832084845290915290205460ff161561361e5760405162461bcd60e51b815260040161137e90614717565b6001600160a01b0384166000818152602080805260408083208584528252808320805460ff19166001179055928252601c90529081208054859290613664908490614143565b9091555050602754821115611d81575060275550505050565b6001600160a01b038416600090815260226020908152604080832084845290915290205460ff16156136c15760405162461bcd60e51b815260040161137e90614717565b6001600160a01b03841660008181526022602090815260408083208584528252808320805460ff19166001179055928252601e9052205460ff161561373b5760405162461bcd60e51b815260206004820152601060248201526f31b630b4b6903932b832ba34ba34b7b760811b604482015260640161137e565b811561374b5761374b8483613a9a565b821561375b5761375b8484613108565b5050506001600160a01b03166000908152601e60205260409020805460ff191660011790555050565b6001600160a01b038416600090815260246020908152604080832084845290915290205460ff16156137c85760405162461bcd60e51b815260040161137e90614717565b6001600160a01b03841660009081526024602090815260408083208484529091529020805460ff191660011790558115613806576138068483613a9a565b8215611d8157611d818484613108565b6001600160a01b038416600090815260266020908152604080832084845290915290205460ff161561385a5760405162461bcd60e51b815260040161137e90614717565b6001600160a01b03841660009081526026602090815260408083208484529091529020805460ff191660011790558115613806576138068483613a9a565b600d54600160401b900460ff1661211657600d805460ff60401b1916600160401b179055426028555050565b6001600160401b0386166000908152600b602090815260408083206001600160a01b0389168452825280832084845290915290205460ff16156139195760405162461bcd60e51b815260040161137e90614717565b6001600160401b038087166000908152600b602090815260408083206001600160a01b038a16845282528083208584529091529020805460ff19166001179055841646146139985760405162461bcd60e51b815260206004820152600c60248201526b31b430b4b71034b21032b93960a11b604482015260640161137e565b81156139a8576139a88383613a9a565b604080516001600160401b03881681526001600160a01b038781166020830152851681830152606081018490526080810183905290517f1c632a7a248c29ea7884a8324f916f13dbb7519f10f16833f711879a8aa670d29181900360a00190a1505050505050565b6000606060008060008661ffff166001600160401b03811115613a3557613a35613d65565b6040519080825280601f01601f191660200182016040528015613a5f576020820181803683370190505b5090506000808751602089018b8e8ef191503d925086831115613a80578692505b828152826000602083013e90999098509650505050505050565b6001600160a01b038216613af05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161137e565b8060026000828254613b029190614143565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020614742833981519152910160405180910390a35050565b6001600160401b03811681146117aa57600080fd5b60008083601f840112613b6e57600080fd5b5081356001600160401b03811115613b8557600080fd5b602083019150836020828501011115613b9d57600080fd5b9250929050565b60008060008060608587031215613bba57600080fd5b8435613bc581613b47565b93506020850135925060408501356001600160401b03811115613be757600080fd5b613bf387828801613b5c565b95989497509550505050565b60005b83811015613c1a578181015183820152602001613c02565b50506000910152565b60008151808452613c3b816020860160208601613bff565b601f01601f19169290920160200192915050565b6020815260006129326020830184613c23565b6001600160a01b03811681146117aa57600080fd5b60008060408385031215613c8a57600080fd5b8235613c9581613c62565b946020939093013593505050565b600060208284031215613cb557600080fd5b5035919050565b600080600060608486031215613cd157600080fd5b833592506020840135613ce381613c62565b929592945050506040919091013590565b80358015158114613d0457600080fd5b919050565b60008060408385031215613d1c57600080fd5b82359150613d2c60208401613cf4565b90509250929050565b600080600060608486031215613d4a57600080fd5b8335613d5581613b47565b92506020840135613ce381613c62565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613da357613da3613d65565b604052919050565b60006001600160401b03821115613dc457613dc4613d65565b50601f01601f191660200190565b600082601f830112613de357600080fd5b8135613df6613df182613dab565b613d7b565b818152846020838601011115613e0b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215613e3e57600080fd5b8435613e4981613b47565b93506020850135613e5981613c62565b92506040850135915060608501356001600160401b03811115613e7b57600080fd5b613e8787828801613dd2565b91505092959194509250565b600080600060608486031215613ea857600080fd5b8335613d5581613c62565b600060208284031215613ec557600080fd5b813561293281613c62565b600060208284031215613ee257600080fd5b61293282613cf4565b60008060408385031215613efe57600080fd5b823591506020830135613f1081613c62565b809150509250929050565b60008060008060808587031215613f3157600080fd5b84359350602085013592506040850135613f4a81613c62565b9396929550929360600135925050565b60008060008060008060808789031215613f7357600080fd5b863595506020870135613f8581613b47565b945060408701356001600160401b0380821115613fa157600080fd5b613fad8a838b01613b5c565b90965094506060890135915080821115613fc657600080fd5b50613fd389828a01613b5c565b979a9699509497509295939492505050565b60008060408385031215613ff857600080fd5b823561400381613c62565b91506020830135613f1081613c62565b60ff811681146117aa57600080fd5b60008060008060008060a0878903121561403b57600080fd5b863561404681613b47565b9550602087013561405681613c62565b9450604087013561406681614013565b93506060870135925060808701356001600160401b0381111561408857600080fd5b613fd389828a01613b5c565b600080604083850312156140a757600080fd5b50508035926020909101359150565b600181811c908216806140ca57607f821691505b6020821081036140ea57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156112ff576112ff6140f0565b60208082526010908201526f3737ba1036b0b9ba32b91031b430b4b760811b604082015260600190565b808201808211156112ff576112ff6140f0565b600060018201614168576141686140f0565b5060010190565b6001600160a01b038316815260406020820181905260009061182d90830184613c23565b8481526001600160401b03841660208201526080604082015260006141bb6080830185613c23565b82810360608401526119bb8185613c23565b6000602082840312156141df57600080fd5b5051919050565b6020808252600a90820152691d5b9b185d5b98da195960b21b604082015260600190565b6020808252601590820152740c4e4d2c8ceca40cccaca40dcdee840cadcdeeaced605b1b604082015260600190565b6020808252600a90820152697377617020706175736560b01b604082015260600190565b6020808252601e908201527f74686520616d6f756e742063616e6e6f7420626520746f6f20736d616c6c0000604082015260600190565b6020808252601e908201527f74686520616d6f756e742063616e6e6f7420626520746f6f206c617267650000604082015260600190565b600080604083850312156142de57600080fd5b82356142e981613c62565b915060208301356001600160401b0381111561430457600080fd5b61431085828601613dd2565b9150509250929050565b6001600160401b038516815260018060a01b03841660208201528260408201526080606082015260006115996080830184613c23565b60008060006060848603121561436557600080fd5b835161437081614013565b6020850151604086015191945092506001600160401b0381111561439357600080fd5b8401601f810186136143a457600080fd5b80516143b2613df182613dab565b8181528760208385010111156143c757600080fd5b6143d8826020830160208601613bff565b8093505050509250925092565b60ff8416815260ff831660208201526060604082015260006118796060830184613c23565b6001600160401b03898116825288811660208301526001600160a01b0388811660408401528716606083015260808201869052841660a082015261010060c0820181905260009061445d83820186613c23565b905082810360e08401526144718185613c23565b9b9a5050505050505050505050565b60006020828403121561449257600080fd5b815161293281613c62565b6000602082840312156144af57600080fd5b815161293281613b47565b6001600160f81b0319861681526001810185905260e884901b6001600160e81b031916602182015260c083901b6001600160c01b0319166024820152815160009061450c81602c850160208701613bff565b91909101602c019695505050505050565b60ff841681528260208201526060604082015260006118796060830184613c23565b6020808252601890820152771cddd85c081a185cc81b9bdd081cdd185c9d1959081e595d60421b604082015260600190565b6020808252600d908201526c3232b0b23634b7329032b9391760991b604082015260600190565b600080600080608085870312156145ae57600080fd5b8451935060208501516145c081613c62565b6040860151606090960151949790965092505050565b600080600080608085870312156145ec57600080fd5b8451935060208501516145fe81613b47565b604086015190935061460f81613c62565b6060959095015193969295505050565b60008060006060848603121561463457600080fd5b83519250602084015161464681613c62565b80925050604084015190509250925092565b6000806040838503121561466b57600080fd5b825191506020830151613f1081613c62565b6001600160401b038616815260018060a01b038516602082015260ff8416604082015282606082015260a0608082015260006119bb60a0830184613c23565b6001600160401b03871681526001600160a01b038616602082015260c0604082018190526000906146ef90830187613c23565b82810360608401526147018187613c23565b6080840195909552505060a00152949350505050565b60208082526010908201526f3737b731b2903932b832ba34ba34b7b760811b60408201526060019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a6d3dda090cd1c90a8f76f177a1084dc6b7c6f4d5c6bd47817d8883359fe577564736f6c63430008170033

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

0000000000000000000000005d77b0c9855f44a8fbef34e670e243e988682a820000000000000000000000000000000000000000000000000000000000006f66

-----Decoded View---------------
Arg [0] : _vizingPad (address): 0x5D77b0c9855F44a8fbEf34E670e243E988682a82
Arg [1] : _masterChainId (uint64): 28518

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005d77b0c9855f44a8fbef34e670e243e988682a82
Arg [1] : 0000000000000000000000000000000000000000000000000000000000006f66


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.