123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- // Copyright 2021-2022, Offchain Labs, Inc.
- // For license information, see https://github.com/nitro/blob/master/LICENSE
- // SPDX-License-Identifier: BUSL-1.1
- // OpenZeppelin Contracts (last updated v4.8.0-rc.2) (vendor/arbitrum/IOutbox.sol)
- // solhint-disable-next-line compiler-version
- pragma solidity >=0.6.9 <0.9.0;
- import "./IBridge.sol";
- interface IOutbox {
- event SendRootUpdated(bytes32 indexed blockHash, bytes32 indexed outputRoot);
- event OutBoxTransactionExecuted(
- address indexed to,
- address indexed l2Sender,
- uint256 indexed zero,
- uint256 transactionIndex
- );
- function rollup() external view returns (address); // the rollup contract
- function bridge() external view returns (IBridge); // the bridge contract
- function spent(uint256) external view returns (bytes32); // packed spent bitmap
- function roots(bytes32) external view returns (bytes32); // maps root hashes => L2 block hash
- // solhint-disable-next-line func-name-mixedcase
- function OUTBOX_VERSION() external view returns (uint128); // the outbox version
- function updateSendRoot(bytes32 sendRoot, bytes32 l2BlockHash) external;
- /// @notice When l2ToL1Sender returns a nonzero address, the message was originated by an L2 account
- /// When the return value is zero, that means this is a system message
- /// @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentrancies
- function l2ToL1Sender() external view returns (address);
- /// @return l2Block return L2 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
- function l2ToL1Block() external view returns (uint256);
- /// @return l1Block return L1 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
- function l2ToL1EthBlock() external view returns (uint256);
- /// @return timestamp return L2 timestamp when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
- function l2ToL1Timestamp() external view returns (uint256);
- /// @return outputId returns the unique output identifier of the L2 to L1 tx or 0 if no L2 to L1 transaction is active
- function l2ToL1OutputId() external view returns (bytes32);
- /**
- * @notice Executes a messages in an Outbox entry.
- * @dev Reverts if dispute period hasn't expired, since the outbox entry
- * is only created once the rollup confirms the respective assertion.
- * @dev it is not possible to execute any L2-to-L1 transaction which contains data
- * to a contract address without any code (as enforced by the Bridge contract).
- * @param proof Merkle proof of message inclusion in send root
- * @param index Merkle path to message
- * @param l2Sender sender if original message (i.e., caller of ArbSys.sendTxToL1)
- * @param to destination address for L1 contract call
- * @param l2Block l2 block number at which sendTxToL1 call was made
- * @param l1Block l1 block number at which sendTxToL1 call was made
- * @param l2Timestamp l2 Timestamp at which sendTxToL1 call was made
- * @param value wei in L1 message
- * @param data abi-encoded L1 message data
- */
- function executeTransaction(
- bytes32[] calldata proof,
- uint256 index,
- address l2Sender,
- address to,
- uint256 l2Block,
- uint256 l1Block,
- uint256 l2Timestamp,
- uint256 value,
- bytes calldata data
- ) external;
- /**
- * @dev function used to simulate the result of a particular function call from the outbox
- * it is useful for things such as gas estimates. This function includes all costs except for
- * proof validation (which can be considered offchain as a somewhat of a fixed cost - it's
- * not really a fixed cost, but can be treated as so with a fixed overhead for gas estimation).
- * We can't include the cost of proof validation since this is intended to be used to simulate txs
- * that are included in yet-to-be confirmed merkle roots. The simulation entrypoint could instead pretend
- * to confirm a pending merkle root, but that would be less practical for integrating with tooling.
- * It is only possible to trigger it when the msg sender is address zero, which should be impossible
- * unless under simulation in an eth_call or eth_estimateGas
- */
- function executeTransactionSimulation(
- uint256 index,
- address l2Sender,
- address to,
- uint256 l2Block,
- uint256 l1Block,
- uint256 l2Timestamp,
- uint256 value,
- bytes calldata data
- ) external;
- /**
- * @param index Merkle path to message
- * @return true if the message has been spent
- */
- function isSpent(uint256 index) external view returns (bool);
- function calculateItemHash(
- address l2Sender,
- address to,
- uint256 l2Block,
- uint256 l1Block,
- uint256 l2Timestamp,
- uint256 value,
- bytes calldata data
- ) external pure returns (bytes32);
- function calculateMerkleRoot(
- bytes32[] memory proof,
- uint256 path,
- bytes32 item
- ) external pure returns (bytes32);
- }
|