You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
5.1 KiB
Solidity
118 lines
5.1 KiB
Solidity
// 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) (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);
|
|
}
|