ETH Price: $3,400.87 (-0.93%)

Contract

0x6142f1C8bBF02E6A6bd074E8d564c9A5420a0676
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Outbound Transfe...202476092024-07-06 12:57:23143 days ago1720270643IN
0x6142f1C8...5420a0676
0.00006646 ETH0.0002776710
Outbound Transfe...202476002024-07-06 12:55:35143 days ago1720270535IN
0x6142f1C8...5420a0676
0.00006646 ETH0.0002776710
Outbound Transfe...202475702024-07-06 12:49:35143 days ago1720270175IN
0x6142f1C8...5420a0676
0.00006646 ETH0.0002893410
Outbound Transfe...202475442024-07-06 12:44:23143 days ago1720269863IN
0x6142f1C8...5420a0676
0.00006646 ETH0.0002893410
Outbound Transfe...202432862024-07-05 22:26:59144 days ago1720218419IN
0x6142f1C8...5420a0676
0.00006646 ETH0.0002892210
Outbound Transfe...202431812024-07-05 22:05:59144 days ago1720217159IN
0x6142f1C8...5420a0676
0.0000025 ETH0.0002776710
Outbound Transfe...202429562024-07-05 21:20:59144 days ago1720214459IN
0x6142f1C8...5420a0676
0 ETH0.0002892210
Outbound Transfe...142072552022-02-14 23:41:171016 days ago1644882077IN
0x6142f1C8...5420a0676
0.00059129 ETH0.0100614261.72197845
Revoke Role141995502022-02-13 19:01:361017 days ago1644778896IN
0x6142f1C8...5420a0676
0 ETH0.00356507128.42022652
Grant Role141995482022-02-13 19:00:401017 days ago1644778840IN
0x6142f1C8...5420a0676
0 ETH0.00530859102.89375141
Set Minter141994972022-02-13 18:49:421017 days ago1644778182IN
0x6142f1C8...5420a0676
0 ETH0.0025451653.15707091
Set Counterpart141994932022-02-13 18:49:231017 days ago1644778163IN
0x6142f1C8...5420a0676
0 ETH0.0018759761.08885504
0x61012060141994572022-02-13 18:41:421017 days ago1644777702IN
 Create: L1LPTGateway
0 ETH0.1727199260.96129142

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
212728432024-11-26 15:33:2313 hrs ago1732635203
0x6142f1C8...5420a0676
0.0001923 ETH
212728432024-11-26 15:33:2313 hrs ago1732635203
0x6142f1C8...5420a0676
0.0001923 ETH
212599572024-11-24 20:21:232 days ago1732479683
0x6142f1C8...5420a0676
0.00011363 ETH
212599572024-11-24 20:21:232 days ago1732479683
0x6142f1C8...5420a0676
0.00011363 ETH
212597892024-11-24 19:47:352 days ago1732477655
0x6142f1C8...5420a0676
0.00011264 ETH
212597892024-11-24 19:47:352 days ago1732477655
0x6142f1C8...5420a0676
0.00011264 ETH
212589852024-11-24 17:05:352 days ago1732467935
0x6142f1C8...5420a0676
0.00012413 ETH
212589852024-11-24 17:05:352 days ago1732467935
0x6142f1C8...5420a0676
0.00012413 ETH
212563342024-11-24 8:12:352 days ago1732435955
0x6142f1C8...5420a0676
0.00011861 ETH
212563342024-11-24 8:12:352 days ago1732435955
0x6142f1C8...5420a0676
0.00011861 ETH
212548582024-11-24 3:16:113 days ago1732418171
0x6142f1C8...5420a0676
0.00014727 ETH
212548582024-11-24 3:16:113 days ago1732418171
0x6142f1C8...5420a0676
0.00014727 ETH
212548122024-11-24 3:06:593 days ago1732417619
0x6142f1C8...5420a0676
0.00013789 ETH
212548122024-11-24 3:06:593 days ago1732417619
0x6142f1C8...5420a0676
0.00013789 ETH
212521712024-11-23 18:16:233 days ago1732385783
0x6142f1C8...5420a0676
0.00022832 ETH
212521712024-11-23 18:16:233 days ago1732385783
0x6142f1C8...5420a0676
0.00022832 ETH
212501772024-11-23 11:35:233 days ago1732361723
0x6142f1C8...5420a0676
0.00012649 ETH
212501772024-11-23 11:35:233 days ago1732361723
0x6142f1C8...5420a0676
0.00012649 ETH
212484692024-11-23 5:52:593 days ago1732341179
0x6142f1C8...5420a0676
0.00014117 ETH
212484692024-11-23 5:52:593 days ago1732341179
0x6142f1C8...5420a0676
0.00014117 ETH
212376022024-11-21 17:29:235 days ago1732210163
0x6142f1C8...5420a0676
0.00018068 ETH
212376022024-11-21 17:29:235 days ago1732210163
0x6142f1C8...5420a0676
0.00018068 ETH
212333682024-11-21 3:17:116 days ago1732159031
0x6142f1C8...5420a0676
0.00012771 ETH
212333682024-11-21 3:17:116 days ago1732159031
0x6142f1C8...5420a0676
0.00012771 ETH
212329392024-11-21 1:50:596 days ago1732153859
0x6142f1C8...5420a0676
0.00010106 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
L1LPTGateway

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 16 : L1LPTGateway.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

import {ControlledGateway} from "../../ControlledGateway.sol";
import {L1ArbitrumMessenger} from "./L1ArbitrumMessenger.sol";
import {IL1LPTGateway} from "./IL1LPTGateway.sol";
import {IL2LPTGateway} from "../../L2/gateway/IL2LPTGateway.sol";

interface TokenLike {
    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool success);

    function balanceOf(address account) external view returns (uint256);
}

interface IMinter {
    function bridgeMint(address _to, uint256 _amount) external;
}

/**
 * @title L1LPTGateway
 * @notice Manages inbound and outbound transfers of LPT between L1 and Arbitrum Rollup
 * @dev the contract can be paused by the admin which will prevent any outbound transfers
 * but pausing the contract does not affect inbound transfers (tokens coming from L2)
 */
