Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Read Proxy
Write Contract
Write Proxy
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
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
- 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
// 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
0x60806040523461006f576000805160206200223083398151915280600052600460205260016040600020018181549155817fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff600080a461005e33610074565b506040516121199081620001178239f35b600080fd5b6001600160a01b031660008181527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b690226020526040812054909190600080516020620022308339815191529060ff166101115780835260046020526040832082845260205260408320600160ff198254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4600190565b50509056fe60806040526004361015610015575b3661200a57005b60003560e01c806301ffc9a7146102205780631230b14c1461021b57806316e01724146102165780631785f53c14610211578063229852461461020c578063248a9ca31461020757806324d7806c146102025780632f2ff15d146101fd57806336568abe146101f85780633659cfe6146101f3578063485cc955146101ee5780634a5df50f146101e957806350d2a276146101e4578063550d01a3146101df5780635c60da1b146101da5780635cc797d8146101d557806363a8fd89146101d057806370480275146101cb57806375829def146101c657806375b238fc146101c15780637cb00d25146101bc5780637cd5f663146101b75780638800867b146101b25780638b8f4a65146101995780638d4fdb40146101ad57806391d14854146101a8578063a1e89aec146101a3578063a217fddf1461019e578063b911135f14610199578063d547741f14610194578063e59f69c21461018f578063f43b36131461018a5763f5869c2f0361000e576116e0565b61168e565b611623565b6115c6565b61141b565b61158c565b611550565b6114de565b61147b565b61135f565b611217565b611170565b611117565b610fb5565b610efc565b610ebb565b610e34565b610dd5565b610d6b565b610ce0565b610a39565b61096e565b6107fa565b610770565b610713565b610677565b61062a565b6105d1565b610557565b610505565b610359565b610254565b7fffffffff0000000000000000000000000000000000000000000000000000000081160361024f57565b600080fd5b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760207fffffffff000000000000000000000000000000000000000000000000000000006004356102b281610225565b167f7965db0b0000000000000000000000000000000000000000000000000000000081149081156102e9575b506040519015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386102de565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361024f57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361024f57565b3461024f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610390610313565b610398610336565b906103ef6103ea3373ffffffffffffffffffffffffffffffffffffffff1660009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090205460ff1690565b6117c7565b60405190604082019082821067ffffffffffffffff8311176104d6576104d49360019260405273ffffffffffffffffffffffffffffffffffffffff8092168452816020850191168152604435600052600a602052610490826040600020955116859073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b511691019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602073ffffffffffffffffffffffffffffffffffffffff60065416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576104d4610591610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b6902260205260409020546105cc9060ff166117c7565b6118ae565b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760206040517ffb5864e8ff833c3cb2d2d08505e82ff02a43554c74a35d4f5a64e852612783118152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760043560005260046020526020600160406000200154604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060ff6107076106b5610313565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426000526004845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166040519015158152f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576104d4600435610750610336565b9080600052600460205261076b600160406000200154611ba6565b611d35565b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576107a7610336565b3373ffffffffffffffffffffffffffffffffffffffff8216036107d0576104d490600435611e7c565b60046040517f6697b232000000000000000000000000000000000000000000000000000000008152fd5b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610831610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209091906108719060ff905b54166117c7565b73ffffffffffffffffffffffffffffffffffffffff8116908115610910576108e99083805260016020526108e4836108dd6108c46040882073ffffffffffffffffffffffffffffffffffffffff90541690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14156118d4565b611eb6565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8280a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e707574206973207a65726f000000000000000000000000000000000000006044820152fd5b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576109a5610313565b6109ad610336565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090206109e79060ff9061086a565b73ffffffffffffffffffffffffffffffffffffffff90817fffffffffffffffffffffffff0000000000000000000000000000000000000000931683600554161760055516906006541617600655600080f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5767ffffffffffffffff60043581811161024f573660238201121561024f57806004013591821161024f576024810190602436918460051b01011161024f57610aae610336565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b6902260205260408120909390610aeb9060ff9061086a565b8015610c8257610b2f610b2a610b2384959473ffffffffffffffffffffffffffffffffffffffff166000526002602052604060002090565b5460ff1690565b611939565b839173ffffffffffffffffffffffffffffffffffffffff93848116935b838110610b57578680f35b80610bcc8688610bc4610baa610b78610b736001988c8c61199e565b6119dd565b7fffffffff00000000000000000000000000000000000000000000000000000000166000526003602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b1614156119ea565b610c2183610be1610b78610b73858a8a61199e565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b85610c58610c33610b7384898961199e565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b7f14ebc1c32aa68f4d766e89f3e546cee249f7df25183fc10ab1568d91c2ce9b7b8a80a301610b4c565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f50726f78793a205f73656c6563746f727327732073697a65206973207a65726f6044820152fd5b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f577fffffffff00000000000000000000000000000000000000000000000000000000600435610d3c81610225565b166000526003602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5773ffffffffffffffffffffffffffffffffffffffff610db7610313565b166000526002602052602060ff604060002054166040519015158152f35b3461024f576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e315773ffffffffffffffffffffffffffffffffffffffff604082806020945260018452205416604051908152f35b80fd5b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610e6b610313565b602435801515810361024f573360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090206104d49290610eb69060ff9061086a565b611f8a565b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060ff600054166040519015158152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610f33610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209091610fb1917fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4290610f959060ff9061086a565b83526004602052610fac6001604085200154611ba6565b611c20565b5080f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610fec610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090206110269060ff9061086a565b73ffffffffffffffffffffffffffffffffffffffff811680156110b957331461105b5761105290611852565b6104d4336118ae565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f41636365737369626c653a2073616d652061646d696e000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41636365737369626c653a207a65726f206164647265737300000000000000006044820152fd5b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760206040517fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec428152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760043580151580910361024f573360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209091906111e99060ff9061086a565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00835416911617815580f35b3461024f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5761124e610313565b60443590811515820361024f573360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209092906112989060ff9061086a565b813b15611301576112ad91816112b057611f8a565b80f35b602435845260016020526040842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055611f8a565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f50726f78793a206e6f7420636f6e7472616374206164647265737300000000006044820152fd5b3461024f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57611396610336565b60443573ffffffffffffffffffffffffffffffffffffffff8116810361024f5761070760ff916113f66020946004356000526009865260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576004356000526001602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760206114c06004356114bb81610225565b611a4f565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060ff61070761151c610336565b6004356000526004845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576020600754604051908152f35b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060405160008152f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576104d4600435611603610336565b9080600052600460205261161e600160406000200154611ba6565b611e7c565b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57600435600052600a60205260408060002073ffffffffffffffffffffffffffffffffffffffff6001818354169201541682519182526020820152f35b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576004356000526008602052604060002073ffffffffffffffffffffffffffffffffffffffff6117c381835416918060018501541693816002820154169160038201541660048201546005830154916007600685015494015494604051988998899491909360e096939998979461010087019a73ffffffffffffffffffffffffffffffffffffffff8094818094168a52166020890152166040870152166060850152608084015260a083015260c08201520152565b0390f35b156117ce57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f41636365737369626c653a2043616c6c6572206973206e6f7420616e2061646d60448201527f696e0000000000000000000000000000000000000000000000000000000000006064820152fd5b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4260005260046020527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69023546118ab9190610fac90611ba6565b50565b3373ffffffffffffffffffffffffffffffffffffffff8216036107d0576118ab90611d6f565b156118db57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f73616d65206164647200000000000000000000000000000000000000000000006044820152fd5b1561194057565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f50726f78793a205f696d70206973206e6f7420616c69766500000000000000006044820152fd5b91908110156119ae5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b356119e781610225565b90565b156119f157565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4c69717569646974795661756c7450726f78793a2073616d6520696d700000006044820152fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116600052600360205273ffffffffffffffffffffffffffffffffffffffff90816040600020541615600014611ad557506000805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49541690565b541690565b60ff611b3983611b11847fffffffff00000000000000000000000000000000000000000000000000000000166000526003602052604060002090565b541673ffffffffffffffffffffffffffffffffffffffff166000526002602052604060002090565b541615611b7657611ad0907fffffffff00000000000000000000000000000000000000000000000000000000166000526003602052604060002090565b506000805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49541690565b80600052600460205260ff611bdf3360406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b541615611be95750565b604490604051907fe2517d3f0000000000000000000000000000000000000000000000000000000082523360048301526024820152fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081207fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec429060ff905b5416611d2f578082526004602052611cc583604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d73ffffffffffffffffffffffffffffffffffffffff3394169280a4600190565b50905090565b600090808252600460205260ff611c8a84604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081207fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec429060ff905b541615611d2f578082526004602052611e1583604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b73ffffffffffffffffffffffffffffffffffffffff3394169280a4600190565b600090808252600460205260ff611dd984604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b803b156113015773ffffffffffffffffffffffffffffffffffffffff90600080526001602052611f258160406000209073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b16806000526002602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f72558d9bfba4210f9ef095c782589484151f6d90f7a81bb3cb9b33efc695d324602060405160018152a2565b602073ffffffffffffffffffffffffffffffffffffffff7f72558d9bfba4210f9ef095c782589484151f6d90f7a81bb3cb9b33efc695d32492169283600052600282526040600020901515907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a2565b60006120387fffffffff00000000000000000000000000000000000000000000000000000000823516611a4f565b73ffffffffffffffffffffffffffffffffffffffff81161515806120d7575b1561207957818091368280378136915af43d82803e15612075573d90f35b3d90fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f50726f78793a20696d706c204f522070726f78792069732066616c73650000006044820152fd5b5060ff8254161561205756fea2646970667358221220b52338da8c34d281912a9a72273a3362f3afe60f1f55e9589e6e43b1bb0760e964736f6c63430008180033df8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42
Deployed ByteCode
0x60806040526004361015610015575b3661200a57005b60003560e01c806301ffc9a7146102205780631230b14c1461021b57806316e01724146102165780631785f53c14610211578063229852461461020c578063248a9ca31461020757806324d7806c146102025780632f2ff15d146101fd57806336568abe146101f85780633659cfe6146101f3578063485cc955146101ee5780634a5df50f146101e957806350d2a276146101e4578063550d01a3146101df5780635c60da1b146101da5780635cc797d8146101d557806363a8fd89146101d057806370480275146101cb57806375829def146101c657806375b238fc146101c15780637cb00d25146101bc5780637cd5f663146101b75780638800867b146101b25780638b8f4a65146101995780638d4fdb40146101ad57806391d14854146101a8578063a1e89aec146101a3578063a217fddf1461019e578063b911135f14610199578063d547741f14610194578063e59f69c21461018f578063f43b36131461018a5763f5869c2f0361000e576116e0565b61168e565b611623565b6115c6565b61141b565b61158c565b611550565b6114de565b61147b565b61135f565b611217565b611170565b611117565b610fb5565b610efc565b610ebb565b610e34565b610dd5565b610d6b565b610ce0565b610a39565b61096e565b6107fa565b610770565b610713565b610677565b61062a565b6105d1565b610557565b610505565b610359565b610254565b7fffffffff0000000000000000000000000000000000000000000000000000000081160361024f57565b600080fd5b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760207fffffffff000000000000000000000000000000000000000000000000000000006004356102b281610225565b167f7965db0b0000000000000000000000000000000000000000000000000000000081149081156102e9575b506040519015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386102de565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361024f57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361024f57565b3461024f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610390610313565b610398610336565b906103ef6103ea3373ffffffffffffffffffffffffffffffffffffffff1660009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090205460ff1690565b6117c7565b60405190604082019082821067ffffffffffffffff8311176104d6576104d49360019260405273ffffffffffffffffffffffffffffffffffffffff8092168452816020850191168152604435600052600a602052610490826040600020955116859073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b511691019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602073ffffffffffffffffffffffffffffffffffffffff60065416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576104d4610591610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b6902260205260409020546105cc9060ff166117c7565b6118ae565b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760206040517ffb5864e8ff833c3cb2d2d08505e82ff02a43554c74a35d4f5a64e852612783118152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760043560005260046020526020600160406000200154604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060ff6107076106b5610313565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426000526004845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166040519015158152f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576104d4600435610750610336565b9080600052600460205261076b600160406000200154611ba6565b611d35565b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576107a7610336565b3373ffffffffffffffffffffffffffffffffffffffff8216036107d0576104d490600435611e7c565b60046040517f6697b232000000000000000000000000000000000000000000000000000000008152fd5b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610831610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209091906108719060ff905b54166117c7565b73ffffffffffffffffffffffffffffffffffffffff8116908115610910576108e99083805260016020526108e4836108dd6108c46040882073ffffffffffffffffffffffffffffffffffffffff90541690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14156118d4565b611eb6565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8280a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e707574206973207a65726f000000000000000000000000000000000000006044820152fd5b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576109a5610313565b6109ad610336565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090206109e79060ff9061086a565b73ffffffffffffffffffffffffffffffffffffffff90817fffffffffffffffffffffffff0000000000000000000000000000000000000000931683600554161760055516906006541617600655600080f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5767ffffffffffffffff60043581811161024f573660238201121561024f57806004013591821161024f576024810190602436918460051b01011161024f57610aae610336565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b6902260205260408120909390610aeb9060ff9061086a565b8015610c8257610b2f610b2a610b2384959473ffffffffffffffffffffffffffffffffffffffff166000526002602052604060002090565b5460ff1690565b611939565b839173ffffffffffffffffffffffffffffffffffffffff93848116935b838110610b57578680f35b80610bcc8688610bc4610baa610b78610b736001988c8c61199e565b6119dd565b7fffffffff00000000000000000000000000000000000000000000000000000000166000526003602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b1614156119ea565b610c2183610be1610b78610b73858a8a61199e565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b85610c58610c33610b7384898961199e565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b7f14ebc1c32aa68f4d766e89f3e546cee249f7df25183fc10ab1568d91c2ce9b7b8a80a301610b4c565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f50726f78793a205f73656c6563746f727327732073697a65206973207a65726f6044820152fd5b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f577fffffffff00000000000000000000000000000000000000000000000000000000600435610d3c81610225565b166000526003602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5773ffffffffffffffffffffffffffffffffffffffff610db7610313565b166000526002602052602060ff604060002054166040519015158152f35b3461024f576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e315773ffffffffffffffffffffffffffffffffffffffff604082806020945260018452205416604051908152f35b80fd5b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610e6b610313565b602435801515810361024f573360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090206104d49290610eb69060ff9061086a565b611f8a565b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060ff600054166040519015158152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610f33610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209091610fb1917fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4290610f959060ff9061086a565b83526004602052610fac6001604085200154611ba6565b611c20565b5080f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57610fec610313565b3360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604090206110269060ff9061086a565b73ffffffffffffffffffffffffffffffffffffffff811680156110b957331461105b5761105290611852565b6104d4336118ae565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f41636365737369626c653a2073616d652061646d696e000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41636365737369626c653a207a65726f206164647265737300000000000000006044820152fd5b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760206040517fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec428152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760043580151580910361024f573360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209091906111e99060ff9061086a565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00835416911617815580f35b3461024f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5761124e610313565b60443590811515820361024f573360009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081209092906112989060ff9061086a565b813b15611301576112ad91816112b057611f8a565b80f35b602435845260016020526040842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055611f8a565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f50726f78793a206e6f7420636f6e7472616374206164647265737300000000006044820152fd5b3461024f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57611396610336565b60443573ffffffffffffffffffffffffffffffffffffffff8116810361024f5761070760ff916113f66020946004356000526009865260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576004356000526001602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f5760206114c06004356114bb81610225565b611a4f565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060ff61070761151c610336565b6004356000526004845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576020600754604051908152f35b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602060405160008152f35b3461024f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576104d4600435611603610336565b9080600052600460205261161e600160406000200154611ba6565b611e7c565b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57600435600052600a60205260408060002073ffffffffffffffffffffffffffffffffffffffff6001818354169201541682519182526020820152f35b3461024f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f57602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b3461024f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261024f576004356000526008602052604060002073ffffffffffffffffffffffffffffffffffffffff6117c381835416918060018501541693816002820154169160038201541660048201546005830154916007600685015494015494604051988998899491909360e096939998979461010087019a73ffffffffffffffffffffffffffffffffffffffff8094818094168a52166020890152166040870152166060850152608084015260a083015260c08201520152565b0390f35b156117ce57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f41636365737369626c653a2043616c6c6572206973206e6f7420616e2061646d60448201527f696e0000000000000000000000000000000000000000000000000000000000006064820152fd5b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4260005260046020527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69023546118ab9190610fac90611ba6565b50565b3373ffffffffffffffffffffffffffffffffffffffff8216036107d0576118ab90611d6f565b156118db57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f73616d65206164647200000000000000000000000000000000000000000000006044820152fd5b1561194057565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f50726f78793a205f696d70206973206e6f7420616c69766500000000000000006044820152fd5b91908110156119ae5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b356119e781610225565b90565b156119f157565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4c69717569646974795661756c7450726f78793a2073616d6520696d700000006044820152fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116600052600360205273ffffffffffffffffffffffffffffffffffffffff90816040600020541615600014611ad557506000805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49541690565b541690565b60ff611b3983611b11847fffffffff00000000000000000000000000000000000000000000000000000000166000526003602052604060002090565b541673ffffffffffffffffffffffffffffffffffffffff166000526002602052604060002090565b541615611b7657611ad0907fffffffff00000000000000000000000000000000000000000000000000000000166000526003602052604060002090565b506000805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49541690565b80600052600460205260ff611bdf3360406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b541615611be95750565b604490604051907fe2517d3f0000000000000000000000000000000000000000000000000000000082523360048301526024820152fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081207fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec429060ff905b5416611d2f578082526004602052611cc583604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d73ffffffffffffffffffffffffffffffffffffffff3394169280a4600190565b50905090565b600090808252600460205260ff611c8a84604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f2fb794d17134dfdec181ddbac1babb5ab1eb140204ef4d982f294e7fc8b69022602052604081207fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec429060ff905b541615611d2f578082526004602052611e1583604084209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b73ffffffffffffffffffffffffffffffffffffffff3394169280a4600190565b600090808252600460205260ff611dd984604085209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b803b156113015773ffffffffffffffffffffffffffffffffffffffff90600080526001602052611f258160406000209073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b16806000526002602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f72558d9bfba4210f9ef095c782589484151f6d90f7a81bb3cb9b33efc695d324602060405160018152a2565b602073ffffffffffffffffffffffffffffffffffffffff7f72558d9bfba4210f9ef095c782589484151f6d90f7a81bb3cb9b33efc695d32492169283600052600282526040600020901515907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a2565b60006120387fffffffff00000000000000000000000000000000000000000000000000000000823516611a4f565b73ffffffffffffffffffffffffffffffffffffffff81161515806120d7575b1561207957818091368280378136915af43d82803e15612075573d90f35b3d90fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f50726f78793a20696d706c204f522070726f78792069732066616c73650000006044820152fd5b5060ff8254161561205756fea2646970667358221220b52338da8c34d281912a9a72273a3362f3afe60f1f55e9589e6e43b1bb0760e964736f6c63430008180033