@arbitrum/nitro-contracts 1.0.0-beta.6 → 1.0.0-beta.7
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 +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
|
}
|