Latest 25 from a total of 145 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Migrate Unbondin... | 16581026 | 891 days ago | IN | 0 ETH | 0.00255648 | ||||
Migrate Unbondin... | 16580657 | 891 days ago | IN | 0 ETH | 0.00109918 | ||||
Migrate Unbondin... | 16199375 | 944 days ago | IN | 0.1 ETH | 0.00307705 | ||||
Migrate Unbondin... | 16199312 | 944 days ago | IN | 0.1 ETH | 0.003512 | ||||
Migrate Unbondin... | 16197199 | 944 days ago | IN | 0.1 ETH | 0.0020579 | ||||
Migrate Unbondin... | 16197190 | 944 days ago | IN | 0.1 ETH | 0.00056226 | ||||
Migrate Unbondin... | 16091878 | 959 days ago | IN | 0 ETH | 0.00124028 | ||||
Migrate Delegato... | 15442619 | 1052 days ago | IN | 0.00148133 ETH | 0.03096035 | ||||
Migrate Delegato... | 14968750 | 1128 days ago | IN | 0.00374195 ETH | 0.05601338 | ||||
Migrate Delegato... | 14968518 | 1128 days ago | IN | 0.00374192 ETH | 0.0181945 | ||||
Migrate Delegato... | 14765214 | 1162 days ago | IN | 0.01355136 ETH | 0.05876647 | ||||
Migrate Delegato... | 14738834 | 1166 days ago | IN | 0.00067754 ETH | 0.00668475 | ||||
Migrate Delegato... | 14733799 | 1167 days ago | IN | 0.00156471 ETH | 0.01278561 | ||||
Migrate Delegato... | 14716485 | 1169 days ago | IN | 0.00468727 ETH | 0.01676762 | ||||
Migrate Delegato... | 14713430 | 1170 days ago | IN | 0.00267189 ETH | 0.01498264 | ||||
Migrate Delegato... | 14664645 | 1178 days ago | IN | 0.00228579 ETH | 0.02267058 | ||||
Migrate Unbondin... | 14662765 | 1178 days ago | IN | 0.00081918 ETH | 0.00613694 | ||||
Migrate Unbondin... | 14648935 | 1180 days ago | IN | 0.00069909 ETH | 0.00861086 | ||||
Migrate Unbondin... | 14632892 | 1183 days ago | IN | 0.00117599 ETH | 0.00511706 | ||||
Migrate Delegato... | 14588054 | 1190 days ago | IN | 0.00391439 ETH | 0.03636975 | ||||
Migrate Unbondin... | 14560325 | 1194 days ago | IN | 0.00073414 ETH | 0.00836405 | ||||
Migrate Delegato... | 14539651 | 1197 days ago | IN | 0.00616463 ETH | 0.07895378 | ||||
Migrate Unbondin... | 14535759 | 1198 days ago | IN | 0.00131061 ETH | 0.00781475 | ||||
Migrate Unbondin... | 14487761 | 1205 days ago | IN | 0.00035955 ETH | 0.00672145 | ||||
Migrate Unbondin... | 14487714 | 1205 days ago | IN | 0.00038097 ETH | 0.00982473 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Create Retryable... | 16199375 | 944 days ago | 0.1 ETH | ||||
Create Retryable... | 16199312 | 944 days ago | 0.1 ETH | ||||
Create Retryable... | 16197199 | 944 days ago | 0.1 ETH | ||||
Create Retryable... | 15442619 | 1052 days ago | 0.00148133 ETH | ||||
Create Retryable... | 15360819 | 1065 days ago | 0.00089595 ETH | ||||
Migrate Delegato... | 15360819 | 1065 days ago | 0.00089595 ETH | ||||
Create Retryable... | 15360800 | 1065 days ago | 0.00089595 ETH | ||||
Migrate Delegato... | 15360800 | 1065 days ago | 0.00089595 ETH | ||||
- | 14968750 | 1128 days ago | 0.00374195 ETH | ||||
- | 14839084 | 1150 days ago | 0.00129032 ETH | ||||
- | 14839084 | 1150 days ago | 0.00129032 ETH | ||||
- | 14839060 | 1150 days ago | 0.0012187 ETH | ||||
- | 14839060 | 1150 days ago | 0.0012187 ETH | ||||
- | 14839046 | 1150 days ago | 0.00164885 ETH | ||||
- | 14839046 | 1150 days ago | 0.00164885 ETH | ||||
- | 14838996 | 1150 days ago | 0.00074324 ETH | ||||
- | 14838996 | 1150 days ago | 0.00074324 ETH | ||||
- | 14832920 | 1151 days ago | 0.0013027 ETH | ||||
- | 14832920 | 1151 days ago | 0.0013027 ETH | ||||
- | 14832902 | 1151 days ago | 0.0013945 ETH | ||||
- | 14832902 | 1151 days ago | 0.0013945 ETH | ||||
- | 14832875 | 1151 days ago | 0.00132095 ETH | ||||
- | 14832875 | 1151 days ago | 0.00132095 ETH | ||||
- | 14832843 | 1151 days ago | 0.00134318 ETH | ||||
- | 14832843 | 1151 days ago | 0.00134318 ETH |
Loading...
Loading
Contract Name:
L1Migrator
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 {L1ArbitrumMessenger} from "./L1ArbitrumMessenger.sol"; import {IL1LPTGateway} from "./IL1LPTGateway.sol"; import {IMigrator} from "../../interfaces/IMigrator.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import {EIP712} from "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol"; import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; interface IBondingManager { function isRegisteredTranscoder(address _addr) external view returns (bool); function pendingStake(address _addr, uint256 _endRound) external view returns (uint256); function pendingFees(address _addr, uint256 _endRound) external view returns (uint256); function getDelegator(address _addr) external view returns ( uint256 bondedAmount, uint256 fees, address delegateAddress, uint256 delegatedAmount, uint256 startRound, uint256 lastClaimRound, uint256 nextUnbondingLockId ); function getDelegatorUnbondingLock(address _addr, uint256 _unbondingLockId) external view returns (uint256 amount, uint256 withdrawRound); } interface ITicketBroker { struct Sender { uint256 deposit; uint256 withdrawRound; } struct ReserveInfo { uint256 fundsRemaining; uint256 claimedInCurrentRound; } function getSenderInfo(address _addr) external view returns (Sender memory sender, ReserveInfo memory reserve); } interface IBridgeMinter { function withdrawETHToL1Migrator() external returns (uint256); function withdrawLPTToL1Migrator() external returns (uint256); } interface ApproveLike { function approve(address _addr, uint256 _amount) external; } interface IL2Migrator is IMigrator { function finalizeMigrateDelegator(MigrateDelegatorParams memory _params) external; function finalizeMigrateUnbondingLocks( MigrateUnbondingLocksParams memory _params ) external; function finalizeMigrateSender(MigrateSenderParams memory _params) external; } contract L1Migrator is L1ArbitrumMessenger, IMigrator, EIP712, AccessControl, Pausable { address public immutable bondingManagerAddr; address public immutable ticketBrokerAddr; address public immutable tokenAddr; address public immutable l1LPTGatewayAddr; address public bridgeMinterAddr; address public l2MigratorAddr; event MigrateDelegatorInitiated( uint256 indexed seqNo, MigrateDelegatorParams params ); event MigrateUnbondingLocksInitiated( uint256 indexed seqNo, MigrateUnbondingLocksParams params ); event MigrateSenderInitiated( uint256 indexed seqNo, MigrateSenderParams params ); event L2MigratorUpdate(address l2Migrator); event BridgeMinterUpdate(address bridgeMinter); bytes32 private immutable MIGRATE_DELEGATOR_TYPE_HASH = keccak256("MigrateDelegator(address l1Addr,address l2Addr)"); bytes32 private immutable MIGRATE_UNBONDING_LOCKS_TYPE_HASH = keccak256( "MigrateUnbondingLocks(address l1Addr,address l2Addr,uint256[] unbondingLockIds)" ); bytes32 private immutable MIGRATE_SENDER_TYPE_HASH = keccak256("MigrateSender(address l1Addr,address l2Addr)"); constructor( address _inbox, address _bondingManagerAddr, address _ticketBrokerAddr, address _tokenAddr, address _l1LPTGatewayAddr, address _l2MigratorAddr ) L1ArbitrumMessenger(_inbox) EIP712("Livepeer L1Migrator", "1") { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); bondingManagerAddr = _bondingManagerAddr; ticketBrokerAddr = _ticketBrokerAddr; tokenAddr = _tokenAddr; l1LPTGatewayAddr = _l1LPTGatewayAddr; l2MigratorAddr = _l2MigratorAddr; _pause(); } /** * @notice Sets L2Migrator * @param _l2MigratorAddr L2Migrator address */ function setL2Migrator(address _l2MigratorAddr) external onlyRole(DEFAULT_ADMIN_ROLE) { l2MigratorAddr = _l2MigratorAddr; emit L2MigratorUpdate(_l2MigratorAddr); } /** * @notice Sets BridgeMinter * @param _bridgeMinterAddr BridgeMinter address */ function setBridgeMinter(address _bridgeMinterAddr) external onlyRole(DEFAULT_ADMIN_ROLE) { bridgeMinterAddr = _bridgeMinterAddr; emit BridgeMinterUpdate(_bridgeMinterAddr); } /** * @notice Receive ETH when there is no msg.data */ receive() external payable {} /** * @notice Executes a L2 call to L2Migrator to migrate transcoder/delegator state from the L1 BondingManager. * @dev The term "delegator" here can refer to both a transcoder (self-delegated delegator) and delegator. * @param _l1Addr Address migrating from L1 * @param _l2Addr Address to use on L2 * @param _sig Optional EIP-712 signature over a payload that includes _l1Addr and _l2Addr * @param _maxGas Gas limit for L2 execution * @param _gasPriceBid Gas price bid for L2 execution * @param _maxSubmissionCost Max ETH to pay for retryable ticket base submission fee */ function migrateDelegator( address _l1Addr, address _l2Addr, bytes calldata _sig, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost ) external payable whenNotPaused { // Authorization // Either msg.sender == _l1Addr OR signer for _sig == _l1Addr requireValidMigration( _l1Addr, _l2Addr, keccak256( abi.encode(MIGRATE_DELEGATOR_TYPE_HASH, _l1Addr, _l2Addr) ), _sig ); ( bytes memory data, MigrateDelegatorParams memory params ) = getMigrateDelegatorParams(_l1Addr, _l2Addr); // We do not prevent migration replays here to minimize L1 gas costs // The L2Migrator is responsible for rejecting migration replays uint256 seqNo = sendTxToL2( l2MigratorAddr, _l2Addr, // Refunds to the L2 address _maxSubmissionCost, _maxGas, _gasPriceBid, data ); emit MigrateDelegatorInitiated(seqNo, params); } /** * @notice Executes a L2 call to L2Migrator to migrate unbonding locks state from the L1 BondingManager. * @param _l1Addr Address migrating from L1 * @param _l2Addr Address to use on L2 * @param _unbondingLockIds IDs of unbonding locks in the L1 BondingManager to migrate * @param _sig Optional EIP-712 signature over a payload that includes _l1Addr, _l2Addr and _unbondingLockIds * @param _maxGas Gas limit for L2 execution * @param _gasPriceBid Gas price bid for L2 execution * @param _maxSubmissionCost Max ETH to pay for retryable ticket base submission fee */ function migrateUnbondingLocks( address _l1Addr, address _l2Addr, uint256[] calldata _unbondingLockIds, bytes calldata _sig, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost ) external payable whenNotPaused { // Authorization // Either msg.sender == _l1Addr OR signer for _sig == _l1Addr requireValidMigration( _l1Addr, _l2Addr, keccak256( abi.encode( MIGRATE_UNBONDING_LOCKS_TYPE_HASH, _l1Addr, _l2Addr, keccak256(abi.encodePacked(_unbondingLockIds)) ) ), _sig ); ( bytes memory data, MigrateUnbondingLocksParams memory params ) = getMigrateUnbondingLocksParams(_l1Addr, _l2Addr, _unbondingLockIds); // We do not prevent migration replays here to minimize L1 gas costs // The L2Migrator is responsible for rejecting migration replays uint256 seqNo = sendTxToL2( l2MigratorAddr, _l2Addr, // Refund to the L2 address _maxSubmissionCost, _maxGas, _gasPriceBid, data ); emit MigrateUnbondingLocksInitiated(seqNo, params); } /** * @notice Executes a L2 call to L2Migrator to migrate sender deposit/reserve state from the L1 TicketBroker. * @param _l1Addr Address migrating from L1 * @param _l2Addr Address to use on L2 * @param _sig Optional EIP-712 signature over a payload that includes _l1Addr and _l2Addr * @param _maxGas Gas limit for L2 execution * @param _gasPriceBid Gas price bid for L2 execution * @param _maxSubmissionCost Max ETH to pay for retryable ticket base submission fee */ function migrateSender( address _l1Addr, address _l2Addr, bytes calldata _sig, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost ) external payable whenNotPaused { // Authorization // Either msg.sender == _l1Addr OR signer for _sig == _l1Addr requireValidMigration( _l1Addr, _l2Addr, keccak256(abi.encode(MIGRATE_SENDER_TYPE_HASH, _l1Addr, _l2Addr)), _sig ); ( bytes memory data, MigrateSenderParams memory params ) = getMigrateSenderParams(_l1Addr, _l2Addr); // We do not prevent migration replays here to minimize L1 gas costs // The L2Migrator is responsible for rejecting migration replays uint256 seqNo = sendTxToL2( l2MigratorAddr, _l2Addr, // Refund to the L2 address _maxSubmissionCost, _maxGas, _gasPriceBid, data ); emit MigrateSenderInitiated(seqNo, params); } /** * @notice Executes a L2 call to send ETH from the L1BridgeMinter to the L2Migrator. * @dev Anyone can call this function. * @param _maxGas Gas limit for L2 execution * @param _gasPriceBid Gas price bid for L2 execution * @param _maxSubmissionCost Max ETH to pay for retryable ticket base submission fee */ function migrateETH( uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost ) external payable whenNotPaused { uint256 amount = IBridgeMinter(bridgeMinterAddr) .withdrawETHToL1Migrator(); // Any ETH refunded to the L2 alias of this contract can be used for // other cross-chain txs sent by this contract. // The retryable ticket created will not be cancellable since this contract // currently does not support cross-chain txs to call ArbRetryableTx.cancel(). // Regarding the comment below on this contract receiving refunds: // msg.sender also cannot be the address to receive refunds as beneficiary because otherwise // msg.sender could cancel the ticket before it is executed on L2 to receive the L2 call value. sendTxToL2( l2MigratorAddr, address(this), // L2 alias of this contract will receive refunds msg.value + amount, amount, _maxSubmissionCost, _maxGas, _gasPriceBid, "" ); } /** * @notice Executes a L2 call to send LPT from the L1BridgeMinter to the L2Migrator. * @dev Anyone can call this function. * @param _maxGas Gas limit for L2 execution * @param _gasPriceBid Gas price bid for L2 execution * @param _maxSubmissionCost Max ETH to pay for retryable ticket base submission fee */ function migrateLPT( uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost ) external payable whenNotPaused onlyRole(DEFAULT_ADMIN_ROLE) { uint256 amount = IBridgeMinter(bridgeMinterAddr) .withdrawLPTToL1Migrator(); // Approve L1LPTGateway to pull tokens ApproveLike(tokenAddr).approve(l1LPTGatewayAddr, amount); // Trigger cross-chain transfer with L1LPTGateway which will pull and escrow tokens // Forward msg.value to outboundTransfer() to be used for cross-chain tx IL1LPTGateway(l1LPTGatewayAddr).outboundTransfer{value: msg.value}( tokenAddr, l2MigratorAddr, amount, _maxGas, _gasPriceBid, abi.encode(_maxSubmissionCost, "") ); } /** * @notice Pause the contract * @dev Only callable by addresses with governor role */ function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { _pause(); } /** * @notice Unpause the contract * @dev Only callable by addresses with governor role */ function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { _unpause(); } /** * @notice Return L2 calldata and MigrateDelegatorParams to use for a L2 call on L2Migrator * @param _l1Addr Address migrating from L1 * @param _l2Addr Address to use on L2 * @return data L2 calldata for finalizeMigrateDelegator() in L2Migrator * @return params MigrateDelegatorParams to use for finalizeMigrateDelegator() in L2Migrator */ function getMigrateDelegatorParams(address _l1Addr, address _l2Addr) public view returns (bytes memory data, MigrateDelegatorParams memory params) { IBondingManager bondingManager = IBondingManager(bondingManagerAddr); // pendingStake() will use current round if _endRound >= LIP-36 round // Using max uint256 guarantees that uint256 stake = bondingManager.pendingStake(_l1Addr, type(uint256).max); // pendingFees() will use current round if _endRound >= LIP-36 round // Using max uint256 guarantees that uint256 fees = bondingManager.pendingFees(_l1Addr, type(uint256).max); ( , , address delegateAddress, uint256 delegatedAmount, , , ) = bondingManager.getDelegator(_l1Addr); // Construct params and L2 calldata for finalizeMigrateDelegator() on L2Migrator params = MigrateDelegatorParams({ l1Addr: _l1Addr, l2Addr: _l2Addr, stake: stake, delegatedStake: delegatedAmount, fees: fees, delegate: delegateAddress }); data = abi.encodeWithSelector( IL2Migrator.finalizeMigrateDelegator.selector, params ); } /** * @notice Return L2 calldata and MigrateSenderParams to use for a L2 call on L2Migrator * @param _l1Addr Address migrating from L1 * @param _l2Addr Address to use on L2 * @return data L2 calldata for finalizeMigrateSender() in L2Migrator * @return params MigrateSenderParams to use for finalizeMigrateSender() in L2Migrator */ function getMigrateSenderParams(address _l1Addr, address _l2Addr) public view returns (bytes memory data, MigrateSenderParams memory params) { ITicketBroker ticketBroker = ITicketBroker(ticketBrokerAddr); ( ITicketBroker.Sender memory sender, ITicketBroker.ReserveInfo memory reserveInfo ) = ticketBroker.getSenderInfo(_l1Addr); // Construct params and L2 calldata for finalizeMigrateSender() on L2Migrator params = MigrateSenderParams({ l1Addr: _l1Addr, l2Addr: _l2Addr, deposit: sender.deposit, reserve: reserveInfo.fundsRemaining }); data = abi.encodeWithSelector( IL2Migrator.finalizeMigrateSender.selector, params ); } /** * @notice Return L2 calldata and MigrateUnbondingLocksParams to use for a L2 call on L2Migrator * @param _l1Addr Address migrating from L1 * @param _l2Addr Address to use on L2 * @param _unbondingLockIds IDs of unbonding locks in L1 BondingManager to migrate * @return data L2 calldata for finalizeMigrateUnbondingLocks() in L2Migrator * @return params MigrateUnbondingLocksParams to use for finalizeMigrateUnbondingLocks() in L2Migrator */ function getMigrateUnbondingLocksParams( address _l1Addr, address _l2Addr, uint256[] memory _unbondingLockIds ) public view returns (bytes memory data, MigrateUnbondingLocksParams memory params) { IBondingManager bondingManager = IBondingManager(bondingManagerAddr); uint256 total; uint256 unbondingLockIdsLen = _unbondingLockIds.length; for (uint256 i; i < unbondingLockIdsLen; i++) { (uint256 amount, ) = bondingManager.getDelegatorUnbondingLock( _l1Addr, _unbondingLockIds[i] ); total += amount; } (, , address delegateAddress, , , , ) = bondingManager.getDelegator( _l1Addr ); // Construct params and L2 calldata for finalizeMigrateUnbondingLocks() on L2Migrator params = MigrateUnbondingLocksParams({ l1Addr: _l1Addr, l2Addr: _l2Addr, total: total, unbondingLockIds: _unbondingLockIds, delegate: delegateAddress }); data = abi.encodeWithSelector( IL2Migrator.finalizeMigrateUnbondingLocks.selector, params ); } function requireValidMigration( address _l1Addr, address _l2Addr, bytes32 _structHash, bytes memory _sig ) private view { require(_l2Addr != address(0), "INVALID_L2_ADDR"); require( msg.sender == _l1Addr || recoverSigner(_structHash, _sig) == _l1Addr, "FAIL_AUTH" ); } function recoverSigner(bytes32 _structHash, bytes memory _sig) private view returns (address) { bytes32 hash = _hashTypedDataV4(_structHash); return ECDSA.recover(hash, _sig); } }
// 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/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; import "./ECDSA.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } }
// 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; 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: 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); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface IMigrator { struct MigrateDelegatorParams { // Address that is migrating from L1 address l1Addr; // Address to use on L2 // If null, l1Addr is used on L2 address l2Addr; // Stake of l1Addr on L1 uint256 stake; // Delegated stake of l1Addr on L1 uint256 delegatedStake; // Fees of l1Addr on L1 uint256 fees; // Delegate of l1Addr on L1 address delegate; } struct MigrateUnbondingLocksParams { // Address that is migrating from L1 address l1Addr; // Address to use on L2 // If null, l1Addr is used on L2 address l2Addr; // Total tokens in unbonding locks uint256 total; // IDs of unbonding locks being migrated uint256[] unbondingLockIds; // Delegate of l1Addr on L1 address delegate; } struct MigrateSenderParams { // Address that is migrating from L1 address l1Addr; // Address to use on L2 // If null, l1Addr is used on L2 address l2Addr; // Deposit of l1Addr on L1 uint256 deposit; // Reserve of l1Addr on L1 uint256 reserve; } }
{ "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
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_inbox","type":"address"},{"internalType":"address","name":"_bondingManagerAddr","type":"address"},{"internalType":"address","name":"_ticketBrokerAddr","type":"address"},{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_l1LPTGatewayAddr","type":"address"},{"internalType":"address","name":"_l2MigratorAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bridgeMinter","type":"address"}],"name":"BridgeMinterUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"l2Migrator","type":"address"}],"name":"L2MigratorUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"seqNo","type":"uint256"},{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"address","name":"delegate","type":"address"}],"indexed":false,"internalType":"struct IMigrator.MigrateDelegatorParams","name":"params","type":"tuple"}],"name":"MigrateDelegatorInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"seqNo","type":"uint256"},{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint256","name":"reserve","type":"uint256"}],"indexed":false,"internalType":"struct IMigrator.MigrateSenderParams","name":"params","type":"tuple"}],"name":"MigrateSenderInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"seqNo","type":"uint256"},{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256[]","name":"unbondingLockIds","type":"uint256[]"},{"internalType":"address","name":"delegate","type":"address"}],"indexed":false,"internalType":"struct IMigrator.MigrateUnbondingLocksParams","name":"params","type":"tuple"}],"name":"MigrateUnbondingLocksInitiated","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"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondingManagerAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeMinterAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_l1Addr","type":"address"},{"internalType":"address","name":"_l2Addr","type":"address"}],"name":"getMigrateDelegatorParams","outputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"address","name":"delegate","type":"address"}],"internalType":"struct IMigrator.MigrateDelegatorParams","name":"params","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_l1Addr","type":"address"},{"internalType":"address","name":"_l2Addr","type":"address"}],"name":"getMigrateSenderParams","outputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint256","name":"reserve","type":"uint256"}],"internalType":"struct IMigrator.MigrateSenderParams","name":"params","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_l1Addr","type":"address"},{"internalType":"address","name":"_l2Addr","type":"address"},{"internalType":"uint256[]","name":"_unbondingLockIds","type":"uint256[]"}],"name":"getMigrateUnbondingLocksParams","outputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"l1Addr","type":"address"},{"internalType":"address","name":"l2Addr","type":"address"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256[]","name":"unbondingLockIds","type":"uint256[]"},{"internalType":"address","name":"delegate","type":"address"}],"internalType":"struct IMigrator.MigrateUnbondingLocksParams","name":"params","type":"tuple"}],"stateMutability":"view","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":"l1LPTGatewayAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l2MigratorAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_l1Addr","type":"address"},{"internalType":"address","name":"_l2Addr","type":"address"},{"internalType":"bytes","name":"_sig","type":"bytes"},{"internalType":"uint256","name":"_maxGas","type":"uint256"},{"internalType":"uint256","name":"_gasPriceBid","type":"uint256"},{"internalType":"uint256","name":"_maxSubmissionCost","type":"uint256"}],"name":"migrateDelegator","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxGas","type":"uint256"},{"internalType":"uint256","name":"_gasPriceBid","type":"uint256"},{"internalType":"uint256","name":"_maxSubmissionCost","type":"uint256"}],"name":"migrateETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxGas","type":"uint256"},{"internalType":"uint256","name":"_gasPriceBid","type":"uint256"},{"internalType":"uint256","name":"_maxSubmissionCost","type":"uint256"}],"name":"migrateLPT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_l1Addr","type":"address"},{"internalType":"address","name":"_l2Addr","type":"address"},{"internalType":"bytes","name":"_sig","type":"bytes"},{"internalType":"uint256","name":"_maxGas","type":"uint256"},{"internalType":"uint256","name":"_gasPriceBid","type":"uint256"},{"internalType":"uint256","name":"_maxSubmissionCost","type":"uint256"}],"name":"migrateSender","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_l1Addr","type":"address"},{"internalType":"address","name":"_l2Addr","type":"address"},{"internalType":"uint256[]","name":"_unbondingLockIds","type":"uint256[]"},{"internalType":"bytes","name":"_sig","type":"bytes"},{"internalType":"uint256","name":"_maxGas","type":"uint256"},{"internalType":"uint256","name":"_gasPriceBid","type":"uint256"},{"internalType":"uint256","name":"_maxSubmissionCost","type":"uint256"}],"name":"migrateUnbondingLocks","outputs":[],"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":"_bridgeMinterAddr","type":"address"}],"name":"setBridgeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_l2MigratorAddr","type":"address"}],"name":"setL2Migrator","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":"ticketBrokerAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6102406040527f0988862b47ed3bbfb4a6ca37401c7f403b193459aeac85ae89b67007a66b7a8f6101e0908152507f61aed36780e7480ed685cb5ea394df4fb8da267b9f97daeb24db6c660f711697610200908152507f028d23c953a67a525f843967e7e61f06d72d4a0aed8e3133159bee065e32f81f610220908152503480156200008a57600080fd5b5060405162004d6338038062004d638339818101604052810190620000b091906200063d565b6040518060400160405280601381526020017f4c69766570656572204c314d69677261746f72000000000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250878073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508261010081815250508161012081815250504660c08181525050620001bc8184846200036660201b60201c565b60a081815250503073ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff168152505080610140818152505050505050506000600160006101000a81548160ff021916908315150217905550620002356000801b33620003a260201b60201c565b8473ffffffffffffffffffffffffffffffffffffffff166101608173ffffffffffffffffffffffffffffffffffffffff16815250508373ffffffffffffffffffffffffffffffffffffffff166101808173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff166101a08173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff166101c08173ffffffffffffffffffffffffffffffffffffffff168152505080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200035a6200049360201b60201c565b5050505050506200081d565b600083838346306040516020016200038395949392919062000720565b6040516020818303038152906040528051906020012090509392505050565b620003b482826200054a60201b60201c565b6200048f57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000434620005b460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b620004a3620005bc60201b60201c565b15620004e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004dd90620007de565b60405180910390fd5b60018060006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25862000531620005b460201b60201c565b60405162000540919062000800565b60405180910390a1565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b6000600160009054906101000a900460ff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200060582620005d8565b9050919050565b6200061781620005f8565b81146200062357600080fd5b50565b60008151905062000637816200060c565b92915050565b60008060008060008060c087890312156200065d576200065c620005d3565b5b60006200066d89828a0162000626565b96505060206200068089828a0162000626565b95505060406200069389828a0162000626565b9450506060620006a689828a0162000626565b9350506080620006b989828a0162000626565b92505060a0620006cc89828a0162000626565b9150509295509295509295565b6000819050919050565b620006ee81620006d9565b82525050565b6000819050919050565b6200070981620006f4565b82525050565b6200071a81620005f8565b82525050565b600060a082019050620007376000830188620006e3565b620007466020830187620006e3565b620007556040830186620006e3565b620007646060830185620006fe565b6200077360808301846200070f565b9695505050505050565b600082825260208201905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000620007c66010836200077d565b9150620007d3826200078e565b602082019050919050565b60006020820190508181036000830152620007f981620007b7565b9050919050565b60006020820190506200081760008301846200070f565b92915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e0516102005161022051614466620008fd6000396000611915015260006107330152600061111c0152600081816110700152818161165401526116c50152600081816110ab01528181611618015261170201526000818161125a01526112f40152600081816108f401528181610c8e0152611a33015260006124500152600061249201526000612471015260006123a6015260006123fc01526000612425015260008181611a570152611f3201526144666000f3fe6080604052600436106101a05760003560e01c806378da3574116100ec578063a375fa521161008a578063de1ec2d611610064578063de1ec2d61461058a578063e40309ca146105b5578063e89320e5146105d1578063fb0e722b146105fc576101a7565b8063a375fa521461051c578063d547741f14610538578063d98ef07014610561576101a7565b806391d14854116100c657806391d148541461044d5780639ca228bc1461048a5780639cb88aa6146104c8578063a217fddf146104f1576101a7565b806378da3574146103ef5780638456cb591461040b5780638f2c17ed14610422576101a7565b806336568abe11610159578063518fe44611610133578063518fe4461461035257806359d959151461036e5780635c975abb146103995780635fbe4d1d146103c4576101a7565b806336568abe146102d457806336e9feb9146102fd5780633f4ba83a1461033b576101a7565b806301ffc9a7146101ac578063236cc70c146101e9578063248a9ca31461021457806328293d51146102515780632f2ff15d1461026d578063329b114e14610296576101a7565b366101a757005b600080fd5b3480156101b857600080fd5b506101d360048036038101906101ce9190612a85565b610627565b6040516101e09190612acd565b60405180910390f35b3480156101f557600080fd5b506101fe6106a1565b60405161020b9190612b29565b60405180910390f35b34801561022057600080fd5b5061023b60048036038101906102369190612b7a565b6106c5565b6040516102489190612bb6565b60405180910390f35b61026b60048036038101906102669190612cee565b6106e4565b005b34801561027957600080fd5b50610294600480360381019061028f9190612dd0565b6108bd565b005b3480156102a257600080fd5b506102bd60048036038101906102b89190612e10565b6108e6565b6040516102cb929190612f82565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190612dd0565b610bfd565b005b34801561030957600080fd5b50610324600480360381019061031f91906130f0565b610c80565b604051610332929190613284565b60405180910390f35b34801561034757600080fd5b50610350610f0f565b005b61036c600480360381019061036791906132bb565b610f2f565b005b34801561037a57600080fd5b5061038361106e565b6040516103909190612b29565b60405180910390f35b3480156103a557600080fd5b506103ae611092565b6040516103bb9190612acd565b60405180910390f35b3480156103d057600080fd5b506103d96110a9565b6040516103e69190612b29565b60405180910390f35b6104096004803603810190610404919061330e565b6110cd565b005b34801561041757600080fd5b50610420611238565b005b34801561042e57600080fd5b50610437611258565b6040516104449190612b29565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190612dd0565b61127c565b6040516104819190612acd565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac9190612e10565b6112e6565b6040516104bf929190613412565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea9190613442565b61147e565b005b3480156104fd57600080fd5b5061050661150e565b6040516105139190612bb6565b60405180910390f35b610536600480360381019061053191906132bb565b611515565b005b34801561054457600080fd5b5061055f600480360381019061055a9190612dd0565b6117e7565b005b34801561056d57600080fd5b5061058860048036038101906105839190613442565b611810565b005b34801561059657600080fd5b5061059f6118a0565b6040516105ac9190612b29565b60405180910390f35b6105cf60048036038101906105ca919061330e565b6118c6565b005b3480156105dd57600080fd5b506105e6611a31565b6040516105f39190612b29565b60405180910390f35b34801561060857600080fd5b50610611611a55565b60405161061e91906134ce565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061069a575061069982611a79565b5b9050919050565b60018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000838152602001908152602001600020600101549050919050565b6106ec611092565b1561072c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072390613546565b60405180910390fd5b6107f089897f00000000000000000000000000000000000000000000000000000000000000008c8c8c8c6040516020016107679291906135e1565b6040516020818303038152906040528051906020012060405160200161079094939291906135fa565b6040516020818303038152906040528051906020012088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611ae3565b60008061083f8b8b8b8b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050610c80565b915091506000610875600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168c86898988611c06565b9050807f68d9b81e798c334d0daecab33df19f49cbc17c77cc19f4bcb772318e19316595836040516108a7919061363f565b60405180910390a2505050505050505050505050565b6108c6826106c5565b6108d7816108d2611c25565b611c2d565b6108e18383611cca565b505050565b60606108f06128dc565b60007f0000000000000000000000000000000000000000000000000000000000000000905060008173ffffffffffffffffffffffffffffffffffffffff16639d0b2c7a877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610972929190613670565b60206040518083038186803b15801561098a57600080fd5b505afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c291906136ae565b905060008273ffffffffffffffffffffffffffffffffffffffff1663f595f1cc887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610a21929190613670565b60206040518083038186803b158015610a3957600080fd5b505afa158015610a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7191906136ae565b90506000808473ffffffffffffffffffffffffffffffffffffffff1663a64ad5958a6040518263ffffffff1660e01b8152600401610aaf9190612b29565b60e06040518083038186803b158015610ac757600080fd5b505afa158015610adb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aff91906136f0565b5050509350935050506040518060c001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018281526020018481526020018373ffffffffffffffffffffffffffffffffffffffff168152509550631a0725d860e01b86604051602401610b929190613792565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050965050505050509250929050565b610c05611c25565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c699061381f565b60405180910390fd5b610c7c8282611daa565b5050565b6060610c8a612954565b60007f000000000000000000000000000000000000000000000000000000000000000090506000808551905060005b81811015610d8c5760008473ffffffffffffffffffffffffffffffffffffffff1663412f83b68b8a8581518110610cf357610cf261383f565b5b60200260200101516040518363ffffffff1660e01b8152600401610d18929190613670565b604080518083038186803b158015610d2f57600080fd5b505afa158015610d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d67919061386e565b5090508084610d7691906138dd565b9350508080610d8490613933565b915050610cb9565b5060008373ffffffffffffffffffffffffffffffffffffffff1663a64ad5958a6040518263ffffffff1660e01b8152600401610dc89190612b29565b60e06040518083038186803b158015610de057600080fd5b505afa158015610df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1891906136f0565b50505050925050506040518060a001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018881526020018273ffffffffffffffffffffffffffffffffffffffff16815250945063cc14c98860e01b85604051602401610ea4919061363f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050955050505050935093915050565b6000801b610f2481610f1f611c25565b611c2d565b610f2c611e8b565b50565b610f37611092565b15610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e90613546565b60405180910390fd5b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aa0946cd6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fe157600080fd5b505af1158015610ff5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101991906136ae565b9050611067600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630833461104e91906138dd565b8486898960405180602001604052806000815250611f2d565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600160009054906101000a900460ff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6110d5611092565b15611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c90613546565b60405180910390fd5b6111af87877f00000000000000000000000000000000000000000000000000000000000000008a8a60405160200161114f9392919061397c565b6040516020818303038152906040528051906020012088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611ae3565b6000806111bc89896108e6565b9150915060006111f2600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a86898988611c06565b9050807f5dde64de6b2af2aa82b195f67a162a4f870e84c1416562735f6653c614a099eb836040516112249190613792565b60405180910390a250505050505050505050565b6000801b61124d81611248611c25565b611c2d565b611255612062565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606112f06129c5565b60007f000000000000000000000000000000000000000000000000000000000000000090506000808273ffffffffffffffffffffffffffffffffffffffff1663e1a589da886040518263ffffffff1660e01b81526004016113519190612b29565b60806040518083038186803b15801561136957600080fd5b505afa15801561137d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a19190613a58565b9150915060405180608001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001836000015181526020018260000151815250935063b3f5ccae60e01b846040516024016114159190613a98565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505094505050509250929050565b6000801b6114938161148e611c25565b611c2d565b816001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f929a2735967d16cbb920d0b381d4f7702b4a860c893eecd7c1dc79a61643779f826040516115029190612b29565b60405180910390a15050565b6000801b81565b61151d611092565b1561155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155490613546565b60405180910390fd5b6000801b6115728161156d611c25565b611c2d565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634235dfbc6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156115dc57600080fd5b505af11580156115f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161491906136ae565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401611691929190613670565b600060405180830381600087803b1580156116ab57600080fd5b505af11580156116bf573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d2ce7d65347f0000000000000000000000000000000000000000000000000000000000000000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858a8a8a6040516020016117589190613ad9565b6040516020818303038152906040526040518863ffffffff1660e01b815260040161178896959493929190613b07565b6000604051808303818588803b1580156117a157600080fd5b505af11580156117b5573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f820116820180604052508101906117df9190613c15565b505050505050565b6117f0826106c5565b611801816117fc611c25565b611c2d565b61180b8383611daa565b505050565b6000801b61182581611820611c25565b611c2d565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ea3e68d24bc6eb4dd4990f8ed051d3def10558c0165ac8a9a61535fdd5af390826040516118949190612b29565b60405180910390a15050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118ce611092565b1561190e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190590613546565b60405180910390fd5b6119a887877f00000000000000000000000000000000000000000000000000000000000000008a8a6040516020016119489392919061397c565b6040516020818303038152906040528051906020012088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611ae3565b6000806119b589896112e6565b9150915060006119eb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a86898988611c06565b9050807f53a728d7c49e850e9b34c39a448454863a6fbfc7afe9fbaf257f9dd5fd1663b383604051611a1d9190613a98565b60405180910390a250505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a90613caa565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611bc157508373ffffffffffffffffffffffffffffffffffffffff16611ba98383612104565b73ffffffffffffffffffffffffffffffffffffffff16145b611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf790613d16565b60405180910390fd5b50505050565b6000611c19878734600089898989611f2d565b90509695505050505050565b600033905090565b611c37828261127c565b611cc657611c5c8173ffffffffffffffffffffffffffffffffffffffff166014612125565b611c6a8360001c6020612125565b604051602001611c7b929190613e15565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbd9190613e88565b60405180910390fd5b5050565b611cd4828261127c565b611da657600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d4b611c25565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611db4828261127c565b15611e8757600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e2c611c25565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611e93611092565b611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec990613ef6565b60405180910390fd5b6000600160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611f16611c25565b604051611f239190612b29565b60405180910390a1565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663679b6ded898c8a8a8e8f8c8c8c6040518a63ffffffff1660e01b8152600401611f98989796959493929190613f16565b6020604051808303818588803b158015611fb157600080fd5b505af1158015611fc5573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611fea91906136ae565b9050808a73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fc1d1490cf25c3b40d600dfb27c7680340ed1ab901b7e8f3551280968a3b372b08660405161204a9190613f9b565b60405180910390a48091505098975050505050505050565b61206a611092565b156120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190613546565b60405180910390fd5b60018060006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120ed611c25565b6040516120fa9190612b29565b60405180910390a1565b60008061211084612361565b905061211c818461237b565b91505092915050565b6060600060028360026121389190613fbd565b61214291906138dd565b67ffffffffffffffff81111561215b5761215a612fb2565b5b6040519080825280601f01601f19166020018201604052801561218d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106121c5576121c461383f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106122295761222861383f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026122699190613fbd565b61227391906138dd565b90505b6001811115612313577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106122b5576122b461383f565b5b1a60f81b8282815181106122cc576122cb61383f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061230c90614017565b9050612276565b5060008414612357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234e9061408d565b60405180910390fd5b8091505092915050565b600061237461236e6123a2565b836124bc565b9050919050565b600080600061238a85856124ef565b9150915061239781612572565b819250505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561241e57507f000000000000000000000000000000000000000000000000000000000000000046145b1561244b577f000000000000000000000000000000000000000000000000000000000000000090506124b9565b6124b67f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612747565b90505b90565b600082826040516020016124d192919061411a565b60405160208183030381529060405280519060200120905092915050565b6000806041835114156125315760008060006020860151925060408601519150606086015160001a905061252587828585612781565b9450945050505061256b565b60408351141561256257600080602085015191506040850151905061255786838361288e565b93509350505061256b565b60006002915091505b9250929050565b6000600481111561258657612585614151565b5b81600481111561259957612598614151565b5b14156125a457612744565b600160048111156125b8576125b7614151565b5b8160048111156125cb576125ca614151565b5b141561260c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612603906141cc565b60405180910390fd5b600260048111156126205761261f614151565b5b81600481111561263357612632614151565b5b1415612674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266b90614238565b60405180910390fd5b6003600481111561268857612687614151565b5b81600481111561269b5761269a614151565b5b14156126dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d3906142ca565b60405180910390fd5b6004808111156126ef576126ee614151565b5b81600481111561270257612701614151565b5b1415612743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273a9061435c565b60405180910390fd5b5b50565b6000838383463060405160200161276295949392919061437c565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156127bc576000600391509150612885565b601b8560ff16141580156127d45750601c8560ff1614155b156127e6576000600491509150612885565b60006001878787876040516000815260200160405260405161280b94939291906143eb565b6020604051602081039080840390855afa15801561282d573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561287c57600060019250925050612885565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c0190506128ce87828885612781565b935093505050935093915050565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a6281612a2d565b8114612a6d57600080fd5b50565b600081359050612a7f81612a59565b92915050565b600060208284031215612a9b57612a9a612a23565b5b6000612aa984828501612a70565b91505092915050565b60008115159050919050565b612ac781612ab2565b82525050565b6000602082019050612ae26000830184612abe565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b1382612ae8565b9050919050565b612b2381612b08565b82525050565b6000602082019050612b3e6000830184612b1a565b92915050565b6000819050919050565b612b5781612b44565b8114612b6257600080fd5b50565b600081359050612b7481612b4e565b92915050565b600060208284031215612b9057612b8f612a23565b5b6000612b9e84828501612b65565b91505092915050565b612bb081612b44565b82525050565b6000602082019050612bcb6000830184612ba7565b92915050565b612bda81612b08565b8114612be557600080fd5b50565b600081359050612bf781612bd1565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612c2257612c21612bfd565b5b8235905067ffffffffffffffff811115612c3f57612c3e612c02565b5b602083019150836020820283011115612c5b57612c5a612c07565b5b9250929050565b60008083601f840112612c7857612c77612bfd565b5b8235905067ffffffffffffffff811115612c9557612c94612c02565b5b602083019150836001820283011115612cb157612cb0612c07565b5b9250929050565b6000819050919050565b612ccb81612cb8565b8114612cd657600080fd5b50565b600081359050612ce881612cc2565b92915050565b600080600080600080600080600060e08a8c031215612d1057612d0f612a23565b5b6000612d1e8c828d01612be8565b9950506020612d2f8c828d01612be8565b98505060408a013567ffffffffffffffff811115612d5057612d4f612a28565b5b612d5c8c828d01612c0c565b975097505060608a013567ffffffffffffffff811115612d7f57612d7e612a28565b5b612d8b8c828d01612c62565b95509550506080612d9e8c828d01612cd9565b93505060a0612daf8c828d01612cd9565b92505060c0612dc08c828d01612cd9565b9150509295985092959850929598565b60008060408385031215612de757612de6612a23565b5b6000612df585828601612b65565b9250506020612e0685828601612be8565b9150509250929050565b60008060408385031215612e2757612e26612a23565b5b6000612e3585828601612be8565b9250506020612e4685828601612be8565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e8a578082015181840152602081019050612e6f565b83811115612e99576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ebb82612e50565b612ec58185612e5b565b9350612ed5818560208601612e6c565b612ede81612e9f565b840191505092915050565b612ef281612b08565b82525050565b612f0181612cb8565b82525050565b60c082016000820151612f1d6000850182612ee9565b506020820151612f306020850182612ee9565b506040820151612f436040850182612ef8565b506060820151612f566060850182612ef8565b506080820151612f696080850182612ef8565b5060a0820151612f7c60a0850182612ee9565b50505050565b600060e0820190508181036000830152612f9c8185612eb0565b9050612fab6020830184612f07565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fea82612e9f565b810181811067ffffffffffffffff8211171561300957613008612fb2565b5b80604052505050565b600061301c612a19565b90506130288282612fe1565b919050565b600067ffffffffffffffff82111561304857613047612fb2565b5b602082029050602081019050919050565b600061306c6130678461302d565b613012565b9050808382526020820190506020840283018581111561308f5761308e612c07565b5b835b818110156130b857806130a48882612cd9565b845260208401935050602081019050613091565b5050509392505050565b600082601f8301126130d7576130d6612bfd565b5b81356130e7848260208601613059565b91505092915050565b60008060006060848603121561310957613108612a23565b5b600061311786828701612be8565b935050602061312886828701612be8565b925050604084013567ffffffffffffffff81111561314957613148612a28565b5b613155868287016130c2565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006131978383612ef8565b60208301905092915050565b6000602082019050919050565b60006131bb8261315f565b6131c5818561316a565b93506131d08361317b565b8060005b838110156132015781516131e8888261318b565b97506131f3836131a3565b9250506001810190506131d4565b5085935050505092915050565b600060a0830160008301516132266000860182612ee9565b5060208301516132396020860182612ee9565b50604083015161324c6040860182612ef8565b506060830151848203606086015261326482826131b0565b91505060808301516132796080860182612ee9565b508091505092915050565b6000604082019050818103600083015261329e8185612eb0565b905081810360208301526132b2818461320e565b90509392505050565b6000806000606084860312156132d4576132d3612a23565b5b60006132e286828701612cd9565b93505060206132f386828701612cd9565b925050604061330486828701612cd9565b9150509250925092565b600080600080600080600060c0888a03121561332d5761332c612a23565b5b600061333b8a828b01612be8565b975050602061334c8a828b01612be8565b965050604088013567ffffffffffffffff81111561336d5761336c612a28565b5b6133798a828b01612c62565b9550955050606061338c8a828b01612cd9565b935050608061339d8a828b01612cd9565b92505060a06133ae8a828b01612cd9565b91505092959891949750929550565b6080820160008201516133d36000850182612ee9565b5060208201516133e66020850182612ee9565b5060408201516133f96040850182612ef8565b50606082015161340c6060850182612ef8565b50505050565b600060a082019050818103600083015261342c8185612eb0565b905061343b60208301846133bd565b9392505050565b60006020828403121561345857613457612a23565b5b600061346684828501612be8565b91505092915050565b6000819050919050565b600061349461348f61348a84612ae8565b61346f565b612ae8565b9050919050565b60006134a682613479565b9050919050565b60006134b88261349b565b9050919050565b6134c8816134ad565b82525050565b60006020820190506134e360008301846134bf565b92915050565b600082825260208201905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006135306010836134e9565b915061353b826134fa565b602082019050919050565b6000602082019050818103600083015261355f81613523565b9050919050565b600081905092915050565b600080fd5b82818337600083830152505050565b60006135918385613566565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156135c4576135c3613571565b5b6020830292506135d5838584613576565b82840190509392505050565b60006135ee828486613585565b91508190509392505050565b600060808201905061360f6000830187612ba7565b61361c6020830186612b1a565b6136296040830185612b1a565b6136366060830184612ba7565b95945050505050565b60006020820190508181036000830152613659818461320e565b905092915050565b61366a81612cb8565b82525050565b60006040820190506136856000830185612b1a565b6136926020830184613661565b9392505050565b6000815190506136a881612cc2565b92915050565b6000602082840312156136c4576136c3612a23565b5b60006136d284828501613699565b91505092915050565b6000815190506136ea81612bd1565b92915050565b600080600080600080600060e0888a03121561370f5761370e612a23565b5b600061371d8a828b01613699565b975050602061372e8a828b01613699565b965050604061373f8a828b016136db565b95505060606137508a828b01613699565b94505060806137618a828b01613699565b93505060a06137728a828b01613699565b92505060c06137838a828b01613699565b91505092959891949750929550565b600060c0820190506137a76000830184612f07565b92915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613809602f836134e9565b9150613814826137ad565b604082019050919050565b60006020820190508181036000830152613838816137fc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000806040838503121561388557613884612a23565b5b600061389385828601613699565b92505060206138a485828601613699565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138e882612cb8565b91506138f383612cb8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613928576139276138ae565b5b828201905092915050565b600061393e82612cb8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613971576139706138ae565b5b600182019050919050565b60006060820190506139916000830186612ba7565b61399e6020830185612b1a565b6139ab6040830184612b1a565b949350505050565b600080fd5b6000604082840312156139ce576139cd6139b3565b5b6139d86040613012565b905060006139e884828501613699565b60008301525060206139fc84828501613699565b60208301525092915050565b600060408284031215613a1e57613a1d6139b3565b5b613a286040613012565b90506000613a3884828501613699565b6000830152506020613a4c84828501613699565b60208301525092915050565b60008060808385031215613a6f57613a6e612a23565b5b6000613a7d858286016139b8565b9250506040613a8e85828601613a08565b9150509250929050565b6000608082019050613aad60008301846133bd565b92915050565b50565b6000613ac36000836134e9565b9150613ace82613ab3565b600082019050919050565b6000604082019050613aee6000830184613661565b8181036020830152613aff81613ab6565b905092915050565b600060c082019050613b1c6000830189612b1a565b613b296020830188612b1a565b613b366040830187613661565b613b436060830186613661565b613b506080830185613661565b81810360a0830152613b628184612eb0565b9050979650505050505050565b600080fd5b600067ffffffffffffffff821115613b8f57613b8e612fb2565b5b613b9882612e9f565b9050602081019050919050565b6000613bb8613bb384613b74565b613012565b905082815260208101848484011115613bd457613bd3613b6f565b5b613bdf848285612e6c565b509392505050565b600082601f830112613bfc57613bfb612bfd565b5b8151613c0c848260208601613ba5565b91505092915050565b600060208284031215613c2b57613c2a612a23565b5b600082015167ffffffffffffffff811115613c4957613c48612a28565b5b613c5584828501613be7565b91505092915050565b7f494e56414c49445f4c325f414444520000000000000000000000000000000000600082015250565b6000613c94600f836134e9565b9150613c9f82613c5e565b602082019050919050565b60006020820190508181036000830152613cc381613c87565b9050919050565b7f4641494c5f415554480000000000000000000000000000000000000000000000600082015250565b6000613d006009836134e9565b9150613d0b82613cca565b602082019050919050565b60006020820190508181036000830152613d2f81613cf3565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613d77601783613d36565b9150613d8282613d41565b601782019050919050565b600081519050919050565b6000613da382613d8d565b613dad8185613d36565b9350613dbd818560208601612e6c565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613dff601183613d36565b9150613e0a82613dc9565b601182019050919050565b6000613e2082613d6a565b9150613e2c8285613d98565b9150613e3782613df2565b9150613e438284613d98565b91508190509392505050565b6000613e5a82613d8d565b613e6481856134e9565b9350613e74818560208601612e6c565b613e7d81612e9f565b840191505092915050565b60006020820190508181036000830152613ea28184613e4f565b905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613ee06014836134e9565b9150613eeb82613eaa565b602082019050919050565b60006020820190508181036000830152613f0f81613ed3565b9050919050565b600061010082019050613f2c600083018b612b1a565b613f39602083018a613661565b613f466040830189613661565b613f536060830188612b1a565b613f606080830187612b1a565b613f6d60a0830186613661565b613f7a60c0830185613661565b81810360e0830152613f8c8184612eb0565b90509998505050505050505050565b60006020820190508181036000830152613fb58184612eb0565b905092915050565b6000613fc882612cb8565b9150613fd383612cb8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561400c5761400b6138ae565b5b828202905092915050565b600061402282612cb8565b91506000821415614036576140356138ae565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006140776020836134e9565b915061408282614041565b602082019050919050565b600060208201905081810360008301526140a68161406a565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006140e3600283613d36565b91506140ee826140ad565b600282019050919050565b6000819050919050565b61411461410f82612b44565b6140f9565b82525050565b6000614125826140d6565b91506141318285614103565b6020820191506141418284614103565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006141b66018836134e9565b91506141c182614180565b602082019050919050565b600060208201905081810360008301526141e5816141a9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614222601f836134e9565b915061422d826141ec565b602082019050919050565b6000602082019050818103600083015261425181614215565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006142b46022836134e9565b91506142bf82614258565b604082019050919050565b600060208201905081810360008301526142e3816142a7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006143466022836134e9565b9150614351826142ea565b604082019050919050565b6000602082019050818103600083015261437581614339565b9050919050565b600060a0820190506143916000830188612ba7565b61439e6020830187612ba7565b6143ab6040830186612ba7565b6143b86060830185613661565b6143c56080830184612b1a565b9695505050505050565b600060ff82169050919050565b6143e5816143cf565b82525050565b60006080820190506144006000830187612ba7565b61440d60208301866143dc565b61441a6040830185612ba7565b6144276060830184612ba7565b9594505050505056fea26469706673582212208972cfdf673c4db6ea6e1c5b9c61b8c2c65bd07628c26e2eec9ebd9c7ebdabfe64736f6c634300080900330000000000000000000000004dbd4fc535ac27206064b68ffcf827b0a60bab3f000000000000000000000000511bc4556d823ae99630ae8de28b9b80df90ea2e0000000000000000000000005b1ce829384eebfa30286f12d1e7a695ca45f5d200000000000000000000000058b6a8a3302369daec383334672404ee733ab2390000000000000000000000006142f1c8bbf02e6a6bd074e8d564c9a5420a0676000000000000000000000000148d5b6b4df9530c7c76a810bd1cdf69ec4c2085
Deployed Bytecode
0x6080604052600436106101a05760003560e01c806378da3574116100ec578063a375fa521161008a578063de1ec2d611610064578063de1ec2d61461058a578063e40309ca146105b5578063e89320e5146105d1578063fb0e722b146105fc576101a7565b8063a375fa521461051c578063d547741f14610538578063d98ef07014610561576101a7565b806391d14854116100c657806391d148541461044d5780639ca228bc1461048a5780639cb88aa6146104c8578063a217fddf146104f1576101a7565b806378da3574146103ef5780638456cb591461040b5780638f2c17ed14610422576101a7565b806336568abe11610159578063518fe44611610133578063518fe4461461035257806359d959151461036e5780635c975abb146103995780635fbe4d1d146103c4576101a7565b806336568abe146102d457806336e9feb9146102fd5780633f4ba83a1461033b576101a7565b806301ffc9a7146101ac578063236cc70c146101e9578063248a9ca31461021457806328293d51146102515780632f2ff15d1461026d578063329b114e14610296576101a7565b366101a757005b600080fd5b3480156101b857600080fd5b506101d360048036038101906101ce9190612a85565b610627565b6040516101e09190612acd565b60405180910390f35b3480156101f557600080fd5b506101fe6106a1565b60405161020b9190612b29565b60405180910390f35b34801561022057600080fd5b5061023b60048036038101906102369190612b7a565b6106c5565b6040516102489190612bb6565b60405180910390f35b61026b60048036038101906102669190612cee565b6106e4565b005b34801561027957600080fd5b50610294600480360381019061028f9190612dd0565b6108bd565b005b3480156102a257600080fd5b506102bd60048036038101906102b89190612e10565b6108e6565b6040516102cb929190612f82565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190612dd0565b610bfd565b005b34801561030957600080fd5b50610324600480360381019061031f91906130f0565b610c80565b604051610332929190613284565b60405180910390f35b34801561034757600080fd5b50610350610f0f565b005b61036c600480360381019061036791906132bb565b610f2f565b005b34801561037a57600080fd5b5061038361106e565b6040516103909190612b29565b60405180910390f35b3480156103a557600080fd5b506103ae611092565b6040516103bb9190612acd565b60405180910390f35b3480156103d057600080fd5b506103d96110a9565b6040516103e69190612b29565b60405180910390f35b6104096004803603810190610404919061330e565b6110cd565b005b34801561041757600080fd5b50610420611238565b005b34801561042e57600080fd5b50610437611258565b6040516104449190612b29565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190612dd0565b61127c565b6040516104819190612acd565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac9190612e10565b6112e6565b6040516104bf929190613412565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea9190613442565b61147e565b005b3480156104fd57600080fd5b5061050661150e565b6040516105139190612bb6565b60405180910390f35b610536600480360381019061053191906132bb565b611515565b005b34801561054457600080fd5b5061055f600480360381019061055a9190612dd0565b6117e7565b005b34801561056d57600080fd5b5061058860048036038101906105839190613442565b611810565b005b34801561059657600080fd5b5061059f6118a0565b6040516105ac9190612b29565b60405180910390f35b6105cf60048036038101906105ca919061330e565b6118c6565b005b3480156105dd57600080fd5b506105e6611a31565b6040516105f39190612b29565b60405180910390f35b34801561060857600080fd5b50610611611a55565b60405161061e91906134ce565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061069a575061069982611a79565b5b9050919050565b60018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000838152602001908152602001600020600101549050919050565b6106ec611092565b1561072c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072390613546565b60405180910390fd5b6107f089897f61aed36780e7480ed685cb5ea394df4fb8da267b9f97daeb24db6c660f7116978c8c8c8c6040516020016107679291906135e1565b6040516020818303038152906040528051906020012060405160200161079094939291906135fa565b6040516020818303038152906040528051906020012088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611ae3565b60008061083f8b8b8b8b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050610c80565b915091506000610875600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168c86898988611c06565b9050807f68d9b81e798c334d0daecab33df19f49cbc17c77cc19f4bcb772318e19316595836040516108a7919061363f565b60405180910390a2505050505050505050505050565b6108c6826106c5565b6108d7816108d2611c25565b611c2d565b6108e18383611cca565b505050565b60606108f06128dc565b60007f000000000000000000000000511bc4556d823ae99630ae8de28b9b80df90ea2e905060008173ffffffffffffffffffffffffffffffffffffffff16639d0b2c7a877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610972929190613670565b60206040518083038186803b15801561098a57600080fd5b505afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c291906136ae565b905060008273ffffffffffffffffffffffffffffffffffffffff1663f595f1cc887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610a21929190613670565b60206040518083038186803b158015610a3957600080fd5b505afa158015610a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7191906136ae565b90506000808473ffffffffffffffffffffffffffffffffffffffff1663a64ad5958a6040518263ffffffff1660e01b8152600401610aaf9190612b29565b60e06040518083038186803b158015610ac757600080fd5b505afa158015610adb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aff91906136f0565b5050509350935050506040518060c001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018281526020018481526020018373ffffffffffffffffffffffffffffffffffffffff168152509550631a0725d860e01b86604051602401610b929190613792565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050965050505050509250929050565b610c05611c25565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c699061381f565b60405180910390fd5b610c7c8282611daa565b5050565b6060610c8a612954565b60007f000000000000000000000000511bc4556d823ae99630ae8de28b9b80df90ea2e90506000808551905060005b81811015610d8c5760008473ffffffffffffffffffffffffffffffffffffffff1663412f83b68b8a8581518110610cf357610cf261383f565b5b60200260200101516040518363ffffffff1660e01b8152600401610d18929190613670565b604080518083038186803b158015610d2f57600080fd5b505afa158015610d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d67919061386e565b5090508084610d7691906138dd565b9350508080610d8490613933565b915050610cb9565b5060008373ffffffffffffffffffffffffffffffffffffffff1663a64ad5958a6040518263ffffffff1660e01b8152600401610dc89190612b29565b60e06040518083038186803b158015610de057600080fd5b505afa158015610df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1891906136f0565b50505050925050506040518060a001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018881526020018273ffffffffffffffffffffffffffffffffffffffff16815250945063cc14c98860e01b85604051602401610ea4919061363f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050955050505050935093915050565b6000801b610f2481610f1f611c25565b611c2d565b610f2c611e8b565b50565b610f37611092565b15610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e90613546565b60405180910390fd5b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aa0946cd6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fe157600080fd5b505af1158015610ff5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101991906136ae565b9050611067600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630833461104e91906138dd565b8486898960405180602001604052806000815250611f2d565b5050505050565b7f0000000000000000000000006142f1c8bbf02e6a6bd074e8d564c9a5420a067681565b6000600160009054906101000a900460ff16905090565b7f00000000000000000000000058b6a8a3302369daec383334672404ee733ab23981565b6110d5611092565b15611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c90613546565b60405180910390fd5b6111af87877f0988862b47ed3bbfb4a6ca37401c7f403b193459aeac85ae89b67007a66b7a8f8a8a60405160200161114f9392919061397c565b6040516020818303038152906040528051906020012088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611ae3565b6000806111bc89896108e6565b9150915060006111f2600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a86898988611c06565b9050807f5dde64de6b2af2aa82b195f67a162a4f870e84c1416562735f6653c614a099eb836040516112249190613792565b60405180910390a250505050505050505050565b6000801b61124d81611248611c25565b611c2d565b611255612062565b50565b7f0000000000000000000000005b1ce829384eebfa30286f12d1e7a695ca45f5d281565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606112f06129c5565b60007f0000000000000000000000005b1ce829384eebfa30286f12d1e7a695ca45f5d290506000808273ffffffffffffffffffffffffffffffffffffffff1663e1a589da886040518263ffffffff1660e01b81526004016113519190612b29565b60806040518083038186803b15801561136957600080fd5b505afa15801561137d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a19190613a58565b9150915060405180608001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001836000015181526020018260000151815250935063b3f5ccae60e01b846040516024016114159190613a98565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505094505050509250929050565b6000801b6114938161148e611c25565b611c2d565b816001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f929a2735967d16cbb920d0b381d4f7702b4a860c893eecd7c1dc79a61643779f826040516115029190612b29565b60405180910390a15050565b6000801b81565b61151d611092565b1561155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155490613546565b60405180910390fd5b6000801b6115728161156d611c25565b611c2d565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634235dfbc6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156115dc57600080fd5b505af11580156115f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161491906136ae565b90507f00000000000000000000000058b6a8a3302369daec383334672404ee733ab23973ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000006142f1c8bbf02e6a6bd074e8d564c9a5420a0676836040518363ffffffff1660e01b8152600401611691929190613670565b600060405180830381600087803b1580156116ab57600080fd5b505af11580156116bf573d6000803e3d6000fd5b505050507f0000000000000000000000006142f1c8bbf02e6a6bd074e8d564c9a5420a067673ffffffffffffffffffffffffffffffffffffffff1663d2ce7d65347f00000000000000000000000058b6a8a3302369daec383334672404ee733ab239600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858a8a8a6040516020016117589190613ad9565b6040516020818303038152906040526040518863ffffffff1660e01b815260040161178896959493929190613b07565b6000604051808303818588803b1580156117a157600080fd5b505af11580156117b5573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f820116820180604052508101906117df9190613c15565b505050505050565b6117f0826106c5565b611801816117fc611c25565b611c2d565b61180b8383611daa565b505050565b6000801b61182581611820611c25565b611c2d565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ea3e68d24bc6eb4dd4990f8ed051d3def10558c0165ac8a9a61535fdd5af390826040516118949190612b29565b60405180910390a15050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118ce611092565b1561190e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190590613546565b60405180910390fd5b6119a887877f028d23c953a67a525f843967e7e61f06d72d4a0aed8e3133159bee065e32f81f8a8a6040516020016119489392919061397c565b6040516020818303038152906040528051906020012088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611ae3565b6000806119b589896112e6565b9150915060006119eb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a86898988611c06565b9050807f53a728d7c49e850e9b34c39a448454863a6fbfc7afe9fbaf257f9dd5fd1663b383604051611a1d9190613a98565b60405180910390a250505050505050505050565b7f000000000000000000000000511bc4556d823ae99630ae8de28b9b80df90ea2e81565b7f0000000000000000000000004dbd4fc535ac27206064b68ffcf827b0a60bab3f81565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a90613caa565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611bc157508373ffffffffffffffffffffffffffffffffffffffff16611ba98383612104565b73ffffffffffffffffffffffffffffffffffffffff16145b611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf790613d16565b60405180910390fd5b50505050565b6000611c19878734600089898989611f2d565b90509695505050505050565b600033905090565b611c37828261127c565b611cc657611c5c8173ffffffffffffffffffffffffffffffffffffffff166014612125565b611c6a8360001c6020612125565b604051602001611c7b929190613e15565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbd9190613e88565b60405180910390fd5b5050565b611cd4828261127c565b611da657600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d4b611c25565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611db4828261127c565b15611e8757600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e2c611c25565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611e93611092565b611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec990613ef6565b60405180910390fd5b6000600160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611f16611c25565b604051611f239190612b29565b60405180910390a1565b6000807f0000000000000000000000004dbd4fc535ac27206064b68ffcf827b0a60bab3f73ffffffffffffffffffffffffffffffffffffffff1663679b6ded898c8a8a8e8f8c8c8c6040518a63ffffffff1660e01b8152600401611f98989796959493929190613f16565b6020604051808303818588803b158015611fb157600080fd5b505af1158015611fc5573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611fea91906136ae565b9050808a73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fc1d1490cf25c3b40d600dfb27c7680340ed1ab901b7e8f3551280968a3b372b08660405161204a9190613f9b565b60405180910390a48091505098975050505050505050565b61206a611092565b156120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190613546565b60405180910390fd5b60018060006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120ed611c25565b6040516120fa9190612b29565b60405180910390a1565b60008061211084612361565b905061211c818461237b565b91505092915050565b6060600060028360026121389190613fbd565b61214291906138dd565b67ffffffffffffffff81111561215b5761215a612fb2565b5b6040519080825280601f01601f19166020018201604052801561218d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106121c5576121c461383f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106122295761222861383f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026122699190613fbd565b61227391906138dd565b90505b6001811115612313577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106122b5576122b461383f565b5b1a60f81b8282815181106122cc576122cb61383f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061230c90614017565b9050612276565b5060008414612357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234e9061408d565b60405180910390fd5b8091505092915050565b600061237461236e6123a2565b836124bc565b9050919050565b600080600061238a85856124ef565b9150915061239781612572565b819250505092915050565b60007f00000000000000000000000021146b872d3a95d2cf9afed03ee5a783dae9a89a73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561241e57507f000000000000000000000000000000000000000000000000000000000000000146145b1561244b577f529b62adc1b67852955895ca21e462956a9397cef353012828b13214f303011190506124b9565b6124b67f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fddb8d931dbe55dad2299e7dc7b91d01d6c52bcdb40a01c2f249d7de53a0026d57fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6612747565b90505b90565b600082826040516020016124d192919061411a565b60405160208183030381529060405280519060200120905092915050565b6000806041835114156125315760008060006020860151925060408601519150606086015160001a905061252587828585612781565b9450945050505061256b565b60408351141561256257600080602085015191506040850151905061255786838361288e565b93509350505061256b565b60006002915091505b9250929050565b6000600481111561258657612585614151565b5b81600481111561259957612598614151565b5b14156125a457612744565b600160048111156125b8576125b7614151565b5b8160048111156125cb576125ca614151565b5b141561260c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612603906141cc565b60405180910390fd5b600260048111156126205761261f614151565b5b81600481111561263357612632614151565b5b1415612674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266b90614238565b60405180910390fd5b6003600481111561268857612687614151565b5b81600481111561269b5761269a614151565b5b14156126dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d3906142ca565b60405180910390fd5b6004808111156126ef576126ee614151565b5b81600481111561270257612701614151565b5b1415612743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273a9061435c565b60405180910390fd5b5b50565b6000838383463060405160200161276295949392919061437c565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156127bc576000600391509150612885565b601b8560ff16141580156127d45750601c8560ff1614155b156127e6576000600491509150612885565b60006001878787876040516000815260200160405260405161280b94939291906143eb565b6020604051602081039080840390855afa15801561282d573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561287c57600060019250925050612885565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c0190506128ce87828885612781565b935093505050935093915050565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a6281612a2d565b8114612a6d57600080fd5b50565b600081359050612a7f81612a59565b92915050565b600060208284031215612a9b57612a9a612a23565b5b6000612aa984828501612a70565b91505092915050565b60008115159050919050565b612ac781612ab2565b82525050565b6000602082019050612ae26000830184612abe565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b1382612ae8565b9050919050565b612b2381612b08565b82525050565b6000602082019050612b3e6000830184612b1a565b92915050565b6000819050919050565b612b5781612b44565b8114612b6257600080fd5b50565b600081359050612b7481612b4e565b92915050565b600060208284031215612b9057612b8f612a23565b5b6000612b9e84828501612b65565b91505092915050565b612bb081612b44565b82525050565b6000602082019050612bcb6000830184612ba7565b92915050565b612bda81612b08565b8114612be557600080fd5b50565b600081359050612bf781612bd1565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612c2257612c21612bfd565b5b8235905067ffffffffffffffff811115612c3f57612c3e612c02565b5b602083019150836020820283011115612c5b57612c5a612c07565b5b9250929050565b60008083601f840112612c7857612c77612bfd565b5b8235905067ffffffffffffffff811115612c9557612c94612c02565b5b602083019150836001820283011115612cb157612cb0612c07565b5b9250929050565b6000819050919050565b612ccb81612cb8565b8114612cd657600080fd5b50565b600081359050612ce881612cc2565b92915050565b600080600080600080600080600060e08a8c031215612d1057612d0f612a23565b5b6000612d1e8c828d01612be8565b9950506020612d2f8c828d01612be8565b98505060408a013567ffffffffffffffff811115612d5057612d4f612a28565b5b612d5c8c828d01612c0c565b975097505060608a013567ffffffffffffffff811115612d7f57612d7e612a28565b5b612d8b8c828d01612c62565b95509550506080612d9e8c828d01612cd9565b93505060a0612daf8c828d01612cd9565b92505060c0612dc08c828d01612cd9565b9150509295985092959850929598565b60008060408385031215612de757612de6612a23565b5b6000612df585828601612b65565b9250506020612e0685828601612be8565b9150509250929050565b60008060408385031215612e2757612e26612a23565b5b6000612e3585828601612be8565b9250506020612e4685828601612be8565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e8a578082015181840152602081019050612e6f565b83811115612e99576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ebb82612e50565b612ec58185612e5b565b9350612ed5818560208601612e6c565b612ede81612e9f565b840191505092915050565b612ef281612b08565b82525050565b612f0181612cb8565b82525050565b60c082016000820151612f1d6000850182612ee9565b506020820151612f306020850182612ee9565b506040820151612f436040850182612ef8565b506060820151612f566060850182612ef8565b506080820151612f696080850182612ef8565b5060a0820151612f7c60a0850182612ee9565b50505050565b600060e0820190508181036000830152612f9c8185612eb0565b9050612fab6020830184612f07565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fea82612e9f565b810181811067ffffffffffffffff8211171561300957613008612fb2565b5b80604052505050565b600061301c612a19565b90506130288282612fe1565b919050565b600067ffffffffffffffff82111561304857613047612fb2565b5b602082029050602081019050919050565b600061306c6130678461302d565b613012565b9050808382526020820190506020840283018581111561308f5761308e612c07565b5b835b818110156130b857806130a48882612cd9565b845260208401935050602081019050613091565b5050509392505050565b600082601f8301126130d7576130d6612bfd565b5b81356130e7848260208601613059565b91505092915050565b60008060006060848603121561310957613108612a23565b5b600061311786828701612be8565b935050602061312886828701612be8565b925050604084013567ffffffffffffffff81111561314957613148612a28565b5b613155868287016130c2565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006131978383612ef8565b60208301905092915050565b6000602082019050919050565b60006131bb8261315f565b6131c5818561316a565b93506131d08361317b565b8060005b838110156132015781516131e8888261318b565b97506131f3836131a3565b9250506001810190506131d4565b5085935050505092915050565b600060a0830160008301516132266000860182612ee9565b5060208301516132396020860182612ee9565b50604083015161324c6040860182612ef8565b506060830151848203606086015261326482826131b0565b91505060808301516132796080860182612ee9565b508091505092915050565b6000604082019050818103600083015261329e8185612eb0565b905081810360208301526132b2818461320e565b90509392505050565b6000806000606084860312156132d4576132d3612a23565b5b60006132e286828701612cd9565b93505060206132f386828701612cd9565b925050604061330486828701612cd9565b9150509250925092565b600080600080600080600060c0888a03121561332d5761332c612a23565b5b600061333b8a828b01612be8565b975050602061334c8a828b01612be8565b965050604088013567ffffffffffffffff81111561336d5761336c612a28565b5b6133798a828b01612c62565b9550955050606061338c8a828b01612cd9565b935050608061339d8a828b01612cd9565b92505060a06133ae8a828b01612cd9565b91505092959891949750929550565b6080820160008201516133d36000850182612ee9565b5060208201516133e66020850182612ee9565b5060408201516133f96040850182612ef8565b50606082015161340c6060850182612ef8565b50505050565b600060a082019050818103600083015261342c8185612eb0565b905061343b60208301846133bd565b9392505050565b60006020828403121561345857613457612a23565b5b600061346684828501612be8565b91505092915050565b6000819050919050565b600061349461348f61348a84612ae8565b61346f565b612ae8565b9050919050565b60006134a682613479565b9050919050565b60006134b88261349b565b9050919050565b6134c8816134ad565b82525050565b60006020820190506134e360008301846134bf565b92915050565b600082825260208201905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006135306010836134e9565b915061353b826134fa565b602082019050919050565b6000602082019050818103600083015261355f81613523565b9050919050565b600081905092915050565b600080fd5b82818337600083830152505050565b60006135918385613566565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156135c4576135c3613571565b5b6020830292506135d5838584613576565b82840190509392505050565b60006135ee828486613585565b91508190509392505050565b600060808201905061360f6000830187612ba7565b61361c6020830186612b1a565b6136296040830185612b1a565b6136366060830184612ba7565b95945050505050565b60006020820190508181036000830152613659818461320e565b905092915050565b61366a81612cb8565b82525050565b60006040820190506136856000830185612b1a565b6136926020830184613661565b9392505050565b6000815190506136a881612cc2565b92915050565b6000602082840312156136c4576136c3612a23565b5b60006136d284828501613699565b91505092915050565b6000815190506136ea81612bd1565b92915050565b600080600080600080600060e0888a03121561370f5761370e612a23565b5b600061371d8a828b01613699565b975050602061372e8a828b01613699565b965050604061373f8a828b016136db565b95505060606137508a828b01613699565b94505060806137618a828b01613699565b93505060a06137728a828b01613699565b92505060c06137838a828b01613699565b91505092959891949750929550565b600060c0820190506137a76000830184612f07565b92915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613809602f836134e9565b9150613814826137ad565b604082019050919050565b60006020820190508181036000830152613838816137fc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000806040838503121561388557613884612a23565b5b600061389385828601613699565b92505060206138a485828601613699565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138e882612cb8565b91506138f383612cb8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613928576139276138ae565b5b828201905092915050565b600061393e82612cb8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613971576139706138ae565b5b600182019050919050565b60006060820190506139916000830186612ba7565b61399e6020830185612b1a565b6139ab6040830184612b1a565b949350505050565b600080fd5b6000604082840312156139ce576139cd6139b3565b5b6139d86040613012565b905060006139e884828501613699565b60008301525060206139fc84828501613699565b60208301525092915050565b600060408284031215613a1e57613a1d6139b3565b5b613a286040613012565b90506000613a3884828501613699565b6000830152506020613a4c84828501613699565b60208301525092915050565b60008060808385031215613a6f57613a6e612a23565b5b6000613a7d858286016139b8565b9250506040613a8e85828601613a08565b9150509250929050565b6000608082019050613aad60008301846133bd565b92915050565b50565b6000613ac36000836134e9565b9150613ace82613ab3565b600082019050919050565b6000604082019050613aee6000830184613661565b8181036020830152613aff81613ab6565b905092915050565b600060c082019050613b1c6000830189612b1a565b613b296020830188612b1a565b613b366040830187613661565b613b436060830186613661565b613b506080830185613661565b81810360a0830152613b628184612eb0565b9050979650505050505050565b600080fd5b600067ffffffffffffffff821115613b8f57613b8e612fb2565b5b613b9882612e9f565b9050602081019050919050565b6000613bb8613bb384613b74565b613012565b905082815260208101848484011115613bd457613bd3613b6f565b5b613bdf848285612e6c565b509392505050565b600082601f830112613bfc57613bfb612bfd565b5b8151613c0c848260208601613ba5565b91505092915050565b600060208284031215613c2b57613c2a612a23565b5b600082015167ffffffffffffffff811115613c4957613c48612a28565b5b613c5584828501613be7565b91505092915050565b7f494e56414c49445f4c325f414444520000000000000000000000000000000000600082015250565b6000613c94600f836134e9565b9150613c9f82613c5e565b602082019050919050565b60006020820190508181036000830152613cc381613c87565b9050919050565b7f4641494c5f415554480000000000000000000000000000000000000000000000600082015250565b6000613d006009836134e9565b9150613d0b82613cca565b602082019050919050565b60006020820190508181036000830152613d2f81613cf3565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613d77601783613d36565b9150613d8282613d41565b601782019050919050565b600081519050919050565b6000613da382613d8d565b613dad8185613d36565b9350613dbd818560208601612e6c565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613dff601183613d36565b9150613e0a82613dc9565b601182019050919050565b6000613e2082613d6a565b9150613e2c8285613d98565b9150613e3782613df2565b9150613e438284613d98565b91508190509392505050565b6000613e5a82613d8d565b613e6481856134e9565b9350613e74818560208601612e6c565b613e7d81612e9f565b840191505092915050565b60006020820190508181036000830152613ea28184613e4f565b905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613ee06014836134e9565b9150613eeb82613eaa565b602082019050919050565b60006020820190508181036000830152613f0f81613ed3565b9050919050565b600061010082019050613f2c600083018b612b1a565b613f39602083018a613661565b613f466040830189613661565b613f536060830188612b1a565b613f606080830187612b1a565b613f6d60a0830186613661565b613f7a60c0830185613661565b81810360e0830152613f8c8184612eb0565b90509998505050505050505050565b60006020820190508181036000830152613fb58184612eb0565b905092915050565b6000613fc882612cb8565b9150613fd383612cb8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561400c5761400b6138ae565b5b828202905092915050565b600061402282612cb8565b91506000821415614036576140356138ae565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006140776020836134e9565b915061408282614041565b602082019050919050565b600060208201905081810360008301526140a68161406a565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006140e3600283613d36565b91506140ee826140ad565b600282019050919050565b6000819050919050565b61411461410f82612b44565b6140f9565b82525050565b6000614125826140d6565b91506141318285614103565b6020820191506141418284614103565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006141b66018836134e9565b91506141c182614180565b602082019050919050565b600060208201905081810360008301526141e5816141a9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614222601f836134e9565b915061422d826141ec565b602082019050919050565b6000602082019050818103600083015261425181614215565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006142b46022836134e9565b91506142bf82614258565b604082019050919050565b600060208201905081810360008301526142e3816142a7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006143466022836134e9565b9150614351826142ea565b604082019050919050565b6000602082019050818103600083015261437581614339565b9050919050565b600060a0820190506143916000830188612ba7565b61439e6020830187612ba7565b6143ab6040830186612ba7565b6143b86060830185613661565b6143c56080830184612b1a565b9695505050505050565b600060ff82169050919050565b6143e5816143cf565b82525050565b60006080820190506144006000830187612ba7565b61440d60208301866143dc565b61441a6040830185612ba7565b6144276060830184612ba7565b9594505050505056fea26469706673582212208972cfdf673c4db6ea6e1c5b9c61b8c2c65bd07628c26e2eec9ebd9c7ebdabfe64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004dbd4fc535ac27206064b68ffcf827b0a60bab3f000000000000000000000000511bc4556d823ae99630ae8de28b9b80df90ea2e0000000000000000000000005b1ce829384eebfa30286f12d1e7a695ca45f5d200000000000000000000000058b6a8a3302369daec383334672404ee733ab2390000000000000000000000006142f1c8bbf02e6a6bd074e8d564c9a5420a0676000000000000000000000000148d5b6b4df9530c7c76a810bd1cdf69ec4c2085
-----Decoded View---------------
Arg [0] : _inbox (address): 0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f
Arg [1] : _bondingManagerAddr (address): 0x511Bc4556D823Ae99630aE8de28b9B80Df90eA2e
Arg [2] : _ticketBrokerAddr (address): 0x5b1cE829384EeBFa30286F12d1E7A695ca45F5D2
Arg [3] : _tokenAddr (address): 0x58b6A8A3302369DAEc383334672404Ee733aB239
Arg [4] : _l1LPTGatewayAddr (address): 0x6142f1C8bBF02E6A6bd074E8d564c9A5420a0676
Arg [5] : _l2MigratorAddr (address): 0x148D5b6B4df9530c7C76A810bd1Cdf69EC4c2085
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000004dbd4fc535ac27206064b68ffcf827b0a60bab3f
Arg [1] : 000000000000000000000000511bc4556d823ae99630ae8de28b9b80df90ea2e
Arg [2] : 0000000000000000000000005b1ce829384eebfa30286f12d1e7a695ca45f5d2
Arg [3] : 00000000000000000000000058b6a8a3302369daec383334672404ee733ab239
Arg [4] : 0000000000000000000000006142f1c8bbf02e6a6bd074e8d564c9a5420a0676
Arg [5] : 000000000000000000000000148d5b6b4df9530c7c76a810bd1cdf69ec4c2085
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
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.