contract L1LPTGateway is IL1LPTGateway, ControlledGateway, L1ArbitrumMessenger {
    address public immutable l1Router;
    address public immutable l1LPTEscrow;
    address public l2Counterpart;
    address public minter;

    event L2CounterpartUpdate(address _l2Counterpart);

    event MinterUpdate(address _minter);

    constructor(
        address _l1Router,
        address _l1LPTEscrow,
        address _l1Lpt,
        address _l2Lpt,
        address _inbox
    ) ControlledGateway(_l1Lpt, _l2Lpt) L1ArbitrumMessenger(_inbox) {
        l1Router = _l1Router;
        l1LPTEscrow = _l1LPTEscrow;

        _pause();
    }

    /**
     * @notice Sets address of companion L2LPTGateway
     * @dev Only address with the admin role is allowed to change the value of l2Counterpart
     * @param _l2Counterpart L2 Address of the counterpart
     */
    function setCounterpart(address _l2Counterpart)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        l2Counterpart = _l2Counterpart;
        emit L2CounterpartUpdate(_l2Counterpart);
    }

    /**
     * @notice Sets address of Minter
     * @dev Only address with the admin role is allowed to change the value of minter
     * @param _minter L1 Address of minter
     */
    function setMinter(address _minter) external onlyRole(DEFAULT_ADMIN_ROLE) {
        minter = _minter;
        emit MinterUpdate(_minter);
    }

    /**
     * @notice Creates and sends a retryable ticket to migrate LPT to L2 using arbitrum Inbox.
     * The tokens are sent to the Escrow contract for safekeeping until they are withdrawn
     * The ticket must be redeemed on L2 to receive tokens at the specified address.
     * @dev maxGas and gasPriceBid must be set using arbitrum's Inbox.estimateRetryableTicket method.
     * @param _l1Token L1 Address of LPT
     * @param _to Recepient address on L2
     * @param _amount Amount of tokens to tranfer
     * @param _maxGas Gas limit for L2 execution of the ticket
     * @param _gasPriceBid Price per gas on L2
     * @param _data Encoded maxSubmission cost and sender address along with additional calldata
     * @return seqNum Sequence number of the retryable ticket created by Inbox
     */
    function outboundTransfer(
        address _l1Token,
        address _to,
        uint256 _amount,
        uint256 _maxGas,
        uint256 _gasPriceBid,
        bytes calldata _data
    ) external payable override whenNotPaused returns (bytes memory) {
        require(_l1Token == l1Lpt, "TOKEN_NOT_LPT");
        require(_amount > 0, "INVALID_ZERO_AMOUNT");

        // nested scope to avoid stack too deep errors
        address from;
        uint256 seqNum;
        bytes memory extraData;
        {
            uint256 maxSubmissionCost;
            (from, maxSubmissionCost, extraData) = parseOutboundData(_data);
            require(extraData.length == 0, "CALL_HOOK_DATA_NOT_ALLOWED");

            // makes sure only sufficient ETH is supplied required for successful redemption on L2
            // if a user does not desire immediate redemption they should provide
            // a msg.value of AT LEAST maxSubmissionCost
            uint256 expectedEth = maxSubmissionCost + (_maxGas * _gasPriceBid);
            require(maxSubmissionCost > 0, "NO_SUBMISSION_COST");
            require(msg.value == expectedEth, "WRONG_ETH_VALUE");

            // transfer tokens to escrow
            TokenLike(_l1Token).transferFrom(from, l1LPTEscrow, _amount);

            bytes memory outboundCalldata = getOutboundCalldata(
                _l1Token,
                from,
                _to,
                _amount,
                extraData
            );

            seqNum = sendTxToL2(
                l2Counterpart,
                from,
                maxSubmissionCost,
                _maxGas,
                _gasPriceBid,
                outboundCalldata
            );
        }

        emit DepositInitiated(_l1Token, from, _to, seqNum, _amount);

        return abi.encode(seqNum);
    }

    /**
     * @notice Receives withdrawn token amount from L2
     * The equivalent tokens are released from the Escrow contract and sent to the destination
     * In case the escrow doesn't have enough balance, new tokens are minted
     * @dev can only accept txs coming directly from L2 LPT Gateway
     * @param l1Token L1 Address of LPT
     * @param from Address of the sender
     * @param to Recepient address on L1
     * @param amount Amount of tokens transferred
     * @param data Contains exitNum which is always set to 0
     */
    function finalizeInboundTransfer(
        address l1Token,
        address from,
        address to,
        uint256 amount,
        bytes calldata data
    ) external override onlyL2Counterpart(l2Counterpart) {
        require(l1Token == l1Lpt, "TOKEN_NOT_LPT");
        (uint256 exitNum, ) = abi.decode(data, (uint256, bytes));

        uint256 escrowBalance = TokenLike(l1Token).balanceOf(l1LPTEscrow);

        // mint additional tokens if requested amount exceeds escrowed amount
        if (amount <= escrowBalance) {
            TokenLike(l1Token).transferFrom(l1LPTEscrow, to, amount);
        } else {
            if (escrowBalance > 0) {
                TokenLike(l1Token).transferFrom(l1LPTEscrow, to, escrowBalance);
            }
            IMinter(minter).bridgeMint(to, amount - escrowBalance);
        }

        emit WithdrawalFinalized(l1Token, from, to, exitNum, amount);
    }

    /**
     * @notice decodes calldata required for migration of tokens
     * @dev data must include maxSubmissionCost, extraData can be left empty
     * @param data encoded callhook data
     * @return from sender of the tx
     * @return maxSubmissionCost base ether value required to keep retyrable ticket alive
     * @return extraData any other data sent to L2
     */
    function parseOutboundData(bytes memory data)
        private
        view
        returns (
            address from,
            uint256 maxSubmissionCost,
            bytes memory extraData
        )
    {
        if (msg.sender == l1Router) {
            // router encoded
            (from, extraData) = abi.decode(data, (address, bytes));
        } else {
            from = msg.sender;
            extraData = data;
        }
        // user encoded
        (maxSubmissionCost, extraData) = abi.decode(
            extraData,
            (uint256, bytes)
        );
    }

    /**
     * @notice returns address of L2 LPT Gateway
     */
    function counterpartGateway() external view override returns (address) {
        return l2Counterpart;
    }

    /**
     * @notice returns address of L2 version of LPT
     */
    function calculateL2TokenAddress(address l1Token)
        external
        view
        override
        returns (address)
    {
        if (l1Token != l1Lpt) {
            return address(0);
        }

        return l2Lpt;
    }

    /**
     * @notice Creates calldata required to create a retryable ticket
     * @dev encodes the target function with its params which
     * will be called on L2 when the retryable ticket is redeemed
     */
    function getOutboundCalldata(
        address l1Token,
        address from,
        address to,
        uint256 amount,
        bytes memory data
    ) public pure returns (bytes memory outboundCalldata) {
        bytes memory emptyBytes;

        outboundCalldata = abi.encodeWithSelector(
            IL2LPTGateway.finalizeInboundTransfer.selector,
            l1Token,
            from,
            to,
            amount,
            abi.encode(emptyBytes, data)
        );
    }
}

File 2 of 16 : AccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/AccessControl.sol)

pragma solidity ^0.8.0;

import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../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:
 *
 * ```
 * 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}:
 *
 * ```
 * 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.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @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 override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @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 override 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.
     */
    function grantRole(bytes32 role, address account) public virtual override 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.
     */
    function revokeRole(bytes32 role, address account) public virtual override 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 `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @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 Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

File 3 of 16 : IAccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @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.
     *
     * _Available since v3.1._
     */
    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 `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

File 4 of 16 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

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

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

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

    bool private _paused;

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

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

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

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

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

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

File 5 of 16 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 6 of 16 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 7 of 16 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./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);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 8 of 16 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 9 of 16 : ControlledGateway.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol";
import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";

/**
 * @title ControlledGateway
 * @notice Base Contract for both L1 and L2 LPT gateways. Provides AccessControl.
 * Gateways can be paused by the admin to stop outgoing token migrations
 */
contract ControlledGateway is AccessControl, Pausable {
    address public immutable l1Lpt;
    address public immutable l2Lpt;

    constructor(address _l1Lpt, address _l2Lpt) {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);

        l1Lpt = _l1Lpt;
        l2Lpt = _l2Lpt;
    }

    function pause() external onlyRole(DEFAULT_ADMIN_ROLE) {
        _pause();
    }

    function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) {
        _unpause();
    }
}

File 10 of 16 : IL1LPTGateway.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface IL1LPTGateway {
    event DepositInitiated(
        address _l1Token,
        address indexed _from,
        address indexed _to,
        uint256 indexed _sequenceNumber,
        uint256 _amount
    );

    event WithdrawalFinalized(
        address _l1Token,
        address indexed _from,
        address indexed _to,
        uint256 indexed _exitNum,
        uint256 _amount
    );

    function outboundTransfer(
        address _l1Token,
        address _to,
        uint256 _amount,
        uint256 _maxGas,
        uint256 _gasPriceBid,
        bytes calldata _data
    ) external payable returns (bytes memory);

    function finalizeInboundTransfer(
        address _token,
        address _from,
        address _to,
        uint256 _amount,
        bytes calldata _data
    ) external;

    // if token is not supported this should return 0x0 address
    function calculateL2TokenAddress(address l1Token)
        external
        view
        returns (address);

    // used by router
    function counterpartGateway() external view returns (address);
}

File 11 of 16 : L1ArbitrumMessenger.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

import {IBridge} from "../../arbitrum/IBridge.sol";
import {IInbox} from "../../arbitrum/IInbox.sol";
import {IOutbox} from "../../arbitrum/IOutbox.sol";

