@arbitrum/nitro-contracts 1.0.0-beta.5 → 1.0.0-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/package.json +6 -2
  2. package/src/bridge/Bridge.sol +138 -32
  3. package/src/bridge/IBridge.sol +34 -14
  4. package/src/bridge/IDelayedMessageProvider.sol +15 -0
  5. package/src/bridge/IInbox.sol +8 -19
  6. package/src/bridge/IOutbox.sol +43 -23
  7. package/src/bridge/IOwnable.sol +10 -0
  8. package/src/bridge/ISequencerInbox.sol +30 -32
  9. package/src/bridge/Inbox.sol +133 -35
  10. package/src/bridge/Outbox.sol +145 -33
  11. package/src/bridge/SequencerInbox.sol +179 -60
  12. package/src/challenge/ChallengeLib.sol +0 -2
  13. package/src/challenge/ChallengeManager.sol +4 -8
  14. package/src/challenge/IChallengeManager.sol +1 -1
  15. package/src/libraries/Error.sol +113 -0
  16. package/src/libraries/IGasRefunder.sol +15 -14
  17. package/src/libraries/MerkleLib.sol +11 -2
  18. package/src/libraries/MessageTypes.sol +1 -0
  19. package/src/mocks/BridgeStub.sol +69 -21
  20. package/src/mocks/InboxStub.sol +2 -0
  21. package/src/mocks/SequencerInboxStub.sol +10 -8
  22. package/src/mocks/Simple.sol +8 -0
  23. package/src/node-interface/NodeInterface.sol +62 -4
  24. package/src/osp/IOneStepProver.sol +1 -2
  25. package/src/osp/OneStepProver0.sol +1 -87
  26. package/src/osp/OneStepProverHostIo.sol +5 -6
  27. package/src/osp/OneStepProverMath.sol +37 -27
  28. package/src/osp/OneStepProverMemory.sol +3 -4
  29. package/src/precompiles/ArbAggregator.sol +23 -33
  30. package/src/precompiles/ArbBLS.sol +1 -43
  31. package/src/precompiles/ArbGasInfo.sol +10 -19
  32. package/src/precompiles/ArbOwner.sol +21 -15
  33. package/src/precompiles/ArbRetryableTx.sol +10 -1
  34. package/src/precompiles/ArbSys.sol +4 -4
  35. package/src/precompiles/ArbosActs.sol +9 -2
  36. package/src/rollup/BridgeCreator.sol +23 -28
  37. package/src/rollup/IRollupCore.sol +3 -3
  38. package/src/rollup/{IRollupEventBridge.sol → IRollupEventInbox.sol} +2 -2
  39. package/src/rollup/IRollupLogic.sol +21 -18
  40. package/src/rollup/RollupAdminLogic.sol +72 -34
  41. package/src/rollup/RollupCore.sol +20 -9
  42. package/src/rollup/RollupCreator.sol +21 -11
  43. package/src/rollup/{RollupEventBridge.sol → RollupEventInbox.sol} +10 -10
  44. package/src/rollup/RollupLib.sol +21 -5
  45. package/src/rollup/RollupUserLogic.sol +10 -18
  46. package/src/rollup/ValidatorWallet.sol +125 -8
  47. package/src/rollup/ValidatorWalletCreator.sol +11 -6
  48. package/src/state/Deserialize.sol +3 -22
  49. package/src/state/GlobalState.sol +7 -0
  50. package/src/state/Instructions.sol +2 -10
  51. package/src/state/Machine.sol +0 -4
  52. package/src/state/ModuleMemory.sol +2 -1
  53. package/src/state/Value.sol +2 -3
  54. package/src/test-helpers/BridgeTester.sol +233 -0
  55. package/src/test-helpers/InterfaceCompatibilityTester.sol +11 -0
  56. package/src/test-helpers/OutboxWithoutOptTester.sol +214 -0
  57. package/src/test-helpers/RollupMock.sol +21 -0
  58. package/src/bridge/IMessageProvider.sol +0 -11
  59. package/src/state/PcStack.sol +0 -32
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbitrum/nitro-contracts",
3
- "version": "1.0.0-beta.5",
3
+ "version": "1.0.0-beta.8",
4
4
  "description": "Layer 2 precompiles and rollup for Arbitrum Nitro",
