@arbitrum/nitro-contracts 1.1.1 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- package/LICENSE.md +1 -0
- package/README.md +2 -4
- package/build/contracts/@openzeppelin/contracts/access/Ownable.sol/Ownable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol/ERC1967Upgrade.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/Proxy.sol/Proxy.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/beacon/IBeacon.sol/IBeacon.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol/UpgradeableBeacon.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol/UUPSUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/security/ReentrancyGuard.sol/ReentrancyGuard.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/token/ERC20/ERC20.sol/ERC20.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/token/ERC20/IERC20.sol/IERC20.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol/IERC20Metadata.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol/SafeERC20.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/utils/Address.sol/Address.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/utils/Context.sol/Context.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol/AccessControlUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol/IAccessControlUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol/OwnableUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol/Initializable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol/PausableUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol/IERC20Upgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol/AddressUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol/ContextUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol/StorageSlotUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol/StringsUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol/ERC165Upgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol/IERC165Upgradeable.dbg.json +1 -1
- package/build/contracts/src/bridge/AbsBridge.sol/AbsBridge.dbg.json +1 -1
- package/build/contracts/src/bridge/AbsInbox.sol/AbsInbox.dbg.json +1 -1
- package/build/contracts/src/bridge/AbsOutbox.sol/AbsOutbox.dbg.json +1 -1
- package/build/contracts/src/bridge/Bridge.sol/Bridge.dbg.json +1 -1
- package/build/contracts/src/bridge/Bridge.sol/Bridge.json +2 -2
- package/build/contracts/src/bridge/ERC20Bridge.sol/ERC20Bridge.dbg.json +1 -1
- package/build/contracts/src/bridge/ERC20Bridge.sol/ERC20Bridge.json +2 -2
- package/build/contracts/src/bridge/ERC20Inbox.sol/ERC20Inbox.dbg.json +1 -1
- package/build/contracts/src/bridge/ERC20Inbox.sol/ERC20Inbox.json +2 -2
- package/build/contracts/src/bridge/ERC20Outbox.sol/ERC20Outbox.dbg.json +1 -1
- package/build/contracts/src/bridge/ERC20Outbox.sol/ERC20Outbox.json +2 -2
- package/build/contracts/src/bridge/GasRefunder.sol/GasRefunder.dbg.json +1 -1
- package/build/contracts/src/bridge/GasRefunder.sol/GasRefunder.json +2 -2
- package/build/contracts/src/bridge/IBridge.sol/IBridge.dbg.json +1 -1
- package/build/contracts/src/bridge/IDelayedMessageProvider.sol/IDelayedMessageProvider.dbg.json +1 -1
- package/build/contracts/src/bridge/IERC20Bridge.sol/IERC20Bridge.dbg.json +1 -1
- package/build/contracts/src/bridge/IERC20Inbox.sol/IERC20Inbox.dbg.json +1 -1
- package/build/contracts/src/bridge/IEthBridge.sol/IEthBridge.dbg.json +1 -1
- package/build/contracts/src/bridge/IInbox.sol/IInbox.dbg.json +1 -1
- package/build/contracts/src/bridge/IInboxBase.sol/IInboxBase.dbg.json +1 -1
- package/build/contracts/src/bridge/IOutbox.sol/IOutbox.dbg.json +1 -1
- package/build/contracts/src/bridge/IOwnable.sol/IOwnable.dbg.json +1 -1
- package/build/contracts/src/bridge/ISequencerInbox.sol/ISequencerInbox.dbg.json +1 -1
- package/build/contracts/src/bridge/ISequencerInbox.sol/ISequencerInbox.json +168 -6
- package/build/contracts/src/bridge/Inbox.sol/Inbox.dbg.json +1 -1
- package/build/contracts/src/bridge/Inbox.sol/Inbox.json +2 -2
- package/build/contracts/src/bridge/Messages.sol/Messages.dbg.json +1 -1
- package/build/contracts/src/bridge/Outbox.sol/Outbox.dbg.json +1 -1
- package/build/contracts/src/bridge/Outbox.sol/Outbox.json +2 -2
- package/build/contracts/src/bridge/SequencerInbox.sol/SequencerInbox.dbg.json +1 -1
- package/build/contracts/src/bridge/SequencerInbox.sol/SequencerInbox.json +238 -13
- package/build/contracts/src/challenge/ChallengeLib.sol/ChallengeLib.dbg.json +1 -1
- package/build/contracts/src/challenge/ChallengeManager.sol/ChallengeManager.dbg.json +1 -1
- package/build/contracts/src/challenge/ChallengeManager.sol/ChallengeManager.json +31 -2
- package/build/contracts/src/challenge/IChallengeManager.sol/IChallengeManager.dbg.json +1 -1
- package/build/contracts/src/challenge/IChallengeResultReceiver.sol/IChallengeResultReceiver.dbg.json +1 -1
- package/build/contracts/src/libraries/AddressAliasHelper.sol/AddressAliasHelper.dbg.json +1 -1
- package/build/contracts/src/libraries/AdminFallbackProxy.sol/AdminFallbackProxy.dbg.json +1 -1
- package/build/contracts/src/libraries/AdminFallbackProxy.sol/DoubleLogicERC1967Upgrade.dbg.json +1 -1
- package/build/contracts/src/libraries/ArbitrumChecker.sol/ArbitrumChecker.dbg.json +1 -1
- package/build/contracts/src/libraries/CryptographyPrimitives.sol/CryptographyPrimitives.dbg.json +1 -1
- package/build/contracts/src/libraries/DelegateCallAware.sol/DelegateCallAware.dbg.json +1 -1
- package/build/contracts/src/libraries/DoubleLogicUUPSUpgradeable.sol/DoubleLogicUUPSUpgradeable.dbg.json +1 -1
- package/build/contracts/src/libraries/GasRefundEnabled.sol/GasRefundEnabled.dbg.json +4 -0
- package/build/contracts/src/libraries/{IGasRefunder.sol → GasRefundEnabled.sol}/GasRefundEnabled.json +1 -1
- package/build/contracts/src/libraries/IGasRefunder.sol/IGasRefunder.dbg.json +1 -1
- package/build/contracts/src/libraries/IReader4844.sol/IReader4844.dbg.json +4 -0
- package/build/contracts/src/libraries/IReader4844.sol/IReader4844.json +37 -0
- package/build/contracts/src/libraries/MerkleLib.sol/MerkleLib.dbg.json +1 -1
- package/build/contracts/src/libraries/MerkleLib.sol/MerkleLib.json +2 -2
- package/build/contracts/src/libraries/UUPSNotUpgradeable.sol/UUPSNotUpgradeable.dbg.json +1 -1
- package/build/contracts/src/mocks/BridgeStub.sol/BridgeStub.dbg.json +1 -1
- package/build/contracts/src/mocks/BridgeStub.sol/BridgeStub.json +2 -2
- package/build/contracts/src/mocks/BridgeUnproxied.sol/BridgeUnproxied.dbg.json +1 -1
- package/build/contracts/src/mocks/BridgeUnproxied.sol/BridgeUnproxied.json +2 -2
- package/build/contracts/src/mocks/InboxStub.sol/InboxStub.dbg.json +1 -1
- package/build/contracts/src/mocks/InboxStub.sol/InboxStub.json +4 -4
- package/build/contracts/src/mocks/MockResultReceiver.sol/MockResultReceiver.dbg.json +1 -1
- package/build/contracts/src/mocks/MockResultReceiver.sol/MockResultReceiver.json +2 -2
- package/build/contracts/src/mocks/ProxyAdminForBinding.sol/ProxyAdminForBinding.dbg.json +1 -1
- package/build/contracts/src/mocks/SequencerInboxStub.sol/SequencerInboxStub.dbg.json +1 -1
- package/build/contracts/src/mocks/SequencerInboxStub.sol/SequencerInboxStub.json +238 -13
- package/build/contracts/src/mocks/Simple.sol/Simple.dbg.json +1 -1
- package/build/contracts/src/mocks/Simple.sol/Simple.json +45 -2
- package/build/contracts/src/mocks/SimpleProxy.sol/SimpleProxy.dbg.json +1 -1
- package/build/contracts/src/mocks/SingleExecutionChallenge.sol/SingleExecutionChallenge.dbg.json +1 -1
- package/build/contracts/src/mocks/SingleExecutionChallenge.sol/SingleExecutionChallenge.json +31 -2
- package/build/contracts/src/mocks/TimedOutChallengeManager.sol/TimedOutChallengeManager.dbg.json +1 -1
- package/build/contracts/src/mocks/TimedOutChallengeManager.sol/TimedOutChallengeManager.json +31 -2
- package/build/contracts/src/mocks/UpgradeExecutorMock.sol/UpgradeExecutorMock.dbg.json +1 -1
- package/build/contracts/src/node-interface/NodeInterface.sol/NodeInterface.dbg.json +1 -1
- package/build/contracts/src/node-interface/NodeInterfaceDebug.sol/NodeInterfaceDebug.dbg.json +1 -1
- package/build/contracts/src/osp/HashProofHelper.sol/HashProofHelper.dbg.json +1 -1
- package/build/contracts/src/osp/IOneStepProofEntry.sol/IOneStepProofEntry.dbg.json +1 -1
- package/build/contracts/src/osp/IOneStepProofEntry.sol/OneStepProofEntryLib.dbg.json +1 -1
- package/build/contracts/src/osp/IOneStepProofEntry.sol/OneStepProofEntryLib.json +2 -2
- package/build/contracts/src/osp/IOneStepProver.sol/IOneStepProver.dbg.json +1 -1
- package/build/contracts/src/osp/OneStepProofEntry.sol/OneStepProofEntry.dbg.json +1 -1
- package/build/contracts/src/osp/OneStepProofEntry.sol/OneStepProofEntry.json +2 -2
- package/build/contracts/src/osp/OneStepProver0.sol/OneStepProver0.dbg.json +1 -1
- package/build/contracts/src/osp/OneStepProver0.sol/OneStepProver0.json +2 -2
- package/build/contracts/src/osp/OneStepProverHostIo.sol/OneStepProverHostIo.dbg.json +1 -1
- package/build/contracts/src/osp/OneStepProverHostIo.sol/OneStepProverHostIo.json +2 -2
- package/build/contracts/src/osp/OneStepProverMath.sol/OneStepProverMath.dbg.json +1 -1
- package/build/contracts/src/osp/OneStepProverMath.sol/OneStepProverMath.json +2 -2
- package/build/contracts/src/osp/OneStepProverMemory.sol/OneStepProverMemory.dbg.json +1 -1
- package/build/contracts/src/osp/OneStepProverMemory.sol/OneStepProverMemory.json +2 -2
- package/build/contracts/src/precompiles/ArbAddressTable.sol/ArbAddressTable.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbAggregator.sol/ArbAggregator.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbBLS.sol/ArbBLS.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbDebug.sol/ArbDebug.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbFunctionTable.sol/ArbFunctionTable.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbGasInfo.sol/ArbGasInfo.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbGasInfo.sol/ArbGasInfo.json +65 -0
- package/build/contracts/src/precompiles/ArbInfo.sol/ArbInfo.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbOwner.sol/ArbOwner.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbOwnerPublic.sol/ArbOwnerPublic.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbOwnerPublic.sol/ArbOwnerPublic.json +18 -0
- package/build/contracts/src/precompiles/ArbRetryableTx.sol/ArbRetryableTx.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbStatistics.sol/ArbStatistics.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbSys.sol/ArbSys.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbosActs.sol/ArbosActs.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbosTest.sol/ArbosTest.dbg.json +1 -1
- package/build/contracts/src/rollup/AbsRollupEventInbox.sol/AbsRollupEventInbox.dbg.json +1 -1
- package/build/contracts/src/rollup/BridgeCreator.sol/BridgeCreator.dbg.json +1 -1
- package/build/contracts/src/rollup/BridgeCreator.sol/BridgeCreator.json +2 -2
- package/build/contracts/src/rollup/DeployHelper.sol/DeployHelper.dbg.json +1 -1
- package/build/contracts/src/rollup/DeployHelper.sol/DeployHelper.json +2 -2
- package/build/contracts/src/rollup/ERC20RollupEventInbox.sol/ERC20RollupEventInbox.dbg.json +1 -1
- package/build/contracts/src/rollup/ERC20RollupEventInbox.sol/ERC20RollupEventInbox.json +2 -2
- package/build/contracts/src/rollup/IRollupAdmin.sol/IRollupAdmin.dbg.json +1 -1
- package/build/contracts/src/rollup/IRollupCore.sol/IRollupCore.dbg.json +1 -1
- package/build/contracts/src/rollup/IRollupEventInbox.sol/IRollupEventInbox.dbg.json +1 -1
- package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUser.dbg.json +1 -1
- package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserAbs.dbg.json +1 -1
- package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserERC20.dbg.json +1 -1
- package/build/contracts/src/rollup/Node.sol/NodeLib.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupAdminLogic.sol/RollupAdminLogic.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupAdminLogic.sol/RollupAdminLogic.json +2 -2
- package/build/contracts/src/rollup/RollupCore.sol/RollupCore.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupCreator.sol/RollupCreator.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupCreator.sol/RollupCreator.json +12 -7
- package/build/contracts/src/rollup/RollupEventInbox.sol/RollupEventInbox.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupEventInbox.sol/RollupEventInbox.json +2 -2
- package/build/contracts/src/rollup/RollupLib.sol/RollupLib.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupLib.sol/RollupLib.json +2 -2
- package/build/contracts/src/rollup/RollupProxy.sol/RollupProxy.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupProxy.sol/RollupProxy.json +2 -2
- package/build/contracts/src/rollup/RollupUserLogic.sol/AbsRollupUserLogic.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupUserLogic.sol/ERC20RollupUserLogic.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupUserLogic.sol/ERC20RollupUserLogic.json +2 -2
- package/build/contracts/src/rollup/RollupUserLogic.sol/RollupUserLogic.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupUserLogic.sol/RollupUserLogic.json +2 -2
- package/build/contracts/src/rollup/ValidatorUtils.sol/ValidatorUtils.dbg.json +1 -1
- package/build/contracts/src/rollup/ValidatorUtils.sol/ValidatorUtils.json +2 -2
- package/build/contracts/src/rollup/ValidatorWallet.sol/ValidatorWallet.dbg.json +1 -1
- package/build/contracts/src/rollup/ValidatorWallet.sol/ValidatorWallet.json +2 -2
- package/build/contracts/src/rollup/ValidatorWalletCreator.sol/ValidatorWalletCreator.dbg.json +1 -1
- package/build/contracts/src/rollup/ValidatorWalletCreator.sol/ValidatorWalletCreator.json +2 -2
- package/build/contracts/src/state/Deserialize.sol/Deserialize.dbg.json +1 -1
- package/build/contracts/src/state/GlobalState.sol/GlobalStateLib.dbg.json +1 -1
- package/build/contracts/src/state/Instructions.sol/Instructions.dbg.json +1 -1
- package/build/contracts/src/state/Machine.sol/MachineLib.dbg.json +1 -1
- package/build/contracts/src/state/MerkleProof.sol/MerkleProofLib.dbg.json +1 -1
- package/build/contracts/src/state/Module.sol/ModuleLib.dbg.json +1 -1
- package/build/contracts/src/state/ModuleMemory.sol/ModuleMemoryLib.dbg.json +1 -1
- package/build/contracts/src/state/ModuleMemoryCompact.sol/ModuleMemoryCompactLib.dbg.json +1 -1
- package/build/contracts/src/state/PcArray.sol/PcArrayLib.dbg.json +1 -1
- package/build/contracts/src/state/StackFrame.sol/StackFrameLib.dbg.json +1 -1
- package/build/contracts/src/state/Value.sol/ValueLib.dbg.json +1 -1
- package/build/contracts/src/state/ValueArray.sol/ValueArrayLib.dbg.json +1 -1
- package/build/contracts/src/state/ValueStack.sol/ValueStackLib.dbg.json +1 -1
- package/build/contracts/src/test-helpers/BridgeTester.sol/BridgeTester.dbg.json +1 -1
- package/build/contracts/src/test-helpers/BridgeTester.sol/BridgeTester.json +2 -2
- package/build/contracts/src/test-helpers/CryptographyPrimitivesTester.sol/CryptographyPrimitivesTester.dbg.json +1 -1
- package/build/contracts/src/test-helpers/EthVault.sol/EthVault.dbg.json +1 -1
- package/build/contracts/src/test-helpers/MessageTester.sol/MessageTester.dbg.json +1 -1
- package/build/contracts/src/test-helpers/OutboxWithoutOptTester.sol/OutboxWithoutOptTester.dbg.json +1 -1
- package/build/contracts/src/test-helpers/OutboxWithoutOptTester.sol/OutboxWithoutOptTester.json +2 -2
- package/build/contracts/src/test-helpers/RollupMock.sol/RollupMock.dbg.json +1 -1
- package/build/contracts/src/test-helpers/RollupMock.sol/RollupMock.json +26 -2
- package/build/contracts/src/test-helpers/TestToken.sol/TestToken.dbg.json +1 -1
- package/build/contracts/src/test-helpers/ValueArrayTester.sol/ValueArrayTester.dbg.json +1 -1
- package/out/yul/Reader4844.yul/Reader4844.json +1 -0
- package/package.json +13 -4
- package/src/bridge/GasRefunder.sol +2 -0
- package/src/bridge/IBridge.sol +22 -0
- package/src/bridge/ISequencerInbox.sol +69 -22
- package/src/bridge/SequencerInbox.sol +436 -142
- package/src/challenge/ChallengeManager.sol +6 -0
- package/src/libraries/Error.sol +24 -3
- package/src/libraries/GasRefundEnabled.sol +52 -0
- package/src/libraries/IGasRefunder.sol +0 -25
- package/src/libraries/IReader4844.sol +13 -0
- package/src/mocks/InboxStub.sol +2 -2
- package/src/mocks/SequencerInboxStub.sol +11 -6
- package/src/mocks/Simple.sol +31 -1
- package/src/osp/OneStepProverHostIo.sol +100 -7
- package/src/precompiles/ArbGasInfo.sol +20 -0
- package/src/precompiles/ArbOwnerPublic.sol +8 -0
- package/src/rollup/BridgeCreator.sol +1 -1
- package/src/rollup/RollupCreator.sol +31 -19
- package/src/rollup/ValidatorWallet.sol +4 -3
- package/src/test-helpers/RollupMock.sol +6 -0
- package/build/contracts/src/libraries/IGasRefunder.sol/GasRefundEnabled.dbg.json +0 -4
@@ -7,9 +7,9 @@ pragma solidity ^0.8.0;
|
|
7
7
|
import {
|
8
8
|
AlreadyInit,
|
9
9
|
HadZeroInit,
|
10
|
+
BadPostUpgradeInit,
|
10
11
|
NotOrigin,
|
11
12
|
DataTooLarge,
|
12
|
-
NotRollup,
|
13
13
|
DelayedBackwards,
|
14
14
|
DelayedTooFar,
|
15
15
|
ForceIncludeBlockTooSoon,
|
@@ -17,11 +17,19 @@ import {
|
|
17
17
|
IncorrectMessagePreimage,
|
18
18
|
NotBatchPoster,
|
19
19
|
BadSequencerNumber,
|
20
|
-
DataNotAuthenticated,
|
21
20
|
AlreadyValidDASKeyset,
|
22
21
|
NoSuchKeyset,
|
23
22
|
NotForked,
|
24
|
-
|
23
|
+
NotBatchPosterManager,
|
24
|
+
RollupNotChanged,
|
25
|
+
DataBlobsNotSupported,
|
26
|
+
InitParamZero,
|
27
|
+
MissingDataHashes,
|
28
|
+
NotOwner,
|
29
|
+
InvalidHeaderFlag,
|
30
|
+
NativeTokenMismatch,
|
31
|
+
BadMaxTimeVariation,
|
32
|
+
Deprecated
|
25
33
|
} from "../libraries/Error.sol";
|
26
34
|
import "./IBridge.sol";
|
27
35
|
import "./IInboxBase.sol";
|
@@ -30,18 +38,21 @@ import "../rollup/IRollupLogic.sol";
|
|
30
38
|
import "./Messages.sol";
|
31
39
|
import "../precompiles/ArbGasInfo.sol";
|
32
40
|
import "../precompiles/ArbSys.sol";
|
41
|
+
import "../libraries/IReader4844.sol";
|
33
42
|
|
34
43
|
import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol";
|
35
|
-
import {GasRefundEnabled, IGasRefunder} from "../libraries/IGasRefunder.sol";
|
36
44
|
import "../libraries/DelegateCallAware.sol";
|
45
|
+
import {IGasRefunder} from "../libraries/IGasRefunder.sol";
|
46
|
+
import {GasRefundEnabled} from "../libraries/GasRefundEnabled.sol";
|
37
47
|
import "../libraries/ArbitrumChecker.sol";
|
48
|
+
import {IERC20Bridge} from "./IERC20Bridge.sol";
|
38
49
|
|
39
50
|
/**
|
40
|
-
* @title
|
51
|
+
* @title Accepts batches from the sequencer and adds them to the rollup inbox.
|
41
52
|
* @notice Contains the inbox accumulator which is the ordering of all data and transactions to be processed by the rollup.
|
42
|
-
*
|
43
|
-
*
|
44
|
-
*
|
53
|
+
* As part of submitting a batch the sequencer is also expected to include items enqueued
|
54
|
+
* in the delayed inbox (Bridge.sol). If items in the delayed inbox are not included by a
|
55
|
+
* sequencer within a time limit they can be force included into the rollup inbox by anyone.
|
45
56
|
*/
|
46
57
|
contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox {
|
47
58
|
uint256 public totalDelayedMessagesRead;
|
@@ -54,42 +65,140 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
54
65
|
/// @inheritdoc ISequencerInbox
|
55
66
|
bytes1 public constant DATA_AUTHENTICATED_FLAG = 0x40;
|
56
67
|
|
68
|
+
/// @inheritdoc ISequencerInbox
|
69
|
+
bytes1 public constant DATA_BLOB_HEADER_FLAG = DATA_AUTHENTICATED_FLAG | 0x10;
|
70
|
+
|
71
|
+
/// @inheritdoc ISequencerInbox
|
72
|
+
bytes1 public constant DAS_MESSAGE_HEADER_FLAG = 0x80;
|
73
|
+
|
74
|
+
/// @inheritdoc ISequencerInbox
|
75
|
+
bytes1 public constant TREE_DAS_MESSAGE_HEADER_FLAG = 0x08;
|
76
|
+
|
77
|
+
/// @inheritdoc ISequencerInbox
|
78
|
+
bytes1 public constant BROTLI_MESSAGE_HEADER_FLAG = 0x00;
|
79
|
+
|
80
|
+
/// @inheritdoc ISequencerInbox
|
81
|
+
bytes1 public constant ZERO_HEAVY_MESSAGE_HEADER_FLAG = 0x20;
|
82
|
+
|
83
|
+
// GAS_PER_BLOB from EIP-4844
|
84
|
+
uint256 internal constant GAS_PER_BLOB = 1 << 17;
|
85
|
+
|
57
86
|
IOwnable public rollup;
|
87
|
+
|
58
88
|
mapping(address => bool) public isBatchPoster;
|
59
|
-
|
89
|
+
|
90
|
+
// we previously stored the max time variation in a (uint,uint,uint,uint) struct here
|
91
|
+
// solhint-disable-next-line var-name-mixedcase
|
92
|
+
ISequencerInbox.MaxTimeVariation private __LEGACY_MAX_TIME_VARIATION;
|
60
93
|
|
61
94
|
mapping(bytes32 => DasKeySetInfo) public dasKeySetInfo;
|
62
95
|
|
63
96
|
modifier onlyRollupOwner() {
|
64
|
-
if (msg.sender != rollup.owner()) revert NotOwner(msg.sender,
|
97
|
+
if (msg.sender != rollup.owner()) revert NotOwner(msg.sender, rollup.owner());
|
98
|
+
_;
|
99
|
+
}
|
100
|
+
|
101
|
+
modifier onlyRollupOwnerOrBatchPosterManager() {
|
102
|
+
if (msg.sender != rollup.owner() && msg.sender != batchPosterManager) {
|
103
|
+
revert NotBatchPosterManager(msg.sender);
|
104
|
+
}
|
65
105
|
_;
|
66
106
|
}
|
67
107
|
|
68
108
|
mapping(address => bool) public isSequencer;
|
109
|
+
IReader4844 public immutable reader4844;
|
110
|
+
|
111
|
+
// see ISequencerInbox.MaxTimeVariation
|
112
|
+
uint64 internal delayBlocks;
|
113
|
+
uint64 internal futureBlocks;
|
114
|
+
uint64 internal delaySeconds;
|
115
|
+
uint64 internal futureSeconds;
|
116
|
+
|
117
|
+
/// @inheritdoc ISequencerInbox
|
118
|
+
address public batchPosterManager;
|
69
119
|
|
70
120
|
// On L1 this should be set to 117964: 90% of Geth's 128KB tx size limit, leaving ~13KB for proving
|
71
121
|
uint256 public immutable maxDataSize;
|
72
122
|
uint256 internal immutable deployTimeChainId = block.chainid;
|
73
123
|
// If the chain this SequencerInbox is deployed on is an Arbitrum chain.
|
74
124
|
bool internal immutable hostChainIsArbitrum = ArbitrumChecker.runningOnArbitrum();
|
75
|
-
|
76
|
-
|
125
|
+
// True if the chain this SequencerInbox is deployed on uses custom fee token
|
126
|
+
bool public immutable isUsingFeeToken;
|
127
|
+
|
128
|
+
constructor(
|
129
|
+
uint256 _maxDataSize,
|
130
|
+
IReader4844 reader4844_,
|
131
|
+
bool _isUsingFeeToken
|
132
|
+
) {
|
77
133
|
maxDataSize = _maxDataSize;
|
134
|
+
if (hostChainIsArbitrum) {
|
135
|
+
if (reader4844_ != IReader4844(address(0))) revert DataBlobsNotSupported();
|
136
|
+
} else {
|
137
|
+
if (reader4844_ == IReader4844(address(0))) revert InitParamZero("Reader4844");
|
138
|
+
}
|
139
|
+
reader4844 = reader4844_;
|
140
|
+
isUsingFeeToken = _isUsingFeeToken;
|
78
141
|
}
|
79
142
|
|
80
143
|
function _chainIdChanged() internal view returns (bool) {
|
81
144
|
return deployTimeChainId != block.chainid;
|
82
145
|
}
|
83
146
|
|
147
|
+
function postUpgradeInit() external onlyDelegated onlyProxyOwner {
|
148
|
+
// Assuming we would not upgrade from a version that have MaxTimeVariation all set to zero
|
149
|
+
// If that is the case, postUpgradeInit do not need to be called
|
150
|
+
if (
|
151
|
+
__LEGACY_MAX_TIME_VARIATION.delayBlocks == 0 &&
|
152
|
+
__LEGACY_MAX_TIME_VARIATION.futureBlocks == 0 &&
|
153
|
+
__LEGACY_MAX_TIME_VARIATION.delaySeconds == 0 &&
|
154
|
+
__LEGACY_MAX_TIME_VARIATION.futureSeconds == 0
|
155
|
+
) {
|
156
|
+
revert AlreadyInit();
|
157
|
+
}
|
158
|
+
|
159
|
+
if (
|
160
|
+
__LEGACY_MAX_TIME_VARIATION.delayBlocks > type(uint64).max ||
|
161
|
+
__LEGACY_MAX_TIME_VARIATION.futureBlocks > type(uint64).max ||
|
162
|
+
__LEGACY_MAX_TIME_VARIATION.delaySeconds > type(uint64).max ||
|
163
|
+
__LEGACY_MAX_TIME_VARIATION.futureSeconds > type(uint64).max
|
164
|
+
) {
|
165
|
+
revert BadPostUpgradeInit();
|
166
|
+
}
|
167
|
+
|
168
|
+
delayBlocks = uint64(__LEGACY_MAX_TIME_VARIATION.delayBlocks);
|
169
|
+
futureBlocks = uint64(__LEGACY_MAX_TIME_VARIATION.futureBlocks);
|
170
|
+
delaySeconds = uint64(__LEGACY_MAX_TIME_VARIATION.delaySeconds);
|
171
|
+
futureSeconds = uint64(__LEGACY_MAX_TIME_VARIATION.futureSeconds);
|
172
|
+
|
173
|
+
__LEGACY_MAX_TIME_VARIATION.delayBlocks = 0;
|
174
|
+
__LEGACY_MAX_TIME_VARIATION.futureBlocks = 0;
|
175
|
+
__LEGACY_MAX_TIME_VARIATION.delaySeconds = 0;
|
176
|
+
__LEGACY_MAX_TIME_VARIATION.futureSeconds = 0;
|
177
|
+
}
|
178
|
+
|
84
179
|
function initialize(
|
85
180
|
IBridge bridge_,
|
86
181
|
ISequencerInbox.MaxTimeVariation calldata maxTimeVariation_
|
87
182
|
) external onlyDelegated {
|
88
183
|
if (bridge != IBridge(address(0))) revert AlreadyInit();
|
89
184
|
if (bridge_ == IBridge(address(0))) revert HadZeroInit();
|
185
|
+
|
186
|
+
// Make sure logic contract was created by proper value for 'isUsingFeeToken'.
|
187
|
+
// Bridge in ETH based chains doesn't implement nativeToken(). In future it might implement it and return address(0)
|
188
|
+
bool actualIsUsingFeeToken = false;
|
189
|
+
try IERC20Bridge(address(bridge_)).nativeToken() returns (address feeToken) {
|
190
|
+
if (feeToken != address(0)) {
|
191
|
+
actualIsUsingFeeToken = true;
|
192
|
+
}
|
193
|
+
} catch {}
|
194
|
+
if (isUsingFeeToken != actualIsUsingFeeToken) {
|
195
|
+
revert NativeTokenMismatch();
|
196
|
+
}
|
197
|
+
|
90
198
|
bridge = bridge_;
|
91
199
|
rollup = bridge_.rollup();
|
92
|
-
|
200
|
+
|
201
|
+
_setMaxTimeVariation(maxTimeVariation_);
|
93
202
|
}
|
94
203
|
|
95
204
|
/// @notice Allows the rollup owner to sync the rollup address
|
@@ -101,28 +210,74 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
101
210
|
rollup = newRollup;
|
102
211
|
}
|
103
212
|
|
104
|
-
function getTimeBounds() internal view virtual returns (TimeBounds memory) {
|
105
|
-
TimeBounds memory bounds;
|
106
|
-
|
107
|
-
|
213
|
+
function getTimeBounds() internal view virtual returns (IBridge.TimeBounds memory) {
|
214
|
+
IBridge.TimeBounds memory bounds;
|
215
|
+
(
|
216
|
+
uint64 delayBlocks_,
|
217
|
+
uint64 futureBlocks_,
|
218
|
+
uint64 delaySeconds_,
|
219
|
+
uint64 futureSeconds_
|
220
|
+
) = maxTimeVariationInternal();
|
221
|
+
if (block.timestamp > delaySeconds_) {
|
222
|
+
bounds.minTimestamp = uint64(block.timestamp) - delaySeconds_;
|
108
223
|
}
|
109
|
-
bounds.maxTimestamp = uint64(block.timestamp +
|
110
|
-
if (block.number >
|
111
|
-
bounds.minBlockNumber = uint64(block.number -
|
224
|
+
bounds.maxTimestamp = uint64(block.timestamp) + futureSeconds_;
|
225
|
+
if (block.number > delayBlocks_) {
|
226
|
+
bounds.minBlockNumber = uint64(block.number) - delayBlocks_;
|
112
227
|
}
|
113
|
-
bounds.maxBlockNumber = uint64(block.number +
|
228
|
+
bounds.maxBlockNumber = uint64(block.number) + futureBlocks_;
|
114
229
|
return bounds;
|
115
230
|
}
|
116
231
|
|
117
232
|
/// @inheritdoc ISequencerInbox
|
118
233
|
function removeDelayAfterFork() external {
|
119
234
|
if (!_chainIdChanged()) revert NotForked();
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
235
|
+
delayBlocks = 1;
|
236
|
+
futureBlocks = 1;
|
237
|
+
delaySeconds = 1;
|
238
|
+
futureSeconds = 1;
|
239
|
+
}
|
240
|
+
|
241
|
+
function maxTimeVariation()
|
242
|
+
external
|
243
|
+
view
|
244
|
+
returns (
|
245
|
+
uint256,
|
246
|
+
uint256,
|
247
|
+
uint256,
|
248
|
+
uint256
|
249
|
+
)
|
250
|
+
{
|
251
|
+
(
|
252
|
+
uint64 delayBlocks_,
|
253
|
+
uint64 futureBlocks_,
|
254
|
+
uint64 delaySeconds_,
|
255
|
+
uint64 futureSeconds_
|
256
|
+
) = maxTimeVariationInternal();
|
257
|
+
|
258
|
+
return (
|
259
|
+
uint256(delayBlocks_),
|
260
|
+
uint256(futureBlocks_),
|
261
|
+
uint256(delaySeconds_),
|
262
|
+
uint256(futureSeconds_)
|
263
|
+
);
|
264
|
+
}
|
265
|
+
|
266
|
+
function maxTimeVariationInternal()
|
267
|
+
internal
|
268
|
+
view
|
269
|
+
returns (
|
270
|
+
uint64,
|
271
|
+
uint64,
|
272
|
+
uint64,
|
273
|
+
uint64
|
274
|
+
)
|
275
|
+
{
|
276
|
+
if (_chainIdChanged()) {
|
277
|
+
return (1, 1, 1, 1);
|
278
|
+
} else {
|
279
|
+
return (delayBlocks, futureBlocks, delaySeconds, futureSeconds);
|
280
|
+
}
|
126
281
|
}
|
127
282
|
|
128
283
|
/// @inheritdoc ISequencerInbox
|
@@ -145,10 +300,8 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
145
300
|
messageDataHash
|
146
301
|
);
|
147
302
|
// Can only force-include after the Sequencer-only window has expired.
|
148
|
-
if (l1BlockAndTime[0] +
|
149
|
-
|
150
|
-
if (l1BlockAndTime[1] + maxTimeVariation.delaySeconds >= block.timestamp)
|
151
|
-
revert ForceIncludeTimeTooSoon();
|
303
|
+
if (l1BlockAndTime[0] + delayBlocks >= block.number) revert ForceIncludeBlockTooSoon();
|
304
|
+
if (l1BlockAndTime[1] + delaySeconds >= block.timestamp) revert ForceIncludeTimeTooSoon();
|
152
305
|
|
153
306
|
// Verify that message hash represents the last message sequence of delayed message to be included
|
154
307
|
bytes32 prevDelayedAcc = 0;
|
@@ -160,14 +313,12 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
160
313
|
Messages.accumulateInboxMessage(prevDelayedAcc, messageHash)
|
161
314
|
) revert IncorrectMessagePreimage();
|
162
315
|
|
163
|
-
(bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash(
|
316
|
+
(bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formEmptyDataHash(
|
164
317
|
_totalDelayedMessagesRead
|
165
318
|
);
|
166
319
|
uint256 __totalDelayedMessagesRead = _totalDelayedMessagesRead;
|
167
320
|
uint256 prevSeqMsgCount = bridge.sequencerReportedSubMessageCount();
|
168
|
-
uint256 newSeqMsgCount = prevSeqMsgCount
|
169
|
-
_totalDelayedMessagesRead -
|
170
|
-
totalDelayedMessagesRead;
|
321
|
+
uint256 newSeqMsgCount = prevSeqMsgCount; // force inclusion should not modify sequencer message count
|
171
322
|
(
|
172
323
|
uint256 seqMessageIndex,
|
173
324
|
bytes32 beforeAcc,
|
@@ -187,42 +338,18 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
187
338
|
delayedAcc,
|
188
339
|
totalDelayedMessagesRead,
|
189
340
|
timeBounds,
|
190
|
-
BatchDataLocation.NoData
|
341
|
+
IBridge.BatchDataLocation.NoData
|
191
342
|
);
|
192
343
|
}
|
193
344
|
|
194
|
-
/// @dev Deprecated
|
345
|
+
/// @dev Deprecated, kept for abi generation and will be removed in the future
|
195
346
|
function addSequencerL2BatchFromOrigin(
|
196
|
-
uint256
|
197
|
-
bytes calldata
|
198
|
-
uint256
|
199
|
-
IGasRefunder
|
200
|
-
) external
|
201
|
-
|
202
|
-
if (msg.sender != tx.origin) revert NotOrigin();
|
203
|
-
if (!isBatchPoster[msg.sender]) revert NotBatchPoster();
|
204
|
-
|
205
|
-
(bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash(
|
206
|
-
data,
|
207
|
-
afterDelayedMessagesRead
|
208
|
-
);
|
209
|
-
(
|
210
|
-
uint256 seqMessageIndex,
|
211
|
-
bytes32 beforeAcc,
|
212
|
-
bytes32 delayedAcc,
|
213
|
-
bytes32 afterAcc
|
214
|
-
) = addSequencerL2BatchImpl(dataHash, afterDelayedMessagesRead, data.length, 0, 0);
|
215
|
-
if (seqMessageIndex != sequenceNumber)
|
216
|
-
revert BadSequencerNumber(seqMessageIndex, sequenceNumber);
|
217
|
-
emit SequencerBatchDelivered(
|
218
|
-
sequenceNumber,
|
219
|
-
beforeAcc,
|
220
|
-
afterAcc,
|
221
|
-
delayedAcc,
|
222
|
-
totalDelayedMessagesRead,
|
223
|
-
timeBounds,
|
224
|
-
BatchDataLocation.TxInput
|
225
|
-
);
|
347
|
+
uint256,
|
348
|
+
bytes calldata,
|
349
|
+
uint256,
|
350
|
+
IGasRefunder
|
351
|
+
) external pure {
|
352
|
+
revert Deprecated();
|
226
353
|
}
|
227
354
|
|
228
355
|
function addSequencerL2BatchFromOrigin(
|
@@ -232,17 +359,17 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
232
359
|
IGasRefunder gasRefunder,
|
233
360
|
uint256 prevMessageCount,
|
234
361
|
uint256 newMessageCount
|
235
|
-
) external refundsGas(gasRefunder) {
|
362
|
+
) external refundsGas(gasRefunder, IReader4844(address(0))) {
|
236
363
|
// solhint-disable-next-line avoid-tx-origin
|
237
364
|
if (msg.sender != tx.origin) revert NotOrigin();
|
238
365
|
if (!isBatchPoster[msg.sender]) revert NotBatchPoster();
|
239
|
-
(bytes32 dataHash, TimeBounds memory timeBounds) =
|
366
|
+
(bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formCallDataHash(
|
240
367
|
data,
|
241
368
|
afterDelayedMessagesRead
|
242
369
|
);
|
243
370
|
// Reformat the stack to prevent "Stack too deep"
|
244
371
|
uint256 sequenceNumber_ = sequenceNumber;
|
245
|
-
TimeBounds memory timeBounds_ = timeBounds;
|
372
|
+
IBridge.TimeBounds memory timeBounds_ = timeBounds;
|
246
373
|
bytes32 dataHash_ = dataHash;
|
247
374
|
uint256 dataLength = data.length;
|
248
375
|
uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead;
|
@@ -260,8 +387,12 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
260
387
|
prevMessageCount_,
|
261
388
|
newMessageCount_
|
262
389
|
);
|
263
|
-
|
390
|
+
|
391
|
+
// ~uint256(0) is type(uint256).max, but ever so slightly cheaper
|
392
|
+
if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) {
|
264
393
|
revert BadSequencerNumber(seqMessageIndex, sequenceNumber_);
|
394
|
+
}
|
395
|
+
|
265
396
|
emit SequencerBatchDelivered(
|
266
397
|
seqMessageIndex,
|
267
398
|
beforeAcc,
|
@@ -269,8 +400,69 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
269
400
|
delayedAcc,
|
270
401
|
totalDelayedMessagesRead,
|
271
402
|
timeBounds_,
|
272
|
-
BatchDataLocation.TxInput
|
403
|
+
IBridge.BatchDataLocation.TxInput
|
404
|
+
);
|
405
|
+
}
|
406
|
+
|
407
|
+
function addSequencerL2BatchFromBlobs(
|
408
|
+
uint256 sequenceNumber,
|
409
|
+
uint256 afterDelayedMessagesRead,
|
410
|
+
IGasRefunder gasRefunder,
|
411
|
+
uint256 prevMessageCount,
|
412
|
+
uint256 newMessageCount
|
413
|
+
) external refundsGas(gasRefunder, reader4844) {
|
414
|
+
if (!isBatchPoster[msg.sender]) revert NotBatchPoster();
|
415
|
+
(
|
416
|
+
bytes32 dataHash,
|
417
|
+
IBridge.TimeBounds memory timeBounds,
|
418
|
+
uint256 blobGas
|
419
|
+
) = formBlobDataHash(afterDelayedMessagesRead);
|
420
|
+
|
421
|
+
// we use addSequencerL2BatchImpl for submitting the message
|
422
|
+
// normally this would also submit a batch spending report but that is skipped if we pass
|
423
|
+
// an empty call data size, then we submit a separate batch spending report later
|
424
|
+
(
|
425
|
+
uint256 seqMessageIndex,
|
426
|
+
bytes32 beforeAcc,
|
427
|
+
bytes32 delayedAcc,
|
428
|
+
bytes32 afterAcc
|
429
|
+
) = addSequencerL2BatchImpl(
|
430
|
+
dataHash,
|
431
|
+
afterDelayedMessagesRead,
|
432
|
+
0,
|
433
|
+
prevMessageCount,
|
434
|
+
newMessageCount
|
435
|
+
);
|
436
|
+
|
437
|
+
uint256 _sequenceNumber = sequenceNumber; // stack workaround
|
438
|
+
|
439
|
+
// ~uint256(0) is type(uint256).max, but ever so slightly cheaper
|
440
|
+
if (seqMessageIndex != _sequenceNumber && _sequenceNumber != ~uint256(0)) {
|
441
|
+
revert BadSequencerNumber(seqMessageIndex, _sequenceNumber);
|
442
|
+
}
|
443
|
+
|
444
|
+
emit SequencerBatchDelivered(
|
445
|
+
_sequenceNumber,
|
446
|
+
beforeAcc,
|
447
|
+
afterAcc,
|
448
|
+
delayedAcc,
|
449
|
+
totalDelayedMessagesRead,
|
450
|
+
timeBounds,
|
451
|
+
IBridge.BatchDataLocation.Blob
|
273
452
|
);
|
453
|
+
|
454
|
+
// blobs are currently not supported on host arbitrum chains, when support is added it may
|
455
|
+
// consume gas in a different way to L1, so explicitly block host arb chains so that if support for blobs
|
456
|
+
// on arb is added it will need to explicitly turned on in the sequencer inbox
|
457
|
+
if (hostChainIsArbitrum) revert DataBlobsNotSupported();
|
458
|
+
|
459
|
+
// submit a batch spending report to refund the entity that produced the blob batch data
|
460
|
+
// same as using calldata, we only submit spending report if the caller is the origin of the tx
|
461
|
+
// such that one cannot "double-claim" batch posting refund in the same tx
|
462
|
+
// solhint-disable-next-line avoid-tx-origin
|
463
|
+
if (msg.sender == tx.origin && !isUsingFeeToken) {
|
464
|
+
submitBatchSpendingReport(dataHash, seqMessageIndex, block.basefee, blobGas);
|
465
|
+
}
|
274
466
|
}
|
275
467
|
|
276
468
|
function addSequencerL2Batch(
|
@@ -280,9 +472,9 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
280
472
|
IGasRefunder gasRefunder,
|
281
473
|
uint256 prevMessageCount,
|
282
474
|
uint256 newMessageCount
|
283
|
-
) external override refundsGas(gasRefunder) {
|
475
|
+
) external override refundsGas(gasRefunder, IReader4844(address(0))) {
|
284
476
|
if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster();
|
285
|
-
(bytes32 dataHash, TimeBounds memory timeBounds) =
|
477
|
+
(bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formCallDataHash(
|
286
478
|
data,
|
287
479
|
afterDelayedMessagesRead
|
288
480
|
);
|
@@ -290,7 +482,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
290
482
|
{
|
291
483
|
// Reformat the stack to prevent "Stack too deep"
|
292
484
|
uint256 sequenceNumber_ = sequenceNumber;
|
293
|
-
TimeBounds memory timeBounds_ = timeBounds;
|
485
|
+
IBridge.TimeBounds memory timeBounds_ = timeBounds;
|
294
486
|
bytes32 dataHash_ = dataHash;
|
295
487
|
uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead;
|
296
488
|
uint256 prevMessageCount_ = prevMessageCount;
|
@@ -307,8 +499,12 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
307
499
|
prevMessageCount_,
|
308
500
|
newMessageCount_
|
309
501
|
);
|
310
|
-
|
502
|
+
|
503
|
+
// ~uint256(0) is type(uint256).max, but ever so slightly cheaper
|
504
|
+
if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) {
|
311
505
|
revert BadSequencerNumber(seqMessageIndex, sequenceNumber_);
|
506
|
+
}
|
507
|
+
|
312
508
|
emit SequencerBatchDelivered(
|
313
509
|
seqMessageIndex,
|
314
510
|
beforeAcc,
|
@@ -316,34 +512,18 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
316
512
|
delayedAcc,
|
317
513
|
totalDelayedMessagesRead,
|
318
514
|
timeBounds_,
|
319
|
-
BatchDataLocation.SeparateBatchEvent
|
515
|
+
IBridge.BatchDataLocation.SeparateBatchEvent
|
320
516
|
);
|
321
517
|
}
|
322
518
|
emit SequencerBatchData(seqMessageIndex, data);
|
323
519
|
}
|
324
520
|
|
325
|
-
modifier validateBatchData(bytes calldata data) {
|
326
|
-
uint256 fullDataLen = HEADER_LENGTH + data.length;
|
327
|
-
if (fullDataLen > maxDataSize) revert DataTooLarge(fullDataLen, maxDataSize);
|
328
|
-
if (data.length > 0 && (data[0] & DATA_AUTHENTICATED_FLAG) == DATA_AUTHENTICATED_FLAG) {
|
329
|
-
revert DataNotAuthenticated();
|
330
|
-
}
|
331
|
-
// the first byte is used to identify the type of batch data
|
332
|
-
// das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes)
|
333
|
-
if (data.length >= 33 && data[0] & 0x80 != 0) {
|
334
|
-
// we skip the first byte, then read the next 32 bytes for the keyset
|
335
|
-
bytes32 dasKeysetHash = bytes32(data[1:33]);
|
336
|
-
if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash);
|
337
|
-
}
|
338
|
-
_;
|
339
|
-
}
|
340
|
-
|
341
521
|
function packHeader(uint256 afterDelayedMessagesRead)
|
342
522
|
internal
|
343
523
|
view
|
344
|
-
returns (bytes memory, TimeBounds memory)
|
524
|
+
returns (bytes memory, IBridge.TimeBounds memory)
|
345
525
|
{
|
346
|
-
TimeBounds memory timeBounds = getTimeBounds();
|
526
|
+
IBridge.TimeBounds memory timeBounds = getTimeBounds();
|
347
527
|
bytes memory header = abi.encodePacked(
|
348
528
|
timeBounds.minTimestamp,
|
349
529
|
timeBounds.maxTimestamp,
|
@@ -356,24 +536,139 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
356
536
|
return (header, timeBounds);
|
357
537
|
}
|
358
538
|
|
359
|
-
|
539
|
+
/// @dev Form a hash for a sequencer message with no batch data
|
540
|
+
/// @param afterDelayedMessagesRead The delayed messages count read up to
|
541
|
+
/// @return The data hash
|
542
|
+
/// @return The timebounds within which the message should be processed
|
543
|
+
function formEmptyDataHash(uint256 afterDelayedMessagesRead)
|
360
544
|
internal
|
361
545
|
view
|
362
|
-
|
363
|
-
returns (bytes32, TimeBounds memory)
|
546
|
+
returns (bytes32, IBridge.TimeBounds memory)
|
364
547
|
{
|
365
|
-
(bytes memory header, TimeBounds memory timeBounds) = packHeader(
|
366
|
-
|
367
|
-
|
548
|
+
(bytes memory header, IBridge.TimeBounds memory timeBounds) = packHeader(
|
549
|
+
afterDelayedMessagesRead
|
550
|
+
);
|
551
|
+
return (keccak256(header), timeBounds);
|
368
552
|
}
|
369
553
|
|
370
|
-
|
554
|
+
/// @dev Since the data is supplied from calldata, the batch poster can choose the data type
|
555
|
+
/// We need to ensure that this data cannot cause a collision with data supplied via another method (eg blobs)
|
556
|
+
/// therefore we restrict which flags can be provided as a header in this field
|
557
|
+
/// This also safe guards unused flags for future use, as we know they would have been disallowed up until this point
|
558
|
+
/// @param headerByte The first byte in the calldata
|
559
|
+
function isValidCallDataFlag(bytes1 headerByte) internal pure returns (bool) {
|
560
|
+
return
|
561
|
+
headerByte == BROTLI_MESSAGE_HEADER_FLAG ||
|
562
|
+
headerByte == DAS_MESSAGE_HEADER_FLAG ||
|
563
|
+
(headerByte == (DAS_MESSAGE_HEADER_FLAG | TREE_DAS_MESSAGE_HEADER_FLAG)) ||
|
564
|
+
headerByte == ZERO_HEAVY_MESSAGE_HEADER_FLAG;
|
565
|
+
}
|
566
|
+
|
567
|
+
/// @dev Form a hash of the data taken from the calldata
|
568
|
+
/// @param data The calldata to be hashed
|
569
|
+
/// @param afterDelayedMessagesRead The delayed messages count read up to
|
570
|
+
/// @return The data hash
|
571
|
+
/// @return The timebounds within which the message should be processed
|
572
|
+
function formCallDataHash(bytes calldata data, uint256 afterDelayedMessagesRead)
|
371
573
|
internal
|
372
574
|
view
|
373
|
-
returns (bytes32, TimeBounds memory)
|
575
|
+
returns (bytes32, IBridge.TimeBounds memory)
|
374
576
|
{
|
375
|
-
|
376
|
-
|
577
|
+
uint256 fullDataLen = HEADER_LENGTH + data.length;
|
578
|
+
if (fullDataLen > maxDataSize) revert DataTooLarge(fullDataLen, maxDataSize);
|
579
|
+
|
580
|
+
(bytes memory header, IBridge.TimeBounds memory timeBounds) = packHeader(
|
581
|
+
afterDelayedMessagesRead
|
582
|
+
);
|
583
|
+
|
584
|
+
// the batch poster is allowed to submit an empty batch, they can use this to progress the
|
585
|
+
// delayed inbox without providing extra batch data
|
586
|
+
if (data.length > 0) {
|
587
|
+
// The first data byte cannot be the same as any that have been set via other methods (eg 4844 blob header) as this
|
588
|
+
// would allow the supplier of the data to spoof an incorrect 4844 data batch
|
589
|
+
if (!isValidCallDataFlag(data[0])) revert InvalidHeaderFlag(data[0]);
|
590
|
+
|
591
|
+
// the first byte is used to identify the type of batch data
|
592
|
+
// das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes)
|
593
|
+
// if invalid data is supplied here the state transition function will process it as an empty block
|
594
|
+
// however we can provide a nice additional check here for the batch poster
|
595
|
+
if (data[0] & DAS_MESSAGE_HEADER_FLAG != 0 && data.length >= 33) {
|
596
|
+
// we skip the first byte, then read the next 32 bytes for the keyset
|
597
|
+
bytes32 dasKeysetHash = bytes32(data[1:33]);
|
598
|
+
if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash);
|
599
|
+
}
|
600
|
+
}
|
601
|
+
return (keccak256(bytes.concat(header, data)), timeBounds);
|
602
|
+
}
|
603
|
+
|
604
|
+
/// @dev Form a hash of the data being provided in 4844 data blobs
|
605
|
+
/// @param afterDelayedMessagesRead The delayed messages count read up to
|
606
|
+
/// @return The data hash
|
607
|
+
/// @return The timebounds within which the message should be processed
|
608
|
+
/// @return The normalized amount of gas used for blob posting
|
609
|
+
function formBlobDataHash(uint256 afterDelayedMessagesRead)
|
610
|
+
internal
|
611
|
+
view
|
612
|
+
returns (
|
613
|
+
bytes32,
|
614
|
+
IBridge.TimeBounds memory,
|
615
|
+
uint256
|
616
|
+
)
|
617
|
+
{
|
618
|
+
bytes32[] memory dataHashes = reader4844.getDataHashes();
|
619
|
+
if (dataHashes.length == 0) revert MissingDataHashes();
|
620
|
+
|
621
|
+
(bytes memory header, IBridge.TimeBounds memory timeBounds) = packHeader(
|
622
|
+
afterDelayedMessagesRead
|
623
|
+
);
|
624
|
+
|
625
|
+
uint256 blobCost = reader4844.getBlobBaseFee() * GAS_PER_BLOB * dataHashes.length;
|
626
|
+
return (
|
627
|
+
keccak256(bytes.concat(header, DATA_BLOB_HEADER_FLAG, abi.encodePacked(dataHashes))),
|
628
|
+
timeBounds,
|
629
|
+
block.basefee > 0 ? blobCost / block.basefee : 0
|
630
|
+
);
|
631
|
+
}
|
632
|
+
|
633
|
+
/// @dev Submit a batch spending report message so that the batch poster can be reimbursed on the rollup
|
634
|
+
/// This function expect msg.sender is tx.origin, and will always record tx.origin as the spender
|
635
|
+
/// @param dataHash The hash of the message the spending report is being submitted for
|
636
|
+
/// @param seqMessageIndex The index of the message to submit the spending report for
|
637
|
+
/// @param gasPrice The gas price that was paid for the data (standard gas or data gas)
|
638
|
+
function submitBatchSpendingReport(
|
639
|
+
bytes32 dataHash,
|
640
|
+
uint256 seqMessageIndex,
|
641
|
+
uint256 gasPrice,
|
642
|
+
uint256 extraGas
|
643
|
+
) internal {
|
644
|
+
// report the account who paid the gas (tx.origin) for the tx as batch poster
|
645
|
+
// if msg.sender is used and is a contract, it might not be able to spend the refund on l2
|
646
|
+
// solhint-disable-next-line avoid-tx-origin
|
647
|
+
address batchPoster = tx.origin;
|
648
|
+
|
649
|
+
// this msg isn't included in the current sequencer batch, but instead added to
|
650
|
+
// the delayed messages queue that is yet to be included
|
651
|
+
if (hostChainIsArbitrum) {
|
652
|
+
// Include extra gas for the host chain's L1 gas charging
|
653
|
+
uint256 l1Fees = ArbGasInfo(address(0x6c)).getCurrentTxL1GasFees();
|
654
|
+
extraGas += l1Fees / block.basefee;
|
655
|
+
}
|
656
|
+
require(extraGas <= type(uint64).max, "EXTRA_GAS_NOT_UINT64");
|
657
|
+
bytes memory spendingReportMsg = abi.encodePacked(
|
658
|
+
block.timestamp,
|
659
|
+
batchPoster,
|
660
|
+
dataHash,
|
661
|
+
seqMessageIndex,
|
662
|
+
gasPrice,
|
663
|
+
uint64(extraGas)
|
664
|
+
);
|
665
|
+
|
666
|
+
uint256 msgNum = bridge.submitBatchSpendingReport(
|
667
|
+
batchPoster,
|
668
|
+
keccak256(spendingReportMsg)
|
669
|
+
);
|
670
|
+
// this is the same event used by Inbox.sol after including a message to the delayed message accumulator
|
671
|
+
emit InboxMessageDelivered(msgNum, spendingReportMsg);
|
377
672
|
}
|
378
673
|
|
379
674
|
function addSequencerL2BatchImpl(
|
@@ -403,39 +698,9 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
403
698
|
|
404
699
|
totalDelayedMessagesRead = afterDelayedMessagesRead;
|
405
700
|
|
406
|
-
if (calldataLengthPosted > 0) {
|
407
|
-
//
|
408
|
-
|
409
|
-
address batchPoster = msg.sender;
|
410
|
-
bytes memory spendingReportMsg;
|
411
|
-
if (hostChainIsArbitrum) {
|
412
|
-
// Include extra gas for the host chain's L1 gas charging
|
413
|
-
uint256 l1Fees = ArbGasInfo(address(0x6c)).getCurrentTxL1GasFees();
|
414
|
-
uint256 extraGas = l1Fees / block.basefee;
|
415
|
-
require(extraGas <= type(uint64).max, "L1_GAS_NOT_UINT64");
|
416
|
-
spendingReportMsg = abi.encodePacked(
|
417
|
-
block.timestamp,
|
418
|
-
batchPoster,
|
419
|
-
dataHash,
|
420
|
-
seqMessageIndex,
|
421
|
-
block.basefee,
|
422
|
-
uint64(extraGas)
|
423
|
-
);
|
424
|
-
} else {
|
425
|
-
spendingReportMsg = abi.encodePacked(
|
426
|
-
block.timestamp,
|
427
|
-
batchPoster,
|
428
|
-
dataHash,
|
429
|
-
seqMessageIndex,
|
430
|
-
block.basefee
|
431
|
-
);
|
432
|
-
}
|
433
|
-
uint256 msgNum = bridge.submitBatchSpendingReport(
|
434
|
-
batchPoster,
|
435
|
-
keccak256(spendingReportMsg)
|
436
|
-
);
|
437
|
-
// this is the same event used by Inbox.sol after including a message to the delayed message accumulator
|
438
|
-
emit InboxMessageDelivered(msgNum, spendingReportMsg);
|
701
|
+
if (calldataLengthPosted > 0 && !isUsingFeeToken) {
|
702
|
+
// only report batch poster spendings if chain is using ETH as native currency
|
703
|
+
submitBatchSpendingReport(dataHash, seqMessageIndex, block.basefee, 0);
|
439
704
|
}
|
440
705
|
}
|
441
706
|
|
@@ -447,17 +712,37 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
447
712
|
return bridge.sequencerMessageCount();
|
448
713
|
}
|
449
714
|
|
715
|
+
function _setMaxTimeVariation(ISequencerInbox.MaxTimeVariation memory maxTimeVariation_)
|
716
|
+
internal
|
717
|
+
{
|
718
|
+
if (
|
719
|
+
maxTimeVariation_.delayBlocks > type(uint64).max ||
|
720
|
+
maxTimeVariation_.futureBlocks > type(uint64).max ||
|
721
|
+
maxTimeVariation_.delaySeconds > type(uint64).max ||
|
722
|
+
maxTimeVariation_.futureSeconds > type(uint64).max
|
723
|
+
) {
|
724
|
+
revert BadMaxTimeVariation();
|
725
|
+
}
|
726
|
+
delayBlocks = uint64(maxTimeVariation_.delayBlocks);
|
727
|
+
futureBlocks = uint64(maxTimeVariation_.futureBlocks);
|
728
|
+
delaySeconds = uint64(maxTimeVariation_.delaySeconds);
|
729
|
+
futureSeconds = uint64(maxTimeVariation_.futureSeconds);
|
730
|
+
}
|
731
|
+
|
450
732
|
/// @inheritdoc ISequencerInbox
|
451
733
|
function setMaxTimeVariation(ISequencerInbox.MaxTimeVariation memory maxTimeVariation_)
|
452
734
|
external
|
453
735
|
onlyRollupOwner
|
454
736
|
{
|
455
|
-
|
737
|
+
_setMaxTimeVariation(maxTimeVariation_);
|
456
738
|
emit OwnerFunctionCalled(0);
|
457
739
|
}
|
458
740
|
|
459
741
|
/// @inheritdoc ISequencerInbox
|
460
|
-
function setIsBatchPoster(address addr, bool isBatchPoster_)
|
742
|
+
function setIsBatchPoster(address addr, bool isBatchPoster_)
|
743
|
+
external
|
744
|
+
onlyRollupOwnerOrBatchPosterManager
|
745
|
+
{
|
461
746
|
isBatchPoster[addr] = isBatchPoster_;
|
462
747
|
emit OwnerFunctionCalled(1);
|
463
748
|
}
|
@@ -493,9 +778,18 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox
|
|
493
778
|
}
|
494
779
|
|
495
780
|
/// @inheritdoc ISequencerInbox
|
496
|
-
function setIsSequencer(address addr, bool isSequencer_)
|
781
|
+
function setIsSequencer(address addr, bool isSequencer_)
|
782
|
+
external
|
783
|
+
onlyRollupOwnerOrBatchPosterManager
|
784
|
+
{
|
497
785
|
isSequencer[addr] = isSequencer_;
|
498
|
-
emit OwnerFunctionCalled(4);
|
786
|
+
emit OwnerFunctionCalled(4); // Owner in this context can also be batch poster manager
|
787
|
+
}
|
788
|
+
|
789
|
+
/// @inheritdoc ISequencerInbox
|
790
|
+
function setBatchPosterManager(address newBatchPosterManager) external onlyRollupOwner {
|
791
|
+
batchPosterManager = newBatchPosterManager;
|
792
|
+
emit OwnerFunctionCalled(5);
|
499
793
|
}
|
500
794
|
|
501
795
|
function isValidKeysetHash(bytes32 ksHash) external view returns (bool) {
|