false
true

Contract Address Details

0x2270BF371160810DfE48777987De96E641952144

Contract Name
L2CrossTradeProxy
Creator
0xf0b595–6035ea at 0x8f948b–fc1557
Implementation
L2CrossTrade | 0x08821e390c3a8a4f36e8c1fdf32d1c28795141a3
Balance
0.19 ETH
Tokens
Fetching tokens...
Transactions
201 Transactions
Transfers
299 Transfers
Gas Used
43,184,636
Last Balance Update
7262
Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB 0x0c448437edcb2a093266df30619924ae8131b9e3.
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
Verify & Publish
Contract name:
L2CrossTradeProxy




Optimization enabled
true
Compiler version
v0.8.24+commit.e11b9ed9




Optimization runs
100000000
Verified at
2024-07-11T04:07:54.676078Z

contracts/L2/L2CrossTradeProxy.sol

Sol2uml
new
// SPDX-License-Identifier: Unlicense
pragma solidity 0.8.24;

import { Proxy } from "../proxy/Proxy.sol";
import { L2CrossTradeStorage } from "./L2CrossTradeStorage.sol";

contract L2CrossTradeProxy is Proxy, L2CrossTradeStorage {

    /// @notice L2CrossTrade initial settings
    /// @param _crossDomainMessenger crossDomainMessenger address
    /// @param _legacyERC20 legacyERC20 address 
    function initialize(
        address _crossDomainMessenger,
        address _legacyERC20
    ) 
        external
        onlyOwner
    {
        crossDomainMessenger = _crossDomainMessenger;
        legacyERC20ETH = _legacyERC20;
    }

    /// @notice Store addresses for chainId
    /// @param _l1CrossTrade L1CrossTradeProxy address for chainId
    /// @param _l1legacyERC20 l1legacyERC20 address for chainId
    /// @param _chainId store chainId
    function setChainInfo(
        address _l1CrossTrade,
        address _l1legacyERC20,
        uint256 _chainId
    )
        external
        onlyOwner
    {
        chainData[_chainId] = ChainIdData({
            l1CrossTradeContract: _l1CrossTrade,
            l1TON: _l1legacyERC20
        });
    }
}
        

contracts/L2/L2CrossTradeStorage.sol

// SPDX-License-Identifier: Unlicense
pragma solidity 0.8.24;

contract L2CrossTradeStorage {
    struct RequestData {
        address l1token;
        address l2token;
        address requester;
        address provider;
        uint256 totalAmount;
        uint256 ctAmount;
        uint256 chainId;
        bytes32 hashValue;
    }

    struct ChainIdData {
        address l1CrossTradeContract;
        address l1TON;
    }

    address public crossDomainMessenger;
    address public legacyERC20ETH;

    uint256 public saleCount;

    //saleCount => ChainData
    mapping(uint256 => RequestData) public dealData;
    mapping(uint256 => mapping(address => mapping(address => bool))) public registerCheck;
    
    //chainId => ChainData
    mapping(uint256 => ChainIdData) public chainData;

}
          

contracts/common/AccessRoleCommon.sol

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

contract AccessRoleCommon {
    bytes32 public constant ADMIN_ROLE = keccak256("ADMIN");
    bytes32 public constant POLICY_ROLE = keccak256("POLICY_ROLE");
}
          

@openzeppelin/contracts/utils/introspection/IERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
          

@openzeppelin/contracts/access/AccessControl.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)

pragma solidity ^0.8.20;