5
5
  "author": "Offchain Labs, Inc.",
6
6
  "license": "BUSL-1.1",
@@ -21,7 +21,10 @@
21
21
  "build": "./scripts/build.bash",
22
22
  "solhint": "solhint -f table src/**/*.sol",
23
23
  "prettier:solidity": "prettier --write src/**/*.sol",
24
- "hardhat:prod": "hardhat --config hardhat.prod-config.js"
24
+ "hardhat:prod": "hardhat --config hardhat.prod-config.js",
25
+ "build:0.6": "INTERFACE_TESTER_SOLC_VERSION=0.6.9 yarn run build",
26
+ "build:0.7": "INTERFACE_TESTER_SOLC_VERSION=0.7.0 yarn run build",
27
+ "test:compatibility": "yarn run build:0.6 && yarn run build:0.7"
25
28
  },
26
29
  "dependencies": {
27
30
  "@openzeppelin/contracts": "4.5.0",
@@ -41,6 +44,7 @@
41
44
  "ethereum-waffle": "^3.4.0",
42
45
  "ethers": "^5.5.2",
43
46
  "hardhat-deploy": "^0.11.4",
47
+ "hardhat-gas-reporter": "^1.0.8",
44
48
  "prettier": "^2.5.1",
45
49
  "prettier-plugin-solidity": "^1.0.0-beta.19",
46
50
  "solhint": "^3.3.7",
@@ -4,21 +4,31 @@
4
4
 
5
5
  pragma solidity ^0.8.4;
6
6
 
7
- import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
7
+ import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
8
8
  import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
9
9
 
10
+ import {
11
+ NotContract,
12
+ NotRollupOrOwner,
13
+ NotDelayedInbox,
14
+ NotSequencerInbox,
15
+ NotOutbox,
16
+ InvalidOutboxSet
17
+ } from "../libraries/Error.sol";
10
18
  import "./IBridge.sol";
11
19
  import "./Messages.sol";
12
20
  import "../libraries/DelegateCallAware.sol";
13
21
 
22
+ import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol";
23
+
14
24
  /**
15
25
  * @title Staging ground for incoming and outgoing messages
16
- * @notice Holds the inbox accumulator for delayed messages, and is the ETH escrow
17
- * for value sent with these messages.
26
+ * @notice Holds the inbox accumulator for sequenced and delayed messages.
27
+ * It is also the ETH escrow for value sent with these messages.
18
28
  * Since the escrow is held here, this contract also contains a list of allowed
19
29
  * outboxes that can make calls from here and withdraw this escrow.
20
30
  */
21
- contract Bridge is OwnableUpgradeable, DelegateCallAware, IBridge {
31
+ contract Bridge is Initializable, DelegateCallAware, IBridge {
22
32
  using AddressUpgradeable for address;
23
33
 
24
34
  struct InOutInfo {
@@ -26,29 +36,109 @@ contract Bridge is OwnableUpgradeable, DelegateCallAware, IBridge {
26
36
  bool allowed;
27
37
  }
28
38
 
29
- mapping(address => InOutInfo) private allowedInboxesMap;
39
+ mapping(address => InOutInfo) private allowedDelayedInboxesMap;
30
40
  mapping(address => InOutInfo) private allowedOutboxesMap;
31
41
 
32
- address[] public allowedInboxList;
42
+ address[] public allowedDelayedInboxList;
33
43
  address[] public allowedOutboxList;
34
44
 
35
- address public override activeOutbox;
45
+ address private _activeOutbox;
36
46
 
37
47
  /// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
38
- bytes32[] public override inboxAccs;
48
+ bytes32[] public override delayedInboxAccs;
49
+
50
+ /// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
51
+ bytes32[] public override sequencerInboxAccs;
52
+
53
+ IOwnable public override rollup;
54
+ address public sequencerInbox;
55
+
56
+ address private constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max);
57
+
58
+ function initialize(IOwnable rollup_) external initializer onlyDelegated {
59
+ _activeOutbox = EMPTY_ACTIVEOUTBOX;
60
+ rollup = rollup_;
61
+ }
62
+
63
+ modifier onlyRollupOrOwner() {
64
+ if (msg.sender != address(rollup)) {
65
+ address rollupOwner = rollup.owner();
66
+ if (msg.sender != rollupOwner) {
67
+ revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner);
68
+ }
69
+ }
70
+ _;
71
+ }
39
72
 
40
- function initialize() external initializer onlyDelegated {
41
- __Ownable_init();
73
+ /// @dev returns the address of current active Outbox, or zero if no outbox is active
74
+ function activeOutbox() public view returns (address) {
75
+ address outbox = _activeOutbox;
76
+ // address zero is returned if no outbox is set, but the value used in storage
77
+ // is non-zero to save users some gas (as storage refunds are usually maxed out)
78
+ // EIP-1153 would help here.
79
+ // we don't return `EMPTY_ACTIVEOUTBOX` to avoid a breaking change on the current api
80
+ if (outbox == EMPTY_ACTIVEOUTBOX) return address(0);
81
+ return outbox;
42
82
  }
43
83
 
44
- function allowedInboxes(address inbox) external view override returns (bool) {
45
- return allowedInboxesMap[inbox].allowed;
84
+ function allowedDelayedInboxes(address inbox) external view override returns (bool) {
85
+ return allowedDelayedInboxesMap[inbox].allowed;
46
86
  }
47
87
 
48
88
  function allowedOutboxes(address outbox) external view override returns (bool) {
49
89
  return allowedOutboxesMap[outbox].allowed;
50
90
  }
51
91
 
92
+ modifier onlySequencerInbox() {
93
+ if (msg.sender != sequencerInbox) revert NotSequencerInbox(msg.sender);
94
+ _;
95
+ }
96
+
97
+ function enqueueSequencerMessage(bytes32 dataHash, uint256 afterDelayedMessagesRead)
98
+ external
99
+ override
100
+ onlySequencerInbox
101
+ returns (
102
+ uint256 seqMessageIndex,
103
+ bytes32 beforeAcc,
104
+ bytes32 delayedAcc,
105
+ bytes32 acc
106
+ )
107
+ {
108
+ seqMessageIndex = sequencerInboxAccs.length;
109
+ if (sequencerInboxAccs.length > 0) {
110
+ beforeAcc = sequencerInboxAccs[sequencerInboxAccs.length - 1];
111
+ }
112
+ if (afterDelayedMessagesRead > 0) {
113
+ delayedAcc = delayedInboxAccs[afterDelayedMessagesRead - 1];
114
+ }
115
+ acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc));
116
+ sequencerInboxAccs.push(acc);
117
+ }
118
+
119
+ /**
120
+ * @dev allows the sequencer inbox to submit a delayed message of the batchPostingReport type
121
+ * This is done through a separate function entrypoint instead of allowing the sequencer inbox
122
+ * to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either
123
+ * every delayed inbox or every sequencer inbox call.
124
+ */
125
+ function submitBatchSpendingReport(address sender, bytes32 messageDataHash)
126
+ external
127
+ override
128
+ onlySequencerInbox
129
+ returns (uint256)
130
+ {
131
+ return
132
+ addMessageToDelayedAccumulator(
133
+ L1MessageType_batchPostingReport,
134
+ sender,
135
+ uint64(block.number),
136
+ uint64(block.timestamp), // solhint-disable-line not-rely-on-time,
137
+ block.basefee,
138
+ messageDataHash
139
+ );
140
+ }
141
+
52
142
  /**
53
143
  * @dev Enqueue a message in the delayed inbox accumulator.
54
144
  * These messages are later sequenced in the SequencerInbox, either by the sequencer as
@@ -59,9 +149,9 @@ contract Bridge is OwnableUpgradeable, DelegateCallAware, IBridge {
59
149
  address sender,
60
150
  bytes32 messageDataHash
61
151
  ) external payable override returns (uint256) {
62
- if (!allowedInboxesMap[msg.sender].allowed) revert NotInbox(msg.sender);
152
+ if (!allowedDelayedInboxesMap[msg.sender].allowed) revert NotDelayedInbox(msg.sender);
63
153
  return
64
- addMessageToAccumulator(
154
+ addMessageToDelayedAccumulator(
65
155
  kind,
66
156
  sender,
67
157
  uint64(block.number),
@@ -71,7 +161,7 @@ contract Bridge is OwnableUpgradeable, DelegateCallAware, IBridge {
71
161
  );
72
162
  }
73
163
 
74
- function addMessageToAccumulator(
164
+ function addMessageToDelayedAccumulator(
75
165
  uint8 kind,
76
166
  address sender,
77
167
  uint64 blockNumber,
@@ -79,7 +169,7 @@ contract Bridge is OwnableUpgradeable, DelegateCallAware, IBridge {
79
169
  uint256 baseFeeL1,
80
170
  bytes32 messageDataHash
81
171
  ) internal returns (uint256) {
82
- uint256 count = inboxAccs.length;
172
+ uint256 count = delayedInboxAccs.length;
83
173
  bytes32 messageHash = Messages.messageHash(
84
174
  kind,
85
175
  sender,
@@ -91,9 +181,9 @@ contract Bridge is OwnableUpgradeable, DelegateCallAware, IBridge {
91
181
  );
92
182
  bytes32 prevAcc = 0;
93
183
  if (count > 0) {
94
- prevAcc = inboxAccs[count - 1];
184
+ prevAcc = delayedInboxAccs[count - 1];
95
185
  }
96
- inboxAccs.push(Messages.accumulateInboxMessage(prevAcc, messageHash));
186
+ delayedInboxAccs.push(Messages.accumulateInboxMessage(prevAcc, messageHash));
97
187
  emit MessageDelivered(
98
188
  count,
99
189
  prevAcc,
@@ -114,37 +204,46 @@ contract Bridge is OwnableUpgradeable, DelegateCallAware, IBridge {
114
204
  ) external override returns (bool success, bytes memory returnData) {
115
205
  if (!allowedOutboxesMap[msg.sender].allowed) revert NotOutbox(msg.sender);
116
206
  if (data.length > 0 && !to.isContract()) revert NotContract(to);
117
- address prevOutbox = activeOutbox;
118
- activeOutbox = msg.sender;
207
+ address prevOutbox = _activeOutbox;
208
+ _activeOutbox = msg.sender;
119
209
  // We set and reset active outbox around external call so activeOutbox remains valid during call
120
210
 
121
211
  // We use a low level call here since we want to bubble up whether it succeeded or failed to the caller
122
212
  // rather than reverting on failure as well as allow contract and non-contract calls
123
213
  // solhint-disable-next-line avoid-low-level-calls
124
214
  (success, returnData) = to.call{value: value}(data);
125
- activeOutbox = prevOutbox;
215
+ _activeOutbox = prevOutbox;
126
216
  emit BridgeCallTriggered(msg.sender, to, value, data);
127
217
  }
128
218
 
129
- function setInbox(address inbox, bool enabled) external override onlyOwner {
130
- InOutInfo storage info = allowedInboxesMap[inbox];
219
+ function setSequencerInbox(address _sequencerInbox) external override onlyRollupOrOwner {
220
+ sequencerInbox = _sequencerInbox;
221
+ emit SequencerInboxUpdated(_sequencerInbox);
222
+ }
223
+
224
+ function setDelayedInbox(address inbox, bool enabled) external override onlyRollupOrOwner {
225
+ InOutInfo storage info = allowedDelayedInboxesMap[inbox];
131
226
  bool alreadyEnabled = info.allowed;
132
227
  emit InboxToggle(inbox, enabled);
133
228
  if ((alreadyEnabled && enabled) || (!alreadyEnabled && !enabled)) {
134
229
  return;
135
230
  }
136
231
  if (enabled) {
137
- allowedInboxesMap[inbox] = InOutInfo(allowedInboxList.length, true);
138
- allowedInboxList.push(inbox);
232
+ allowedDelayedInboxesMap[inbox] = InOutInfo(allowedDelayedInboxList.length, true);
233
+ allowedDelayedInboxList.push(inbox);
139
234
  } else {
140
- allowedInboxList[info.index] = allowedInboxList[allowedInboxList.length - 1];
141
- allowedInboxesMap[allowedInboxList[info.index]].index = info.index;
142
- allowedInboxList.pop();
143
- delete allowedInboxesMap[inbox];
235
+ allowedDelayedInboxList[info.index] = allowedDelayedInboxList[
236
+ allowedDelayedInboxList.length - 1
237
+ ];
238
+ allowedDelayedInboxesMap[allowedDelayedInboxList[info.index]].index = info.index;
239
+ allowedDelayedInboxList.pop();
240
+ delete allowedDelayedInboxesMap[inbox];
144
241
  }
145
242
  }
146
243
 
147
- function setOutbox(address outbox, bool enabled) external override onlyOwner {
244
+ function setOutbox(address outbox, bool enabled) external override onlyRollupOrOwner {
245
+ if (outbox == EMPTY_ACTIVEOUTBOX) revert InvalidOutboxSet(outbox);
246
+
148
247
  InOutInfo storage info = allowedOutboxesMap[outbox];
149
248
  bool alreadyEnabled = info.allowed;
150
249
  emit OutboxToggle(outbox, enabled);
@@ -162,7 +261,14 @@ contract Bridge is OwnableUpgradeable, DelegateCallAware, IBridge {
162
261
  }
163
262
  }
164
263
 
165
- function messageCount() external view override returns (uint256) {
166
- return inboxAccs.length;
264
+ function delayedMessageCount() external view override returns (uint256) {
265
+ return delayedInboxAccs.length;
167
266
  }
267
+
268
+ function sequencerMessageCount() external view override returns (uint256) {
269
+ return sequencerInboxAccs.length;
270
+ }
271
+
272
+ /// @dev For the classic -> nitro migration. TODO: remove post-migration.
273
+ function acceptFundsFromOldBridge() external payable {}
168
274
  }
@@ -2,17 +2,10 @@
2
2
  // For license information, see https://github.com/nitro/blob/master/LICENSE
3
3
  // SPDX-License-Identifier: BUSL-1.1
4
4
 
5
- pragma solidity ^0.8.4;
5
+ // solhint-disable-next-line compiler-version
6
+ pragma solidity >=0.6.9 <0.9.0;
6
7
 
7
- import {NotContract} from "../libraries/Error.sol";
8
-
9
- /// @dev Thrown when an un-authorized address tries to access an only-inbox function
10
- /// @param sender The un-authorized sender
11
- error NotInbox(address sender);
12
-
13
- /// @dev Thrown when an un-authorized address tries to access an only-outbox function
14
- /// @param sender The un-authorized sender
15
- error NotOutbox(address sender);
8
+ import "./IOwnable.sol";
16
9
 
17
10
  interface IBridge {
18
11
  event MessageDelivered(
@@ -37,12 +30,27 @@ interface IBridge {
37
30
 
38
31
  event OutboxToggle(address indexed outbox, bool enabled);
39
32
 
33
+ event SequencerInboxUpdated(address newSequencerInbox);
34
+
40
35
  function enqueueDelayedMessage(
41
36
  uint8 kind,
42
37
  address sender,
43
38
  bytes32 messageDataHash
44
39
  ) external payable returns (uint256);
45
40
 
41
+ function enqueueSequencerMessage(bytes32 dataHash, uint256 afterDelayedMessagesRead)
42
+ external
43
+ returns (
44
+ uint256 seqMessageIndex,
45
+ bytes32 beforeAcc,
46
+ bytes32 delayedAcc,
47
+ bytes32 acc
48
+ );
49
+
50
+ function submitBatchSpendingReport(address batchPoster, bytes32 dataHash)
51
+ external
52
+ returns (uint256 msgNum);
53
+
46
54
  function executeCall(
47
55
  address to,
48
56
  uint256 value,
@@ -50,19 +58,31 @@ interface IBridge {
50
58
  ) external returns (bool success, bytes memory returnData);
51
59
 
52
60
  // These are only callable by the admin
53
- function setInbox(address inbox, bool enabled) external;
61
+ function setDelayedInbox(address inbox, bool enabled) external;
54
62
 
55
63
  function setOutbox(address inbox, bool enabled) external;
56
64
 
65
+ function setSequencerInbox(address _sequencerInbox) external;
66
+
57
67
  // View functions
58
68
 
69
+ function sequencerInbox() external view returns (address);
70
+
59
71
  function activeOutbox() external view returns (address);
60
72
 
61
- function allowedInboxes(address inbox) external view returns (bool);
73
+ function allowedDelayedInboxes(address inbox) external view returns (bool);
62
74
 
63
75
  function allowedOutboxes(address outbox) external view returns (bool);
64
76
 
65
- function inboxAccs(uint256 index) external view returns (bytes32);
77
+ function delayedInboxAccs(uint256 index) external view returns (bytes32);
78
+
79
+ function sequencerInboxAccs(uint256 index) external view returns (bytes32);
80
+
81
+ function delayedMessageCount() external view returns (uint256);
82
+
83
+ function sequencerMessageCount() external view returns (uint256);
84
+
85
+ function rollup() external view returns (IOwnable);
66
86
 
67
- function messageCount() external view returns (uint256);
87
+ function acceptFundsFromOldBridge() external payable;
68
88
  }
@@ -0,0 +1,15 @@
1
+ // Copyright 2021-2022, Offchain Labs, Inc.
2
+ // For license information, see https://github.com/nitro/blob/master/LICENSE
3
+ // SPDX-License-Identifier: BUSL-1.1
4
+
5
+ // solhint-disable-next-line compiler-version
6
+ pragma solidity >=0.6.9 <0.9.0;
7
+
8
+ interface IDelayedMessageProvider {
9
+ /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator
10
+ event InboxMessageDelivered(uint256 indexed messageNum, bytes data);
11
+
12
+ /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator
13
+ /// same as InboxMessageDelivered but the batch data is available in tx.input
14
+ event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum);
15
+ }
@@ -2,28 +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
- pragma solidity ^0.8.4;
5
+ // solhint-disable-next-line compiler-version
6
+ pragma solidity >=0.6.9 <0.9.0;
6
7
 
7
8
  import "./IBridge.sol";
8
- import "./IMessageProvider.sol";
9
- import {AlreadyInit, NotOrigin, DataTooLarge} from "../libraries/Error.sol";
9
+ import "./IDelayedMessageProvider.sol";
10
10
 
11
- /// @dev The contract is paused, so cannot be paused
12
- error AlreadyPaused();
13
-
14
- /// @dev The contract is unpaused, so cannot be unpaused
15
- error AlreadyUnpaused();
16
-
17
- /// @dev The contract is paused
18
- error Paused();
19
-
20
- /// @dev msg.value sent to the inbox isn't high enough
21
- error InsufficientValue(uint256 expected, uint256 actual);
22
-
23
- /// @dev submission cost provided isn't enough to create retryable ticket
24
- error InsufficientSubmissionCost(uint256 expected, uint256 actual);
25
-
26
- interface IInbox is IMessageProvider {
11
+ interface IInbox is IDelayedMessageProvider {
27
12
  function sendL2Message(bytes calldata messageData) external returns (uint256);
28
13
 
29
14
  function sendUnsignedTransaction(
@@ -58,6 +43,7 @@ interface IInbox is IMessageProvider {
58
43
  bytes calldata data
59
44
  ) external payable returns (uint256);
60
45
 
46
+ /// @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error
61
47
  function createRetryableTicket(
62
48
  address to,
63
49
  uint256 arbTxCallValue,
@@ -69,6 +55,7 @@ interface IInbox is IMessageProvider {
69
55
  bytes calldata data
70
56
  ) external payable returns (uint256);
71
57
 
58
+ /// @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error
72
59
  function unsafeCreateRetryableTicket(
73
60
  address to,
74
61
  uint256 arbTxCallValue,
@@ -86,4 +73,6 @@ interface IInbox is IMessageProvider {
86
73
  function depositEth(uint256 maxSubmissionCost) external payable returns (uint256);
87
74
 
88
75
  function bridge() external view returns (IBridge);
76
+
77
+ function postUpgradeInit(IBridge _bridge) external;
89
78
  }
@@ -2,29 +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
- pragma solidity ^0.8.4;
6
-
7
- import {AlreadyInit, NotRollup} from "../libraries/Error.sol";
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();
5
+ // solhint-disable-next-line compiler-version
6
+ pragma solidity >=0.6.9 <0.9.0;
28
7
 
29
8
  interface IOutbox {
30
9
  event SendRootUpdated(bytes32 indexed blockHash, bytes32 indexed outputRoot);
@@ -49,4 +28,45 @@ interface IOutbox {
49
28
  function l2ToL1OutputId() external view returns (bytes32);
50
29
 
51
30
  function updateSendRoot(bytes32 sendRoot, bytes32 l2BlockHash) external;
31
+
32
+ function executeTransaction(
33
+ bytes32[] calldata proof,
34
+ uint256 index,
35
+ address l2Sender,
36
+ address to,
37
+ uint256 l2Block,
38
+ uint256 l1Block,
39
+ uint256 l2Timestamp,
40
+ uint256 value,
41
+ bytes calldata data
42
+ ) external;
43
+
44
+ function executeTransactionSimulation(
45
+ uint256 index,
46
+ address l2Sender,
47
+ address to,
48
+ uint256 l2Block,
49
+ uint256 l1Block,
50
+ uint256 l2Timestamp,
51
+ uint256 value,
52
+ bytes calldata data
53
+ ) external;
54
+
55
+ function isSpent(uint256) external view returns (bool);
56
+
57
+ function calculateItemHash(
58
+ address l2Sender,
59
+ address to,
60
+ uint256 l2Block,
61
+ uint256 l1Block,
62
+ uint256 l2Timestamp,
63
+ uint256 value,
64
+ bytes calldata data
65
+ ) external pure returns (bytes32);
66
+
67
+ function calculateMerkleRoot(
68
+ bytes32[] memory proof,
69
+ uint256 path,
70
+ bytes32 item
71
+ ) external pure returns (bytes32);
52
72
  }
@@ -0,0 +1,10 @@
1
+ // Copyright 2021-2022, Offchain Labs, Inc.
2
+ // For license information, see https://github.com/nitro/blob/master/LICENSE
3
+ // SPDX-License-Identifier: BUSL-1.1
4
+
5
+ // solhint-disable-next-line compiler-version
6
+ pragma solidity >=0.4.21 <0.9.0;
7
+
8
+ interface IOwnable {
9
+ function owner() external view returns (address);
10
+ }
@@ -2,12 +2,14 @@
2
2
  // For license information, see https://github.com/nitro/blob/master/LICENSE
3
3
  // SPDX-License-Identifier: BUSL-1.1
4
4
 
5
- pragma solidity ^0.8.0;
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";
10
+ import "./IDelayedMessageProvider.sol";
9
11
 
10
- interface ISequencerInbox {
12
+ interface ISequencerInbox is IDelayedMessageProvider {
11
13
  struct MaxTimeVariation {
12
14
  uint256 delayBlocks;
13
15
  uint256 futureBlocks;
@@ -38,48 +40,44 @@ interface ISequencerInbox {
38
40
  BatchDataLocation dataLocation
39
41
  );
40
42
 
43
+ event OwnerFunctionCalled(uint256 indexed id);
44
+
41
45
  /// @dev a separate event that emits batch data when this isn't easily accessible in the tx.input
42
46
  event SequencerBatchData(uint256 indexed batchSequenceNumber, bytes data);
43
47
 
44
- /// @dev Thrown when someone attempts to read fewer messages than have already been read
45
- error DelayedBackwards();
46
-
47
- /// @dev Thrown when someone attempts to read more messages than exist
48
- error DelayedTooFar();
49
-
50
- /// @dev Thrown if the length of the header plus the length of the batch overflows
51
- error DataLengthOverflow();
52
-
53
- /// @dev Force include can only read messages more blocks old than the delay period
54
- error ForceIncludeBlockTooSoon();
55
-
56
- /// @dev Force include can only read messages more seconds old than the delay period
57
- error ForceIncludeTimeTooSoon();
48
+ /// @dev a valid keyset was added
49
+ event SetValidKeyset(bytes32 indexed keysetHash, bytes keysetBytes);
58
50
 
59
- /// @dev The message provided did not match the hash in the delayed inbox
60
- error IncorrectMessagePreimage();
61
-
62
- /// @dev This can only be called by the batch poster
63
- error NotBatchPoster();
64
-
65
- /// @dev The sequence number provided to this message was inconsistent with the number of batches already included
66
- error BadSequencerNumber();
67
-
68
- /// @dev The batch data has the inbox authenticated bit set, but the batch data was not authenticated by the inbox
69
- error DataNotAuthenticated();
51
+ /// @dev a keyset was invalidated
52
+ event InvalidateKeyset(bytes32 indexed keysetHash);
70
53
 
71
54
  function inboxAccs(uint256 index) external view returns (bytes32);
72
55
 
73
56
  function batchCount() external view returns (uint256);
74
57
 
75
- function setMaxTimeVariation(MaxTimeVariation memory timeVariation) external;
76
-
77
- function setIsBatchPoster(address addr, bool isBatchPoster_) external;
78
-
79
58
  function addSequencerL2Batch(
80
59
  uint256 sequenceNumber,
81
60
  bytes calldata data,
82
61
  uint256 afterDelayedMessagesRead,
83
62
  IGasRefunder gasRefunder
84
63
  ) external;
64
+
65
+ // Methods only callable by rollup owner
66
+
67
+ /**
68
+ * @notice Set max time variation from actual time for sequencer inbox
69
+ * @param timeVariation the maximum time variation parameters
70
+ */
71
+ function setMaxTimeVariation(MaxTimeVariation memory timeVariation) external;
72
+
73
+ /**
74
+ * @notice Updates whether an address is authorized to be a batch poster at the sequencer inbox
75
+ * @param addr the address
76
+ * @param isBatchPoster if the specified address should be authorized as a batch poster
77
+ */
78
+ function setIsBatchPoster(address addr, bool isBatchPoster) external;
79
+
80
+ function setValidKeyset(bytes calldata keysetBytes) external;
81
+
82
+ function invalidateKeysetHash(bytes32 ksHash) external;
85
83
  }