@arbitrum/nitro-contracts 1.0.0-beta.7 → 1.0.0
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.
- 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/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@arbitrum/nitro-contracts",
|
3
|
-
"version": "1.0.0
|
3
|
+
"version": "1.0.0",
|
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,12 @@
|
|
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",
|
28
|
+
"test:storage": "./test/storage/test.bash",
|
29
|
+
"postinstall": "patch-package"
|
25
30
|
},
|
26
31
|
"dependencies": {
|
27
32
|
"@openzeppelin/contracts": "4.5.0",
|
@@ -31,6 +36,7 @@
|
|
31
36
|
"private": false,
|
32
37
|
"devDependencies": {
|
33
38
|
"@nomiclabs/hardhat-ethers": "npm:hardhat-deploy-ethers@^0.3.0-beta.13",
|
39
|
+
"@nomiclabs/hardhat-etherscan": "^3.1.0",
|
34
40
|
"@nomiclabs/hardhat-waffle": "^2.0.1",
|
35
41
|
"@typechain/ethers-v5": "^10.0.0",
|
36
42
|
"@typechain/hardhat": "^6.0.0",
|
@@ -42,6 +48,8 @@
|
|
42
48
|
"ethers": "^5.5.2",
|
43
49
|
"hardhat-deploy": "^0.11.4",
|
44
50
|
"hardhat-gas-reporter": "^1.0.8",
|
51
|
+
"patch-package": "^6.4.7",
|
52
|
+
"postinstall-postinstall": "^2.1.0",
|
45
53
|
"prettier": "^2.5.1",
|
46
54
|
"prettier-plugin-solidity": "^1.0.0-beta.19",
|
47
55
|
"solhint": "^3.3.7",
|
@@ -50,5 +58,8 @@
|
|
50
58
|
"ts-node": "^10.4.0",
|
51
59
|
"typechain": "^8.0.0",
|
52
60
|
"typescript": "^4.5.4"
|
61
|
+
},
|
62
|
+
"optionalDependencies":{
|
63
|
+
"sol2uml": "2.2.0"
|
53
64
|
}
|
54
65
|
}
|
package/src/bridge/Bridge.sol
CHANGED
@@ -7,6 +7,15 @@ pragma solidity ^0.8.4;
|
|
7
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
|
+
BadSequencerMessageNumber
|
18
|
+
} from "../libraries/Error.sol";
|
10
19
|
import "./IBridge.sol";
|
11
20
|
import "./Messages.sol";
|
12
21
|
import "../libraries/DelegateCallAware.sol";
|
@@ -34,18 +43,20 @@ contract Bridge is Initializable, DelegateCallAware, IBridge {
|
|
34
43
|
address[] public allowedDelayedInboxList;
|
35
44
|
address[] public allowedOutboxList;
|
36
45
|
|
37
|
-
address
|
46
|
+
address internal _activeOutbox;
|
38
47
|
|
39
|
-
/// @
|
40
|
-
bytes32[] public
|
48
|
+
/// @inheritdoc IBridge
|
49
|
+
bytes32[] public delayedInboxAccs;
|
41
50
|
|
42
|
-
/// @
|
43
|
-
bytes32[] public
|
51
|
+
/// @inheritdoc IBridge
|
52
|
+
bytes32[] public sequencerInboxAccs;
|
44
53
|
|
45
|
-
IOwnable public
|
54
|
+
IOwnable public rollup;
|
46
55
|
address public sequencerInbox;
|
47
56
|
|
48
|
-
|
57
|
+
uint256 public override sequencerReportedSubMessageCount;
|
58
|
+
|
59
|
+
address internal constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max);
|
49
60
|
|
50
61
|
function initialize(IOwnable rollup_) external initializer onlyDelegated {
|
51
62
|
_activeOutbox = EMPTY_ACTIVEOUTBOX;
|
@@ -73,11 +84,11 @@ contract Bridge is Initializable, DelegateCallAware, IBridge {
|
|
73
84
|
return outbox;
|
74
85
|
}
|
75
86
|
|
76
|
-
function allowedDelayedInboxes(address inbox) external view
|
87
|
+
function allowedDelayedInboxes(address inbox) external view returns (bool) {
|
77
88
|
return allowedDelayedInboxesMap[inbox].allowed;
|
78
89
|
}
|
79
90
|
|
80
|
-
function allowedOutboxes(address outbox) external view
|
91
|
+
function allowedOutboxes(address outbox) external view returns (bool) {
|
81
92
|
return allowedOutboxesMap[outbox].allowed;
|
82
93
|
}
|
83
94
|
|
@@ -86,9 +97,13 @@ contract Bridge is Initializable, DelegateCallAware, IBridge {
|
|
86
97
|
_;
|
87
98
|
}
|
88
99
|
|
89
|
-
function enqueueSequencerMessage(
|
100
|
+
function enqueueSequencerMessage(
|
101
|
+
bytes32 dataHash,
|
102
|
+
uint256 afterDelayedMessagesRead,
|
103
|
+
uint256 prevMessageCount,
|
104
|
+
uint256 newMessageCount
|
105
|
+
)
|
90
106
|
external
|
91
|
-
override
|
92
107
|
onlySequencerInbox
|
93
108
|
returns (
|
94
109
|
uint256 seqMessageIndex,
|
@@ -97,6 +112,14 @@ contract Bridge is Initializable, DelegateCallAware, IBridge {
|
|
97
112
|
bytes32 acc
|
98
113
|
)
|
99
114
|
{
|
115
|
+
if (
|
116
|
+
sequencerReportedSubMessageCount != prevMessageCount &&
|
117
|
+
prevMessageCount != 0 &&
|
118
|
+
sequencerReportedSubMessageCount != 0
|
119
|
+
) {
|
120
|
+
revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount);
|
121
|
+
}
|
122
|
+
sequencerReportedSubMessageCount = newMessageCount;
|
100
123
|
seqMessageIndex = sequencerInboxAccs.length;
|
101
124
|
if (sequencerInboxAccs.length > 0) {
|
102
125
|
beforeAcc = sequencerInboxAccs[sequencerInboxAccs.length - 1];
|
@@ -108,15 +131,9 @@ contract Bridge is Initializable, DelegateCallAware, IBridge {
|
|
108
131
|
sequencerInboxAccs.push(acc);
|
109
132
|
}
|
110
133
|
|
111
|
-
|
112
|
-
* @dev allows the sequencer inbox to submit a delayed message of the batchPostingReport type
|
113
|
-
* This is done through a separate function entrypoint instead of allowing the sequencer inbox
|
114
|
-
* to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either
|
115
|
-
* every delayed inbox or every sequencer inbox call.
|
116
|
-
*/
|
134
|
+
/// @inheritdoc IBridge
|
117
135
|
function submitBatchSpendingReport(address sender, bytes32 messageDataHash)
|
118
136
|
external
|
119
|
-
override
|
120
137
|
onlySequencerInbox
|
121
138
|
returns (uint256)
|
122
139
|
{
|
@@ -131,16 +148,12 @@ contract Bridge is Initializable, DelegateCallAware, IBridge {
|
|
131
148
|
);
|
132
149
|
}
|
133
150
|
|
134
|
-
|
135
|
-
* @dev Enqueue a message in the delayed inbox accumulator.
|
136
|
-
* These messages are later sequenced in the SequencerInbox, either by the sequencer as
|
137
|
-
* part of a normal batch, or by force inclusion.
|
138
|
-
*/
|
151
|
+
/// @inheritdoc IBridge
|
139
152
|
function enqueueDelayedMessage(
|
140
153
|
uint8 kind,
|
141
154
|
address sender,
|
142
155
|
bytes32 messageDataHash
|
143
|
-
) external payable
|
156
|
+
) external payable returns (uint256) {
|
144
157
|
if (!allowedDelayedInboxesMap[msg.sender].allowed) revert NotDelayedInbox(msg.sender);
|
145
158
|
return
|
146
159
|
addMessageToDelayedAccumulator(
|
@@ -193,7 +206,7 @@ contract Bridge is Initializable, DelegateCallAware, IBridge {
|
|
193
206
|
address to,
|
194
207
|
uint256 value,
|
195
208
|
bytes calldata data
|
196
|
-
) external
|
209
|
+
) external returns (bool success, bytes memory returnData) {
|
197
210
|
if (!allowedOutboxesMap[msg.sender].allowed) revert NotOutbox(msg.sender);
|
198
211
|
if (data.length > 0 && !to.isContract()) revert NotContract(to);
|
199
212
|
address prevOutbox = _activeOutbox;
|
@@ -208,12 +221,12 @@ contract Bridge is Initializable, DelegateCallAware, IBridge {
|
|
208
221
|
emit BridgeCallTriggered(msg.sender, to, value, data);
|
209
222
|
}
|
210
223
|
|
211
|
-
function setSequencerInbox(address _sequencerInbox) external
|
224
|
+
function setSequencerInbox(address _sequencerInbox) external onlyRollupOrOwner {
|
212
225
|
sequencerInbox = _sequencerInbox;
|
213
226
|
emit SequencerInboxUpdated(_sequencerInbox);
|
214
227
|
}
|
215
228
|
|
216
|
-
function setDelayedInbox(address inbox, bool enabled) external
|
229
|
+
function setDelayedInbox(address inbox, bool enabled) external onlyRollupOrOwner {
|
217
230
|
InOutInfo storage info = allowedDelayedInboxesMap[inbox];
|
218
231
|
bool alreadyEnabled = info.allowed;
|
219
232
|
emit InboxToggle(inbox, enabled);
|
@@ -233,7 +246,7 @@ contract Bridge is Initializable, DelegateCallAware, IBridge {
|
|
233
246
|
}
|
234
247
|
}
|
235
248
|
|
236
|
-
function setOutbox(address outbox, bool enabled) external
|
249
|
+
function setOutbox(address outbox, bool enabled) external onlyRollupOrOwner {
|
237
250
|
if (outbox == EMPTY_ACTIVEOUTBOX) revert InvalidOutboxSet(outbox);
|
238
251
|
|
239
252
|
InOutInfo storage info = allowedOutboxesMap[outbox];
|
@@ -253,11 +266,18 @@ contract Bridge is Initializable, DelegateCallAware, IBridge {
|
|
253
266
|
}
|
254
267
|
}
|
255
268
|
|
269
|
+
function setSequencerReportedSubMessageCount(uint256 newMsgCount) external onlyRollupOrOwner {
|
270
|
+
sequencerReportedSubMessageCount = newMsgCount;
|
271
|
+
}
|
272
|
+
|
256
273
|
function delayedMessageCount() external view override returns (uint256) {
|
257
274
|
return delayedInboxAccs.length;
|
258
275
|
}
|
259
276
|
|
260
|
-
function sequencerMessageCount() external view
|
277
|
+
function sequencerMessageCount() external view returns (uint256) {
|
261
278
|
return sequencerInboxAccs.length;
|
262
279
|
}
|
280
|
+
|
281
|
+
/// @dev For the classic -> nitro migration. TODO: remove post-migration.
|
282
|
+
function acceptFundsFromOldBridge() external payable {}
|
263
283
|
}
|
package/src/bridge/IBridge.sol
CHANGED
@@ -2,27 +2,11 @@
|
|
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 {NotContract, NotRollupOrOwner} from "../libraries/Error.sol";
|
8
8
|
import "./IOwnable.sol";
|
9
9
|
|
10
|
-
/// @dev Thrown when an un-authorized address tries to access an only-inbox function
|
11
|
-
/// @param sender The un-authorized sender
|
12
|
-
error NotDelayedInbox(address sender);
|
13
|
-
|
14
|
-
/// @dev Thrown when an un-authorized address tries to access an only-sequencer-inbox function
|
15
|
-
/// @param sender The un-authorized sender
|
16
|
-
error NotSequencerInbox(address sender);
|
17
|
-
|
18
|
-
/// @dev Thrown when an un-authorized address tries to access an only-outbox function
|
19
|
-
/// @param sender The un-authorized sender
|
20
|
-
error NotOutbox(address sender);
|
21
|
-
|
22
|
-
/// @dev the provided outbox address isn't valid
|
23
|
-
/// @param outbox address of outbox being set
|
24
|
-
error InvalidOutboxSet(address outbox);
|
25
|
-
|
26
10
|
interface IBridge {
|
27
11
|
event MessageDelivered(
|
28
12
|
uint256 indexed messageIndex,
|
@@ -48,13 +32,57 @@ interface IBridge {
|
|
48
32
|
|
49
33
|
event SequencerInboxUpdated(address newSequencerInbox);
|
50
34
|
|
35
|
+
function allowedDelayedInboxList(uint256) external returns (address);
|
36
|
+
|
37
|
+
function allowedOutboxList(uint256) external returns (address);
|
38
|
+
|
39
|
+
/// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
|
40
|
+
function delayedInboxAccs(uint256) external view returns (bytes32);
|
41
|
+
|
42
|
+
/// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
|
43
|
+
function sequencerInboxAccs(uint256) external view returns (bytes32);
|
44
|
+
|
45
|
+
function rollup() external view returns (IOwnable);
|
46
|
+
|
47
|
+
function sequencerInbox() external view returns (address);
|
48
|
+
|
49
|
+
function activeOutbox() external view returns (address);
|
50
|
+
|
51
|
+
function allowedDelayedInboxes(address inbox) external view returns (bool);
|
52
|
+
|
53
|
+
function allowedOutboxes(address outbox) external view returns (bool);
|
54
|
+
|
55
|
+
function sequencerReportedSubMessageCount() external view returns (uint256);
|
56
|
+
|
57
|
+
/**
|
58
|
+
* @dev Enqueue a message in the delayed inbox accumulator.
|
59
|
+
* These messages are later sequenced in the SequencerInbox, either
|
60
|
+
* by the sequencer as part of a normal batch, or by force inclusion.
|
61
|
+
*/
|
51
62
|
function enqueueDelayedMessage(
|
52
63
|
uint8 kind,
|
53
64
|
address sender,
|
54
65
|
bytes32 messageDataHash
|
55
66
|
) external payable returns (uint256);
|
56
67
|
|
57
|
-
function
|
68
|
+
function executeCall(
|
69
|
+
address to,
|
70
|
+
uint256 value,
|
71
|
+
bytes calldata data
|
72
|
+
) external returns (bool success, bytes memory returnData);
|
73
|
+
|
74
|
+
function delayedMessageCount() external view returns (uint256);
|
75
|
+
|
76
|
+
function sequencerMessageCount() external view returns (uint256);
|
77
|
+
|
78
|
+
// ---------- onlySequencerInbox functions ----------
|
79
|
+
|
80
|
+
function enqueueSequencerMessage(
|
81
|
+
bytes32 dataHash,
|
82
|
+
uint256 afterDelayedMessagesRead,
|
83
|
+
uint256 prevMessageCount,
|
84
|
+
uint256 newMessageCount
|
85
|
+
)
|
58
86
|
external
|
59
87
|
returns (
|
60
88
|
uint256 seqMessageIndex,
|
@@ -63,40 +91,25 @@ interface IBridge {
|
|
63
91
|
bytes32 acc
|
64
92
|
);
|
65
93
|
|
94
|
+
/**
|
95
|
+
* @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type
|
96
|
+
* This is done through a separate function entrypoint instead of allowing the sequencer inbox
|
97
|
+
* to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either
|
98
|
+
* every delayed inbox or every sequencer inbox call.
|
99
|
+
*/
|
66
100
|
function submitBatchSpendingReport(address batchPoster, bytes32 dataHash)
|
67
101
|
external
|
68
102
|
returns (uint256 msgNum);
|
69
103
|
|
70
|
-
|
71
|
-
address to,
|
72
|
-
uint256 value,
|
73
|
-
bytes calldata data
|
74
|
-
) external returns (bool success, bytes memory returnData);
|
75
|
-
|
76
|
-
// These are only callable by the admin
|
77
|
-
function setDelayedInbox(address inbox, bool enabled) external;
|
78
|
-
|
79
|
-
function setOutbox(address inbox, bool enabled) external;
|
104
|
+
// ---------- onlyRollupOrOwner functions ----------
|
80
105
|
|
81
106
|
function setSequencerInbox(address _sequencerInbox) external;
|
82
107
|
|
83
|
-
|
84
|
-
|
85
|
-
function sequencerInbox() external view returns (address);
|
86
|
-
|
87
|
-
function activeOutbox() external view returns (address);
|
88
|
-
|
89
|
-
function allowedDelayedInboxes(address inbox) external view returns (bool);
|
90
|
-
|
91
|
-
function allowedOutboxes(address outbox) external view returns (bool);
|
92
|
-
|
93
|
-
function delayedInboxAccs(uint256 index) external view returns (bytes32);
|
94
|
-
|
95
|
-
function sequencerInboxAccs(uint256 index) external view returns (bytes32);
|
108
|
+
function setDelayedInbox(address inbox, bool enabled) external;
|
96
109
|
|
97
|
-
function
|
110
|
+
function setOutbox(address inbox, bool enabled) external;
|
98
111
|
|
99
|
-
|
112
|
+
// ---------- initializer ----------
|
100
113
|
|
101
|
-
function
|
114
|
+
function initialize(IOwnable rollup_) external;
|
102
115
|
}
|
@@ -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.6.9 <0.9.0;
|
6
7
|
|
7
8
|
interface IDelayedMessageProvider {
|
8
9
|
/// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator
|
package/src/bridge/IInbox.sol
CHANGED
@@ -2,47 +2,48 @@
|
|
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
8
|
import "./IBridge.sol";
|
8
9
|
import "./IDelayedMessageProvider.sol";
|
9
|
-
import
|
10
|
+
import "./ISequencerInbox.sol";
|
10
11
|
|
11
|
-
|
12
|
-
|
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);
|
12
|
+
interface IInbox is IDelayedMessageProvider {
|
13
|
+
function bridge() external view returns (IBridge);
|
25
14
|
|
26
|
-
|
27
|
-
|
15
|
+
function sequencerInbox() external view returns (ISequencerInbox);
|
16
|
+
|
17
|
+
/**
|
18
|
+
* @notice Send a generic L2 message to the chain
|
19
|
+
* @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
|
20
|
+
* This method will be disabled upon L1 fork to prevent replay attacks on L2
|
21
|
+
* @param messageData Data of the message being sent
|
22
|
+
*/
|
23
|
+
function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256);
|
24
|
+
|
25
|
+
/**
|
26
|
+
* @notice Send a generic L2 message to the chain
|
27
|
+
* @dev This method can be used to send any type of message that doesn't require L1 validation
|
28
|
+
* This method will be disabled upon L1 fork to prevent replay attacks on L2
|
29
|
+
* @param messageData Data of the message being sent
|
30
|
+
*/
|
31
|
+
function sendL2Message(bytes calldata messageData) external returns (uint256);
|
28
32
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
uint256
|
36
|
-
uint256 maxSubmissionCost,
|
37
|
-
address excessFeeRefundAddress,
|
38
|
-
address callValueRefundAddress,
|
39
|
-
uint256 gasLimit,
|
40
|
-
uint256 maxFeePerGas,
|
41
|
-
bytes data
|
42
|
-
);
|
33
|
+
function sendL1FundedUnsignedTransaction(
|
34
|
+
uint256 gasLimit,
|
35
|
+
uint256 maxFeePerGas,
|
36
|
+
uint256 nonce,
|
37
|
+
address to,
|
38
|
+
bytes calldata data
|
39
|
+
) external payable returns (uint256);
|
43
40
|
|
44
|
-
|
45
|
-
|
41
|
+
function sendL1FundedContractTransaction(
|
42
|
+
uint256 gasLimit,
|
43
|
+
uint256 maxFeePerGas,
|
44
|
+
address to,
|
45
|
+
bytes calldata data
|
46
|
+
) external payable returns (uint256);
|
46
47
|
|
47
48
|
function sendUnsignedTransaction(
|
48
49
|
uint256 gasLimit,
|
@@ -61,7 +62,11 @@ interface IInbox is IDelayedMessageProvider {
|
|
61
62
|
bytes calldata data
|
62
63
|
) external returns (uint256);
|
63
64
|
|
64
|
-
|
65
|
+
/**
|
66
|
+
* @dev This method can only be called upon L1 fork and will not alias the caller
|
67
|
+
* This method will revert if not called from origin
|
68
|
+
*/
|
69
|
+
function sendL1FundedUnsignedTransactionToFork(
|
65
70
|
uint256 gasLimit,
|
66
71
|
uint256 maxFeePerGas,
|
67
72
|
uint256 nonce,
|
@@ -69,42 +74,120 @@ interface IInbox is IDelayedMessageProvider {
|
|
69
74
|
bytes calldata data
|
70
75
|
) external payable returns (uint256);
|
71
76
|
|
72
|
-
|
77
|
+
/**
|
78
|
+
* @dev This method can only be called upon L1 fork and will not alias the caller
|
79
|
+
* This method will revert if not called from origin
|
80
|
+
*/
|
81
|
+
function sendUnsignedTransactionToFork(
|
73
82
|
uint256 gasLimit,
|
74
83
|
uint256 maxFeePerGas,
|
84
|
+
uint256 nonce,
|
75
85
|
address to,
|
86
|
+
uint256 value,
|
76
87
|
bytes calldata data
|
77
|
-
) external
|
88
|
+
) external returns (uint256);
|
89
|
+
|
90
|
+
/**
|
91
|
+
* @notice Send a message to initiate L2 withdrawal
|
92
|
+
* @dev This method can only be called upon L1 fork and will not alias the caller
|
93
|
+
* This method will revert if not called from origin
|
94
|
+
*/
|
95
|
+
function sendWithdrawEthToFork(
|
96
|
+
uint256 gasLimit,
|
97
|
+
uint256 maxFeePerGas,
|
98
|
+
uint256 nonce,
|
99
|
+
uint256 value,
|
100
|
+
address withdrawTo
|
101
|
+
) external returns (uint256);
|
102
|
+
|
103
|
+
/**
|
104
|
+
* @notice Get the L1 fee for submitting a retryable
|
105
|
+
* @dev This fee can be paid by funds already in the L2 aliased address or by the current message value
|
106
|
+
* @dev This formula may change in the future, to future proof your code query this method instead of inlining!!
|
107
|
+
* @param dataLength The length of the retryable's calldata, in bytes
|
108
|
+
* @param baseFee The block basefee when the retryable is included in the chain, if 0 current block.basefee will be used
|
109
|
+
*/
|
110
|
+
function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee)
|
111
|
+
external
|
112
|
+
view
|
113
|
+
returns (uint256);
|
114
|
+
|
115
|
+
/**
|
116
|
+
* @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
|
117
|
+
* @dev This does not trigger the fallback function when receiving in the L2 side.
|
118
|
+
* Look into retryable tickets if you are interested in this functionality.
|
119
|
+
* @dev This function should not be called inside contract constructors
|
120
|
+
*/
|
121
|
+
function depositEth() external payable returns (uint256);
|
78
122
|
|
79
|
-
|
123
|
+
/**
|
124
|
+
* @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts
|
125
|
+
* @dev all msg.value will deposited to callValueRefundAddress on L2
|
126
|
+
* @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error
|
127
|
+
* @param to destination L2 contract address
|
128
|
+
* @param l2CallValue call value for retryable L2 message
|
129
|
+
* @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee
|
130
|
+
* @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance
|
131
|
+
* @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled
|
132
|
+
* @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)
|
133
|
+
* @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
|
134
|
+
* @param data ABI encoded data of L2 message
|
135
|
+
* @return unique message number of the retryable transaction
|
136
|
+
*/
|
80
137
|
function createRetryableTicket(
|
81
138
|
address to,
|
82
|
-
uint256
|
139
|
+
uint256 l2CallValue,
|
83
140
|
uint256 maxSubmissionCost,
|
84
|
-
address
|
85
|
-
address
|
141
|
+
address excessFeeRefundAddress,
|
142
|
+
address callValueRefundAddress,
|
86
143
|
uint256 gasLimit,
|
87
144
|
uint256 maxFeePerGas,
|
88
145
|
bytes calldata data
|
89
146
|
) external payable returns (uint256);
|
90
147
|
|
91
|
-
|
92
|
-
|
148
|
+
/**
|
149
|
+
* @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts
|
150
|
+
* @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds
|
151
|
+
* come from the deposit alone, rather than falling back on the user's L2 balance
|
152
|
+
* @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress).
|
153
|
+
* createRetryableTicket method is the recommended standard.
|
154
|
+
* @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error
|
155
|
+
* @param to destination L2 contract address
|
156
|
+
* @param l2CallValue call value for retryable L2 message
|
157
|
+
* @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee
|
158
|
+
* @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance
|
159
|
+
* @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled
|
160
|
+
* @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)
|
161
|
+
* @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
|
162
|
+
* @param data ABI encoded data of L2 message
|
163
|
+
* @return unique message number of the retryable transaction
|
164
|
+
*/
|
93
165
|
function unsafeCreateRetryableTicket(
|
94
166
|
address to,
|
95
|
-
uint256
|
167
|
+
uint256 l2CallValue,
|
96
168
|
uint256 maxSubmissionCost,
|
97
|
-
address
|
98
|
-
address
|
169
|
+
address excessFeeRefundAddress,
|
170
|
+
address callValueRefundAddress,
|
99
171
|
uint256 gasLimit,
|
100
172
|
uint256 maxFeePerGas,
|
101
173
|
bytes calldata data
|
102
174
|
) external payable returns (uint256);
|
103
175
|
|
104
|
-
|
176
|
+
// ---------- onlyRollupOrOwner functions ----------
|
105
177
|
|
106
|
-
/// @notice
|
107
|
-
function
|
178
|
+
/// @notice pauses all inbox functionality
|
179
|
+
function pause() external;
|
108
180
|
|
109
|
-
|
181
|
+
/// @notice unpauses all inbox functionality
|
182
|
+
function unpause() external;
|
183
|
+
|
184
|
+
// ---------- initializer ----------
|
185
|
+
|
186
|
+
/**
|
187
|
+
* @dev function to be called one time during the inbox upgrade process
|
188
|
+
* this is used to fix the storage slots
|
189
|
+
*/
|
190
|
+
function postUpgradeInit(IBridge _bridge) external;
|
191
|
+
|
192
|
+
function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external;
|
110
193
|
}
|