@arbitrum/nitro-contracts 1.0.0-beta.7 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- package/package.json +13 -2
- package/src/bridge/Bridge.sol +49 -29
- package/src/bridge/IBridge.sol +58 -45
- package/src/bridge/IDelayedMessageProvider.sol +2 -1
- package/src/bridge/IInbox.sol +133 -50
- package/src/bridge/IOutbox.sol +95 -27
- package/src/bridge/IOwnable.sol +2 -1
- package/src/bridge/ISequencerInbox.sol +79 -31
- package/src/bridge/Inbox.sol +171 -108
- package/src/bridge/Outbox.sol +26 -41
- package/src/bridge/SequencerInbox.sol +152 -62
- package/src/challenge/ChallengeManager.sol +0 -9
- package/src/challenge/IChallengeManager.sol +0 -2
- package/src/libraries/AdminFallbackProxy.sol +4 -4
- package/src/libraries/Constants.sol +3 -0
- package/src/libraries/{SecondaryLogicUUPSUpgradeable.sol → DoubleLogicUUPSUpgradeable.sol} +2 -1
- package/src/libraries/Error.sol +119 -0
- package/src/libraries/IGasRefunder.sol +13 -6
- package/src/libraries/MerkleLib.sol +5 -3
- package/src/mocks/BridgeStub.sol +22 -1
- package/src/mocks/BridgeUnproxied.sol +17 -0
- package/src/mocks/InboxStub.sol +49 -2
- package/src/mocks/SequencerInboxStub.sol +13 -3
- package/src/mocks/Simple.sol +69 -0
- package/src/node-interface/NodeInterface.sol +69 -7
- package/src/precompiles/ArbGasInfo.sol +16 -4
- package/src/precompiles/ArbOwner.sol +18 -0
- package/src/precompiles/ArbOwnerPublic.sol +3 -0
- package/src/precompiles/ArbSys.sol +7 -4
- package/src/rollup/IRollupCore.sol +2 -0
- package/src/rollup/IRollupLogic.sol +10 -0
- package/src/rollup/RollupAdminLogic.sol +69 -3
- package/src/rollup/RollupCore.sol +8 -2
- package/src/rollup/RollupCreator.sol +3 -3
- package/src/rollup/RollupEventInbox.sol +3 -6
- package/src/rollup/RollupLib.sol +1 -0
- package/src/{libraries/ArbitrumProxy.sol → rollup/RollupProxy.sol} +3 -3
- package/src/rollup/RollupUserLogic.sol +47 -10
- package/src/state/GlobalState.sol +7 -0
- package/src/test-helpers/BridgeTester.sol +17 -1
- package/src/test-helpers/InterfaceCompatibilityTester.sol +11 -0
- package/src/test-helpers/OutboxWithoutOptTester.sol +33 -7
package/src/bridge/IOutbox.sol
CHANGED
@@ -2,32 +2,13 @@
|
|
2
2
|
// For license information, see https://github.com/nitro/blob/master/LICENSE
|
3
3
|
// SPDX-License-Identifier: BUSL-1.1
|
4
4
|
|
5
|
-
|
5
|
+
// solhint-disable-next-line compiler-version
|
6
|
+
pragma solidity >=0.6.9 <0.9.0;
|
6
7
|
|
7
|
-
import
|
8
|
-
|
9
|
-
/// @dev The provided proof was too long
|
10
|
-
/// @param proofLength The length of the too-long proof
|
11
|
-
error ProofTooLong(uint256 proofLength);
|
12
|
-
|
13
|
-
/// @dev The output index was greater than the maximum
|
14
|
-
/// @param index The output index
|
15
|
-
/// @param maxIndex The max the index could be
|
16
|
-
error PathNotMinimal(uint256 index, uint256 maxIndex);
|
17
|
-
|
18
|
-
/// @dev The calculated root does not exist
|
19
|
-
/// @param root The calculated root
|
20
|
-
error UnknownRoot(bytes32 root);
|
21
|
-
|
22
|
-
/// @dev The record has already been spent
|
23
|
-
/// @param index The index of the spent record
|
24
|
-
error AlreadySpent(uint256 index);
|
25
|
-
|
26
|
-
/// @dev A call to the bridge failed with no return data
|
27
|
-
error BridgeCallFailed();
|
8
|
+
import "./IBridge.sol";
|
28
9
|
|
29
10
|
interface IOutbox {
|
30
|
-
event SendRootUpdated(bytes32 indexed
|
11
|
+
event SendRootUpdated(bytes32 indexed outputRoot, bytes32 indexed l2BlockHash);
|
31
12
|
event OutBoxTransactionExecuted(
|
32
13
|
address indexed to,
|
33
14
|
address indexed l2Sender,
|
@@ -35,18 +16,105 @@ interface IOutbox {
|
|
35
16
|
uint256 transactionIndex
|
36
17
|
);
|
37
18
|
|
19
|
+
function rollup() external view returns (address); // the rollup contract
|
20
|
+
|
21
|
+
function bridge() external view returns (IBridge); // the bridge contract
|
22
|
+
|
23
|
+
function spent(uint256) external view returns (bytes32); // packed spent bitmap
|
24
|
+
|
25
|
+
function roots(bytes32) external view returns (bytes32); // maps root hashes => L2 block hash
|
26
|
+
|
27
|
+
// solhint-disable-next-line func-name-mixedcase
|
28
|
+
function OUTBOX_VERSION() external view returns (uint128); // the outbox version
|
29
|
+
|
30
|
+
function updateSendRoot(bytes32 sendRoot, bytes32 l2BlockHash) external;
|
31
|
+
|
32
|
+
/// @notice When l2ToL1Sender returns a nonzero address, the message was originated by an L2 account
|
33
|
+
/// When the return value is zero, that means this is a system message
|
34
|
+
/// @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentrancies
|
38
35
|
function l2ToL1Sender() external view returns (address);
|
39
36
|
|
37
|
+
/// @return l2Block return L2 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
|
40
38
|
function l2ToL1Block() external view returns (uint256);
|
41
39
|
|
40
|
+
/// @return l1Block return L1 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
|
42
41
|
function l2ToL1EthBlock() external view returns (uint256);
|
43
42
|
|
43
|
+
/// @return timestamp return L2 timestamp when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
|
44
44
|
function l2ToL1Timestamp() external view returns (uint256);
|
45
45
|
|
46
|
-
|
47
|
-
function l2ToL1BatchNum() external view returns (uint256);
|
48
|
-
|
46
|
+
/// @return outputId returns the unique output identifier of the L2 to L1 tx or 0 if no L2 to L1 transaction is active
|
49
47
|
function l2ToL1OutputId() external view returns (bytes32);
|
50
48
|
|
51
|
-
|
49
|
+
/**
|
50
|
+
* @notice Executes a messages in an Outbox entry.
|
51
|
+
* @dev Reverts if dispute period hasn't expired, since the outbox entry
|
52
|
+
* is only created once the rollup confirms the respective assertion.
|
53
|
+
* @dev it is not possible to execute any L2-to-L1 transaction which contains data
|
54
|
+
* to a contract address without any code (as enforced by the Bridge contract).
|
55
|
+
* @param proof Merkle proof of message inclusion in send root
|
56
|
+
* @param index Merkle path to message
|
57
|
+
* @param l2Sender sender if original message (i.e., caller of ArbSys.sendTxToL1)
|
58
|
+
* @param to destination address for L1 contract call
|
59
|
+
* @param l2Block l2 block number at which sendTxToL1 call was made
|
60
|
+
* @param l1Block l1 block number at which sendTxToL1 call was made
|
61
|
+
* @param l2Timestamp l2 Timestamp at which sendTxToL1 call was made
|
62
|
+
* @param value wei in L1 message
|
63
|
+
* @param data abi-encoded L1 message data
|
64
|
+
*/
|
65
|
+
function executeTransaction(
|
66
|
+
bytes32[] calldata proof,
|
67
|
+
uint256 index,
|
68
|
+
address l2Sender,
|
69
|
+
address to,
|
70
|
+
uint256 l2Block,
|
71
|
+
uint256 l1Block,
|
72
|
+
uint256 l2Timestamp,
|
73
|
+
uint256 value,
|
74
|
+
bytes calldata data
|
75
|
+
) external;
|
76
|
+
|
77
|
+
/**
|
78
|
+
* @dev function used to simulate the result of a particular function call from the outbox
|
79
|
+
* it is useful for things such as gas estimates. This function includes all costs except for
|
80
|
+
* proof validation (which can be considered offchain as a somewhat of a fixed cost - it's
|
81
|
+
* not really a fixed cost, but can be treated as so with a fixed overhead for gas estimation).
|
82
|
+
* We can't include the cost of proof validation since this is intended to be used to simulate txs
|
83
|
+
* that are included in yet-to-be confirmed merkle roots. The simulation entrypoint could instead pretend
|
84
|
+
* to confirm a pending merkle root, but that would be less practical for integrating with tooling.
|
85
|
+
* It is only possible to trigger it when the msg sender is address zero, which should be impossible
|
86
|
+
* unless under simulation in an eth_call or eth_estimateGas
|
87
|
+
*/
|
88
|
+
function executeTransactionSimulation(
|
89
|
+
uint256 index,
|
90
|
+
address l2Sender,
|
91
|
+
address to,
|
92
|
+
uint256 l2Block,
|
93
|
+
uint256 l1Block,
|
94
|
+
uint256 l2Timestamp,
|
95
|
+
uint256 value,
|
96
|
+
bytes calldata data
|
97
|
+
) external;
|
98
|
+
|
99
|
+
/**
|
100
|
+
* @param index Merkle path to message
|
101
|
+
* @return true if the message has been spent
|
102
|
+
*/
|
103
|
+
function isSpent(uint256 index) external view returns (bool);
|
104
|
+
|
105
|
+
function calculateItemHash(
|
106
|
+
address l2Sender,
|
107
|
+
address to,
|
108
|
+
uint256 l2Block,
|
109
|
+
uint256 l1Block,
|
110
|
+
uint256 l2Timestamp,
|
111
|
+
uint256 value,
|
112
|
+
bytes calldata data
|
113
|
+
) external pure returns (bytes32);
|
114
|
+
|
115
|
+
function calculateMerkleRoot(
|
116
|
+
bytes32[] memory proof,
|
117
|
+
uint256 path,
|
118
|
+
bytes32 item
|
119
|
+
) external pure returns (bytes32);
|
52
120
|
}
|
package/src/bridge/IOwnable.sol
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
// For license information, see https://github.com/nitro/blob/master/LICENSE
|
3
3
|
// SPDX-License-Identifier: BUSL-1.1
|
4
4
|
|
5
|
-
|
5
|
+
// solhint-disable-next-line compiler-version
|
6
|
+
pragma solidity >=0.4.21 <0.9.0;
|
6
7
|
|
7
8
|
interface IOwnable {
|
8
9
|
function owner() external view returns (address);
|
@@ -2,11 +2,13 @@
|
|
2
2
|
// For license information, see https://github.com/nitro/blob/master/LICENSE
|
3
3
|
// SPDX-License-Identifier: BUSL-1.1
|
4
4
|
|
5
|
-
|
5
|
+
// solhint-disable-next-line compiler-version
|
6
|
+
pragma solidity >=0.6.9 <0.9.0;
|
7
|
+
pragma experimental ABIEncoderV2;
|
6
8
|
|
7
9
|
import "../libraries/IGasRefunder.sol";
|
8
|
-
import {AlreadyInit, HadZeroInit, NotOrigin, DataTooLarge, NotRollup} from "../libraries/Error.sol";
|
9
10
|
import "./IDelayedMessageProvider.sol";
|
11
|
+
import "./IBridge.sol";
|
10
12
|
|
11
13
|
interface ISequencerInbox is IDelayedMessageProvider {
|
12
14
|
struct MaxTimeVariation {
|
@@ -50,63 +52,109 @@ interface ISequencerInbox is IDelayedMessageProvider {
|
|
50
52
|
/// @dev a keyset was invalidated
|
51
53
|
event InvalidateKeyset(bytes32 indexed keysetHash);
|
52
54
|
|
53
|
-
|
54
|
-
error DelayedBackwards();
|
55
|
+
function totalDelayedMessagesRead() external view returns (uint256);
|
55
56
|
|
56
|
-
|
57
|
-
error DelayedTooFar();
|
57
|
+
function bridge() external view returns (IBridge);
|
58
58
|
|
59
|
-
/// @dev
|
60
|
-
|
59
|
+
/// @dev The size of the batch header
|
60
|
+
// solhint-disable-next-line func-name-mixedcase
|
61
|
+
function HEADER_LENGTH() external view returns (uint256);
|
61
62
|
|
62
|
-
/// @dev
|
63
|
-
|
63
|
+
/// @dev If the first batch data byte after the header has this bit set,
|
64
|
+
/// the sequencer inbox has authenticated the data. Currently not used.
|
65
|
+
// solhint-disable-next-line func-name-mixedcase
|
66
|
+
function DATA_AUTHENTICATED_FLAG() external view returns (bytes1);
|
64
67
|
|
65
|
-
|
66
|
-
error IncorrectMessagePreimage();
|
68
|
+
function rollup() external view returns (IOwnable);
|
67
69
|
|
68
|
-
|
69
|
-
error NotBatchPoster();
|
70
|
+
function isBatchPoster(address) external view returns (bool);
|
70
71
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
error DataNotAuthenticated();
|
76
|
-
|
77
|
-
/// @dev Tried to create an already valid Data Availability Service keyset
|
78
|
-
error AlreadyValidDASKeyset(bytes32);
|
72
|
+
struct DasKeySetInfo {
|
73
|
+
bool isValidKeyset;
|
74
|
+
uint64 creationBlock;
|
75
|
+
}
|
79
76
|
|
80
|
-
|
81
|
-
|
77
|
+
// https://github.com/ethereum/solidity/issues/11826
|
78
|
+
// function maxTimeVariation() external view returns (MaxTimeVariation calldata);
|
79
|
+
// function dasKeySetInfo(bytes32) external view returns (DasKeySetInfo calldata);
|
80
|
+
|
81
|
+
/// @notice Remove force inclusion delay after a L1 chainId fork
|
82
|
+
function removeDelayAfterFork() external;
|
83
|
+
|
84
|
+
/// @notice Force messages from the delayed inbox to be included in the chain
|
85
|
+
/// Callable by any address, but message can only be force-included after maxTimeVariation.delayBlocks and
|
86
|
+
/// maxTimeVariation.delaySeconds has elapsed. As part of normal behaviour the sequencer will include these
|
87
|
+
/// messages so it's only necessary to call this if the sequencer is down, or not including any delayed messages.
|
88
|
+
/// @param _totalDelayedMessagesRead The total number of messages to read up to
|
89
|
+
/// @param kind The kind of the last message to be included
|
90
|
+
/// @param l1BlockAndTime The l1 block and the l1 timestamp of the last message to be included
|
91
|
+
/// @param baseFeeL1 The l1 gas price of the last message to be included
|
92
|
+
/// @param sender The sender of the last message to be included
|
93
|
+
/// @param messageDataHash The messageDataHash of the last message to be included
|
94
|
+
function forceInclusion(
|
95
|
+
uint256 _totalDelayedMessagesRead,
|
96
|
+
uint8 kind,
|
97
|
+
uint64[2] calldata l1BlockAndTime,
|
98
|
+
uint256 baseFeeL1,
|
99
|
+
address sender,
|
100
|
+
bytes32 messageDataHash
|
101
|
+
) external;
|
82
102
|
|
83
103
|
function inboxAccs(uint256 index) external view returns (bytes32);
|
84
104
|
|
85
105
|
function batchCount() external view returns (uint256);
|
86
106
|
|
87
|
-
function
|
107
|
+
function isValidKeysetHash(bytes32 ksHash) external view returns (bool);
|
108
|
+
|
109
|
+
/// @notice the creation block is intended to still be available after a keyset is deleted
|
110
|
+
function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256);
|
111
|
+
|
112
|
+
// ---------- BatchPoster functions ----------
|
113
|
+
|
114
|
+
function addSequencerL2BatchFromOrigin(
|
88
115
|
uint256 sequenceNumber,
|
89
116
|
bytes calldata data,
|
90
117
|
uint256 afterDelayedMessagesRead,
|
91
118
|
IGasRefunder gasRefunder
|
92
119
|
) external;
|
93
120
|
|
94
|
-
|
121
|
+
function addSequencerL2Batch(
|
122
|
+
uint256 sequenceNumber,
|
123
|
+
bytes calldata data,
|
124
|
+
uint256 afterDelayedMessagesRead,
|
125
|
+
IGasRefunder gasRefunder,
|
126
|
+
uint256 prevMessageCount,
|
127
|
+
uint256 newMessageCount
|
128
|
+
) external;
|
129
|
+
|
130
|
+
// ---------- onlyRollupOrOwner functions ----------
|
95
131
|
|
96
132
|
/**
|
97
|
-
* @notice Set max
|
98
|
-
* @param
|
133
|
+
* @notice Set max delay for sequencer inbox
|
134
|
+
* @param maxTimeVariation_ the maximum time variation parameters
|
99
135
|
*/
|
100
|
-
function setMaxTimeVariation(MaxTimeVariation memory
|
136
|
+
function setMaxTimeVariation(MaxTimeVariation memory maxTimeVariation_) external;
|
101
137
|
|
102
138
|
/**
|
103
139
|
* @notice Updates whether an address is authorized to be a batch poster at the sequencer inbox
|
104
140
|
* @param addr the address
|
105
|
-
* @param
|
141
|
+
* @param isBatchPoster_ if the specified address should be authorized as a batch poster
|
106
142
|
*/
|
107
|
-
function setIsBatchPoster(address addr, bool
|
143
|
+
function setIsBatchPoster(address addr, bool isBatchPoster_) external;
|
108
144
|
|
145
|
+
/**
|
146
|
+
* @notice Makes Data Availability Service keyset valid
|
147
|
+
* @param keysetBytes bytes of the serialized keyset
|
148
|
+
*/
|
109
149
|
function setValidKeyset(bytes calldata keysetBytes) external;
|
110
150
|
|
151
|
+
/**
|
152
|
+
* @notice Invalidates a Data Availability Service keyset
|
153
|
+
* @param ksHash hash of the keyset
|
154
|
+
*/
|
111
155
|
function invalidateKeysetHash(bytes32 ksHash) external;
|
156
|
+
|
157
|
+
// ---------- initializer ----------
|
158
|
+
|
159
|
+
function initialize(IBridge bridge_, MaxTimeVariation calldata maxTimeVariation_) external;
|
112
160
|
}
|