Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Inbox
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 100 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.4; import { AlreadyInit, NotOrigin, DataTooLarge, AlreadyPaused, AlreadyUnpaused, Paused, InsufficientValue, InsufficientSubmissionCost, NotAllowedOrigin, RetryableData, NotRollupOrOwner } from "../libraries/Error.sol"; import "./IInbox.sol"; import "./ISequencerInbox.sol"; import "./IBridge.sol"; import "./Messages.sol"; import "../libraries/AddressAliasHelper.sol"; import "../libraries/DelegateCallAware.sol"; import { L2_MSG, L1MessageType_L2FundedByL1, L1MessageType_submitRetryableTx, L1MessageType_ethDeposit, L2MessageType_unsignedEOATx, L2MessageType_unsignedContractTx } from "../libraries/MessageTypes.sol"; import {MAX_DATA_SIZE} from "../libraries/Constants.sol"; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; /** * @title Inbox for user and contract originated messages * @notice Messages created via this inbox are enqueued in the delayed accumulator * to await inclusion in the SequencerInbox */ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { IBridge public bridge; ISequencerInbox public sequencerInbox; /// ------------------------------------ allow list start ------------------------------------ /// bool public allowListEnabled; mapping(address => bool) public isAllowed; event AllowListAddressSet(address indexed user, bool val); event AllowListEnabledUpdated(bool isEnabled); function setAllowList(address[] memory user, bool[] memory val) external onlyRollupOrOwner { require(user.length == val.length, "INVALID_INPUT"); for (uint256 i = 0; i < user.length; i++) { isAllowed[user[i]] = val[i]; emit AllowListAddressSet(user[i], val[i]); } } function setAllowListEnabled(bool _allowListEnabled) external onlyRollupOrOwner { require(_allowListEnabled != allowListEnabled, "ALREADY_SET"); allowListEnabled = _allowListEnabled; emit AllowListEnabledUpdated(_allowListEnabled); } /// @dev this modifier checks the tx.origin instead of msg.sender for convenience (ie it allows /// allowed users to interact with the token bridge without needing the token bridge to be allowList aware). /// this modifier is not intended to use to be used for security (since this opens the allowList to /// a smart contract phishing risk). modifier onlyAllowed() { // solhint-disable-next-line avoid-tx-origin if (allowListEnabled && !isAllowed[tx.origin]) revert NotAllowedOrigin(tx.origin); _; } /// ------------------------------------ allow list end ------------------------------------ /// modifier onlyRollupOrOwner() { IOwnable rollup = bridge.rollup(); if (msg.sender != address(rollup)) { address rollupOwner = rollup.owner(); if (msg.sender != rollupOwner) { revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner); } } _; } /// @inheritdoc IInbox function pause() external onlyRollupOrOwner { _pause(); } /// @inheritdoc IInbox function unpause() external onlyRollupOrOwner { _unpause(); } function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external initializer onlyDelegated { bridge = _bridge; sequencerInbox = _sequencerInbox; allowListEnabled = false; __Pausable_init(); } /// @inheritdoc IInbox function postUpgradeInit(IBridge _bridge) external onlyDelegated onlyProxyOwner { uint8 slotsToWipe = 3; for (uint8 i = 0; i < slotsToWipe; i++) { assembly { sstore(i, 0) } } allowListEnabled = false; bridge = _bridge; } /// @inheritdoc IInbox function sendL2MessageFromOrigin(bytes calldata messageData) external whenNotPaused onlyAllowed returns (uint256) { // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); if (messageData.length > MAX_DATA_SIZE) revert DataTooLarge(messageData.length, MAX_DATA_SIZE); uint256 msgNum = deliverToBridge(L2_MSG, msg.sender, keccak256(messageData)); emit InboxMessageDeliveredFromOrigin(msgNum); return msgNum; } /// @inheritdoc IInbox function sendL2Message(bytes calldata messageData) external whenNotPaused onlyAllowed returns (uint256) { return _deliverMessage(L2_MSG, msg.sender, messageData); } function sendL1FundedUnsignedTransaction( uint256 gasLimit, uint256 maxFeePerGas, uint256 nonce, address to, bytes calldata data ) external payable whenNotPaused onlyAllowed returns (uint256) { return _deliverMessage( L1MessageType_L2FundedByL1, msg.sender, abi.encodePacked( L2MessageType_unsignedEOATx, gasLimit, maxFeePerGas, nonce, uint256(uint160(to)), msg.value, data ) ); } function sendL1FundedContractTransaction( uint256 gasLimit, uint256 maxFeePerGas, address to, bytes calldata data ) external payable whenNotPaused onlyAllowed returns (uint256) { return _deliverMessage( L1MessageType_L2FundedByL1, msg.sender, abi.encodePacked( L2MessageType_unsignedContractTx, gasLimit, maxFeePerGas, uint256(uint160(to)), msg.value, data ) ); } function sendUnsignedTransaction( uint256 gasLimit, uint256 maxFeePerGas, uint256 nonce, address to, uint256 value, bytes calldata data ) external whenNotPaused onlyAllowed returns (uint256) { return _deliverMessage( L2_MSG, msg.sender, abi.encodePacked( L2MessageType_unsignedEOATx, gasLimit, maxFeePerGas, nonce, uint256(uint160(to)), value, data ) ); } function sendContractTransaction( uint256 gasLimit, uint256 maxFeePerGas, address to, uint256 value, bytes calldata data ) external whenNotPaused onlyAllowed returns (uint256) { return _deliverMessage( L2_MSG, msg.sender, abi.encodePacked( L2MessageType_unsignedContractTx, gasLimit, maxFeePerGas, uint256(uint160(to)), value, data ) ); } /// @inheritdoc IInbox function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) public view returns (uint256) { // Use current block basefee if baseFee parameter is 0 return (1400 + 6 * dataLength) * (baseFee == 0 ? block.basefee : baseFee); } /// @inheritdoc IInbox function depositEth() public payable whenNotPaused onlyAllowed returns (uint256) { address dest = msg.sender; // solhint-disable-next-line avoid-tx-origin if (AddressUpgradeable.isContract(msg.sender) || tx.origin != msg.sender) { // isContract check fails if this function is called during a contract's constructor. dest = AddressAliasHelper.applyL1ToL2Alias(msg.sender); } return _deliverMessage( L1MessageType_ethDeposit, msg.sender, abi.encodePacked(dest, msg.value) ); } /// @notice deprecated in favour of depositEth with no parameters function depositEth(uint256) external payable whenNotPaused onlyAllowed returns (uint256) { return depositEth(); } /** * @notice deprecated in favour of unsafeCreateRetryableTicket * @dev deprecated in favour of unsafeCreateRetryableTicket * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error * @param to destination L2 contract address * @param l2CallValue call value for retryable L2 message * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) * @param data ABI encoded data of L2 message * @return unique message number of the retryable transaction */ function createRetryableTicketNoRefundAliasRewrite( address to, uint256 l2CallValue, uint256 maxSubmissionCost, address excessFeeRefundAddress, address callValueRefundAddress, uint256 gasLimit, uint256 maxFeePerGas, bytes calldata data ) external payable whenNotPaused onlyAllowed returns (uint256) { return unsafeCreateRetryableTicket( to, l2CallValue, maxSubmissionCost, excessFeeRefundAddress, callValueRefundAddress, gasLimit, maxFeePerGas, data ); } /// @inheritdoc IInbox function createRetryableTicket( address to, uint256 l2CallValue, uint256 maxSubmissionCost, address excessFeeRefundAddress, address callValueRefundAddress, uint256 gasLimit, uint256 maxFeePerGas, bytes calldata data ) external payable whenNotPaused onlyAllowed returns (uint256) { // ensure the user's deposit alone will make submission succeed if (msg.value < (maxSubmissionCost + l2CallValue + gasLimit * maxFeePerGas)) { revert InsufficientValue( maxSubmissionCost + l2CallValue + gasLimit * maxFeePerGas, msg.value ); } // if a refund address is a contract, we apply the alias to it // so that it can access its funds on the L2 // since the beneficiary and other refund addresses don't get rewritten by arb-os if (AddressUpgradeable.isContract(excessFeeRefundAddress)) { excessFeeRefundAddress = AddressAliasHelper.applyL1ToL2Alias(excessFeeRefundAddress); } if (AddressUpgradeable.isContract(callValueRefundAddress)) { // this is the beneficiary. be careful since this is the address that can cancel the retryable in the L2 callValueRefundAddress = AddressAliasHelper.applyL1ToL2Alias(callValueRefundAddress); } return unsafeCreateRetryableTicket( to, l2CallValue, maxSubmissionCost, excessFeeRefundAddress, callValueRefundAddress, gasLimit, maxFeePerGas, data ); } /// @inheritdoc IInbox function unsafeCreateRetryableTicket( address to, uint256 l2CallValue, uint256 maxSubmissionCost, address excessFeeRefundAddress, address callValueRefundAddress, uint256 gasLimit, uint256 maxFeePerGas, bytes calldata data ) public payable whenNotPaused onlyAllowed returns (uint256) { // gas price and limit of 1 should never be a valid input, so instead they are used as // magic values to trigger a revert in eth calls that surface data without requiring a tx trace if (gasLimit == 1 || maxFeePerGas == 1) revert RetryableData( msg.sender, to, l2CallValue, msg.value, maxSubmissionCost, excessFeeRefundAddress, callValueRefundAddress, gasLimit, maxFeePerGas, data ); uint256 submissionFee = calculateRetryableSubmissionFee(data.length, block.basefee); if (maxSubmissionCost < submissionFee) revert InsufficientSubmissionCost(submissionFee, maxSubmissionCost); return _deliverMessage( L1MessageType_submitRetryableTx, msg.sender, abi.encodePacked( uint256(uint160(to)), l2CallValue, msg.value, maxSubmissionCost, uint256(uint160(excessFeeRefundAddress)), uint256(uint160(callValueRefundAddress)), gasLimit, maxFeePerGas, data.length, data ) ); } function _deliverMessage( uint8 _kind, address _sender, bytes memory _messageData ) internal returns (uint256) { if (_messageData.length > MAX_DATA_SIZE) revert DataTooLarge(_messageData.length, MAX_DATA_SIZE); uint256 msgNum = deliverToBridge(_kind, _sender, keccak256(_messageData)); emit InboxMessageDelivered(msgNum, _messageData); return msgNum; } function deliverToBridge( uint8 kind, address sender, bytes32 messageDataHash ) internal returns (uint256) { return bridge.enqueueDelayedMessage{value: msg.value}( kind, AddressAliasHelper.applyL1ToL2Alias(sender), messageDataHash ); } }
// Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.4; /// @dev Init was already called error AlreadyInit(); /// Init was called with param set to zero that must be nonzero error HadZeroInit(); /// @dev Thrown when non owner tries to access an only-owner function /// @param sender The msg.sender who is not the owner /// @param owner The owner address error NotOwner(address sender, address owner); /// @dev Thrown when an address that is not the rollup tries to call an only-rollup function /// @param sender The sender who is not the rollup /// @param rollup The rollup address authorized to call this function error NotRollup(address sender, address rollup); /// @dev Thrown when the contract was not called directly from the origin ie msg.sender != tx.origin error NotOrigin(); /// @dev Provided data was too large /// @param dataLength The length of the data that is too large /// @param maxDataLength The max length the data can be error DataTooLarge(uint256 dataLength, uint256 maxDataLength); /// @dev The provided is not a contract and was expected to be /// @param addr The adddress in question error NotContract(address addr); /// @dev The merkle proof provided was too long /// @param actualLength The length of the merkle proof provided /// @param maxProofLength The max length a merkle proof can have error MerkleProofTooLong(uint256 actualLength, uint256 maxProofLength); /// @dev Thrown when an un-authorized address tries to access an admin function /// @param sender The un-authorized sender /// @param rollup The rollup, which would be authorized /// @param owner The rollup's owner, which would be authorized error NotRollupOrOwner(address sender, address rollup, address owner); // Bridge Errors /// @dev Thrown when an un-authorized address tries to access an only-inbox function /// @param sender The un-authorized sender error NotDelayedInbox(address sender); /// @dev Thrown when an un-authorized address tries to access an only-sequencer-inbox function /// @param sender The un-authorized sender error NotSequencerInbox(address sender); /// @dev Thrown when an un-authorized address tries to access an only-outbox function /// @param sender The un-authorized sender error NotOutbox(address sender); /// @dev the provided outbox address isn't valid /// @param outbox address of outbox being set error InvalidOutboxSet(address outbox); // Inbox Errors /// @dev The contract is paused, so cannot be paused error AlreadyPaused(); /// @dev The contract is unpaused, so cannot be unpaused error AlreadyUnpaused(); /// @dev The contract is paused error Paused(); /// @dev msg.value sent to the inbox isn't high enough error InsufficientValue(uint256 expected, uint256 actual); /// @dev submission cost provided isn't enough to create retryable ticket error InsufficientSubmissionCost(uint256 expected, uint256 actual); /// @dev address not allowed to interact with the given contract error NotAllowedOrigin(address origin); /// @dev used to convey retryable tx data in eth calls without requiring a tx trace /// this follows a pattern similar to EIP-3668 where reverts surface call information error RetryableData( address from, address to, uint256 l2CallValue, uint256 deposit, uint256 maxSubmissionCost, address excessFeeRefundAddress, address callValueRefundAddress, uint256 gasLimit, uint256 maxFeePerGas, bytes data ); // Outbox Errors /// @dev The provided proof was too long /// @param proofLength The length of the too-long proof error ProofTooLong(uint256 proofLength); /// @dev The output index was greater than the maximum /// @param index The output index /// @param maxIndex The max the index could be error PathNotMinimal(uint256 index, uint256 maxIndex); /// @dev The calculated root does not exist /// @param root The calculated root error UnknownRoot(bytes32 root); /// @dev The record has already been spent /// @param index The index of the spent record error AlreadySpent(uint256 index); /// @dev A call to the bridge failed with no return data error BridgeCallFailed(); // Sequencer Inbox Errors /// @dev Thrown when someone attempts to read fewer messages than have already been read error DelayedBackwards(); /// @dev Thrown when someone attempts to read more messages than exist error DelayedTooFar(); /// @dev Force include can only read messages more blocks old than the delay period error ForceIncludeBlockTooSoon(); /// @dev Force include can only read messages more seconds old than the delay period error ForceIncludeTimeTooSoon(); /// @dev The message provided did not match the hash in the delayed inbox error IncorrectMessagePreimage(); /// @dev This can only be called by the batch poster error NotBatchPoster(); /// @dev The sequence number provided to this message was inconsistent with the number of batches already included error BadSequencerNumber(uint256 stored, uint256 received); /// @dev The batch data has the inbox authenticated bit set, but the batch data was not authenticated by the inbox error DataNotAuthenticated(); /// @dev Tried to create an already valid Data Availability Service keyset error AlreadyValidDASKeyset(bytes32); /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset error NoSuchKeyset(bytes32);
// Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; import "./IBridge.sol"; import "./IDelayedMessageProvider.sol"; import "./ISequencerInbox.sol"; interface IInbox is IDelayedMessageProvider { function bridge() external view returns (IBridge); function sequencerInbox() external view returns (ISequencerInbox); /** * @notice Send a generic L2 message to the chain * @dev This method is an optimization to avoid having to emit the entirety of the messageData in a log. Instead validators are expected to be able to parse the data from the transaction's input * @param messageData Data of the message being sent */ function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256); /** * @notice Send a generic L2 message to the chain * @dev This method can be used to send any type of message that doesn't require L1 validation * @param messageData Data of the message being sent */ function sendL2Message(bytes calldata messageData) external returns (uint256); function sendL1FundedUnsignedTransaction( uint256 gasLimit, uint256 maxFeePerGas, uint256 nonce, address to, bytes calldata data ) external payable returns (uint256); function sendL1FundedContractTransaction( uint256 gasLimit, uint256 maxFeePerGas, address to, bytes calldata data ) external payable returns (uint256); function sendUnsignedTransaction( uint256 gasLimit, uint256 maxFeePerGas, uint256 nonce, address to, uint256 value, bytes calldata data ) external returns (uint256); function sendContractTransaction( uint256 gasLimit, uint256 maxFeePerGas, address to, uint256 value, bytes calldata data ) external returns (uint256); /** * @notice Get the L1 fee for submitting a retryable * @dev This fee can be paid by funds already in the L2 aliased address or by the current message value * @dev This formula may change in the future, to future proof your code query this method instead of inlining!! * @param dataLength The length of the retryable's calldata, in bytes * @param baseFee The block basefee when the retryable is included in the chain, if 0 current block.basefee will be used */ function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) external view returns (uint256); /** * @notice Deposit eth from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract * @dev This does not trigger the fallback function when receiving in the L2 side. * Look into retryable tickets if you are interested in this functionality. * @dev This function should not be called inside contract constructors */ function depositEth() external payable returns (uint256); /** * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts * @dev all msg.value will deposited to callValueRefundAddress on L2 * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error * @param to destination L2 contract address * @param l2CallValue call value for retryable L2 message * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) * @param data ABI encoded data of L2 message * @return unique message number of the retryable transaction */ function createRetryableTicket( address to, uint256 l2CallValue, uint256 maxSubmissionCost, address excessFeeRefundAddress, address callValueRefundAddress, uint256 gasLimit, uint256 maxFeePerGas, bytes calldata data ) external payable returns (uint256); /** * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds * come from the deposit alone, rather than falling back on the user's L2 balance * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress). * createRetryableTicket method is the recommended standard. * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error * @param to destination L2 contract address * @param l2CallValue call value for retryable L2 message * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) * @param data ABI encoded data of L2 message * @return unique message number of the retryable transaction */ function unsafeCreateRetryableTicket( address to, uint256 l2CallValue, uint256 maxSubmissionCost, address excessFeeRefundAddress, address callValueRefundAddress, uint256 gasLimit, uint256 maxFeePerGas, bytes calldata data ) external payable returns (uint256); // ---------- onlyRollupOrOwner functions ---------- /// @notice pauses all inbox functionality function pause() external; /// @notice unpauses all inbox functionality function unpause() external; // ---------- initializer ---------- /** * @dev function to be called one time during the inbox upgrade process * this is used to fix the storage slots */ function postUpgradeInit(IBridge _bridge) external; function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external; }
// Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; pragma experimental ABIEncoderV2; import "../libraries/IGasRefunder.sol"; import "./IDelayedMessageProvider.sol"; import "./IBridge.sol"; interface ISequencerInbox is IDelayedMessageProvider { struct MaxTimeVariation { uint256 delayBlocks; uint256 futureBlocks; uint256 delaySeconds; uint256 futureSeconds; } struct TimeBounds { uint64 minTimestamp; uint64 maxTimestamp; uint64 minBlockNumber; uint64 maxBlockNumber; } enum BatchDataLocation { TxInput, SeparateBatchEvent, NoData } event SequencerBatchDelivered( uint256 indexed batchSequenceNumber, bytes32 indexed beforeAcc, bytes32 indexed afterAcc, bytes32 delayedAcc, uint256 afterDelayedMessagesRead, TimeBounds timeBounds, BatchDataLocation dataLocation ); event OwnerFunctionCalled(uint256 indexed id); /// @dev a separate event that emits batch data when this isn't easily accessible in the tx.input event SequencerBatchData(uint256 indexed batchSequenceNumber, bytes data); /// @dev a valid keyset was added event SetValidKeyset(bytes32 indexed keysetHash, bytes keysetBytes); /// @dev a keyset was invalidated event InvalidateKeyset(bytes32 indexed keysetHash); function totalDelayedMessagesRead() external view returns (uint256); function bridge() external view returns (IBridge); /// @dev The size of the batch header // solhint-disable-next-line func-name-mixedcase function HEADER_LENGTH() external view returns (uint256); /// @dev If the first batch data byte after the header has this bit set, /// the sequencer inbox has authenticated the data. Currently not used. // solhint-disable-next-line func-name-mixedcase function DATA_AUTHENTICATED_FLAG() external view returns (bytes1); function rollup() external view returns (IOwnable); function isBatchPoster(address) external view returns (bool); struct DasKeySetInfo { bool isValidKeyset; uint64 creationBlock; } // https://github.com/ethereum/solidity/issues/11826 // function maxTimeVariation() external view returns (MaxTimeVariation calldata); // function dasKeySetInfo(bytes32) external view returns (DasKeySetInfo calldata); /// @notice Force messages from the delayed inbox to be included in the chain /// Callable by any address, but message can only be force-included after maxTimeVariation.delayBlocks and /// maxTimeVariation.delaySeconds has elapsed. As part of normal behaviour the sequencer will include these /// messages so it's only necessary to call this if the sequencer is down, or not including any delayed messages. /// @param _totalDelayedMessagesRead The total number of messages to read up to /// @param kind The kind of the last message to be included /// @param l1BlockAndTime The l1 block and the l1 timestamp of the last message to be included /// @param baseFeeL1 The l1 gas price of the last message to be included /// @param sender The sender of the last message to be included /// @param messageDataHash The messageDataHash of the last message to be included function forceInclusion( uint256 _totalDelayedMessagesRead, uint8 kind, uint64[2] calldata l1BlockAndTime, uint256 baseFeeL1, address sender, bytes32 messageDataHash ) external; function inboxAccs(uint256 index) external view returns (bytes32); function batchCount() external view returns (uint256); function isValidKeysetHash(bytes32 ksHash) external view returns (bool); /// @notice the creation block is intended to still be available after a keyset is deleted function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256); // ---------- BatchPoster functions ---------- function addSequencerL2BatchFromOrigin( uint256 sequenceNumber, bytes calldata data, uint256 afterDelayedMessagesRead, IGasRefunder gasRefunder ) external; function addSequencerL2Batch( uint256 sequenceNumber, bytes calldata data, uint256 afterDelayedMessagesRead, IGasRefunder gasRefunder ) external; // ---------- onlyRollupOrOwner functions ---------- /** * @notice Set max delay for sequencer inbox * @param maxTimeVariation_ the maximum time variation parameters */ function setMaxTimeVariation(MaxTimeVariation memory maxTimeVariation_) external; /** * @notice Updates whether an address is authorized to be a batch poster at the sequencer inbox * @param addr the address * @param isBatchPoster_ if the specified address should be authorized as a batch poster */ function setIsBatchPoster(address addr, bool isBatchPoster_) external; /** * @notice Makes Data Availability Service keyset valid * @param keysetBytes bytes of the serialized keyset */ function setValidKeyset(bytes calldata keysetBytes) external; /** * @notice Invalidates a Data Availability Service keyset * @param ksHash hash of the keyset */ function invalidateKeysetHash(bytes32 ksHash) external; // ---------- initializer ---------- function initialize(IBridge bridge_, MaxTimeVariation calldata maxTimeVariation_) external; }
// Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; import "./IOwnable.sol"; interface IBridge { event MessageDelivered( uint256 indexed messageIndex, bytes32 indexed beforeInboxAcc, address inbox, uint8 kind, address sender, bytes32 messageDataHash, uint256 baseFeeL1, uint64 timestamp ); event BridgeCallTriggered( address indexed outbox, address indexed to, uint256 value, bytes data ); event InboxToggle(address indexed inbox, bool enabled); event OutboxToggle(address indexed outbox, bool enabled); event SequencerInboxUpdated(address newSequencerInbox); function allowedDelayedInboxList(uint256) external returns (address); function allowedOutboxList(uint256) external returns (address); /// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message. function delayedInboxAccs(uint256) external view returns (bytes32); /// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message. function sequencerInboxAccs(uint256) external view returns (bytes32); function rollup() external view returns (IOwnable); function sequencerInbox() external view returns (address); function activeOutbox() external view returns (address); function allowedDelayedInboxes(address inbox) external view returns (bool); function allowedOutboxes(address outbox) external view returns (bool); /** * @dev Enqueue a message in the delayed inbox accumulator. * These messages are later sequenced in the SequencerInbox, either * by the sequencer as part of a normal batch, or by force inclusion. */ function enqueueDelayedMessage( uint8 kind, address sender, bytes32 messageDataHash ) external payable returns (uint256); function executeCall( address to, uint256 value, bytes calldata data ) external returns (bool success, bytes memory returnData); function delayedMessageCount() external view returns (uint256); function sequencerMessageCount() external view returns (uint256); // ---------- onlySequencerInbox functions ---------- function enqueueSequencerMessage(bytes32 dataHash, uint256 afterDelayedMessagesRead) external returns ( uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 acc ); /** * @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type * This is done through a separate function entrypoint instead of allowing the sequencer inbox * to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either * every delayed inbox or every sequencer inbox call. */ function submitBatchSpendingReport(address batchPoster, bytes32 dataHash) external returns (uint256 msgNum); // ---------- onlyRollupOrOwner functions ---------- function setSequencerInbox(address _sequencerInbox) external; function setDelayedInbox(address inbox, bool enabled) external; function setOutbox(address inbox, bool enabled) external; // ---------- initializer ---------- function initialize(IOwnable rollup_) external; }
// Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; library Messages { function messageHash( uint8 kind, address sender, uint64 blockNumber, uint64 timestamp, uint256 inboxSeqNum, uint256 baseFeeL1, bytes32 messageDataHash ) internal pure returns (bytes32) { return keccak256( abi.encodePacked( kind, sender, blockNumber, timestamp, inboxSeqNum, baseFeeL1, messageDataHash ) ); } function accumulateInboxMessage(bytes32 prevAcc, bytes32 message) internal pure returns (bytes32) { return keccak256(abi.encodePacked(prevAcc, message)); } }
// Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; library AddressAliasHelper { uint160 internal constant OFFSET = uint160(0x1111000000000000000000000000000000001111); /// @notice Utility function that converts the address in the L1 that submitted a tx to /// the inbox to the msg.sender viewed in the L2 /// @param l1Address the address in the L1 that triggered the tx to L2 /// @return l2Address L2 address as viewed in msg.sender function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) { unchecked { l2Address = address(uint160(l1Address) + OFFSET); } } /// @notice Utility function that converts the msg.sender viewed in the L2 to the /// address in the L1 that submitted a tx to the inbox /// @param l2Address L2 address as viewed in msg.sender /// @return l1Address the address in the L1 that triggered the tx to L2 function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) { unchecked { l1Address = address(uint160(l2Address) - OFFSET); } } }
// Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; import {NotOwner} from "./Error.sol"; /// @dev A stateless contract that allows you to infer if the current call has been delegated or not /// Pattern used here is from UUPS implementation by the OpenZeppelin team abstract contract DelegateCallAware { address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegate call. This allows a function to be * callable on the proxy contract but not on the logic contract. */ modifier onlyDelegated() { require(address(this) != __self, "Function must be called through delegatecall"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "Function must not be called through delegatecall"); _; } /// @dev Check that msg.sender is the current EIP 1967 proxy admin modifier onlyProxyOwner() { // Storage slot with the admin of the proxy contract // This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1 bytes32 slot = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; address admin; assembly { admin := sload(slot) } if (msg.sender != admin) revert NotOwner(msg.sender, admin); _; } }
// Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.4; uint8 constant L2_MSG = 3; uint8 constant L1MessageType_L2FundedByL1 = 7; uint8 constant L1MessageType_submitRetryableTx = 9; uint8 constant L1MessageType_ethDeposit = 12; uint8 constant L1MessageType_batchPostingReport = 13; uint8 constant L2MessageType_unsignedEOATx = 0; uint8 constant L2MessageType_unsignedContractTx = 1; uint8 constant ROLLUP_PROTOCOL_EVENT_TYPE = 8; uint8 constant INITIALIZATION_MSG_TYPE = 11;
// Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.4; // 90% of Geth's 128KB tx size limit, leaving ~13KB for proving uint256 constant MAX_DATA_SIZE = 117964; uint64 constant NO_CHAL_INDEX = 0;
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.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 PausableUpgradeable is Initializable, ContextUpgradeable { /** * @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. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _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()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; interface IDelayedMessageProvider { /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator event InboxMessageDelivered(uint256 indexed messageNum, bytes data); /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator /// same as InboxMessageDelivered but the batch data is available in tx.input event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum); }
// Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 // solhint-disable-next-line compiler-version pragma solidity >=0.4.21 <0.9.0; interface IOwnable { function owner() external view returns (address); }
// Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; interface IGasRefunder { function onGasSpent( address payable spender, uint256 gasUsed, uint256 calldataSize ) external returns (bool success); } abstract contract GasRefundEnabled { /// @dev this refunds the sender for execution costs of the tx /// calldata costs are only refunded if `msg.sender == tx.origin` to guarantee the value refunded relates to charging /// for the `tx.input`. this avoids a possible attack where you generate large calldata from a contract and get over-refunded modifier refundsGas(IGasRefunder gasRefunder) { uint256 startGasLeft = gasleft(); _; if (address(gasRefunder) != address(0)) { uint256 calldataSize = 0; // if triggered in a contract call, the spender may be overrefunded by appending dummy data to the call // so we check if it is a top level call, which would mean the sender paid calldata as part of tx.input // solhint-disable-next-line avoid-tx-origin if (msg.sender == tx.origin) { assembly { calldataSize := calldatasize() } } gasRefunder.onGasSpent(payable(msg.sender), startGasLeft - gasleft(), calldataSize); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
{ "optimizer": { "enabled": true, "runs": 100 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"dataLength","type":"uint256"},{"internalType":"uint256","name":"maxDataLength","type":"uint256"}],"name":"DataTooLarge","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"InsufficientSubmissionCost","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"InsufficientValue","type":"error"},{"inputs":[{"internalType":"address","name":"origin","type":"address"}],"name":"NotAllowedOrigin","type":"error"},{"inputs":[],"name":"NotOrigin","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"NotOwner","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"rollup","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"NotRollupOrOwner","type":"error"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"l2CallValue","type":"uint256"},{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint256","name":"maxSubmissionCost","type":"uint256"},{"internalType":"address","name":"excessFeeRefundAddress","type":"address"},{"internalType":"address","name":"callValueRefundAddress","type":"address"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"RetryableData","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"val","type":"bool"}],"name":"AllowListAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isEnabled","type":"bool"}],"name":"AllowListEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"messageNum","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"InboxMessageDelivered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"messageNum","type":"uint256"}],"name":"InboxMessageDeliveredFromOrigin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"allowListEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"contract IBridge","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dataLength","type":"uint256"},{"internalType":"uint256","name":"baseFee","type":"uint256"}],"name":"calculateRetryableSubmissionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"l2CallValue","type":"uint256"},{"internalType":"uint256","name":"maxSubmissionCost","type":"uint256"},{"internalType":"address","name":"excessFeeRefundAddress","type":"address"},{"internalType":"address","name":"callValueRefundAddress","type":"address"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"createRetryableTicket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"l2CallValue","type":"uint256"},{"internalType":"uint256","name":"maxSubmissionCost","type":"uint256"},{"internalType":"address","name":"excessFeeRefundAddress","type":"address"},{"internalType":"address","name":"callValueRefundAddress","type":"address"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"createRetryableTicketNoRefundAliasRewrite","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"depositEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IBridge","name":"_bridge","type":"address"},{"internalType":"contract ISequencerInbox","name":"_sequencerInbox","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"contract IBridge","name":"_bridge","type":"address"}],"name":"postUpgradeInit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"sendContractTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"sendL1FundedContractTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"sendL1FundedUnsignedTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"messageData","type":"bytes"}],"name":"sendL2Message","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"messageData","type":"bytes"}],"name":"sendL2MessageFromOrigin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"sendUnsignedTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sequencerInbox","outputs":[{"internalType":"contract ISequencerInbox","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"user","type":"address[]"},{"internalType":"bool[]","name":"val","type":"bool[]"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_allowListEnabled","type":"bool"}],"name":"setAllowListEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"l2CallValue","type":"uint256"},{"internalType":"uint256","name":"maxSubmissionCost","type":"uint256"},{"internalType":"address","name":"excessFeeRefundAddress","type":"address"},{"internalType":"address","name":"callValueRefundAddress","type":"address"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unsafeCreateRetryableTicket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60a06040523060805234801561001457600080fd5b506080516121c7610037600039600081816108f101526110d601526121c76000f3fe6080604052600436106101405760003560e01c806367ef3ab8116100b6578063babcc5391161006f578063babcc53914610307578063c474d2c514610337578063e3de72a514610357578063e78cea9214610377578063ee35f327146103a4578063efeadb6d146103c457600080fd5b806367ef3ab81461026c5780636e6e8a6a1461027f5780638456cb59146102925780638a631aa6146102a7578063a66b327d146102c7578063b75436bb146102e757600080fd5b8063439370b111610108578063439370b1146101e6578063485cc955146101ee5780635075788b1461020e5780635c975abb1461022e5780635e91675814610246578063679b6ded1461025957600080fd5b80630f4d14e9146101455780631b871c8d1461016b5780631fe927cf1461017e57806322bd5c1c1461019e5780633f4ba83a146101cf575b600080fd5b6101586101533660046118b3565b6103e4565b6040519081526020015b60405180910390f35b610158610179366004611929565b610471565b34801561018a57600080fd5b506101586101993660046119cd565b610504565b3480156101aa57600080fd5b506066546101bf90600160a01b900460ff1681565b6040519015158152602001610162565b3480156101db57600080fd5b506101e4610622565b005b610158610762565b3480156101fa57600080fd5b506101e4610209366004611a0e565b610842565b34801561021a57600080fd5b50610158610229366004611a47565b610987565b34801561023a57600080fd5b5060335460ff166101bf565b610158610254366004611ac3565b610a36565b610158610267366004611929565b610ae1565b61015861027a366004611b2c565b610c09565b61015861028d366004611929565b610cb7565b34801561029e57600080fd5b506101e4610dff565b3480156102b357600080fd5b506101586102c2366004611b9e565b610f3c565b3480156102d357600080fd5b506101586102e2366004611bf2565b610fdd565b3480156102f357600080fd5b506101586103023660046119cd565b611015565b34801561031357600080fd5b506101bf610322366004611c14565b60676020526000908152604090205460ff1681565b34801561034357600080fd5b506101e4610352366004611c14565b6110cb565b34801561036357600080fd5b506101e4610372366004611d1c565b6111cd565b34801561038357600080fd5b50606554610397906001600160a01b031681565b6040516101629190611ddd565b3480156103b057600080fd5b50606654610397906001600160a01b031681565b3480156103d057600080fd5b506101e46103df366004611df1565b61144d565b60006103f260335460ff1690565b156104185760405162461bcd60e51b815260040161040f90611e0c565b60405180910390fd5b606654600160a01b900460ff16801561044157503260009081526067602052604090205460ff16155b156104615732604051630f51ed7160e41b815260040161040f9190611ddd565b610469610762565b90505b919050565b600061047f60335460ff1690565b1561049c5760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff1680156104c557503260009081526067602052604090205460ff16155b156104e55732604051630f51ed7160e41b815260040161040f9190611ddd565b6104f68a8a8a8a8a8a8a8a8a610cb7565b9a9950505050505050505050565b600061051260335460ff1690565b1561052f5760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff16801561055857503260009081526067602052604090205460ff16155b156105785732604051630f51ed7160e41b815260040161040f9190611ddd565b3332146105985760405163feb3d07160e01b815260040160405180910390fd5b6201cccc8211156105c857604051634634691b60e01b8152600481018390526201cccc602482015260440161040f565b60006105ed60033386866040516105e0929190611e36565b604051809103902061162c565b60405190915081907fab532385be8f1005a4b6ba8fa20a2245facb346134ac739fe9a5198dc1580b9c90600090a29392505050565b6065546040805163cb23bcb560e01b815290516000926001600160a01b03169163cb23bcb5916004808301926020929190829003018186803b15801561066757600080fd5b505afa15801561067b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069f9190611e46565b9050336001600160a01b03821614610757576000816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ec57600080fd5b505afa158015610700573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107249190611e46565b9050336001600160a01b0382161461075557338282604051630739600760e01b815260040161040f93929190611e63565b505b61075f6116de565b50565b600061077060335460ff1690565b1561078d5760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff1680156107b657503260009081526067602052604090205460ff16155b156107d65732604051630f51ed7160e41b815260040161040f9190611ddd565b33803b1515806107e65750323314155b156107f957503361111161111160901b01015b6040516bffffffffffffffffffffffff19606083901b16602082015234603482015261083c90600c9033906054015b60405160208183030381529060405261176b565b91505090565b600054610100900460ff1661085d5760005460ff1615610861565b303b155b6108c45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161040f565b600054610100900460ff161580156108e6576000805461ffff19166101011790555b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561092f5760405162461bcd60e51b815260040161040f90611e86565b606580546001600160a01b038086166001600160a01b031990921691909117909155606680546001600160a81b0319169184169190911790556109706117f7565b8015610982576000805461ff00191690555b505050565b600061099560335460ff1690565b156109b25760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff1680156109db57503260009081526067602052604090205460ff16155b156109fb5732604051630f51ed7160e41b815260040161040f9190611ddd565b610a2a60033360008b8b8b8b6001600160a01b03168b8b8b604051602001610828989796959493929190611ed2565b98975050505050505050565b6000610a4460335460ff1690565b15610a615760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff168015610a8a57503260009081526067602052604090205460ff16155b15610aaa5732604051630f51ed7160e41b815260040161040f9190611ddd565b610ad760073360018989896001600160a01b0316348a8a6040516020016108289796959493929190611f18565b9695505050505050565b6000610aef60335460ff1690565b15610b0c5760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff168015610b3557503260009081526067602052604090205460ff16155b15610b555732604051630f51ed7160e41b815260040161040f9190611ddd565b610b5f8486611f6d565b610b698a8a611f8c565b610b739190611f8c565b341015610bbb57610b848486611f6d565b610b8e8a8a611f8c565b610b989190611f8c565b604051631c102d6360e21b8152600481019190915234602482015260440161040f565b6001600160a01b0387163b15610bda5761111161111160901b01870196505b6001600160a01b0386163b156104e55761111161111160901b01860195506104f68a8a8a8a8a8a8a8a8a610cb7565b6000610c1760335460ff1690565b15610c345760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff168015610c5d57503260009081526067602052604090205460ff16155b15610c7d5732604051630f51ed7160e41b815260040161040f9190611ddd565b610cac60073360008a8a8a8a6001600160a01b0316348b8b604051602001610828989796959493929190611ed2565b979650505050505050565b6000610cc560335460ff1690565b15610ce25760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff168015610d0b57503260009081526067602052604090205460ff16155b15610d2b5732604051630f51ed7160e41b815260040161040f9190611ddd565b8460011480610d3a5750836001145b15610d6e57338a8a348b8b8b8b8b8b8b6040516307c266e360e01b815260040161040f9b9a99989796959493929190611fa4565b6000610d7a8348610fdd565b905080891015610da757604051637d6f91c560e11b815260048101829052602481018a905260440161040f565b610df06009338d6001600160a01b03168d348e8e6001600160a01b03168e6001600160a01b03168e8e8e8e90508f8f6040516020016108289b9a9998979695949392919061202d565b9b9a5050505050505050505050565b6065546040805163cb23bcb560e01b815290516000926001600160a01b03169163cb23bcb5916004808301926020929190829003018186803b158015610e4457600080fd5b505afa158015610e58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7c9190611e46565b9050336001600160a01b03821614610f34576000816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ec957600080fd5b505afa158015610edd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f019190611e46565b9050336001600160a01b03821614610f3257338282604051630739600760e01b815260040161040f93929190611e63565b505b61075f611828565b6000610f4a60335460ff1690565b15610f675760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff168015610f9057503260009081526067602052604090205460ff16155b15610fb05732604051630f51ed7160e41b815260040161040f9190611ddd565b610cac60033360018a8a8a6001600160a01b03168a8a8a6040516020016108289796959493929190611f18565b60008115610feb5781610fed565b485b610ff8846006611f6d565b61100490610578611f8c565b61100e9190611f6d565b9392505050565b600061102360335460ff1690565b156110405760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff16801561106957503260009081526067602052604090205460ff16155b156110895732604051630f51ed7160e41b815260040161040f9190611ddd565b61100e60033385858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061176b92505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156111145760405162461bcd60e51b815260040161040f90611e86565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038054336001600160a01b0382161461117157604051631194af8760e11b81523360048201526001600160a01b038216602482015260440161040f565b600360005b8160ff168160ff16101561119a57600081558061119281612087565b915050611176565b50506066805460ff60a01b191690555050606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546040805163cb23bcb560e01b815290516000926001600160a01b03169163cb23bcb5916004808301926020929190829003018186803b15801561121257600080fd5b505afa158015611226573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124a9190611e46565b9050336001600160a01b03821614611302576000816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561129757600080fd5b505afa1580156112ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cf9190611e46565b9050336001600160a01b0382161461130057338282604051630739600760e01b815260040161040f93929190611e63565b505b81518351146113435760405162461bcd60e51b815260206004820152600d60248201526c1253959053125117d253941555609a1b604482015260640161040f565b60005b835181101561144757828181518110611361576113616120a7565b60200260200101516067600086848151811061137f5761137f6120a7565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055508381815181106113d0576113d06120a7565b60200260200101516001600160a01b03167fd9739f45a01ce092c5cdb3d68f63d63d21676b1c6c0b4f9cbc6be4cf5449595a848381518110611414576114146120a7565b602002602001015160405161142d911515815260200190565b60405180910390a28061143f816120bd565b915050611346565b50505050565b6065546040805163cb23bcb560e01b815290516000926001600160a01b03169163cb23bcb5916004808301926020929190829003018186803b15801561149257600080fd5b505afa1580156114a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ca9190611e46565b9050336001600160a01b03821614611582576000816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561151757600080fd5b505afa15801561152b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154f9190611e46565b9050336001600160a01b0382161461158057338282604051630739600760e01b815260040161040f93929190611e63565b505b606660149054906101000a900460ff16151582151514156115d35760405162461bcd60e51b815260206004820152600b60248201526a1053149150511657d4d15560aa1b604482015260640161040f565b60668054831515600160a01b0260ff60a01b199091161790556040517f16435b45f7482047f839a6a19d291442627200f52cad2803c595150d0d440eb39061162090841515815260200190565b60405180910390a15050565b6065546000906001600160a01b0316638db5993b348661111161111160901b0187016040516001600160e01b031960e086901b16815260ff90921660048301526001600160a01b03166024820152604481018690526064016020604051808303818588803b15801561169d57600080fd5b505af11580156116b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906116d691906120d8565b949350505050565b60335460ff166117275760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161040f565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516117619190611ddd565b60405180910390a1565b60006201cccc825111156117a1578151604051634634691b60e01b815260048101919091526201cccc602482015260440161040f565b60006117b58585858051906020012061162c565b9050807fff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b846040516117e791906120f1565b60405180910390a2949350505050565b600054610100900460ff1661181e5760405162461bcd60e51b815260040161040f90612146565b611826611880565b565b60335460ff161561184b5760405162461bcd60e51b815260040161040f90611e0c565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586117543390565b600054610100900460ff166118a75760405162461bcd60e51b815260040161040f90612146565b6033805460ff19169055565b6000602082840312156118c557600080fd5b5035919050565b6001600160a01b038116811461075f57600080fd5b60008083601f8401126118f357600080fd5b5081356001600160401b0381111561190a57600080fd5b60208301915083602082850101111561192257600080fd5b9250929050565b60008060008060008060008060006101008a8c03121561194857600080fd5b8935611953816118cc565b985060208a0135975060408a0135965060608a0135611971816118cc565b955060808a0135611981816118cc565b945060a08a0135935060c08a0135925060e08a01356001600160401b038111156119aa57600080fd5b6119b68c828d016118e1565b915080935050809150509295985092959850929598565b600080602083850312156119e057600080fd5b82356001600160401b038111156119f657600080fd5b611a02858286016118e1565b90969095509350505050565b60008060408385031215611a2157600080fd5b8235611a2c816118cc565b91506020830135611a3c816118cc565b809150509250929050565b600080600080600080600060c0888a031215611a6257600080fd5b8735965060208801359550604088013594506060880135611a82816118cc565b93506080880135925060a08801356001600160401b03811115611aa457600080fd5b611ab08a828b016118e1565b989b979a50959850939692959293505050565b600080600080600060808688031215611adb57600080fd5b85359450602086013593506040860135611af4816118cc565b925060608601356001600160401b03811115611b0f57600080fd5b611b1b888289016118e1565b969995985093965092949392505050565b60008060008060008060a08789031215611b4557600080fd5b8635955060208701359450604087013593506060870135611b65816118cc565b925060808701356001600160401b03811115611b8057600080fd5b611b8c89828a016118e1565b979a9699509497509295939492505050565b60008060008060008060a08789031215611bb757600080fd5b86359550602087013594506040870135611bd0816118cc565b93506060870135925060808701356001600160401b03811115611b8057600080fd5b60008060408385031215611c0557600080fd5b50508035926020909101359150565b600060208284031215611c2657600080fd5b813561100e816118cc565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611c6f57611c6f611c31565b604052919050565b60006001600160401b03821115611c9057611c90611c31565b5060051b60200190565b8035801515811461046c57600080fd5b600082601f830112611cbb57600080fd5b81356020611cd0611ccb83611c77565b611c47565b82815260059290921b84018101918181019086841115611cef57600080fd5b8286015b84811015611d1157611d0481611c9a565b8352918301918301611cf3565b509695505050505050565b60008060408385031215611d2f57600080fd5b82356001600160401b0380821115611d4657600080fd5b818501915085601f830112611d5a57600080fd5b81356020611d6a611ccb83611c77565b82815260059290921b84018101918181019089841115611d8957600080fd5b948201945b83861015611db0578535611da1816118cc565b82529482019490820190611d8e565b96505086013592505080821115611dc657600080fd5b50611dd385828601611caa565b9150509250929050565b6001600160a01b0391909116815260200190565b600060208284031215611e0357600080fd5b61100e82611c9a565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b8183823760009101908152919050565b600060208284031215611e5857600080fd5b815161100e816118cc565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b60ff60f81b8960f81b168152876001820152866021820152856041820152846061820152836081820152818360a18301376000910160a101908152979650505050505050565b60ff60f81b8860f81b16815286600182015285602182015284604182015283606182015281836081830137600091016081019081529695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611f8757611f87611f57565b500290565b60008219821115611f9f57611f9f611f57565b500190565b6001600160a01b038c811682528b81166020830152604082018b9052606082018a90526080820189905287811660a0830152861660c082015260e0810185905261010081018490526101406101208201819052810182905260006101608385828501376000838501820152601f909301601f19169091019091019b9a5050505050505050505050565b8b81528a60208201528960408201528860608201528760808201528660a08201528560c08201528460e08201528361010082015260006101208385828501376000929093019092019081529b9a5050505050505050505050565b600060ff821660ff81141561209e5761209e611f57565b60010192915050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156120d1576120d1611f57565b5060010190565b6000602082840312156120ea57600080fd5b5051919050565b600060208083528351808285015260005b8181101561211e57858101830151858201604001528201612102565b81811115612130576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220d297b2123f27e6d97d871cbac6b6481b0721d22eaab519255c96c291c00231bc64736f6c63430008090033
Deployed Bytecode
0x6080604052600436106101405760003560e01c806367ef3ab8116100b6578063babcc5391161006f578063babcc53914610307578063c474d2c514610337578063e3de72a514610357578063e78cea9214610377578063ee35f327146103a4578063efeadb6d146103c457600080fd5b806367ef3ab81461026c5780636e6e8a6a1461027f5780638456cb59146102925780638a631aa6146102a7578063a66b327d146102c7578063b75436bb146102e757600080fd5b8063439370b111610108578063439370b1146101e6578063485cc955146101ee5780635075788b1461020e5780635c975abb1461022e5780635e91675814610246578063679b6ded1461025957600080fd5b80630f4d14e9146101455780631b871c8d1461016b5780631fe927cf1461017e57806322bd5c1c1461019e5780633f4ba83a146101cf575b600080fd5b6101586101533660046118b3565b6103e4565b6040519081526020015b60405180910390f35b610158610179366004611929565b610471565b34801561018a57600080fd5b506101586101993660046119cd565b610504565b3480156101aa57600080fd5b506066546101bf90600160a01b900460ff1681565b6040519015158152602001610162565b3480156101db57600080fd5b506101e4610622565b005b610158610762565b3480156101fa57600080fd5b506101e4610209366004611a0e565b610842565b34801561021a57600080fd5b50610158610229366004611a47565b610987565b34801561023a57600080fd5b5060335460ff166101bf565b610158610254366004611ac3565b610a36565b610158610267366004611929565b610ae1565b61015861027a366004611b2c565b610c09565b61015861028d366004611929565b610cb7565b34801561029e57600080fd5b506101e4610dff565b3480156102b357600080fd5b506101586102c2366004611b9e565b610f3c565b3480156102d357600080fd5b506101586102e2366004611bf2565b610fdd565b3480156102f357600080fd5b506101586103023660046119cd565b611015565b34801561031357600080fd5b506101bf610322366004611c14565b60676020526000908152604090205460ff1681565b34801561034357600080fd5b506101e4610352366004611c14565b6110cb565b34801561036357600080fd5b506101e4610372366004611d1c565b6111cd565b34801561038357600080fd5b50606554610397906001600160a01b031681565b6040516101629190611ddd565b3480156103b057600080fd5b50606654610397906001600160a01b031681565b3480156103d057600080fd5b506101e46103df366004611df1565b61144d565b60006103f260335460ff1690565b156104185760405162461bcd60e51b815260040161040f90611e0c565b60405180910390fd5b606654600160a01b900460ff16801561044157503260009081526067602052604090205460ff16155b156104615732604051630f51ed7160e41b815260040161040f9190611ddd565b610469610762565b90505b919050565b600061047f60335460ff1690565b1561049c5760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff1680156104c557503260009081526067602052604090205460ff16155b156104e55732604051630f51ed7160e41b815260040161040f9190611ddd565b6104f68a8a8a8a8a8a8a8a8a610cb7565b9a9950505050505050505050565b600061051260335460ff1690565b1561052f5760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff16801561055857503260009081526067602052604090205460ff16155b156105785732604051630f51ed7160e41b815260040161040f9190611ddd565b3332146105985760405163feb3d07160e01b815260040160405180910390fd5b6201cccc8211156105c857604051634634691b60e01b8152600481018390526201cccc602482015260440161040f565b60006105ed60033386866040516105e0929190611e36565b604051809103902061162c565b60405190915081907fab532385be8f1005a4b6ba8fa20a2245facb346134ac739fe9a5198dc1580b9c90600090a29392505050565b6065546040805163cb23bcb560e01b815290516000926001600160a01b03169163cb23bcb5916004808301926020929190829003018186803b15801561066757600080fd5b505afa15801561067b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069f9190611e46565b9050336001600160a01b03821614610757576000816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ec57600080fd5b505afa158015610700573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107249190611e46565b9050336001600160a01b0382161461075557338282604051630739600760e01b815260040161040f93929190611e63565b505b61075f6116de565b50565b600061077060335460ff1690565b1561078d5760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff1680156107b657503260009081526067602052604090205460ff16155b156107d65732604051630f51ed7160e41b815260040161040f9190611ddd565b33803b1515806107e65750323314155b156107f957503361111161111160901b01015b6040516bffffffffffffffffffffffff19606083901b16602082015234603482015261083c90600c9033906054015b60405160208183030381529060405261176b565b91505090565b600054610100900460ff1661085d5760005460ff1615610861565b303b155b6108c45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161040f565b600054610100900460ff161580156108e6576000805461ffff19166101011790555b306001600160a01b037f0000000000000000000000003e2198a77fc6b266082b9285909217076354873016141561092f5760405162461bcd60e51b815260040161040f90611e86565b606580546001600160a01b038086166001600160a01b031990921691909117909155606680546001600160a81b0319169184169190911790556109706117f7565b8015610982576000805461ff00191690555b505050565b600061099560335460ff1690565b156109b25760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff1680156109db57503260009081526067602052604090205460ff16155b156109fb5732604051630f51ed7160e41b815260040161040f9190611ddd565b610a2a60033360008b8b8b8b6001600160a01b03168b8b8b604051602001610828989796959493929190611ed2565b98975050505050505050565b6000610a4460335460ff1690565b15610a615760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff168015610a8a57503260009081526067602052604090205460ff16155b15610aaa5732604051630f51ed7160e41b815260040161040f9190611ddd565b610ad760073360018989896001600160a01b0316348a8a6040516020016108289796959493929190611f18565b9695505050505050565b6000610aef60335460ff1690565b15610b0c5760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff168015610b3557503260009081526067602052604090205460ff16155b15610b555732604051630f51ed7160e41b815260040161040f9190611ddd565b610b5f8486611f6d565b610b698a8a611f8c565b610b739190611f8c565b341015610bbb57610b848486611f6d565b610b8e8a8a611f8c565b610b989190611f8c565b604051631c102d6360e21b8152600481019190915234602482015260440161040f565b6001600160a01b0387163b15610bda5761111161111160901b01870196505b6001600160a01b0386163b156104e55761111161111160901b01860195506104f68a8a8a8a8a8a8a8a8a610cb7565b6000610c1760335460ff1690565b15610c345760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff168015610c5d57503260009081526067602052604090205460ff16155b15610c7d5732604051630f51ed7160e41b815260040161040f9190611ddd565b610cac60073360008a8a8a8a6001600160a01b0316348b8b604051602001610828989796959493929190611ed2565b979650505050505050565b6000610cc560335460ff1690565b15610ce25760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff168015610d0b57503260009081526067602052604090205460ff16155b15610d2b5732604051630f51ed7160e41b815260040161040f9190611ddd565b8460011480610d3a5750836001145b15610d6e57338a8a348b8b8b8b8b8b8b6040516307c266e360e01b815260040161040f9b9a99989796959493929190611fa4565b6000610d7a8348610fdd565b905080891015610da757604051637d6f91c560e11b815260048101829052602481018a905260440161040f565b610df06009338d6001600160a01b03168d348e8e6001600160a01b03168e6001600160a01b03168e8e8e8e90508f8f6040516020016108289b9a9998979695949392919061202d565b9b9a5050505050505050505050565b6065546040805163cb23bcb560e01b815290516000926001600160a01b03169163cb23bcb5916004808301926020929190829003018186803b158015610e4457600080fd5b505afa158015610e58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7c9190611e46565b9050336001600160a01b03821614610f34576000816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ec957600080fd5b505afa158015610edd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f019190611e46565b9050336001600160a01b03821614610f3257338282604051630739600760e01b815260040161040f93929190611e63565b505b61075f611828565b6000610f4a60335460ff1690565b15610f675760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff168015610f9057503260009081526067602052604090205460ff16155b15610fb05732604051630f51ed7160e41b815260040161040f9190611ddd565b610cac60033360018a8a8a6001600160a01b03168a8a8a6040516020016108289796959493929190611f18565b60008115610feb5781610fed565b485b610ff8846006611f6d565b61100490610578611f8c565b61100e9190611f6d565b9392505050565b600061102360335460ff1690565b156110405760405162461bcd60e51b815260040161040f90611e0c565b606654600160a01b900460ff16801561106957503260009081526067602052604090205460ff16155b156110895732604051630f51ed7160e41b815260040161040f9190611ddd565b61100e60033385858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061176b92505050565b306001600160a01b037f0000000000000000000000003e2198a77fc6b266082b928590921707635487301614156111145760405162461bcd60e51b815260040161040f90611e86565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038054336001600160a01b0382161461117157604051631194af8760e11b81523360048201526001600160a01b038216602482015260440161040f565b600360005b8160ff168160ff16101561119a57600081558061119281612087565b915050611176565b50506066805460ff60a01b191690555050606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546040805163cb23bcb560e01b815290516000926001600160a01b03169163cb23bcb5916004808301926020929190829003018186803b15801561121257600080fd5b505afa158015611226573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124a9190611e46565b9050336001600160a01b03821614611302576000816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561129757600080fd5b505afa1580156112ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cf9190611e46565b9050336001600160a01b0382161461130057338282604051630739600760e01b815260040161040f93929190611e63565b505b81518351146113435760405162461bcd60e51b815260206004820152600d60248201526c1253959053125117d253941555609a1b604482015260640161040f565b60005b835181101561144757828181518110611361576113616120a7565b60200260200101516067600086848151811061137f5761137f6120a7565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055508381815181106113d0576113d06120a7565b60200260200101516001600160a01b03167fd9739f45a01ce092c5cdb3d68f63d63d21676b1c6c0b4f9cbc6be4cf5449595a848381518110611414576114146120a7565b602002602001015160405161142d911515815260200190565b60405180910390a28061143f816120bd565b915050611346565b50505050565b6065546040805163cb23bcb560e01b815290516000926001600160a01b03169163cb23bcb5916004808301926020929190829003018186803b15801561149257600080fd5b505afa1580156114a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ca9190611e46565b9050336001600160a01b03821614611582576000816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561151757600080fd5b505afa15801561152b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154f9190611e46565b9050336001600160a01b0382161461158057338282604051630739600760e01b815260040161040f93929190611e63565b505b606660149054906101000a900460ff16151582151514156115d35760405162461bcd60e51b815260206004820152600b60248201526a1053149150511657d4d15560aa1b604482015260640161040f565b60668054831515600160a01b0260ff60a01b199091161790556040517f16435b45f7482047f839a6a19d291442627200f52cad2803c595150d0d440eb39061162090841515815260200190565b60405180910390a15050565b6065546000906001600160a01b0316638db5993b348661111161111160901b0187016040516001600160e01b031960e086901b16815260ff90921660048301526001600160a01b03166024820152604481018690526064016020604051808303818588803b15801561169d57600080fd5b505af11580156116b1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906116d691906120d8565b949350505050565b60335460ff166117275760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161040f565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516117619190611ddd565b60405180910390a1565b60006201cccc825111156117a1578151604051634634691b60e01b815260048101919091526201cccc602482015260440161040f565b60006117b58585858051906020012061162c565b9050807fff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b846040516117e791906120f1565b60405180910390a2949350505050565b600054610100900460ff1661181e5760405162461bcd60e51b815260040161040f90612146565b611826611880565b565b60335460ff161561184b5760405162461bcd60e51b815260040161040f90611e0c565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586117543390565b600054610100900460ff166118a75760405162461bcd60e51b815260040161040f90612146565b6033805460ff19169055565b6000602082840312156118c557600080fd5b5035919050565b6001600160a01b038116811461075f57600080fd5b60008083601f8401126118f357600080fd5b5081356001600160401b0381111561190a57600080fd5b60208301915083602082850101111561192257600080fd5b9250929050565b60008060008060008060008060006101008a8c03121561194857600080fd5b8935611953816118cc565b985060208a0135975060408a0135965060608a0135611971816118cc565b955060808a0135611981816118cc565b945060a08a0135935060c08a0135925060e08a01356001600160401b038111156119aa57600080fd5b6119b68c828d016118e1565b915080935050809150509295985092959850929598565b600080602083850312156119e057600080fd5b82356001600160401b038111156119f657600080fd5b611a02858286016118e1565b90969095509350505050565b60008060408385031215611a2157600080fd5b8235611a2c816118cc565b91506020830135611a3c816118cc565b809150509250929050565b600080600080600080600060c0888a031215611a6257600080fd5b8735965060208801359550604088013594506060880135611a82816118cc565b93506080880135925060a08801356001600160401b03811115611aa457600080fd5b611ab08a828b016118e1565b989b979a50959850939692959293505050565b600080600080600060808688031215611adb57600080fd5b85359450602086013593506040860135611af4816118cc565b925060608601356001600160401b03811115611b0f57600080fd5b611b1b888289016118e1565b969995985093965092949392505050565b60008060008060008060a08789031215611b4557600080fd5b8635955060208701359450604087013593506060870135611b65816118cc565b925060808701356001600160401b03811115611b8057600080fd5b611b8c89828a016118e1565b979a9699509497509295939492505050565b60008060008060008060a08789031215611bb757600080fd5b86359550602087013594506040870135611bd0816118cc565b93506060870135925060808701356001600160401b03811115611b8057600080fd5b60008060408385031215611c0557600080fd5b50508035926020909101359150565b600060208284031215611c2657600080fd5b813561100e816118cc565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611c6f57611c6f611c31565b604052919050565b60006001600160401b03821115611c9057611c90611c31565b5060051b60200190565b8035801515811461046c57600080fd5b600082601f830112611cbb57600080fd5b81356020611cd0611ccb83611c77565b611c47565b82815260059290921b84018101918181019086841115611cef57600080fd5b8286015b84811015611d1157611d0481611c9a565b8352918301918301611cf3565b509695505050505050565b60008060408385031215611d2f57600080fd5b82356001600160401b0380821115611d4657600080fd5b818501915085601f830112611d5a57600080fd5b81356020611d6a611ccb83611c77565b82815260059290921b84018101918181019089841115611d8957600080fd5b948201945b83861015611db0578535611da1816118cc565b82529482019490820190611d8e565b96505086013592505080821115611dc657600080fd5b50611dd385828601611caa565b9150509250929050565b6001600160a01b0391909116815260200190565b600060208284031215611e0357600080fd5b61100e82611c9a565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b8183823760009101908152919050565b600060208284031215611e5857600080fd5b815161100e816118cc565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b60ff60f81b8960f81b168152876001820152866021820152856041820152846061820152836081820152818360a18301376000910160a101908152979650505050505050565b60ff60f81b8860f81b16815286600182015285602182015284604182015283606182015281836081830137600091016081019081529695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611f8757611f87611f57565b500290565b60008219821115611f9f57611f9f611f57565b500190565b6001600160a01b038c811682528b81166020830152604082018b9052606082018a90526080820189905287811660a0830152861660c082015260e0810185905261010081018490526101406101208201819052810182905260006101608385828501376000838501820152601f909301601f19169091019091019b9a5050505050505050505050565b8b81528a60208201528960408201528860608201528760808201528660a08201528560c08201528460e08201528361010082015260006101208385828501376000929093019092019081529b9a5050505050505050505050565b600060ff821660ff81141561209e5761209e611f57565b60010192915050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156120d1576120d1611f57565b5060010190565b6000602082840312156120ea57600080fd5b5051919050565b600060208083528351808285015260005b8181101561211e57858101830151858201604001528201612102565b81811115612130576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220d297b2123f27e6d97d871cbac6b6481b0721d22eaab519255c96c291c00231bc64736f6c63430008090033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.