abstract contract L1ArbitrumMessenger {
    IInbox public immutable inbox;

    event TxToL2(
        address indexed from,
        address indexed to,
        uint256 indexed seqNum,
        bytes data
    );

    constructor(address _inbox) {
        inbox = IInbox(_inbox);
    }

    modifier onlyL2Counterpart(address l2Counterpart) {
        // a message coming from the counterpart gateway was executed by the bridge
        address bridge = inbox.bridge();
        require(msg.sender == bridge, "NOT_FROM_BRIDGE");

        // and the outbox reports that the L2 address of the sender is the counterpart gateway
        address l2ToL1Sender = IOutbox(IBridge(bridge).activeOutbox())
            .l2ToL1Sender();
        require(l2ToL1Sender == l2Counterpart, "ONLY_COUNTERPART_GATEWAY");
        _;
    }

    function sendTxToL2(
        address target,
        address from,
        uint256 maxSubmissionCost,
        uint256 maxGas,
        uint256 gasPriceBid,
        bytes memory data
    ) internal returns (uint256) {
        return
            sendTxToL2(
                target,
                from,
                msg.value,
                0, // we always assume that l2CallValue = 0
                maxSubmissionCost,
                maxGas,
                gasPriceBid,
                data
            );
    }

    function sendTxToL2(
        address target,
        address from,
        uint256 _l1CallValue,
        uint256 _l2CallValue,
        uint256 maxSubmissionCost,
        uint256 maxGas,
        uint256 gasPriceBid,
        bytes memory data
    ) internal returns (uint256) {
        uint256 seqNum = inbox.createRetryableTicket{value: _l1CallValue}(
            target,
            _l2CallValue,
            maxSubmissionCost,
            from,
            from,
            maxGas,
            gasPriceBid,
            data
        );
        emit TxToL2(from, target, seqNum, data);
        return seqNum;
    }
}

File 12 of 16 : IL2LPTGateway.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface IL2LPTGateway {
    event DepositFinalized(
        address indexed _l1Token,
        address indexed _from,
        address indexed _to,
        uint256 _amount
    );

    event WithdrawalInitiated(
        address _l1Token,
        address indexed _from,
        address indexed _to,
        uint256 indexed _l2ToL1Id,
        uint256 _exitNum,
        uint256 _amount
    );

    function outboundTransfer(
        address _token,
        address _to,
        uint256 _amount,
        bytes calldata _data
    ) external returns (bytes memory);

    function finalizeInboundTransfer(
        address _token,
        address _from,
        address _to,
        uint256 _amount,
        bytes calldata _data
    ) external;

    // if token is not supported this should return 0x0 address
    function calculateL2TokenAddress(address _l1Token)
        external
        view
        returns (address);

    // used by router
    function counterpartGateway() external view returns (address);
}

File 13 of 16 : IBridge.sol
// SPDX-License-Identifier: Apache-2.0

