@arbitrum/nitro-contracts 1.1.0 → 1.2.0

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