import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {ERC165} from "../utils/introspection/ERC165.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```solidity
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```solidity
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address account => bool) hasRole;
        bytes32 adminRole;
    }

    mapping(bytes32 role => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with an {AccessControlUnauthorizedAccount} error including the required role.
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual returns (bool) {
        return _roles[role].hasRole[account];
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
     * is missing `role`.
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert AccessControlUnauthorizedAccount(account, role);
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address callerConfirmation) public virtual {
        if (callerConfirmation != _msgSender()) {
            revert AccessControlBadConfirmation();
        }

        _revokeRole(role, callerConfirmation);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
        if (!hasRole(role, account)) {
            _roles[role].hasRole[account] = true;
            emit RoleGranted(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
        if (hasRole(role, account)) {
            _roles[role].hasRole[account] = false;
            emit RoleRevoked(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }
}
          

@openzeppelin/contracts/access/IAccessControl.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)

pragma solidity ^0.8.20;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev The `account` is missing a role.
     */
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);

    /**
     * @dev The caller of a function is not the expected one.
     *
     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
     */
    error AccessControlBadConfirmation();

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     */
    function renounceRole(bytes32 role, address callerConfirmation) external;
}
          

@openzeppelin/contracts/utils/Context.sol

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

pragma solidity ^0.8.20;

/**
 * @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;
    }
}
          

@openzeppelin/contracts/utils/introspection/ERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)

pragma solidity ^0.8.20;

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

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}
          

contracts/common/AccessibleCommon.sol

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

import "@openzeppelin/contracts/access/AccessControl.sol";
import "./AccessRoleCommon.sol";

contract AccessibleCommon is AccessRoleCommon, AccessControl {
    modifier onlyOwner() {
        require(isAdmin(msg.sender), "Accessible: Caller is not an admin");
        _;
    }

    /// @dev add admin
    /// @param account  address to add
    function addAdmin(address account) public virtual onlyOwner {
        grantRole(ADMIN_ROLE, account);
    }

    /// @dev remove admin
    /// @param account  address to remove
    function removeAdmin(address account) public virtual onlyOwner {
        renounceRole(ADMIN_ROLE, account);
    }

    /// @dev transfer admin
    /// @param newAdmin new admin address
    function transferAdmin(address newAdmin) external virtual onlyOwner {
        require(newAdmin != address(0), "Accessible: zero address");
        require(msg.sender != newAdmin, "Accessible: same admin");

        grantRole(ADMIN_ROLE, newAdmin);
        renounceRole(ADMIN_ROLE, msg.sender);
    }

    /// @dev whether admin
    /// @param account  address to check
    function isAdmin(address account) public view virtual returns (bool) {
        return hasRole(ADMIN_ROLE, account);
    }
}
          

contracts/interfaces/IProxyAction.sol

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.20;


/// @title IProxyAction
interface IProxyAction {

    /// @dev set the implementation address and status of the proxy[index]
    /// @param newImplementation Address of the new implementation.
    /// @param _index index
    /// @param _alive _alive
    function setImplementation2(
        address newImplementation,
        uint256 _index,
        bool _alive
    ) external;


    /// @dev set alive status of implementation
    /// @param newImplementation Address of the new implementation.
    /// @param _alive alive status
    function setAliveImplementation2(address newImplementation, bool _alive)
        external;


    /// @dev set selectors of Implementation
    /// @param _selectors being added selectors
    /// @param _imp implementation address
    function setSelectorImplementations2(
        bytes4[] calldata _selectors,
        address _imp
    ) external  ;



    /// onlyOwner

    /// @notice Set pause state
    /// @param _pause true:pause or false:resume
    function setProxyPause(bool _pause) external ;


    /// anybody

    /// @dev view implementation address of selector of function
    /// @param _selector selector of function
    /// @return impl address of the implementation
    function getSelectorImplementation2(bytes4 _selector)
        external
        view
        returns (address impl);


    /// @dev view implementation address of the proxy[index]
    /// @param _index index of proxy
    /// @return address of the implementation
    function implementation2(uint256 _index) external view returns (address) ;
}

          

contracts/interfaces/IProxyEvent.sol

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.20;


/// @title IProxyEvent
interface IProxyEvent {

    event Upgraded(address indexed implementation);

    event SetAliveImplementation(address indexed impl, bool alive);
    event SetSelectorImplementation(bytes4 indexed selector, address indexed impl);


}
          

contracts/proxy/Proxy.sol

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.20;

import "./ProxyStorage.sol";
import { AccessibleCommon } from "../common/AccessibleCommon.sol";

// import { Address } from "@openzeppelin/contracts/utils/Address.sol";

import "../interfaces/IProxyEvent.sol";
import "../interfaces/IProxyAction.sol";

// import "hardhat/console.sol";

contract Proxy is ProxyStorage, AccessibleCommon, IProxyEvent, IProxyAction
{

    /* ========== DEPENDENCIES ========== */

    /* ========== CONSTRUCTOR ========== */

    constructor () {
        _setRoleAdmin(ADMIN_ROLE, ADMIN_ROLE);
        _grantRole(ADMIN_ROLE, msg.sender);
    }


    /* ========== onlyOwner ========== */

    /// @inheritdoc IProxyAction
    function setProxyPause(bool _pause) external onlyOwner {
        pauseProxy = _pause;
    }

    /// @notice Set implementation contract
    /// @param impl New implementation contract address
    function upgradeTo(address impl) external onlyOwner {
        require(impl != address(0), "input is zero");
        require(
            _implementation2(0) != impl,
            "same addr"
        );
        _setImplementation2(impl, 0, true);
        emit Upgraded(impl);
    }


    /// @inheritdoc IProxyAction
    function setImplementation2(
        address newImplementation,
        uint256 _index,
        bool _alive
    ) external override onlyOwner {
        _setImplementation2(newImplementation, _index, _alive);
    }

    /// @inheritdoc IProxyAction
    function setAliveImplementation2(address newImplementation, bool _alive)
        public override onlyOwner
    {
        _setAliveImplementation2(newImplementation, _alive);
    }

    /// @inheritdoc IProxyAction
    function setSelectorImplementations2(
        bytes4[] calldata _selectors,
        address _imp
    ) public override onlyOwner {
        require(
            _selectors.length > 0,
            "Proxy: _selectors's size is zero"
        );
        require(aliveImplementation[_imp], "Proxy: _imp is not alive");

        for (uint256 i = 0; i < _selectors.length; i++) {
            require(
                selectorImplementation[_selectors[i]] != _imp,
                "LiquidityVaultProxy: same imp"
            );
            selectorImplementation[_selectors[i]] = _imp;
            emit SetSelectorImplementation(_selectors[i], _imp);
        }
    }

    /* ========== Anyone can   ========== */



    /* ========== VIEW ========== */

    /// @dev returns the implementation
    function implementation() external view returns (address) {
        return _implementation2(0);
    }

    /// @inheritdoc IProxyAction
    function implementation2(uint256 _index) external override view returns (address) {
        return _implementation2(_index);
    }


    /// @inheritdoc IProxyAction
    function getSelectorImplementation2(bytes4 _selector)
        public override
        view
        returns (address impl)
    {
        if (selectorImplementation[_selector] == address(0))
            return proxyImplementation[0];
        else if (aliveImplementation[selectorImplementation[_selector]]){
            return selectorImplementation[_selector];
        }
        else return proxyImplementation[0];
    }


    /// @dev receive ether
    receive() external payable {

    }

    /// @dev fallback function , execute on undefined function call
    fallback() external payable {
        _fallback();
    }

    /* === ======= internal ========== */

    /// @dev view implementation address of the proxy[index]
    /// @param _index index of proxy
    /// @return impl address of the implementation
    function _implementation2(uint256 _index)
        internal
        view
        returns (address impl)
    {
        return proxyImplementation[_index];
    }

    /// @dev fallback function , execute on undefined function call
    function _fallback() internal {
        address _impl = getSelectorImplementation2(msg.sig);

        require(
            _impl != address(0) && !pauseProxy,
            "Proxy: impl OR proxy is false"
        );

        assembly {
            // Copy msg.data. We take full control of memory in this inline assembly
            // block because it will not return to Solidity code. We overwrite the
            // Solidity scratch pad at memory position 0.
            calldatacopy(0, 0, calldatasize())

            // Call the implementation.
            // out and outsize are 0 because we don't know the size yet.
            let result := delegatecall(gas(), _impl, 0, calldatasize(), 0, 0)

            // Copy the returned data.
            returndatacopy(0, 0, returndatasize())

            switch result
                // delegatecall returns 0 on error.
                case 0 {
                    revert(0, returndatasize())
                }
                default {
                    return(0, returndatasize())
                }
        }
    }

    /// @dev set the implementation address and status of the proxy[index]
    /// @param newImplementation Address of the new implementation.
    /// @param _index index of proxy
    /// @param _alive alive status
    function _setImplementation2(
        address newImplementation,
        uint256 _index,
        bool _alive
    ) internal {
        require(
            _isContract(newImplementation),
            "Proxy: not contract address"
        );
        if (_alive) proxyImplementation[_index] = newImplementation;
        _setAliveImplementation2(newImplementation, _alive);
    }

    /// @dev set alive status of implementation
    /// @param newImplementation Address of the new implementation.
    /// @param _alive alive status
    function _setAliveImplementation2(address newImplementation, bool _alive)
        internal
    {
        aliveImplementation[newImplementation] = _alive;
        emit SetAliveImplementation(newImplementation, _alive);
    }

    function _isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }


}
          

contracts/proxy/ProxyStorage.sol

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.20;

contract ProxyStorage  {

    bool public pauseProxy;

    mapping(uint256 => address) public proxyImplementation;
    mapping(address => bool) public aliveImplementation;
    mapping(bytes4 => address) public selectorImplementation;

}
          

Compiler Settings

{"viaIR":true,"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":100000000,"enabled":true,"details":{"yul":true}},"libraries":{},"evmVersion":"paris"}
              

Contract ABI

[{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bytes32","name":"neededRole","internalType":"bytes32"}]},{"type":"event","name":"RoleAdminChanged","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"previousAdminRole","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"newAdminRole","internalType":"bytes32","indexed":true}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SetAliveImplementation","inputs":[{"type":"address","name":"impl","internalType":"address","indexed":true},{"type":"bool","name":"alive","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"SetSelectorImplementation","inputs":[{"type":"bytes4","name":"selector","internalType":"bytes4","indexed":true},{"type":"address","name":"impl","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"type":"address","name":"implementation","internalType":"address","indexed":true}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DEFAULT_ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"POLICY_ROLE","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAdmin","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"aliveImplementation","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"l1CrossTradeContract","internalType":"address"},{"type":"address","name":"l1TON","internalType":"address"}],"name":"chainData","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"crossDomainMessenger","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"l1token","internalType":"address"},{"type":"address","name":"l2token","internalType":"address"},{"type":"address","name":"requester","internalType":"address"},{"type":"address","name":"provider","internalType":"address"},{"type":"uint256","name":"totalAmount","internalType":"uint256"},{"type":"uint256","name":"ctAmount","internalType":"uint256"},{"type":"uint256","name":"chainId","internalType":"uint256"},{"type":"bytes32","name":"hashValue","internalType":"bytes32"}],"name":"dealData","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getRoleAdmin","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"impl","internalType":"address"}],"name":"getSelectorImplementation2","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"implementation","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"implementation2","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"address","name":"_crossDomainMessenger","internalType":"address"},{"type":"address","name":"_legacyERC20","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAdmin","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"legacyERC20ETH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"pauseProxy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"proxyImplementation","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"registerCheck","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeAdmin","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"callerConfirmation","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"saleCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"selectorImplementation","inputs":[{"type":"bytes4","name":"","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAliveImplementation2","inputs":[{"type":"address","name":"newImplementation","internalType":"address"},{"type":"bool","name":"_alive","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setChainInfo","inputs":[{"type":"address","name":"_l1CrossTrade","internalType":"address"},{"type":"address","name":"_l1legacyERC20","internalType":"address"},{"type":"uint256","name":"_chainId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setImplementation2","inputs":[{"type":"address","name":"newImplementation","internalType":"address"},{"type":"uint256","name":"_index","internalType":"uint256"},{"type":"bool","name":"_alive","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setProxyPause","inputs":[{"type":"bool","name":"_pause","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSelectorImplementations2","inputs":[{"type":"bytes4[]","name":"_selectors","internalType":"bytes4[]"},{"type":"address","name":"_imp","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferAdmin","inputs":[{"type":"address","name":"newAdmin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"upgradeTo","inputs":[{"type":"address","name":"impl","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x60806040523461006f576000805160206200223083398151915280600052600460205260016040600020018181549155817fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff600080a461005e33610074565b506040516121199081620001178239f35b600080fd5b6001600160a01b031660008181527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b690226020526040812054909190600080516020620022308339815191529060ff166101115780835260046020526040832082845260205260408320600160ff198254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4600190565b50509056fe60806040526004361015610015575b3661200a57005b60003560e01c806301ffc9a7146102205780631230b14c1461021b57806316e01724146102165780631785f53c14610211578063229852461461020c578063248a9ca31461020757806324d7806c146102025780632f2ff15d146101fd57806336568abe146101f85780633659cfe6146101f3578063485cc955146101ee5780634a5df50f146101e957806350d2a276146101e4578063550d01a3146101df5780635c60da1b146101da5780635cc797d8146101d557806363a8fd89146101d057806370480275146101cb57806375829def146101c657806375b238fc146101c15780637cb00d25146101bc5780637cd5f663146101b75780638800867b146101b25780638b8f4a65146101995780638d4fdb40146101ad57806391d14854146101a8578063a1e89aec146101a3578063a217fddf1461019e578063b911135f14610199578063d547741f14610194578063e59f69c21461018f578063f43b36131461018a5763f5869c2f0361000e576116e0565b61168e565b611623565b6115c6565b61141b565b61158c565b611550565b6114de565b61147b565b61135f565b611217565b611170565b611117565b610fb5565b610efc565b610ebb565b610e34565b610dd5565b610d6b565b610ce0565b610a39565b61096e565b6107fa565b610770565b610713565b610677565b61062a565b6105d1565b610557565b610505565b610359565b610254565b7fffffffff0000000000000000000000000000000000000000000000000000000081160361024f57565b600080fd5b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760207fffffffff000000000000000000000000000000000000000000000000000000006004356102b281610225565b167f7965db0b0000000000000000000000000000000000000000000000000000000081149081156102e9575b506040519015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386102de565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361024f57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361024f57565b3461024f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610390610313565b610398610336565b906103ef6103ea3373ffffffffffffffffffffffffffffffffffffffff1660009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090205460ff1690565b6117c7565b60405190604082019082821067ffffffffffffffff8311176104d6576104d49360019260405273ffffffffffffffffffffffffffffffffffffffff8092168452816020850191168152604435600052600a602052610490826040600020955116859073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b511691019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602073ffffffffffffffffffffffffffffffffffffffff60065416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576104d4610591610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b6902260205260409020546105cc9060ff166117c7565b6118ae565b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760206040517ffb5864e8ff833c3cb2d2d08505e82ff02a43554c74a35d4f5a64e852612783118152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760043560005260046020526020600160406000200154604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060ff6107076106b5610313565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426000526004845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166040519015158152f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576104d4600435610750610336565b9080600052600460205261076b600160406000200154611ba6565b611d35565b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576107a7610336565b3373ffffffffffffffffffffffffffffffffffffffff8216036107d0576104d490600435611e7c565b60046040517f6697b232000000000000000000000000000000000000000000000000000000008152fd5b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610831610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209091906108719060ff905b54166117c7565b73ffffffffffffffffffffffffffffffffffffffff8116908115610910576108e99083805260016020526108e4836108dd6108c46040882073ffffffffffffffffffffffffffffffffffffffff90541690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14156118d4565b611eb6565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8280a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e707574206973207a65726f000000000000000000000000000000000000006044820152fd5b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576109a5610313565b6109ad610336565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090206109e79060ff9061086a565b73ffffffffffffffffffffffffffffffffffffffff90817fffffffffffffffffffffffff0000000000000000000000000000000000000000931683600554161760055516906006541617600655600080f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5767ffffffffffffffff60043581811161024f573660238201121561024f57806004013591821161024f576024810190602436918460051b01011161024f57610aae610336565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b6902260205260408120909390610aeb9060ff9061086a565b8015610c8257610b2f610b2a610b2384959473ffffffffffffffffffffffffffffffffffffffff166000526002602052604060002090565b5460ff1690565b611939565b839173ffffffffffffffffffffffffffffffffffffffff93848116935b838110610b57578680f35b80610bcc8688610bc4610baa610b78610b736001988c8c61199e565b6119dd565b7fffffffff00000000000000000000000000000000000000000000000000000000166000526003602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b1614156119ea565b610c2183610be1610b78610b73858a8a61199e565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b85610c58610c33610b7384898961199e565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b7f14ebc1c32aa68f4d766e89f3e546cee249f7df25183fc10ab1568d91c2ce9b7b8a80a301610b4c565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f50726f78793a205f73656c6563746f727327732073697a65206973207a65726f6044820152fd5b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f577fffffffff00000000000000000000000000000000000000000000000000000000600435610d3c81610225565b166000526003602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5773ffffffffffffffffffffffffffffffffffffffff610db7610313565b166000526002602052602060ff604060002054166040519015158152f35b3461024f576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e315773ffffffffffffffffffffffffffffffffffffffff604082806020945260018452205416604051908152f35b80fd5b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610e6b610313565b602435801515810361024f573360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090206104d49290610eb69060ff9061086a565b611f8a565b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060ff600054166040519015158152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610f33610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209091610fb1917fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4290610f959060ff9061086a565b83526004602052610fac6001604085200154611ba6565b611c20565b5080f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610fec610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090206110269060ff9061086a565b73ffffffffffffffffffffffffffffffffffffffff811680156110b957331461105b5761105290611852565b6104d4336118ae565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f41636365737369626c653a2073616d652061646d696e000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41636365737369626c653a207a65726f206164647265737300000000000000006044820152fd5b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760206040517fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec428152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760043580151580910361024f573360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209091906111e99060ff9061086a565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00835416911617815580f35b3461024f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5761124e610313565b60443590811515820361024f573360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209092906112989060ff9061086a565b813b15611301576112ad91816112b057611f8a565b80f35b602435845260016020526040842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055611f8a565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f50726f78793a206e6f7420636f6e7472616374206164647265737300000000006044820152fd5b3461024f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57611396610336565b60443573ffffffffffffffffffffffffffffffffffffffff8116810361024f5761070760ff916113f66020946004356000526009865260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576004356000526001602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760206114c06004356114bb81610225565b611a4f565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060ff61070761151c610336565b6004356000526004845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576020600754604051908152f35b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060405160008152f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576104d4600435611603610336565b9080600052600460205261161e600160406000200154611ba6565b611e7c565b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57600435600052600a60205260408060002073ffffffffffffffffffffffffffffffffffffffff6001818354169201541682519182526020820152f35b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576004356000526008602052604060002073ffffffffffffffffffffffffffffffffffffffff6117c381835416918060018501541693816002820154169160038201541660048201546005830154916007600685015494015494604051988998899491909360e096939998979461010087019a73ffffffffffffffffffffffffffffffffffffffff8094818094168a52166020890152166040870152166060850152608084015260a083015260c08201520152565b0390f35b156117ce57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f41636365737369626c653a2043616c6c6572206973206e6f7420616e2061646d60448201527f696e0000000000000000000000000000000000000000000000000000000000006064820152fd5b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4260005260046020527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69023546118ab9190610fac90611ba6565b50565b3373ffffffffffffffffffffffffffffffffffffffff8216036107d0576118ab90611d6f565b156118db57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f73616d65206164647200000000000000000000000000000000000000000000006044820152fd5b1561194057565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f50726f78793a205f696d70206973206e6f7420616c69766500000000000000006044820152fd5b91908110156119ae5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b356119e781610225565b90565b156119f157565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4c69717569646974795661756c7450726f78793a2073616d6520696d700000006044820152fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116600052600360205273ffffffffffffffffffffffffffffffffffffffff90816040600020541615600014611ad557506000805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49541690565b541690565b60ff611b3983611b11847fffffffff00000000000000000000000000000000000000000000000000000000166000526003602052604060002090565b541673ffffffffffffffffffffffffffffffffffffffff166000526002602052604060002090565b541615611b7657611ad0907fffffffff00000000000000000000000000000000000000000000000000000000166000526003602052604060002090565b506000805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49541690565b80600052600460205260ff611bdf3360406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b541615611be95750565b604490604051907fe2517d3f0000000000000000000000000000000000000000000000000000000082523360048301526024820152fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081207fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec429060ff905b5416611d2f578082526004602052611cc583604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d73ffffffffffffffffffffffffffffffffffffffff3394169280a4600190565b50905090565b600090808252600460205260ff611c8a84604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081207fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec429060ff905b541615611d2f578082526004602052611e1583604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b73ffffffffffffffffffffffffffffffffffffffff3394169280a4600190565b600090808252600460205260ff611dd984604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b803b156113015773ffffffffffffffffffffffffffffffffffffffff90600080526001602052611f258160406000209073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b16806000526002602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f72558d9bfba4210f9ef095c782589484151f6d90f7a81bb3cb9b33efc695d324602060405160018152a2565b602073ffffffffffffffffffffffffffffffffffffffff7f72558d9bfba4210f9ef095c782589484151f6d90f7a81bb3cb9b33efc695d32492169283600052600282526040600020901515907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a2565b60006120387fffffffff00000000000000000000000000000000000000000000000000000000823516611a4f565b73ffffffffffffffffffffffffffffffffffffffff81161515806120d7575b1561207957818091368280378136915af43d82803e15612075573d90f35b3d90fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f50726f78793a20696d706c204f522070726f78792069732066616c73650000006044820152fd5b5060ff8254161561205756fea2646970667358221220b52338da8c34d281912a9a72273a3362f3afe60f1f55e9589e6e43b1bb0760e964736f6c63430008180033df8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42

Deployed ByteCode

0x60806040526004361015610015575b3661200a57005b60003560e01c806301ffc9a7146102205780631230b14c1461021b57806316e01724146102165780631785f53c14610211578063229852461461020c578063248a9ca31461020757806324d7806c146102025780632f2ff15d146101fd57806336568abe146101f85780633659cfe6146101f3578063485cc955146101ee5780634a5df50f146101e957806350d2a276146101e4578063550d01a3146101df5780635c60da1b146101da5780635cc797d8146101d557806363a8fd89146101d057806370480275146101cb57806375829def146101c657806375b238fc146101c15780637cb00d25146101bc5780637cd5f663146101b75780638800867b146101b25780638b8f4a65146101995780638d4fdb40146101ad57806391d14854146101a8578063a1e89aec146101a3578063a217fddf1461019e578063b911135f14610199578063d547741f14610194578063e59f69c21461018f578063f43b36131461018a5763f5869c2f0361000e576116e0565b61168e565b611623565b6115c6565b61141b565b61158c565b611550565b6114de565b61147b565b61135f565b611217565b611170565b611117565b610fb5565b610efc565b610ebb565b610e34565b610dd5565b610d6b565b610ce0565b610a39565b61096e565b6107fa565b610770565b610713565b610677565b61062a565b6105d1565b610557565b610505565b610359565b610254565b7fffffffff0000000000000000000000000000000000000000000000000000000081160361024f57565b600080fd5b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760207fffffffff000000000000000000000000000000000000000000000000000000006004356102b281610225565b167f7965db0b0000000000000000000000000000000000000000000000000000000081149081156102e9575b506040519015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386102de565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361024f57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361024f57565b3461024f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610390610313565b610398610336565b906103ef6103ea3373ffffffffffffffffffffffffffffffffffffffff1660009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090205460ff1690565b6117c7565b60405190604082019082821067ffffffffffffffff8311176104d6576104d49360019260405273ffffffffffffffffffffffffffffffffffffffff8092168452816020850191168152604435600052600a602052610490826040600020955116859073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b511691019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602073ffffffffffffffffffffffffffffffffffffffff60065416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576104d4610591610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b6902260205260409020546105cc9060ff166117c7565b6118ae565b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760206040517ffb5864e8ff833c3cb2d2d08505e82ff02a43554c74a35d4f5a64e852612783118152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760043560005260046020526020600160406000200154604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060ff6107076106b5610313565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426000526004845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166040519015158152f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576104d4600435610750610336565b9080600052600460205261076b600160406000200154611ba6565b611d35565b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576107a7610336565b3373ffffffffffffffffffffffffffffffffffffffff8216036107d0576104d490600435611e7c565b60046040517f6697b232000000000000000000000000000000000000000000000000000000008152fd5b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610831610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209091906108719060ff905b54166117c7565b73ffffffffffffffffffffffffffffffffffffffff8116908115610910576108e99083805260016020526108e4836108dd6108c46040882073ffffffffffffffffffffffffffffffffffffffff90541690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14156118d4565b611eb6565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8280a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e707574206973207a65726f000000000000000000000000000000000000006044820152fd5b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576109a5610313565b6109ad610336565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090206109e79060ff9061086a565b73ffffffffffffffffffffffffffffffffffffffff90817fffffffffffffffffffffffff0000000000000000000000000000000000000000931683600554161760055516906006541617600655600080f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5767ffffffffffffffff60043581811161024f573660238201121561024f57806004013591821161024f576024810190602436918460051b01011161024f57610aae610336565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b6902260205260408120909390610aeb9060ff9061086a565b8015610c8257610b2f610b2a610b2384959473ffffffffffffffffffffffffffffffffffffffff166000526002602052604060002090565b5460ff1690565b611939565b839173ffffffffffffffffffffffffffffffffffffffff93848116935b838110610b57578680f35b80610bcc8688610bc4610baa610b78610b736001988c8c61199e565b6119dd565b7fffffffff00000000000000000000000000000000000000000000000000000000166000526003602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b1614156119ea565b610c2183610be1610b78610b73858a8a61199e565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b85610c58610c33610b7384898961199e565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b7f14ebc1c32aa68f4d766e89f3e546cee249f7df25183fc10ab1568d91c2ce9b7b8a80a301610b4c565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f50726f78793a205f73656c6563746f727327732073697a65206973207a65726f6044820152fd5b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f577fffffffff00000000000000000000000000000000000000000000000000000000600435610d3c81610225565b166000526003602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5773ffffffffffffffffffffffffffffffffffffffff610db7610313565b166000526002602052602060ff604060002054166040519015158152f35b3461024f576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e315773ffffffffffffffffffffffffffffffffffffffff604082806020945260018452205416604051908152f35b80fd5b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610e6b610313565b602435801515810361024f573360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090206104d49290610eb69060ff9061086a565b611f8a565b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060ff600054166040519015158152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610f33610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209091610fb1917fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4290610f959060ff9061086a565b83526004602052610fac6001604085200154611ba6565b611c20565b5080f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610fec610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090206110269060ff9061086a565b73ffffffffffffffffffffffffffffffffffffffff811680156110b957331461105b5761105290611852565b6104d4336118ae565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f41636365737369626c653a2073616d652061646d696e000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41636365737369626c653a207a65726f206164647265737300000000000000006044820152fd5b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760206040517fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec428152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760043580151580910361024f573360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209091906111e99060ff9061086a565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00835416911617815580f35b3461024f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5761124e610313565b60443590811515820361024f573360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209092906112989060ff9061086a565b813b15611301576112ad91816112b057611f8a565b80f35b602435845260016020526040842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055611f8a565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f50726f78793a206e6f7420636f6e7472616374206164647265737300000000006044820152fd5b3461024f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57611396610336565b60443573ffffffffffffffffffffffffffffffffffffffff8116810361024f5761070760ff916113f66020946004356000526009865260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576004356000526001602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760206114c06004356114bb81610225565b611a4f565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060ff61070761151c610336565b6004356000526004845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576020600754604051908152f35b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060405160008152f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576104d4600435611603610336565b9080600052600460205261161e600160406000200154611ba6565b611e7c565b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57600435600052600a60205260408060002073ffffffffffffffffffffffffffffffffffffffff6001818354169201541682519182526020820152f35b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576004356000526008602052604060002073ffffffffffffffffffffffffffffffffffffffff6117c381835416918060018501541693816002820154169160038201541660048201546005830154916007600685015494015494604051988998899491909360e096939998979461010087019a73ffffffffffffffffffffffffffffffffffffffff8094818094168a52166020890152166040870152166060850152608084015260a083015260c08201520152565b0390f35b156117ce57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f41636365737369626c653a2043616c6c6572206973206e6f7420616e2061646d60448201527f696e0000000000000000000000000000000000000000000000000000000000006064820152fd5b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4260005260046020527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69023546118ab9190610fac90611ba6565b50565b3373ffffffffffffffffffffffffffffffffffffffff8216036107d0576118ab90611d6f565b156118db57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f73616d65206164647200000000000000000000000000000000000000000000006044820152fd5b1561194057565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f50726f78793a205f696d70206973206e6f7420616c69766500000000000000006044820152fd5b91908110156119ae5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b356119e781610225565b90565b156119f157565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4c69717569646974795661756c7450726f78793a2073616d6520696d700000006044820152fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116600052600360205273ffffffffffffffffffffffffffffffffffffffff90816040600020541615600014611ad557506000805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49541690565b541690565b60ff611b3983611b11847fffffffff00000000000000000000000000000000000000000000000000000000166000526003602052604060002090565b541673ffffffffffffffffffffffffffffffffffffffff166000526002602052604060002090565b541615611b7657611ad0907fffffffff00000000000000000000000000000000000000000000000000000000166000526003602052604060002090565b506000805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49541690565b80600052600460205260ff611bdf3360406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b541615611be95750565b604490604051907fe2517d3f0000000000000000000000000000000000000000000000000000000082523360048301526024820152fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081207fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec429060ff905b5416611d2f578082526004602052611cc583604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d73ffffffffffffffffffffffffffffffffffffffff3394169280a4600190565b50905090565b600090808252600460205260ff611c8a84604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081207fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec429060ff905b541615611d2f578082526004602052611e1583604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b73ffffffffffffffffffffffffffffffffffffffff3394169280a4600190565b600090808252600460205260ff611dd984604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b803b156113015773ffffffffffffffffffffffffffffffffffffffff90600080526001602052611f258160406000209073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b16806000526002602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f72558d9bfba4210f9ef095c782589484151f6d90f7a81bb3cb9b33efc695d324602060405160018152a2565b602073ffffffffffffffffffffffffffffffffffffffff7f72558d9bfba4210f9ef095c782589484151f6d90f7a81bb3cb9b33efc695d32492169283600052600282526040600020901515907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a2565b60006120387fffffffff00000000000000000000000000000000000000000000000000000000823516611a4f565b73ffffffffffffffffffffffffffffffffffffffff81161515806120d7575b1561207957818091368280378136915af43d82803e15612075573d90f35b3d90fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f50726f78793a20696d706c204f522070726f78792069732066616c73650000006044820152fd5b5060ff8254161561205756fea2646970667358221220b52338da8c34d281912a9a72273a3362f3afe60f1f55e9589e6e43b1bb0760e964736f6c63430008180033