@arbitrum/nitro-contracts 1.0.0-beta.6 → 1.0.0-beta.7
Sign up to get free protection for your applications and to get access to all the features.
- package/package.json +1 -1
- package/src/bridge/IDelayedMessageProvider.sol +4 -0
- package/src/bridge/Inbox.sol +20 -9
- package/src/libraries/IGasRefunder.sol +1 -0
- package/src/mocks/InboxStub.sol +9 -3
- package/src/precompiles/ArbSys.sol +1 -1
- package/src/rollup/RollupUserLogic.sol +1 -0
- package/src/rollup/ValidatorWallet.sol +1 -0
package/package.json
CHANGED
@@ -7,4 +7,8 @@ pragma solidity ^0.8.0;
|
|
7
7
|
interface IDelayedMessageProvider {
|
8
8
|
/// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator
|
9
9
|
event InboxMessageDelivered(uint256 indexed messageNum, bytes data);
|
10
|
+
|
11
|
+
/// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator
|
12
|
+
/// same as InboxMessageDelivered but the batch data is available in tx.input
|
13
|
+
event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum);
|
10
14
|
}
|
package/src/bridge/Inbox.sol
CHANGED
@@ -61,6 +61,7 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox {
|
|
61
61
|
/// this modifier is not intended to use to be used for security (since this opens the allowList to
|
62
62
|
/// a smart contract phishing risk).
|
63
63
|
modifier onlyAllowed() {
|
64
|
+
// solhint-disable-next-line avoid-tx-origin
|
64
65
|
if (allowListEnabled && !isAllowed[tx.origin]) revert NotAllowedOrigin(tx.origin);
|
65
66
|
_;
|
66
67
|
}
|
@@ -114,14 +115,23 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox {
|
|
114
115
|
}
|
115
116
|
|
116
117
|
/**
|
117
|
-
* @
|
118
|
+
* @notice Send a generic L2 message to the chain
|
119
|
+
* @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
|
118
120
|
* @param messageData Data of the message being sent
|
119
121
|
*/
|
120
122
|
function sendL2MessageFromOrigin(bytes calldata messageData)
|
121
123
|
external
|
124
|
+
whenNotPaused
|
125
|
+
onlyAllowed
|
122
126
|
returns (uint256)
|
123
127
|
{
|
124
|
-
|
128
|
+
// solhint-disable-next-line avoid-tx-origin
|
129
|
+
if (msg.sender != tx.origin) revert NotOrigin();
|
130
|
+
if (messageData.length > MAX_DATA_SIZE)
|
131
|
+
revert DataTooLarge(messageData.length, MAX_DATA_SIZE);
|
132
|
+
uint256 msgNum = deliverToBridge(L2_MSG, msg.sender, keccak256(messageData));
|
133
|
+
emit InboxMessageDeliveredFromOrigin(msgNum);
|
134
|
+
return msgNum;
|
125
135
|
}
|
126
136
|
|
127
137
|
/**
|
@@ -130,7 +140,7 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox {
|
|
130
140
|
* @param messageData Data of the message being sent
|
131
141
|
*/
|
132
142
|
function sendL2Message(bytes calldata messageData)
|
133
|
-
|
143
|
+
external
|
134
144
|
override
|
135
145
|
whenNotPaused
|
136
146
|
onlyAllowed
|
@@ -461,11 +471,7 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox {
|
|
461
471
|
) internal returns (uint256) {
|
462
472
|
if (_messageData.length > MAX_DATA_SIZE)
|
463
473
|
revert DataTooLarge(_messageData.length, MAX_DATA_SIZE);
|
464
|
-
uint256 msgNum = deliverToBridge(
|
465
|
-
_kind,
|
466
|
-
AddressAliasHelper.applyL1ToL2Alias(_sender),
|
467
|
-
keccak256(_messageData)
|
468
|
-
);
|
474
|
+
uint256 msgNum = deliverToBridge(_kind, _sender, keccak256(_messageData));
|
469
475
|
emit InboxMessageDelivered(msgNum, _messageData);
|
470
476
|
return msgNum;
|
471
477
|
}
|
@@ -475,6 +481,11 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox {
|
|
475
481
|
address sender,
|
476
482
|
bytes32 messageDataHash
|
477
483
|
) internal returns (uint256) {
|
478
|
-
return
|
484
|
+
return
|
485
|
+
bridge.enqueueDelayedMessage{value: msg.value}(
|
486
|
+
kind,
|
487
|
+
AddressAliasHelper.applyL1ToL2Alias(sender),
|
488
|
+
messageDataHash
|
489
|
+
);
|
479
490
|
}
|
480
491
|
}
|
@@ -23,6 +23,7 @@ abstract contract GasRefundEnabled {
|
|
23
23
|
uint256 calldataSize = 0;
|
24
24
|
// if triggered in a contract call, the spender may be overrefunded by appending dummy data to the call
|
25
25
|
// so we check if it is a top level call, which would mean the sender paid calldata as part of tx.input
|
26
|
+
// solhint-disable-next-line avoid-tx-origin
|
26
27
|
if (msg.sender == tx.origin) {
|
27
28
|
assembly {
|
28
29
|
calldataSize := calldatasize()
|
package/src/mocks/InboxStub.sol
CHANGED
@@ -28,10 +28,16 @@ contract InboxStub is IInbox {
|
|
28
28
|
}
|
29
29
|
|
30
30
|
/**
|
31
|
-
* @
|
31
|
+
* @notice Send a generic L2 message to the chain
|
32
|
+
* @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
|
33
|
+
* @param messageData Data of the message being sent
|
32
34
|
*/
|
33
35
|
function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256) {
|
34
|
-
|
36
|
+
// solhint-disable-next-line avoid-tx-origin
|
37
|
+
require(msg.sender == tx.origin, "origin only");
|
38
|
+
uint256 msgNum = deliverToBridge(L2_MSG, msg.sender, keccak256(messageData));
|
39
|
+
emit InboxMessageDeliveredFromOrigin(msgNum);
|
40
|
+
return msgNum;
|
35
41
|
}
|
36
42
|
|
37
43
|
/**
|
@@ -39,7 +45,7 @@ contract InboxStub is IInbox {
|
|
39
45
|
* @dev This method can be used to send any type of message that doesn't require L1 validation
|
40
46
|
* @param messageData Data of the message being sent
|
41
47
|
*/
|
42
|
-
function sendL2Message(bytes calldata messageData)
|
48
|
+
function sendL2Message(bytes calldata messageData) external override returns (uint256) {
|
43
49
|
uint256 msgNum = deliverToBridge(L2_MSG, msg.sender, keccak256(messageData));
|
44
50
|
emit InboxMessageDelivered(msgNum, messageData);
|
45
51
|
return msgNum;
|
@@ -38,7 +38,7 @@ interface ArbSys {
|
|
38
38
|
* @notice Returns 0 since Nitro has no concept of storage gas
|
39
39
|
* @return int 0
|
40
40
|
*/
|
41
|
-
function getStorageGasAvailable() external returns (uint256);
|
41
|
+
function getStorageGasAvailable() external view returns (uint256);
|
42
42
|
|
43
43
|
/**
|
44
44
|
* @notice check if current call is coming from l1
|
@@ -623,6 +623,7 @@ contract RollupUserLogic is AbsRollupUserLogic, IRollupUser {
|
|
623
623
|
function withdrawStakerFunds() external override onlyValidator whenNotPaused returns (uint256) {
|
624
624
|
uint256 amount = withdrawFunds(msg.sender);
|
625
625
|
// This is safe because it occurs after all checks and effects
|
626
|
+
// solhint-disable-next-line avoid-low-level-calls
|
626
627
|
(bool success, ) = msg.sender.call{value: amount}("");
|
627
628
|
require(success, "TRANSFER_FAILED");
|
628
629
|
return amount;
|
@@ -185,6 +185,7 @@ contract ValidatorWallet is OwnableUpgradeable, DelegateCallAware, GasRefundEnab
|
|
185
185
|
|
186
186
|
/// @dev allows the owner to withdraw eth held by this contract
|
187
187
|
function withdrawEth(uint256 amount, address destination) external onlyOwner {
|
188
|
+
// solhint-disable-next-line avoid-low-level-calls
|
188
189
|
(bool success, ) = destination.call{value: amount}("");
|
189
190
|
if (!success) revert WithdrawEthFail(destination);
|
190
191
|
}
|