/*
 * Copyright 2021, Offchain Labs, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

pragma solidity 0.8.9;

interface IBridge {
    event MessageDelivered(
        uint256 indexed messageIndex,
        bytes32 indexed beforeInboxAcc,
        address inbox,
        uint8 kind,
        address sender,
        bytes32 messageDataHash
    );

    event BridgeCallTriggered(
        address indexed outbox,
        address indexed destAddr,
        uint256 amount,
        bytes data
    );

    event InboxToggle(address indexed inbox, bool enabled);

    event OutboxToggle(address indexed outbox, bool enabled);

    function deliverMessageToInbox(
        uint8 kind,
        address sender,
        bytes32 messageDataHash
    ) external payable returns (uint256);

    function executeCall(
        address destAddr,
        uint256 amount,
        bytes calldata data
    ) external returns (bool success, bytes memory returnData);

    // These are only callable by the admin
    function setInbox(address inbox, bool enabled) external;

    function setOutbox(address inbox, bool enabled) external;

    // View functions

    function activeOutbox() external view returns (address);

    function allowedInboxes(address inbox) external view returns (bool);

    function allowedOutboxes(address outbox) external view returns (bool);

    function inboxAccs(uint256 index) external view returns (bytes32);

    function messageCount() external view returns (uint256);
}

File 14 of 16 : IInbox.sol
// SPDX-License-Identifier: Apache-2.0

/*
 * Copyright 2021, Offchain Labs, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

pragma solidity 0.8.9;

import "./IMessageProvider.sol";

interface IInbox is IMessageProvider {
    function sendL2Message(bytes calldata messageData)
        external
        returns (uint256);

    function sendUnsignedTransaction(
        uint256 maxGas,
        uint256 gasPriceBid,
        uint256 nonce,
        address destAddr,
        uint256 amount,
        bytes calldata data
    ) external returns (uint256);

    function sendContractTransaction(
        uint256 maxGas,
        uint256 gasPriceBid,
        address destAddr,
        uint256 amount,
        bytes calldata data
    ) external returns (uint256);

    function sendL1FundedUnsignedTransaction(
        uint256 maxGas,
        uint256 gasPriceBid,
        uint256 nonce,
        address destAddr,
        bytes calldata data
    ) external payable returns (uint256);

    function sendL1FundedContractTransaction(
        uint256 maxGas,
        uint256 gasPriceBid,
        address destAddr,
        bytes calldata data
    ) external payable returns (uint256);

    function createRetryableTicket(
        address destAddr,
        uint256 arbTxCallValue,
        uint256 maxSubmissionCost,
        address submissionRefundAddress,
        address valueRefundAddress,
        uint256 maxGas,
        uint256 gasPriceBid,
        bytes calldata data
    ) external payable returns (uint256);

    function createRetryableTicketNoRefundAliasRewrite(
        address destAddr,
        uint256 arbTxCallValue,
        uint256 maxSubmissionCost,
        address submissionRefundAddress,
        address valueRefundAddress,
        uint256 maxGas,
        uint256 gasPriceBid,
        bytes calldata data
    ) external payable returns (uint256);

    function depositEth(uint256 maxSubmissionCost)
        external
        payable
        returns (uint256);

    function bridge() external view returns (address);

    function pauseCreateRetryables() external;

    function unpauseCreateRetryables() external;

    function startRewriteAddress() external;

    function stopRewriteAddress() external;
}

File 15 of 16 : IMessageProvider.sol
// SPDX-License-Identifier: Apache-2.0

/*
 * Copyright 2021, Offchain Labs, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

pragma solidity 0.8.9;

interface IMessageProvider {
    event InboxMessageDelivered(uint256 indexed messageNum, bytes data);

    event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum);
}

File 16 of 16 : IOutbox.sol
// SPDX-License-Identifier: Apache-2.0

/*
 * Copyright 2021, Offchain Labs, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

pragma solidity 0.8.9;

interface IOutbox {
    event OutboxEntryCreated(
        uint256 indexed batchNum,
        uint256 outboxEntryIndex,
        bytes32 outputRoot,
        uint256 numInBatch
    );
    event OutBoxTransactionExecuted(
        address indexed destAddr,
        address indexed l2Sender,
        uint256 indexed outboxEntryIndex,
        uint256 transactionIndex
    );

    function l2ToL1Sender() external view returns (address);

    function l2ToL1Block() external view returns (uint256);

    function l2ToL1EthBlock() external view returns (uint256);

    function l2ToL1Timestamp() external view returns (uint256);

    function l2ToL1BatchNum() external view returns (uint256);

    function l2ToL1OutputId() external view returns (bytes32);

    function processOutgoingMessages(
        bytes calldata sendsData,
        uint256[] calldata sendLengths
    ) external;

    function outboxEntryExists(uint256 batchNum) external view returns (bool);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_l1Router","type":"address"},{"internalType":"address","name":"_l1LPTEscrow","type":"address"},{"internalType":"address","name":"_l1Lpt","type":"address"},{"internalType":"address","name":"_l2Lpt","type":"address"},{"internalType":"address","name":"_inbox","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_l1Token","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_sequenceNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"DepositInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_l2Counterpart","type":"address"}],"name":"L2CounterpartUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_minter","type":"address"}],"name":"MinterUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"seqNum","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"TxToL2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_l1Token","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_exitNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"WithdrawalFinalized","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"l1Token","type":"address"}],"name":"calculateL2TokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"counterpartGateway","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"l1Token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"finalizeInboundTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"l1Token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"getOutboundCalldata","outputs":[{"internalType":"bytes","name":"outboundCalldata","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inbox","outputs":[{"internalType":"contract IInbox","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l1LPTEscrow","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l1Lpt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l1Router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l2Counterpart","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l2Lpt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_l1Token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxGas","type":"uint256"},{"internalType":"uint256","name":"_gasPriceBid","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"outboundTransfer","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_l2Counterpart","type":"address"}],"name":"setCounterpart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101206040523480156200001257600080fd5b506040516200373038038062003730833981810160405281019062000038919062000429565b8083836000600160006101000a81548160ff0219169083151502179055506200006b6000801b336200018e60201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505050508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050508473ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff16815250508373ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff1681525050620001836200027f60201b60201c565b505050505062000562565b620001a082826200033660201b60201c565b6200027b57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000220620003a060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6200028f620003a860201b60201c565b15620002d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002c99062000512565b60405180910390fd5b60018060006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200031d620003a060201b60201c565b6040516200032c919062000545565b60405180910390a1565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b6000600160009054906101000a900460ff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003f182620003c4565b9050919050565b6200040381620003e4565b81146200040f57600080fd5b50565b6000815190506200042381620003f8565b92915050565b600080600080600060a08688031215620004485762000447620003bf565b5b6000620004588882890162000412565b95505060206200046b8882890162000412565b94505060406200047e8882890162000412565b9350506060620004918882890162000412565b9250506080620004a48882890162000412565b9150509295509295909350565b600082825260208201905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000620004fa601083620004b1565b91506200050782620004c2565b602082019050919050565b600060208201905081810360008301526200052d81620004eb565b9050919050565b6200053f81620003e4565b82525050565b60006020820190506200055c600083018462000534565b92915050565b60805160a05160c05160e0516101005161313c620005f4600039600081816109ee01528181610aa001528181610b5e01528181610e0a0152611348015260008181610dcf01526119ae0152600081816106b3015281816114e00152611cab015260008181610f6c01526110a30152600081816105ff0152818161092e015281816110470152611116015261313c6000f3fe60806040526004361061014b5760003560e01c806377061e4d116100b6578063a217fddf1161006f578063a217fddf1461046e578063a7e28d4814610499578063d2ce7d65146104d6578063d547741f14610506578063fb0e722b1461052f578063fca3b5aa1461055a5761014b565b806377061e4d1461035e5780638456cb59146103875780638e7c8efe1461039e57806391d14854146103c95780639d79bdb514610406578063a0c76a96146104315761014b565b80632f2ff15d116101085780632f2ff15d1461027457806336568abe1461029d5780633f4ba83a146102c6578063407395e0146102dd5780635c975abb1461030857806362dcefbb146103335761014b565b806301ffc9a714610150578063072566771461018d57806307546172146101b8578063248a9ca3146101e35780632db09c1c146102205780632e567b361461024b575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190611e47565b610583565b6040516101849190611e8f565b60405180910390f35b34801561019957600080fd5b506101a26105fd565b6040516101af9190611eeb565b60405180910390f35b3480156101c457600080fd5b506101cd610621565b6040516101da9190611eeb565b60405180910390f35b3480156101ef57600080fd5b5061020a60048036038101906102059190611f3c565b610647565b6040516102179190611f78565b60405180910390f35b34801561022c57600080fd5b50610235610666565b6040516102429190611eeb565b60405180910390f35b34801561025757600080fd5b50610272600480360381019061026d919061205a565b61068e565b005b34801561028057600080fd5b5061029b600480360381019061029691906120f4565b610d01565b005b3480156102a957600080fd5b506102c460048036038101906102bf91906120f4565b610d2a565b005b3480156102d257600080fd5b506102db610dad565b005b3480156102e957600080fd5b506102f2610dcd565b6040516102ff9190611eeb565b60405180910390f35b34801561031457600080fd5b5061031d610df1565b60405161032a9190611e8f565b60405180910390f35b34801561033f57600080fd5b50610348610e08565b6040516103559190611eeb565b60405180910390f35b34801561036a57600080fd5b5061038560048036038101906103809190612134565b610e2c565b005b34801561039357600080fd5b5061039c610ebc565b005b3480156103aa57600080fd5b506103b3610edc565b6040516103c09190611eeb565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb91906120f4565b610f00565b6040516103fd9190611e8f565b60405180910390f35b34801561041257600080fd5b5061041b610f6a565b6040516104289190611eeb565b60405180910390f35b34801561043d57600080fd5b50610458600480360381019061045391906122a2565b610f8e565b60405161046591906123c1565b60405180910390f35b34801561047a57600080fd5b5061048361103c565b6040516104909190611f78565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190612134565b611043565b6040516104cd9190611eeb565b60405180910390f35b6104f060048036038101906104eb91906123e3565b6110ca565b6040516104fd91906123c1565b60405180910390f35b34801561051257600080fd5b5061052d600480360381019061052891906120f4565b6114b5565b005b34801561053b57600080fd5b506105446114de565b60405161055191906124f1565b60405180910390f35b34801561056657600080fd5b50610581600480360381019061057c9190612134565b611502565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105f657506105f582611593565b5b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000838152602001908152602001600020600101549050919050565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e78cea926040518163ffffffff1660e01b815260040160206040518083038186803b15801561071757600080fd5b505afa15801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f9190612521565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b6906125ab565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663ab5d89436040518163ffffffff1660e01b815260040160206040518083038186803b15801561080757600080fd5b505afa15801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f9190612521565b73ffffffffffffffffffffffffffffffffffffffff166380648b026040518163ffffffff1660e01b815260040160206040518083038186803b15801561088457600080fd5b505afa158015610898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bc9190612521565b90508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461092c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092390612617565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b190612683565b60405180910390fd5b600085858101906109cb91906126a3565b50905060008a73ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401610a299190611eeb565b60206040518083038186803b158015610a4157600080fd5b505afa158015610a55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a799190612714565b9050808811610b37578a73ffffffffffffffffffffffffffffffffffffffff166323b872dd7f00000000000000000000000000000000000000000000000000000000000000008b8b6040518463ffffffff1660e01b8152600401610adf93929190612750565b602060405180830381600087803b158015610af957600080fd5b505af1158015610b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3191906127b3565b50610c8c565b6000811115610bf1578a73ffffffffffffffffffffffffffffffffffffffff166323b872dd7f00000000000000000000000000000000000000000000000000000000000000008b846040518463ffffffff1660e01b8152600401610b9d93929190612750565b602060405180830381600087803b158015610bb757600080fd5b505af1158015610bcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bef91906127b3565b505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638c2a993e8a838b610c3c919061280f565b6040518363ffffffff1660e01b8152600401610c59929190612843565b600060405180830381600087803b158015610c7357600080fd5b505af1158015610c87573d6000803e3d6000fd5b505050505b818973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f891afe029c75c4f8c5855fc3480598bc5a53739344f6ae575bdb7ea2a79f56b38e8c604051610cec929190612843565b60405180910390a45050505050505050505050565b610d0a82610647565b610d1b81610d166115fd565b611605565b610d2583836116a2565b505050565b610d326115fd565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d96906128de565b60405180910390fd5b610da98282611782565b5050565b6000801b610dc281610dbd6115fd565b611605565b610dca611863565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600160009054906101000a900460ff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000801b610e4181610e3c6115fd565b611605565b816001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5e7a493863411309f190ab78ded345429e56b2df9a2b48530f31243fa31e992882604051610eb09190611eeb565b60405180910390a15050565b6000801b610ed181610ecc6115fd565b611605565b610ed9611905565b50565b60018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606080632e567b3660e01b878787878588604051602001610fb09291906128fe565b604051602081830303815290604052604051602401610fd3959493929190612935565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505091505095945050505050565b6000801b81565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146110a157600090506110c5565b7f000000000000000000000000000000000000000000000000000000000000000090505b919050565b60606110d4610df1565b15611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b906129db565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146111a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119990612683565b60405180910390fd5b600086116111e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dc90612a47565b60405180910390fd5b6000806060600061123987878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506119a7565b8094508193508296505050506000825114611289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128090612ab3565b60405180910390fd5b6000888a6112979190612ad3565b826112a29190612b2d565b9050600082116112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90612bcf565b60405180910390fd5b803414611329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132090612c3b565b60405180910390fd5b8c73ffffffffffffffffffffffffffffffffffffffff166323b872dd867f00000000000000000000000000000000000000000000000000000000000000008e6040518463ffffffff1660e01b815260040161138693929190612750565b602060405180830381600087803b1580156113a057600080fd5b505af11580156113b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d891906127b3565b5060006113e88e878f8f88610f8e565b905061141860018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687858e8e86611a4b565b9450505050818a73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fb8910b9960c443aac3240b98585384e3a6f109fbf6969e264c3f183d69aba7e18e8d60405161147d929190612843565b60405180910390a4816040516020016114969190612c5b565b6040516020818303038152906040529350505050979650505050505050565b6114be82610647565b6114cf816114ca6115fd565b611605565b6114d98383611782565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000801b611517816115126115fd565b611605565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fe4445650be24dc57d85324bde2bc79571389abac71a7126fb392df5aa012600f826040516115879190611eeb565b60405180910390a15050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b61160f8282610f00565b61169e576116348173ffffffffffffffffffffffffffffffffffffffff166014611a6a565b6116428360001c6020611a6a565b604051602001611653929190612d55565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116959190612dc8565b60405180910390fd5b5050565b6116ac8282610f00565b61177e57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117236115fd565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61178c8282610f00565b1561185f57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118046115fd565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61186b610df1565b6118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190612e36565b60405180910390fd5b6000600160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6118ee6115fd565b6040516118fb9190611eeb565b60405180910390a1565b61190d610df1565b1561194d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611944906129db565b60405180910390fd5b60018060006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119906115fd565b60405161199d9190611eeb565b60405180910390a1565b60008060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611a215783806020019051810190611a149190612f04565b8092508194505050611a28565b3392508390505b80806020019051810190611a3c9190612f60565b80925081935050509193909250565b6000611a5e878734600089898989611ca6565b90509695505050505050565b606060006002836002611a7d9190612ad3565b611a879190612b2d565b67ffffffffffffffff811115611aa057611a9f612177565b5b6040519080825280601f01601f191660200182016040528015611ad25781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611b0a57611b09612fbc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611b6e57611b6d612fbc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611bae9190612ad3565b611bb89190612b2d565b90505b6001811115611c58577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611bfa57611bf9612fbc565b5b1a60f81b828281518110611c1157611c10612fbc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611c5190612feb565b9050611bbb565b5060008414611c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9390613061565b60405180910390fd5b8091505092915050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663679b6ded898c8a8a8e8f8c8c8c6040518a63ffffffff1660e01b8152600401611d11989796959493929190613081565b6020604051808303818588803b158015611d2a57600080fd5b505af1158015611d3e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611d639190612714565b9050808a73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fc1d1490cf25c3b40d600dfb27c7680340ed1ab901b7e8f3551280968a3b372b086604051611dc391906123c1565b60405180910390a48091505098975050505050505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611e2481611def565b8114611e2f57600080fd5b50565b600081359050611e4181611e1b565b92915050565b600060208284031215611e5d57611e5c611de5565b5b6000611e6b84828501611e32565b91505092915050565b60008115159050919050565b611e8981611e74565b82525050565b6000602082019050611ea46000830184611e80565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611ed582611eaa565b9050919050565b611ee581611eca565b82525050565b6000602082019050611f006000830184611edc565b92915050565b6000819050919050565b611f1981611f06565b8114611f2457600080fd5b50565b600081359050611f3681611f10565b92915050565b600060208284031215611f5257611f51611de5565b5b6000611f6084828501611f27565b91505092915050565b611f7281611f06565b82525050565b6000602082019050611f8d6000830184611f69565b92915050565b611f9c81611eca565b8114611fa757600080fd5b50565b600081359050611fb981611f93565b92915050565b6000819050919050565b611fd281611fbf565b8114611fdd57600080fd5b50565b600081359050611fef81611fc9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261201a57612019611ff5565b5b8235905067ffffffffffffffff81111561203757612036611ffa565b5b60208301915083600182028301111561205357612052611fff565b5b9250929050565b60008060008060008060a0878903121561207757612076611de5565b5b600061208589828a01611faa565b965050602061209689828a01611faa565b95505060406120a789828a01611faa565b94505060606120b889828a01611fe0565b935050608087013567ffffffffffffffff8111156120d9576120d8611dea565b5b6120e589828a01612004565b92509250509295509295509295565b6000806040838503121561210b5761210a611de5565b5b600061211985828601611f27565b925050602061212a85828601611faa565b9150509250929050565b60006020828403121561214a57612149611de5565b5b600061215884828501611faa565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6121af82612166565b810181811067ffffffffffffffff821117156121ce576121cd612177565b5b80604052505050565b60006121e1611ddb565b90506121ed82826121a6565b919050565b600067ffffffffffffffff82111561220d5761220c612177565b5b61221682612166565b9050602081019050919050565b82818337600083830152505050565b6000612245612240846121f2565b6121d7565b90508281526020810184848401111561226157612260612161565b5b61226c848285612223565b509392505050565b600082601f83011261228957612288611ff5565b5b8135612299848260208601612232565b91505092915050565b600080600080600060a086880312156122be576122bd611de5565b5b60006122cc88828901611faa565b95505060206122dd88828901611faa565b94505060406122ee88828901611faa565b93505060606122ff88828901611fe0565b925050608086013567ffffffffffffffff8111156123205761231f611dea565b5b61232c88828901612274565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b60005b83811015612373578082015181840152602081019050612358565b83811115612382576000848401525b50505050565b600061239382612339565b61239d8185612344565b93506123ad818560208601612355565b6123b681612166565b840191505092915050565b600060208201905081810360008301526123db8184612388565b905092915050565b600080600080600080600060c0888a03121561240257612401611de5565b5b60006124108a828b01611faa565b97505060206124218a828b01611faa565b96505060406124328a828b01611fe0565b95505060606124438a828b01611fe0565b94505060806124548a828b01611fe0565b93505060a088013567ffffffffffffffff81111561247557612474611dea565b5b6124818a828b01612004565b925092505092959891949750929550565b6000819050919050565b60006124b76124b26124ad84611eaa565b612492565b611eaa565b9050919050565b60006124c98261249c565b9050919050565b60006124db826124be565b9050919050565b6124eb816124d0565b82525050565b600060208201905061250660008301846124e2565b92915050565b60008151905061251b81611f93565b92915050565b60006020828403121561253757612536611de5565b5b60006125458482850161250c565b91505092915050565b600082825260208201905092915050565b7f4e4f545f46524f4d5f4252494447450000000000000000000000000000000000600082015250565b6000612595600f8361254e565b91506125a08261255f565b602082019050919050565b600060208201905081810360008301526125c481612588565b9050919050565b7f4f4e4c595f434f554e544552504152545f474154455741590000000000000000600082015250565b600061260160188361254e565b915061260c826125cb565b602082019050919050565b60006020820190508181036000830152612630816125f4565b9050919050565b7f544f4b454e5f4e4f545f4c505400000000000000000000000000000000000000600082015250565b600061266d600d8361254e565b915061267882612637565b602082019050919050565b6000602082019050818103600083015261269c81612660565b9050919050565b600080604083850312156126ba576126b9611de5565b5b60006126c885828601611fe0565b925050602083013567ffffffffffffffff8111156126e9576126e8611dea565b5b6126f585828601612274565b9150509250929050565b60008151905061270e81611fc9565b92915050565b60006020828403121561272a57612729611de5565b5b6000612738848285016126ff565b91505092915050565b61274a81611fbf565b82525050565b60006060820190506127656000830186611edc565b6127726020830185611edc565b61277f6040830184612741565b949350505050565b61279081611e74565b811461279b57600080fd5b50565b6000815190506127ad81612787565b92915050565b6000602082840312156127c9576127c8611de5565b5b60006127d78482850161279e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061281a82611fbf565b915061282583611fbf565b925082821015612838576128376127e0565b5b828203905092915050565b60006040820190506128586000830185611edc565b6128656020830184612741565b9392505050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006128c8602f8361254e565b91506128d38261286c565b604082019050919050565b600060208201905081810360008301526128f7816128bb565b9050919050565b600060408201905081810360008301526129188185612388565b9050818103602083015261292c8184612388565b90509392505050565b600060a08201905061294a6000830188611edc565b6129576020830187611edc565b6129646040830186611edc565b6129716060830185612741565b81810360808301526129838184612388565b90509695505050505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006129c560108361254e565b91506129d08261298f565b602082019050919050565b600060208201905081810360008301526129f4816129b8565b9050919050565b7f494e56414c49445f5a45524f5f414d4f554e5400000000000000000000000000600082015250565b6000612a3160138361254e565b9150612a3c826129fb565b602082019050919050565b60006020820190508181036000830152612a6081612a24565b9050919050565b7f43414c4c5f484f4f4b5f444154415f4e4f545f414c4c4f574544000000000000600082015250565b6000612a9d601a8361254e565b9150612aa882612a67565b602082019050919050565b60006020820190508181036000830152612acc81612a90565b9050919050565b6000612ade82611fbf565b9150612ae983611fbf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b2257612b216127e0565b5b828202905092915050565b6000612b3882611fbf565b9150612b4383611fbf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b7857612b776127e0565b5b828201905092915050565b7f4e4f5f5355424d495353494f4e5f434f53540000000000000000000000000000600082015250565b6000612bb960128361254e565b9150612bc482612b83565b602082019050919050565b60006020820190508181036000830152612be881612bac565b9050919050565b7f57524f4e475f4554485f56414c55450000000000000000000000000000000000600082015250565b6000612c25600f8361254e565b9150612c3082612bef565b602082019050919050565b60006020820190508181036000830152612c5481612c18565b9050919050565b6000602082019050612c706000830184612741565b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612cb7601783612c76565b9150612cc282612c81565b601782019050919050565b600081519050919050565b6000612ce382612ccd565b612ced8185612c76565b9350612cfd818560208601612355565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612d3f601183612c76565b9150612d4a82612d09565b601182019050919050565b6000612d6082612caa565b9150612d6c8285612cd8565b9150612d7782612d32565b9150612d838284612cd8565b91508190509392505050565b6000612d9a82612ccd565b612da4818561254e565b9350612db4818560208601612355565b612dbd81612166565b840191505092915050565b60006020820190508181036000830152612de28184612d8f565b905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612e2060148361254e565b9150612e2b82612dea565b602082019050919050565b60006020820190508181036000830152612e4f81612e13565b9050919050565b6000612e6182611eaa565b9050919050565b612e7181612e56565b8114612e7c57600080fd5b50565b600081519050612e8e81612e68565b92915050565b6000612ea7612ea2846121f2565b6121d7565b905082815260208101848484011115612ec357612ec2612161565b5b612ece848285612355565b509392505050565b600082601f830112612eeb57612eea611ff5565b5b8151612efb848260208601612e94565b91505092915050565b60008060408385031215612f1b57612f1a611de5565b5b6000612f2985828601612e7f565b925050602083015167ffffffffffffffff811115612f4a57612f49611dea565b5b612f5685828601612ed6565b9150509250929050565b60008060408385031215612f7757612f76611de5565b5b6000612f85858286016126ff565b925050602083015167ffffffffffffffff811115612fa657612fa5611dea565b5b612fb285828601612ed6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612ff682611fbf565b9150600082141561300a576130096127e0565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061304b60208361254e565b915061305682613015565b602082019050919050565b6000602082019050818103600083015261307a8161303e565b9050919050565b600061010082019050613097600083018b611edc565b6130a4602083018a612741565b6130b16040830189612741565b6130be6060830188611edc565b6130cb6080830187611edc565b6130d860a0830186612741565b6130e560c0830185612741565b81810360e08301526130f78184612388565b9050999850505050505050505056fea2646970667358221220d2b38db1047051666bcc5f05516f4dc8dfdcd78f97d00ff14822cb38b898980164736f6c6343000809003300000000000000000000000072ce9c846789fdb6fc1f34ac4ad25dd9ef7031ef0000000000000000000000006a23f4940bd5ba117da261f98aae51a8bffa210a00000000000000000000000058b6a8a3302369daec383334672404ee733ab239000000000000000000000000289ba1701c2f088cf0faf8b3705246331cb8a8390000000000000000000000004dbd4fc535ac27206064b68ffcf827b0a60bab3f

Deployed Bytecode

0x60806040526004361061014b5760003560e01c806377061e4d116100b6578063a217fddf1161006f578063a217fddf1461046e578063a7e28d4814610499578063d2ce7d65146104d6578063d547741f14610506578063fb0e722b1461052f578063fca3b5aa1461055a5761014b565b806377061e4d1461035e5780638456cb59146103875780638e7c8efe1461039e57806391d14854146103c95780639d79bdb514610406578063a0c76a96146104315761014b565b80632f2ff15d116101085780632f2ff15d1461027457806336568abe1461029d5780633f4ba83a146102c6578063407395e0146102dd5780635c975abb1461030857806362dcefbb146103335761014b565b806301ffc9a714610150578063072566771461018d57806307546172146101b8578063248a9ca3146101e35780632db09c1c146102205780632e567b361461024b575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190611e47565b610583565b6040516101849190611e8f565b60405180910390f35b34801561019957600080fd5b506101a26105fd565b6040516101af9190611eeb565b60405180910390f35b3480156101c457600080fd5b506101cd610621565b6040516101da9190611eeb565b60405180910390f35b3480156101ef57600080fd5b5061020a60048036038101906102059190611f3c565b610647565b6040516102179190611f78565b60405180910390f35b34801561022c57600080fd5b50610235610666565b6040516102429190611eeb565b60405180910390f35b34801561025757600080fd5b50610272600480360381019061026d919061205a565b61068e565b005b34801561028057600080fd5b5061029b600480360381019061029691906120f4565b610d01565b005b3480156102a957600080fd5b506102c460048036038101906102bf91906120f4565b610d2a565b005b3480156102d257600080fd5b506102db610dad565b005b3480156102e957600080fd5b506102f2610dcd565b6040516102ff9190611eeb565b60405180910390f35b34801561031457600080fd5b5061031d610df1565b60405161032a9190611e8f565b60405180910390f35b34801561033f57600080fd5b50610348610e08565b6040516103559190611eeb565b60405180910390f35b34801561036a57600080fd5b5061038560048036038101906103809190612134565b610e2c565b005b34801561039357600080fd5b5061039c610ebc565b005b3480156103aa57600080fd5b506103b3610edc565b6040516103c09190611eeb565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb91906120f4565b610f00565b6040516103fd9190611e8f565b60405180910390f35b34801561041257600080fd5b5061041b610f6a565b6040516104289190611eeb565b60405180910390f35b34801561043d57600080fd5b50610458600480360381019061045391906122a2565b610f8e565b60405161046591906123c1565b60405180910390f35b34801561047a57600080fd5b5061048361103c565b6040516104909190611f78565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190612134565b611043565b6040516104cd9190611eeb565b60405180910390f35b6104f060048036038101906104eb91906123e3565b6110ca565b6040516104fd91906123c1565b60405180910390f35b34801561051257600080fd5b5061052d600480360381019061052891906120f4565b6114b5565b005b34801561053b57600080fd5b506105446114de565b60405161055191906124f1565b60405180910390f35b34801561056657600080fd5b50610581600480360381019061057c9190612134565b611502565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105f657506105f582611593565b5b9050919050565b7f00000000000000000000000058b6a8a3302369daec383334672404ee733ab23981565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000838152602001908152602001600020600101549050919050565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660007f0000000000000000000000004dbd4fc535ac27206064b68ffcf827b0a60bab3f73ffffffffffffffffffffffffffffffffffffffff1663e78cea926040518163ffffffff1660e01b815260040160206040518083038186803b15801561071757600080fd5b505afa15801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f9190612521565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b6906125ab565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663ab5d89436040518163ffffffff1660e01b815260040160206040518083038186803b15801561080757600080fd5b505afa15801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f9190612521565b73ffffffffffffffffffffffffffffffffffffffff166380648b026040518163ffffffff1660e01b815260040160206040518083038186803b15801561088457600080fd5b505afa158015610898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bc9190612521565b90508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461092c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092390612617565b60405180910390fd5b7f00000000000000000000000058b6a8a3302369daec383334672404ee733ab23973ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16146109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b190612683565b60405180910390fd5b600085858101906109cb91906126a3565b50905060008a73ffffffffffffffffffffffffffffffffffffffff166370a082317f0000000000000000000000006a23f4940bd5ba117da261f98aae51a8bffa210a6040518263ffffffff1660e01b8152600401610a299190611eeb565b60206040518083038186803b158015610a4157600080fd5b505afa158015610a55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a799190612714565b9050808811610b37578a73ffffffffffffffffffffffffffffffffffffffff166323b872dd7f0000000000000000000000006a23f4940bd5ba117da261f98aae51a8bffa210a8b8b6040518463ffffffff1660e01b8152600401610adf93929190612750565b602060405180830381600087803b158015610af957600080fd5b505af1158015610b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3191906127b3565b50610c8c565b6000811115610bf1578a73ffffffffffffffffffffffffffffffffffffffff166323b872dd7f0000000000000000000000006a23f4940bd5ba117da261f98aae51a8bffa210a8b846040518463ffffffff1660e01b8152600401610b9d93929190612750565b602060405180830381600087803b158015610bb757600080fd5b505af1158015610bcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bef91906127b3565b505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638c2a993e8a838b610c3c919061280f565b6040518363ffffffff1660e01b8152600401610c59929190612843565b600060405180830381600087803b158015610c7357600080fd5b505af1158015610c87573d6000803e3d6000fd5b505050505b818973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f891afe029c75c4f8c5855fc3480598bc5a53739344f6ae575bdb7ea2a79f56b38e8c604051610cec929190612843565b60405180910390a45050505050505050505050565b610d0a82610647565b610d1b81610d166115fd565b611605565b610d2583836116a2565b505050565b610d326115fd565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d96906128de565b60405180910390fd5b610da98282611782565b5050565b6000801b610dc281610dbd6115fd565b611605565b610dca611863565b50565b7f00000000000000000000000072ce9c846789fdb6fc1f34ac4ad25dd9ef7031ef81565b6000600160009054906101000a900460ff16905090565b7f0000000000000000000000006a23f4940bd5ba117da261f98aae51a8bffa210a81565b6000801b610e4181610e3c6115fd565b611605565b816001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5e7a493863411309f190ab78ded345429e56b2df9a2b48530f31243fa31e992882604051610eb09190611eeb565b60405180910390a15050565b6000801b610ed181610ecc6115fd565b611605565b610ed9611905565b50565b60018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f000000000000000000000000289ba1701c2f088cf0faf8b3705246331cb8a83981565b606080632e567b3660e01b878787878588604051602001610fb09291906128fe565b604051602081830303815290604052604051602401610fd3959493929190612935565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505091505095945050505050565b6000801b81565b60007f00000000000000000000000058b6a8a3302369daec383334672404ee733ab23973ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146110a157600090506110c5565b7f000000000000000000000000289ba1701c2f088cf0faf8b3705246331cb8a83990505b919050565b60606110d4610df1565b15611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b906129db565b60405180910390fd5b7f00000000000000000000000058b6a8a3302369daec383334672404ee733ab23973ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146111a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119990612683565b60405180910390fd5b600086116111e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dc90612a47565b60405180910390fd5b6000806060600061123987878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506119a7565b8094508193508296505050506000825114611289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128090612ab3565b60405180910390fd5b6000888a6112979190612ad3565b826112a29190612b2d565b9050600082116112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90612bcf565b60405180910390fd5b803414611329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132090612c3b565b60405180910390fd5b8c73ffffffffffffffffffffffffffffffffffffffff166323b872dd867f0000000000000000000000006a23f4940bd5ba117da261f98aae51a8bffa210a8e6040518463ffffffff1660e01b815260040161138693929190612750565b602060405180830381600087803b1580156113a057600080fd5b505af11580156113b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d891906127b3565b5060006113e88e878f8f88610f8e565b905061141860018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687858e8e86611a4b565b9450505050818a73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fb8910b9960c443aac3240b98585384e3a6f109fbf6969e264c3f183d69aba7e18e8d60405161147d929190612843565b60405180910390a4816040516020016114969190612c5b565b6040516020818303038152906040529350505050979650505050505050565b6114be82610647565b6114cf816114ca6115fd565b611605565b6114d98383611782565b505050565b7f0000000000000000000000004dbd4fc535ac27206064b68ffcf827b0a60bab3f81565b6000801b611517816115126115fd565b611605565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fe4445650be24dc57d85324bde2bc79571389abac71a7126fb392df5aa012600f826040516115879190611eeb565b60405180910390a15050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b61160f8282610f00565b61169e576116348173ffffffffffffffffffffffffffffffffffffffff166014611a6a565b6116428360001c6020611a6a565b604051602001611653929190612d55565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116959190612dc8565b60405180910390fd5b5050565b6116ac8282610f00565b61177e57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117236115fd565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61178c8282610f00565b1561185f57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118046115fd565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61186b610df1565b6118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190612e36565b60405180910390fd5b6000600160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6118ee6115fd565b6040516118fb9190611eeb565b60405180910390a1565b61190d610df1565b1561194d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611944906129db565b60405180910390fd5b60018060006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119906115fd565b60405161199d9190611eeb565b60405180910390a1565b60008060607f00000000000000000000000072ce9c846789fdb6fc1f34ac4ad25dd9ef7031ef73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611a215783806020019051810190611a149190612f04565b8092508194505050611a28565b3392508390505b80806020019051810190611a3c9190612f60565b80925081935050509193909250565b6000611a5e878734600089898989611ca6565b90509695505050505050565b606060006002836002611a7d9190612ad3565b611a879190612b2d565b67ffffffffffffffff811115611aa057611a9f612177565b5b6040519080825280601f01601f191660200182016040528015611ad25781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611b0a57611b09612fbc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611b6e57611b6d612fbc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611bae9190612ad3565b611bb89190612b2d565b90505b6001811115611c58577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611bfa57611bf9612fbc565b5b1a60f81b828281518110611c1157611c10612fbc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611c5190612feb565b9050611bbb565b5060008414611c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9390613061565b60405180910390fd5b8091505092915050565b6000807f0000000000000000000000004dbd4fc535ac27206064b68ffcf827b0a60bab3f73ffffffffffffffffffffffffffffffffffffffff1663679b6ded898c8a8a8e8f8c8c8c6040518a63ffffffff1660e01b8152600401611d11989796959493929190613081565b6020604051808303818588803b158015611d2a57600080fd5b505af1158015611d3e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611d639190612714565b9050808a73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fc1d1490cf25c3b40d600dfb27c7680340ed1ab901b7e8f3551280968a3b372b086604051611dc391906123c1565b60405180910390a48091505098975050505050505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611e2481611def565b8114611e2f57600080fd5b50565b600081359050611e4181611e1b565b92915050565b600060208284031215611e5d57611e5c611de5565b5b6000611e6b84828501611e32565b91505092915050565b60008115159050919050565b611e8981611e74565b82525050565b6000602082019050611ea46000830184611e80565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611ed582611eaa565b9050919050565b611ee581611eca565b82525050565b6000602082019050611f006000830184611edc565b92915050565b6000819050919050565b611f1981611f06565b8114611f2457600080fd5b50565b600081359050611f3681611f10565b92915050565b600060208284031215611f5257611f51611de5565b5b6000611f6084828501611f27565b91505092915050565b611f7281611f06565b82525050565b6000602082019050611f8d6000830184611f69565b92915050565b611f9c81611eca565b8114611fa757600080fd5b50565b600081359050611fb981611f93565b92915050565b6000819050919050565b611fd281611fbf565b8114611fdd57600080fd5b50565b600081359050611fef81611fc9565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261201a57612019611ff5565b5b8235905067ffffffffffffffff81111561203757612036611ffa565b5b60208301915083600182028301111561205357612052611fff565b5b9250929050565b60008060008060008060a0878903121561207757612076611de5565b5b600061208589828a01611faa565b965050602061209689828a01611faa565b95505060406120a789828a01611faa565b94505060606120b889828a01611fe0565b935050608087013567ffffffffffffffff8111156120d9576120d8611dea565b5b6120e589828a01612004565b92509250509295509295509295565b6000806040838503121561210b5761210a611de5565b5b600061211985828601611f27565b925050602061212a85828601611faa565b9150509250929050565b60006020828403121561214a57612149611de5565b5b600061215884828501611faa565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6121af82612166565b810181811067ffffffffffffffff821117156121ce576121cd612177565b5b80604052505050565b60006121e1611ddb565b90506121ed82826121a6565b919050565b600067ffffffffffffffff82111561220d5761220c612177565b5b61221682612166565b9050602081019050919050565b82818337600083830152505050565b6000612245612240846121f2565b6121d7565b90508281526020810184848401111561226157612260612161565b5b61226c848285612223565b509392505050565b600082601f83011261228957612288611ff5565b5b8135612299848260208601612232565b91505092915050565b600080600080600060a086880312156122be576122bd611de5565b5b60006122cc88828901611faa565b95505060206122dd88828901611faa565b94505060406122ee88828901611faa565b93505060606122ff88828901611fe0565b925050608086013567ffffffffffffffff8111156123205761231f611dea565b5b61232c88828901612274565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b60005b83811015612373578082015181840152602081019050612358565b83811115612382576000848401525b50505050565b600061239382612339565b61239d8185612344565b93506123ad818560208601612355565b6123b681612166565b840191505092915050565b600060208201905081810360008301526123db8184612388565b905092915050565b600080600080600080600060c0888a03121561240257612401611de5565b5b60006124108a828b01611faa565b97505060206124218a828b01611faa565b96505060406124328a828b01611fe0565b95505060606124438a828b01611fe0565b94505060806124548a828b01611fe0565b93505060a088013567ffffffffffffffff81111561247557612474611dea565b5b6124818a828b01612004565b925092505092959891949750929550565b6000819050919050565b60006124b76124b26124ad84611eaa565b612492565b611eaa565b9050919050565b60006124c98261249c565b9050919050565b60006124db826124be565b9050919050565b6124eb816124d0565b82525050565b600060208201905061250660008301846124e2565b92915050565b60008151905061251b81611f93565b92915050565b60006020828403121561253757612536611de5565b5b60006125458482850161250c565b91505092915050565b600082825260208201905092915050565b7f4e4f545f46524f4d5f4252494447450000000000000000000000000000000000600082015250565b6000612595600f8361254e565b91506125a08261255f565b602082019050919050565b600060208201905081810360008301526125c481612588565b9050919050565b7f4f4e4c595f434f554e544552504152545f474154455741590000000000000000600082015250565b600061260160188361254e565b915061260c826125cb565b602082019050919050565b60006020820190508181036000830152612630816125f4565b9050919050565b7f544f4b454e5f4e4f545f4c505400000000000000000000000000000000000000600082015250565b600061266d600d8361254e565b915061267882612637565b602082019050919050565b6000602082019050818103600083015261269c81612660565b9050919050565b600080604083850312156126ba576126b9611de5565b5b60006126c885828601611fe0565b925050602083013567ffffffffffffffff8111156126e9576126e8611dea565b5b6126f585828601612274565b9150509250929050565b60008151905061270e81611fc9565b92915050565b60006020828403121561272a57612729611de5565b5b6000612738848285016126ff565b91505092915050565b61274a81611fbf565b82525050565b60006060820190506127656000830186611edc565b6127726020830185611edc565b61277f6040830184612741565b949350505050565b61279081611e74565b811461279b57600080fd5b50565b6000815190506127ad81612787565b92915050565b6000602082840312156127c9576127c8611de5565b5b60006127d78482850161279e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061281a82611fbf565b915061282583611fbf565b925082821015612838576128376127e0565b5b828203905092915050565b60006040820190506128586000830185611edc565b6128656020830184612741565b9392505050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006128c8602f8361254e565b91506128d38261286c565b604082019050919050565b600060208201905081810360008301526128f7816128bb565b9050919050565b600060408201905081810360008301526129188185612388565b9050818103602083015261292c8184612388565b90509392505050565b600060a08201905061294a6000830188611edc565b6129576020830187611edc565b6129646040830186611edc565b6129716060830185612741565b81810360808301526129838184612388565b90509695505050505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006129c560108361254e565b91506129d08261298f565b602082019050919050565b600060208201905081810360008301526129f4816129b8565b9050919050565b7f494e56414c49445f5a45524f5f414d4f554e5400000000000000000000000000600082015250565b6000612a3160138361254e565b9150612a3c826129fb565b602082019050919050565b60006020820190508181036000830152612a6081612a24565b9050919050565b7f43414c4c5f484f4f4b5f444154415f4e4f545f414c4c4f574544000000000000600082015250565b6000612a9d601a8361254e565b9150612aa882612a67565b602082019050919050565b60006020820190508181036000830152612acc81612a90565b9050919050565b6000612ade82611fbf565b9150612ae983611fbf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b2257612b216127e0565b5b828202905092915050565b6000612b3882611fbf565b9150612b4383611fbf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b7857612b776127e0565b5b828201905092915050565b7f4e4f5f5355424d495353494f4e5f434f53540000000000000000000000000000600082015250565b6000612bb960128361254e565b9150612bc482612b83565b602082019050919050565b60006020820190508181036000830152612be881612bac565b9050919050565b7f57524f4e475f4554485f56414c55450000000000000000000000000000000000600082015250565b6000612c25600f8361254e565b9150612c3082612bef565b602082019050919050565b60006020820190508181036000830152612c5481612c18565b9050919050565b6000602082019050612c706000830184612741565b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612cb7601783612c76565b9150612cc282612c81565b601782019050919050565b600081519050919050565b6000612ce382612ccd565b612ced8185612c76565b9350612cfd818560208601612355565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612d3f601183612c76565b9150612d4a82612d09565b601182019050919050565b6000612d6082612caa565b9150612d6c8285612cd8565b9150612d7782612d32565b9150612d838284612cd8565b91508190509392505050565b6000612d9a82612ccd565b612da4818561254e565b9350612db4818560208601612355565b612dbd81612166565b840191505092915050565b60006020820190508181036000830152612de28184612d8f565b905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612e2060148361254e565b9150612e2b82612dea565b602082019050919050565b60006020820190508181036000830152612e4f81612e13565b9050919050565b6000612e6182611eaa565b9050919050565b612e7181612e56565b8114612e7c57600080fd5b50565b600081519050612e8e81612e68565b92915050565b6000612ea7612ea2846121f2565b6121d7565b905082815260208101848484011115612ec357612ec2612161565b5b612ece848285612355565b509392505050565b600082601f830112612eeb57612eea611ff5565b5b8151612efb848260208601612e94565b91505092915050565b60008060408385031215612f1b57612f1a611de5565b5b6000612f2985828601612e7f565b925050602083015167ffffffffffffffff811115612f4a57612f49611dea565b5b612f5685828601612ed6565b9150509250929050565b60008060408385031215612f7757612f76611de5565b5b6000612f85858286016126ff565b925050602083015167ffffffffffffffff811115612fa657612fa5611dea565b5b612fb285828601612ed6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612ff682611fbf565b9150600082141561300a576130096127e0565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061304b60208361254e565b915061305682613015565b602082019050919050565b6000602082019050818103600083015261307a8161303e565b9050919050565b600061010082019050613097600083018b611edc565b6130a4602083018a612741565b6130b16040830189612741565b6130be6060830188611edc565b6130cb6080830187611edc565b6130d860a0830186612741565b6130e560c0830185612741565b81810360e08301526130f78184612388565b9050999850505050505050505056fea2646970667358221220d2b38db1047051666bcc5f05516f4dc8dfdcd78f97d00ff14822cb38b898980164736f6c63430008090033

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

00000000000000000000000072ce9c846789fdb6fc1f34ac4ad25dd9ef7031ef0000000000000000000000006a23f4940bd5ba117da261f98aae51a8bffa210a00000000000000000000000058b6a8a3302369daec383334672404ee733ab239000000000000000000000000289ba1701c2f088cf0faf8b3705246331cb8a8390000000000000000000000004dbd4fc535ac27206064b68ffcf827b0a60bab3f

-----Decoded View---------------
Arg [0] : _l1Router (address): 0x72Ce9c846789fdB6fC1f34aC4AD25Dd9ef7031ef
Arg [1] : _l1LPTEscrow (address): 0x6A23F4940BD5BA117Da261f98aae51A8BFfa210A
Arg [2] : _l1Lpt (address): 0x58b6A8A3302369DAEc383334672404Ee733aB239
Arg [3] : _l2Lpt (address): 0x289ba1701C2F088cf0faf8B3705246331cB8A839
Arg [4] : _inbox (address): 0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000072ce9c846789fdb6fc1f34ac4ad25dd9ef7031ef
Arg [1] : 0000000000000000000000006a23f4940bd5ba117da261f98aae51a8bffa210a
Arg [2] : 00000000000000000000000058b6a8a3302369daec383334672404ee733ab239
Arg [3] : 000000000000000000000000289ba1701c2f088cf0faf8b3705246331cb8a839
Arg [4] : 0000000000000000000000004dbd4fc535ac27206064b68ffcf827b0a60bab3f


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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