Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 13 from a total of 13 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Outbound Transfe... | 20247609 | 143 days ago | IN | 0.00006646 ETH | 0.00027767 | ||||
Outbound Transfe... | 20247600 | 143 days ago | IN | 0.00006646 ETH | 0.00027767 | ||||
Outbound Transfe... | 20247570 | 143 days ago | IN | 0.00006646 ETH | 0.00028934 | ||||
Outbound Transfe... | 20247544 | 143 days ago | IN | 0.00006646 ETH | 0.00028934 | ||||
Outbound Transfe... | 20243286 | 144 days ago | IN | 0.00006646 ETH | 0.00028922 | ||||
Outbound Transfe... | 20243181 | 144 days ago | IN | 0.0000025 ETH | 0.00027767 | ||||
Outbound Transfe... | 20242956 | 144 days ago | IN | 0 ETH | 0.00028922 | ||||
Outbound Transfe... | 14207255 | 1016 days ago | IN | 0.00059129 ETH | 0.01006142 | ||||
Revoke Role | 14199550 | 1017 days ago | IN | 0 ETH | 0.00356507 | ||||
Grant Role | 14199548 | 1017 days ago | IN | 0 ETH | 0.00530859 | ||||
Set Minter | 14199497 | 1017 days ago | IN | 0 ETH | 0.00254516 | ||||
Set Counterpart | 14199493 | 1017 days ago | IN | 0 ETH | 0.00187597 | ||||
0x61012060 | 14199457 | 1017 days ago | IN | 0 ETH | 0.17271992 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21272843 | 13 hrs ago | 0.0001923 ETH | ||||
21272843 | 13 hrs ago | 0.0001923 ETH | ||||
21259957 | 2 days ago | 0.00011363 ETH | ||||
21259957 | 2 days ago | 0.00011363 ETH | ||||
21259789 | 2 days ago | 0.00011264 ETH | ||||
21259789 | 2 days ago | 0.00011264 ETH | ||||
21258985 | 2 days ago | 0.00012413 ETH | ||||
21258985 | 2 days ago | 0.00012413 ETH | ||||
21256334 | 2 days ago | 0.00011861 ETH | ||||
21256334 | 2 days ago | 0.00011861 ETH | ||||
21254858 | 3 days ago | 0.00014727 ETH | ||||
21254858 | 3 days ago | 0.00014727 ETH | ||||
21254812 | 3 days ago | 0.00013789 ETH | ||||
21254812 | 3 days ago | 0.00013789 ETH | ||||
21252171 | 3 days ago | 0.00022832 ETH | ||||
21252171 | 3 days ago | 0.00022832 ETH | ||||
21250177 | 3 days ago | 0.00012649 ETH | ||||
21250177 | 3 days ago | 0.00012649 ETH | ||||
21248469 | 3 days ago | 0.00014117 ETH | ||||
21248469 | 3 days ago | 0.00014117 ETH | ||||
21237602 | 5 days ago | 0.00018068 ETH | ||||
21237602 | 5 days ago | 0.00018068 ETH | ||||
21233368 | 6 days ago | 0.00012771 ETH | ||||
21233368 | 6 days ago | 0.00012771 ETH | ||||
21232939 | 6 days ago | 0.00010106 ETH |
Loading...
Loading
Contract Name:
L1LPTGateway
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
//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) ); } }
// 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()); } } }
// 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; }
// 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()); } }
// 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; } }
// 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); } }
// 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; } }
// 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); }
//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(); } }
//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); }
//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; } }
//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); }
// 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); }
// 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; }
// 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); }
// 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); }
{ "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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.