@arbitrum/nitro-contracts 2.1.0 → 3.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (503) hide show
  1. package/build/contracts/@openzeppelin/contracts/access/Ownable.sol/Ownable.dbg.json +1 -1
  2. package/build/contracts/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.dbg.json +1 -1
  3. package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.dbg.json +1 -1
  4. package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.json +2 -2
  5. package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol/ERC1967Upgrade.dbg.json +1 -1
  6. package/build/contracts/@openzeppelin/contracts/proxy/Proxy.sol/Proxy.dbg.json +1 -1
  7. package/build/contracts/@openzeppelin/contracts/proxy/beacon/IBeacon.sol/IBeacon.dbg.json +1 -1
  8. package/build/contracts/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol/UpgradeableBeacon.dbg.json +1 -1
  9. package/build/contracts/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol/UpgradeableBeacon.json +2 -2
  10. package/build/contracts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.dbg.json +1 -1
  11. package/build/contracts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +2 -2
  12. package/build/contracts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.dbg.json +1 -1
  13. package/build/contracts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +2 -2
  14. package/build/contracts/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol/UUPSUpgradeable.dbg.json +1 -1
  15. package/build/contracts/@openzeppelin/contracts/security/ReentrancyGuard.sol/ReentrancyGuard.dbg.json +1 -1
  16. package/build/contracts/@openzeppelin/contracts/token/ERC20/ERC20.sol/ERC20.dbg.json +1 -1
  17. package/build/contracts/@openzeppelin/contracts/token/ERC20/ERC20.sol/ERC20.json +2 -2
  18. package/build/contracts/@openzeppelin/contracts/token/ERC20/IERC20.sol/IERC20.dbg.json +1 -1
  19. package/build/contracts/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol/IERC20Metadata.dbg.json +1 -1
  20. package/build/contracts/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit.dbg.json +4 -0
  21. package/build/contracts/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit.json +86 -0
  22. package/build/contracts/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol/SafeERC20.dbg.json +1 -1
  23. package/build/contracts/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol/SafeERC20.json +2 -2
  24. package/build/contracts/@openzeppelin/contracts/utils/Address.sol/Address.dbg.json +1 -1
  25. package/build/contracts/@openzeppelin/contracts/utils/Address.sol/Address.json +2 -2
  26. package/build/contracts/@openzeppelin/contracts/utils/Context.sol/Context.dbg.json +1 -1
  27. package/build/contracts/@openzeppelin/contracts/utils/Create2.sol/Create2.dbg.json +4 -0
  28. package/build/contracts/@openzeppelin/contracts/utils/Create2.sol/Create2.json +10 -0
  29. package/build/contracts/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.dbg.json +1 -1
  30. package/build/contracts/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.json +2 -2
  31. package/build/contracts/@openzeppelin/contracts/utils/Strings.sol/Strings.dbg.json +1 -1
  32. package/build/contracts/@openzeppelin/contracts/utils/Strings.sol/Strings.json +2 -2
  33. package/build/contracts/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol/AccessControlUpgradeable.dbg.json +1 -1
  34. package/build/contracts/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol/AccessControlUpgradeable.json +13 -0
  35. package/build/contracts/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol/IAccessControlUpgradeable.dbg.json +1 -1
  36. package/build/contracts/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol/OwnableUpgradeable.dbg.json +1 -1
  37. package/build/contracts/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol/OwnableUpgradeable.json +13 -0
  38. package/build/contracts/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol/Initializable.dbg.json +1 -1
  39. package/build/contracts/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol/Initializable.json +15 -1
  40. package/build/contracts/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol/PausableUpgradeable.dbg.json +1 -1
  41. package/build/contracts/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol/PausableUpgradeable.json +13 -0
  42. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol/AddressUpgradeable.dbg.json +1 -1
  43. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol/AddressUpgradeable.json +2 -2
  44. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol/ContextUpgradeable.dbg.json +1 -1
  45. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol/ContextUpgradeable.json +15 -1
  46. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/Create2Upgradeable.sol/Create2Upgradeable.dbg.json +4 -0
  47. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/Create2Upgradeable.sol/Create2Upgradeable.json +10 -0
  48. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol/StorageSlotUpgradeable.dbg.json +1 -1
  49. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol/StorageSlotUpgradeable.json +2 -2
  50. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol/StringsUpgradeable.dbg.json +1 -1
  51. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol/StringsUpgradeable.json +2 -2
  52. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol/ERC165Upgradeable.dbg.json +1 -1
  53. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol/ERC165Upgradeable.json +13 -0
  54. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol/IERC165Upgradeable.dbg.json +1 -1
  55. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol/EnumerableSetUpgradeable.dbg.json +4 -0
  56. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol/EnumerableSetUpgradeable.json +10 -0
  57. package/build/contracts/src/assertionStakingPool/AbsBoldStakingPool.sol/AbsBoldStakingPool.dbg.json +4 -0
  58. package/build/contracts/{@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol/IERC20Upgradeable.json → src/assertionStakingPool/AbsBoldStakingPool.sol/AbsBoldStakingPool.json} +41 -95
  59. package/build/contracts/src/assertionStakingPool/AssertionStakingPool.sol/AssertionStakingPool.dbg.json +4 -0
  60. package/build/contracts/src/assertionStakingPool/AssertionStakingPool.sol/AssertionStakingPool.json +340 -0
  61. package/build/contracts/src/assertionStakingPool/AssertionStakingPoolCreator.sol/AssertionStakingPoolCreator.dbg.json +4 -0
  62. package/build/contracts/src/assertionStakingPool/AssertionStakingPoolCreator.sol/AssertionStakingPoolCreator.json +89 -0
  63. package/build/contracts/src/assertionStakingPool/EdgeStakingPool.sol/EdgeStakingPool.dbg.json +4 -0
  64. package/build/contracts/src/assertionStakingPool/EdgeStakingPool.sol/EdgeStakingPool.json +248 -0
  65. package/build/contracts/src/assertionStakingPool/EdgeStakingPoolCreator.sol/EdgeStakingPoolCreator.dbg.json +4 -0
  66. package/build/contracts/src/assertionStakingPool/EdgeStakingPoolCreator.sol/EdgeStakingPoolCreator.json +83 -0
  67. package/build/contracts/src/assertionStakingPool/StakingPoolCreatorUtils.sol/StakingPoolCreatorUtils.dbg.json +4 -0
  68. package/build/contracts/src/assertionStakingPool/StakingPoolCreatorUtils.sol/StakingPoolCreatorUtils.json +16 -0
  69. package/build/contracts/src/assertionStakingPool/interfaces/IAbsBoldStakingPool.sol/IAbsBoldStakingPool.dbg.json +4 -0
  70. package/build/contracts/src/assertionStakingPool/interfaces/IAbsBoldStakingPool.sol/IAbsBoldStakingPool.json +140 -0
  71. package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPool.sol/IAssertionStakingPool.dbg.json +4 -0
  72. package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPool.sol/IAssertionStakingPool.json +324 -0
  73. package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPoolCreator.sol/IAssertionStakingPoolCreator.dbg.json +4 -0
  74. package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPoolCreator.sol/IAssertionStakingPoolCreator.json +84 -0
  75. package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPool.sol/IEdgeStakingPool.dbg.json +4 -0
  76. package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPool.sol/IEdgeStakingPool.json +232 -0
  77. package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPoolCreator.sol/IEdgeStakingPoolCreator.dbg.json +4 -0
  78. package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPoolCreator.sol/IEdgeStakingPoolCreator.json +78 -0
  79. package/build/contracts/src/bridge/AbsBridge.sol/AbsBridge.dbg.json +1 -1
  80. package/build/contracts/src/bridge/AbsBridge.sol/AbsBridge.json +13 -0
  81. package/build/contracts/src/bridge/AbsInbox.sol/AbsInbox.dbg.json +1 -1
  82. package/build/contracts/src/bridge/AbsInbox.sol/AbsInbox.json +20 -7
  83. package/build/contracts/src/bridge/AbsOutbox.sol/AbsOutbox.dbg.json +1 -1
  84. package/build/contracts/src/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  85. package/build/contracts/src/bridge/Bridge.sol/Bridge.json +15 -2
  86. package/build/contracts/src/bridge/DelayBuffer.sol/DelayBuffer.dbg.json +4 -0
  87. package/build/contracts/src/bridge/DelayBuffer.sol/DelayBuffer.json +24 -0
  88. package/build/contracts/src/bridge/ERC20Bridge.sol/ERC20Bridge.dbg.json +1 -1
  89. package/build/contracts/src/bridge/ERC20Bridge.sol/ERC20Bridge.json +15 -2
  90. package/build/contracts/src/bridge/ERC20Inbox.sol/ERC20Inbox.dbg.json +1 -1
  91. package/build/contracts/src/bridge/ERC20Inbox.sol/ERC20Inbox.json +22 -9
  92. package/build/contracts/src/bridge/ERC20Outbox.sol/ERC20Outbox.dbg.json +1 -1
  93. package/build/contracts/src/bridge/ERC20Outbox.sol/ERC20Outbox.json +2 -2
  94. package/build/contracts/src/bridge/GasRefunder.sol/GasRefunder.dbg.json +1 -1
  95. package/build/contracts/src/bridge/GasRefunder.sol/GasRefunder.json +2 -2
  96. package/build/contracts/src/bridge/IBridge.sol/IBridge.dbg.json +1 -1
  97. package/build/contracts/src/bridge/IDelayedMessageProvider.sol/IDelayedMessageProvider.dbg.json +1 -1
  98. package/build/contracts/src/bridge/IERC20Bridge.sol/IERC20Bridge.dbg.json +1 -1
  99. package/build/contracts/src/bridge/IERC20Inbox.sol/IERC20Inbox.dbg.json +1 -1
  100. package/build/contracts/src/bridge/IERC20Inbox.sol/IERC20Inbox.json +1 -1
  101. package/build/contracts/src/bridge/IEthBridge.sol/IEthBridge.dbg.json +1 -1
  102. package/build/contracts/src/bridge/IInbox.sol/IInbox.dbg.json +1 -1
  103. package/build/contracts/src/bridge/IInbox.sol/IInbox.json +1 -1
  104. package/build/contracts/src/bridge/IInboxBase.sol/IInboxBase.dbg.json +1 -1
  105. package/build/contracts/src/bridge/IInboxBase.sol/IInboxBase.json +1 -1
  106. package/build/contracts/src/bridge/IOutbox.sol/IOutbox.dbg.json +1 -1
  107. package/build/contracts/src/bridge/IOwnable.sol/IOwnable.dbg.json +1 -1
  108. package/build/contracts/src/bridge/ISequencerInbox.sol/ISequencerInbox.dbg.json +1 -1
  109. package/build/contracts/src/bridge/ISequencerInbox.sol/ISequencerInbox.json +441 -0
  110. package/build/contracts/src/bridge/Inbox.sol/Inbox.dbg.json +1 -1
  111. package/build/contracts/src/bridge/Inbox.sol/Inbox.json +22 -4
  112. package/build/contracts/src/bridge/Messages.sol/Messages.dbg.json +1 -1
  113. package/build/contracts/src/bridge/Messages.sol/Messages.json +2 -2
  114. package/build/contracts/src/bridge/Outbox.sol/Outbox.dbg.json +1 -1
  115. package/build/contracts/src/bridge/Outbox.sol/Outbox.json +2 -2
  116. package/build/contracts/src/bridge/SequencerInbox.sol/SequencerInbox.dbg.json +1 -1
  117. package/build/contracts/src/bridge/SequencerInbox.sol/SequencerInbox.json +564 -7
  118. package/build/contracts/src/chain/CacheManager.sol/CacheManager.dbg.json +1 -1
  119. package/build/contracts/src/chain/CacheManager.sol/CacheManager.json +15 -2
  120. package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/EdgeChallengeManager.dbg.json +4 -0
  121. package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/EdgeChallengeManager.json +1631 -0
  122. package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/IEdgeChallengeManager.dbg.json +4 -0
  123. package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/IEdgeChallengeManager.json +762 -0
  124. package/build/contracts/src/challengeV2/IAssertionChain.sol/IAssertionChain.dbg.json +4 -0
  125. package/build/contracts/src/challengeV2/IAssertionChain.sol/IAssertionChain.json +247 -0
  126. package/build/contracts/src/challengeV2/libraries/ArrayUtilsLib.sol/ArrayUtilsLib.dbg.json +4 -0
  127. package/build/contracts/src/challengeV2/libraries/ArrayUtilsLib.sol/ArrayUtilsLib.json +10 -0
  128. package/build/contracts/src/challengeV2/libraries/ChallengeEdgeLib.sol/ChallengeEdgeLib.dbg.json +4 -0
  129. package/build/contracts/src/challengeV2/libraries/ChallengeEdgeLib.sol/ChallengeEdgeLib.json +10 -0
  130. package/build/contracts/src/challengeV2/libraries/EdgeChallengeManagerLib.sol/EdgeChallengeManagerLib.dbg.json +4 -0
  131. package/build/contracts/src/challengeV2/libraries/EdgeChallengeManagerLib.sol/EdgeChallengeManagerLib.json +24 -0
  132. package/build/contracts/src/challengeV2/libraries/MerkleTreeAccumulatorLib.sol/MerkleTreeAccumulatorLib.dbg.json +4 -0
  133. package/build/contracts/src/challengeV2/libraries/MerkleTreeAccumulatorLib.sol/MerkleTreeAccumulatorLib.json +24 -0
  134. package/build/contracts/src/challengeV2/libraries/UintUtilsLib.sol/UintUtilsLib.dbg.json +4 -0
  135. package/build/contracts/src/challengeV2/libraries/UintUtilsLib.sol/UintUtilsLib.json +10 -0
  136. package/build/contracts/src/libraries/AddressAliasHelper.sol/AddressAliasHelper.dbg.json +1 -1
  137. package/build/contracts/src/libraries/AddressAliasHelper.sol/AddressAliasHelper.json +2 -2
  138. package/build/contracts/src/libraries/AdminFallbackProxy.sol/AdminFallbackProxy.dbg.json +1 -1
  139. package/build/contracts/src/libraries/AdminFallbackProxy.sol/AdminFallbackProxy.json +2 -2
  140. package/build/contracts/src/libraries/AdminFallbackProxy.sol/DoubleLogicERC1967Upgrade.dbg.json +1 -1
  141. package/build/contracts/src/libraries/ArbitrumChecker.sol/ArbitrumChecker.dbg.json +1 -1
  142. package/build/contracts/src/libraries/ArbitrumChecker.sol/ArbitrumChecker.json +2 -2
  143. package/build/contracts/src/libraries/CryptographyPrimitives.sol/CryptographyPrimitives.dbg.json +1 -1
  144. package/build/contracts/src/libraries/CryptographyPrimitives.sol/CryptographyPrimitives.json +2 -2
  145. package/build/contracts/src/libraries/DecimalsConverterHelper.sol/DecimalsConverterHelper.dbg.json +1 -1
  146. package/build/contracts/src/libraries/DecimalsConverterHelper.sol/DecimalsConverterHelper.json +2 -2
  147. package/build/contracts/src/libraries/DelegateCallAware.sol/DelegateCallAware.dbg.json +1 -1
  148. package/build/contracts/src/libraries/DoubleLogicUUPSUpgradeable.sol/DoubleLogicUUPSUpgradeable.dbg.json +1 -1
  149. package/build/contracts/src/libraries/GasRefundEnabled.sol/GasRefundEnabled.dbg.json +1 -1
  150. package/build/contracts/src/libraries/IGasRefunder.sol/IGasRefunder.dbg.json +1 -1
  151. package/build/contracts/src/libraries/IReader4844.sol/IReader4844.dbg.json +1 -1
  152. package/build/contracts/src/libraries/MerkleLib.sol/MerkleLib.dbg.json +1 -1
  153. package/build/contracts/src/libraries/MerkleLib.sol/MerkleLib.json +2 -2
  154. package/build/contracts/src/libraries/UUPSNotUpgradeable.sol/UUPSNotUpgradeable.dbg.json +1 -1
  155. package/build/contracts/src/mocks/Benchmarks.sol/Benchmarks.dbg.json +1 -1
  156. package/build/contracts/src/mocks/Benchmarks.sol/Benchmarks.json +2 -2
  157. package/build/contracts/src/mocks/BridgeStub.sol/BridgeStub.dbg.json +1 -1
  158. package/build/contracts/src/mocks/BridgeStub.sol/BridgeStub.json +8 -8
  159. package/build/contracts/src/mocks/BridgeUnproxied.sol/BridgeUnproxied.dbg.json +1 -1
  160. package/build/contracts/src/mocks/BridgeUnproxied.sol/BridgeUnproxied.json +28 -2
  161. package/build/contracts/src/mocks/InboxStub.sol/InboxStub.dbg.json +1 -1
  162. package/build/contracts/src/mocks/InboxStub.sol/InboxStub.json +2 -2
  163. package/build/contracts/src/mocks/MerkleTreeAccess.sol/MerkleTreeAccess.dbg.json +4 -0
  164. package/build/contracts/src/mocks/MerkleTreeAccess.sol/MerkleTreeAccess.json +227 -0
  165. package/build/contracts/src/mocks/MockRollupEventInbox.sol/MockRollupEventInbox.dbg.json +4 -0
  166. package/build/contracts/src/mocks/MockRollupEventInbox.sol/MockRollupEventInbox.json +133 -0
  167. package/build/contracts/src/mocks/MultiCallTest.sol/MultiCallTest.dbg.json +1 -1
  168. package/build/contracts/src/mocks/MultiCallTest.sol/MultiCallTest.json +2 -2
  169. package/build/contracts/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol/PendingBlkTimeAndNrAdvanceCheck.dbg.json +1 -1
  170. package/build/contracts/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol/PendingBlkTimeAndNrAdvanceCheck.json +2 -2
  171. package/build/contracts/src/mocks/Program.sol/ProgramTest.dbg.json +1 -1
  172. package/build/contracts/src/mocks/Program.sol/ProgramTest.json +2 -2
  173. package/build/contracts/src/mocks/ProxyAdminForBinding.sol/ProxyAdminForBinding.dbg.json +1 -1
  174. package/build/contracts/src/mocks/ProxyAdminForBinding.sol/ProxyAdminForBinding.json +2 -2
  175. package/build/contracts/src/mocks/SdkStorage.sol/SdkStorage.dbg.json +1 -1
  176. package/build/contracts/src/mocks/SdkStorage.sol/SdkStorage.json +2 -2
  177. package/build/contracts/src/mocks/SequencerInboxBlobMock.sol/SequencerInboxBlobMock.dbg.json +4 -0
  178. package/build/contracts/src/mocks/SequencerInboxBlobMock.sol/SequencerInboxBlobMock.json +1632 -0
  179. package/build/contracts/src/mocks/SequencerInboxStub.sol/SequencerInboxStub.dbg.json +1 -1
  180. package/build/contracts/src/mocks/SequencerInboxStub.sol/SequencerInboxStub.json +564 -7
  181. package/build/contracts/src/mocks/Simple.sol/Simple.dbg.json +1 -1
  182. package/build/contracts/src/mocks/Simple.sol/Simple.json +2 -2
  183. package/build/contracts/src/mocks/SimpleCacheManager.sol/SimpleCacheManager.dbg.json +1 -1
  184. package/build/contracts/src/mocks/SimpleCacheManager.sol/SimpleCacheManager.json +2 -2
  185. package/build/contracts/src/mocks/SimpleOneStepProofEntry.sol/SimpleOneStepProofEntry.dbg.json +4 -0
  186. package/build/contracts/src/mocks/SimpleOneStepProofEntry.sol/SimpleOneStepProofEntry.json +142 -0
  187. package/build/contracts/src/mocks/SimpleProxy.sol/SimpleProxy.dbg.json +1 -1
  188. package/build/contracts/src/mocks/SimpleProxy.sol/SimpleProxy.json +2 -2
  189. package/build/contracts/src/mocks/TestWETH9.sol/IWETH9.dbg.json +4 -0
  190. package/build/contracts/src/mocks/TestWETH9.sol/IWETH9.json +31 -0
  191. package/build/contracts/src/mocks/TestWETH9.sol/TestWETH9.dbg.json +4 -0
  192. package/build/contracts/src/mocks/TestWETH9.sol/TestWETH9.json +317 -0
  193. package/build/contracts/src/mocks/UpgradeExecutorMock.sol/UpgradeExecutorMock.dbg.json +1 -1
  194. package/build/contracts/src/mocks/UpgradeExecutorMock.sol/UpgradeExecutorMock.json +15 -2
  195. package/build/contracts/src/node-interface/NodeInterface.sol/NodeInterface.dbg.json +1 -1
  196. package/build/contracts/src/node-interface/NodeInterfaceDebug.sol/NodeInterfaceDebug.dbg.json +1 -1
  197. package/build/contracts/src/osp/HashProofHelper.sol/HashProofHelper.dbg.json +1 -1
  198. package/build/contracts/src/osp/HashProofHelper.sol/HashProofHelper.json +2 -2
  199. package/build/contracts/src/osp/IOneStepProofEntry.sol/IOneStepProofEntry.dbg.json +1 -1
  200. package/build/contracts/src/osp/IOneStepProofEntry.sol/IOneStepProofEntry.json +33 -9
  201. package/build/contracts/src/osp/IOneStepProofEntry.sol/OneStepProofEntryLib.dbg.json +1 -1
  202. package/build/contracts/src/osp/IOneStepProofEntry.sol/OneStepProofEntryLib.json +2 -2
  203. package/build/contracts/src/osp/IOneStepProver.sol/IOneStepProver.dbg.json +1 -1
  204. package/build/contracts/src/osp/IOneStepProver.sol/IOneStepProver.json +5 -0
  205. package/build/contracts/src/osp/OneStepProofEntry.sol/OneStepProofEntry.dbg.json +1 -1
  206. package/build/contracts/src/osp/OneStepProofEntry.sol/OneStepProofEntry.json +35 -11
  207. package/build/contracts/src/osp/OneStepProver0.sol/OneStepProver0.dbg.json +1 -1
  208. package/build/contracts/src/osp/OneStepProver0.sol/OneStepProver0.json +7 -2
  209. package/build/contracts/src/osp/OneStepProverHostIo.sol/OneStepProverHostIo.dbg.json +1 -1
  210. package/build/contracts/src/osp/OneStepProverHostIo.sol/OneStepProverHostIo.json +7 -2
  211. package/build/contracts/src/osp/OneStepProverMath.sol/OneStepProverMath.dbg.json +1 -1
  212. package/build/contracts/src/osp/OneStepProverMath.sol/OneStepProverMath.json +7 -2
  213. package/build/contracts/src/osp/OneStepProverMemory.sol/OneStepProverMemory.dbg.json +1 -1
  214. package/build/contracts/src/osp/OneStepProverMemory.sol/OneStepProverMemory.json +7 -2
  215. package/build/contracts/src/precompiles/ArbAddressTable.sol/ArbAddressTable.dbg.json +1 -1
  216. package/build/contracts/src/precompiles/ArbAggregator.sol/ArbAggregator.dbg.json +1 -1
  217. package/build/contracts/src/precompiles/ArbBLS.sol/ArbBLS.dbg.json +1 -1
  218. package/build/contracts/src/precompiles/ArbDebug.sol/ArbDebug.dbg.json +1 -1
  219. package/build/contracts/src/precompiles/ArbFunctionTable.sol/ArbFunctionTable.dbg.json +1 -1
  220. package/build/contracts/src/precompiles/ArbGasInfo.sol/ArbGasInfo.dbg.json +1 -1
  221. package/build/contracts/src/precompiles/ArbInfo.sol/ArbInfo.dbg.json +1 -1
  222. package/build/contracts/src/precompiles/ArbOwner.sol/ArbOwner.dbg.json +1 -1
  223. package/build/contracts/src/precompiles/ArbOwnerPublic.sol/ArbOwnerPublic.dbg.json +1 -1
  224. package/build/contracts/src/precompiles/ArbRetryableTx.sol/ArbRetryableTx.dbg.json +1 -1
  225. package/build/contracts/src/precompiles/ArbStatistics.sol/ArbStatistics.dbg.json +1 -1
  226. package/build/contracts/src/precompiles/ArbSys.sol/ArbSys.dbg.json +1 -1
  227. package/build/contracts/src/precompiles/ArbWasm.sol/ArbWasm.dbg.json +1 -1
  228. package/build/contracts/src/precompiles/ArbWasmCache.sol/ArbWasmCache.dbg.json +1 -1
  229. package/build/contracts/src/precompiles/ArbosActs.sol/ArbosActs.dbg.json +1 -1
  230. package/build/contracts/src/precompiles/ArbosTest.sol/ArbosTest.dbg.json +1 -1
  231. package/build/contracts/src/rollup/AbsRollupEventInbox.sol/AbsRollupEventInbox.dbg.json +1 -1
  232. package/build/contracts/src/rollup/Assertion.sol/AssertionNodeLib.dbg.json +4 -0
  233. package/build/contracts/src/rollup/{Node.sol/NodeLib.json → Assertion.sol/AssertionNodeLib.json} +4 -4
  234. package/build/contracts/src/rollup/AssertionState.sol/AssertionStateLib.dbg.json +4 -0
  235. package/build/contracts/src/{challenge/ChallengeLib.sol/ChallengeLib.json → rollup/AssertionState.sol/AssertionStateLib.json} +4 -4
  236. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/BOLDUpgradeAction.dbg.json +4 -0
  237. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/BOLDUpgradeAction.json +807 -0
  238. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ConstantArrayStorage.dbg.json +4 -0
  239. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ConstantArrayStorage.json +35 -0
  240. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollup.dbg.json +4 -0
  241. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollup.json +361 -0
  242. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollupAdmin.dbg.json +4 -0
  243. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollupAdmin.json +38 -0
  244. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ISeqInboxPostUpgradeInit.dbg.json +4 -0
  245. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ISeqInboxPostUpgradeInit.json +41 -0
  246. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/RollupReader.dbg.json +4 -0
  247. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/RollupReader.json +385 -0
  248. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/StateHashPreImageLookup.dbg.json +4 -0
  249. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/StateHashPreImageLookup.json +203 -0
  250. package/build/contracts/src/rollup/BridgeCreator.sol/BridgeCreator.dbg.json +1 -1
  251. package/build/contracts/src/rollup/BridgeCreator.sol/BridgeCreator.json +62 -10
  252. package/build/contracts/src/rollup/DeployHelper.sol/DeployHelper.dbg.json +1 -1
  253. package/build/contracts/src/rollup/DeployHelper.sol/DeployHelper.json +2 -2
  254. package/build/contracts/src/rollup/ERC20RollupEventInbox.sol/ERC20RollupEventInbox.dbg.json +1 -1
  255. package/build/contracts/src/rollup/ERC20RollupEventInbox.sol/ERC20RollupEventInbox.json +2 -2
  256. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/FactoryDeployerHelper.dbg.json +1 -1
  257. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/FactoryDeployerHelper.json +2 -2
  258. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IDeployHelper.dbg.json +1 -1
  259. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IERC20.dbg.json +1 -1
  260. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IERC20Bridge.dbg.json +1 -1
  261. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IInboxBase.dbg.json +1 -1
  262. package/build/contracts/src/rollup/IRollupAdmin.sol/IRollupAdmin.dbg.json +1 -1
  263. package/build/contracts/src/rollup/IRollupAdmin.sol/IRollupAdmin.json +473 -99
  264. package/build/contracts/src/rollup/IRollupCore.sol/IRollupCore.dbg.json +1 -1
  265. package/build/contracts/src/rollup/IRollupCore.sol/IRollupCore.json +315 -221
  266. package/build/contracts/src/rollup/IRollupEventInbox.sol/IRollupEventInbox.dbg.json +1 -1
  267. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUser.dbg.json +1 -1
  268. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUser.json +678 -499
  269. package/build/contracts/src/rollup/RollupAdminLogic.sol/RollupAdminLogic.dbg.json +1 -1
  270. package/build/contracts/src/rollup/RollupAdminLogic.sol/RollupAdminLogic.json +806 -435
  271. package/build/contracts/src/rollup/RollupCore.sol/RollupCore.dbg.json +1 -1
  272. package/build/contracts/src/rollup/RollupCore.sol/RollupCore.json +323 -235
  273. package/build/contracts/src/rollup/RollupCreator.sol/RollupCreator.dbg.json +1 -1
  274. package/build/contracts/src/rollup/RollupCreator.sol/RollupCreator.json +98 -36
  275. package/build/contracts/src/rollup/RollupEventInbox.sol/RollupEventInbox.dbg.json +1 -1
  276. package/build/contracts/src/rollup/RollupEventInbox.sol/RollupEventInbox.json +2 -2
  277. package/build/contracts/src/rollup/RollupLib.sol/RollupLib.dbg.json +1 -1
  278. package/build/contracts/src/rollup/RollupLib.sol/RollupLib.json +2 -2
  279. package/build/contracts/src/rollup/RollupProxy.sol/RollupProxy.dbg.json +1 -1
  280. package/build/contracts/src/rollup/RollupProxy.sol/RollupProxy.json +97 -16
  281. package/build/contracts/src/rollup/RollupUserLogic.sol/RollupUserLogic.dbg.json +1 -1
  282. package/build/contracts/src/rollup/RollupUserLogic.sol/RollupUserLogic.json +924 -535
  283. package/build/contracts/src/rollup/ValidatorWallet.sol/ValidatorWallet.dbg.json +1 -1
  284. package/build/contracts/src/rollup/ValidatorWallet.sol/ValidatorWallet.json +15 -43
  285. package/build/contracts/src/rollup/ValidatorWalletCreator.sol/ValidatorWalletCreator.dbg.json +1 -1
  286. package/build/contracts/src/rollup/ValidatorWalletCreator.sol/ValidatorWalletCreator.json +2 -2
  287. package/build/contracts/src/state/Deserialize.sol/Deserialize.dbg.json +1 -1
  288. package/build/contracts/src/state/Deserialize.sol/Deserialize.json +2 -2
  289. package/build/contracts/src/state/GlobalState.sol/GlobalStateLib.dbg.json +1 -1
  290. package/build/contracts/src/state/GlobalState.sol/GlobalStateLib.json +2 -2
  291. package/build/contracts/src/state/Instructions.sol/Instructions.dbg.json +1 -1
  292. package/build/contracts/src/state/Instructions.sol/Instructions.json +2 -2
  293. package/build/contracts/src/state/Machine.sol/MachineLib.dbg.json +1 -1
  294. package/build/contracts/src/state/Machine.sol/MachineLib.json +2 -2
  295. package/build/contracts/src/state/MerkleProof.sol/MerkleProofLib.dbg.json +1 -1
  296. package/build/contracts/src/state/MerkleProof.sol/MerkleProofLib.json +2 -2
  297. package/build/contracts/src/state/Module.sol/ModuleLib.dbg.json +1 -1
  298. package/build/contracts/src/state/Module.sol/ModuleLib.json +2 -2
  299. package/build/contracts/src/state/ModuleMemory.sol/ModuleMemoryLib.dbg.json +1 -1
  300. package/build/contracts/src/state/ModuleMemory.sol/ModuleMemoryLib.json +2 -2
  301. package/build/contracts/src/state/ModuleMemoryCompact.sol/ModuleMemoryCompactLib.dbg.json +1 -1
  302. package/build/contracts/src/state/ModuleMemoryCompact.sol/ModuleMemoryCompactLib.json +2 -2
  303. package/build/contracts/src/state/MultiStack.sol/MultiStackLib.dbg.json +1 -1
  304. package/build/contracts/src/state/MultiStack.sol/MultiStackLib.json +2 -2
  305. package/build/contracts/src/state/PcArray.sol/PcArrayLib.dbg.json +1 -1
  306. package/build/contracts/src/state/PcArray.sol/PcArrayLib.json +2 -2
  307. package/build/contracts/src/state/StackFrame.sol/StackFrameLib.dbg.json +1 -1
  308. package/build/contracts/src/state/StackFrame.sol/StackFrameLib.json +2 -2
  309. package/build/contracts/src/state/Value.sol/ValueLib.dbg.json +1 -1
  310. package/build/contracts/src/state/Value.sol/ValueLib.json +2 -2
  311. package/build/contracts/src/state/ValueArray.sol/ValueArrayLib.dbg.json +1 -1
  312. package/build/contracts/src/state/ValueArray.sol/ValueArrayLib.json +2 -2
  313. package/build/contracts/src/state/ValueStack.sol/ValueStackLib.dbg.json +1 -1
  314. package/build/contracts/src/state/ValueStack.sol/ValueStackLib.json +2 -2
  315. package/build/contracts/src/test-helpers/BridgeTester.sol/BridgeTester.dbg.json +1 -1
  316. package/build/contracts/src/test-helpers/BridgeTester.sol/BridgeTester.json +15 -2
  317. package/build/contracts/src/test-helpers/CryptographyPrimitivesTester.sol/CryptographyPrimitivesTester.dbg.json +1 -1
  318. package/build/contracts/src/test-helpers/CryptographyPrimitivesTester.sol/CryptographyPrimitivesTester.json +2 -2
  319. package/build/contracts/src/test-helpers/EthVault.sol/EthVault.dbg.json +1 -1
  320. package/build/contracts/src/test-helpers/EthVault.sol/EthVault.json +2 -2
  321. package/build/contracts/src/test-helpers/MessageTester.sol/MessageTester.dbg.json +1 -1
  322. package/build/contracts/src/test-helpers/MessageTester.sol/MessageTester.json +2 -2
  323. package/build/contracts/src/test-helpers/OutboxWithoutOptTester.sol/OutboxWithoutOptTester.dbg.json +1 -1
  324. package/build/contracts/src/test-helpers/OutboxWithoutOptTester.sol/OutboxWithoutOptTester.json +2 -2
  325. package/build/contracts/src/test-helpers/RollupMock.sol/RollupMock.dbg.json +1 -1
  326. package/build/contracts/src/test-helpers/RollupMock.sol/RollupMock.json +2 -15
  327. package/build/contracts/src/test-helpers/TestToken.sol/TestToken.dbg.json +1 -1
  328. package/build/contracts/src/test-helpers/TestToken.sol/TestToken.json +2 -2
  329. package/build/contracts/src/test-helpers/ValueArrayTester.sol/ValueArrayTester.dbg.json +1 -1
  330. package/build/contracts/src/test-helpers/ValueArrayTester.sol/ValueArrayTester.json +2 -2
  331. package/out/yul/Reader4844.yul/Reader4844.json +1 -1
  332. package/package.json +15 -5
  333. package/src/assertionStakingPool/AbsBoldStakingPool.sol +66 -0
  334. package/src/assertionStakingPool/AssertionStakingPool.sol +70 -0
  335. package/src/assertionStakingPool/AssertionStakingPoolCreator.sol +35 -0
  336. package/src/assertionStakingPool/EdgeStakingPool.sol +57 -0
  337. package/src/assertionStakingPool/EdgeStakingPoolCreator.sol +34 -0
  338. package/src/assertionStakingPool/StakingPoolCreatorUtils.sol +25 -0
  339. package/src/assertionStakingPool/interfaces/IAbsBoldStakingPool.sol +41 -0
  340. package/src/assertionStakingPool/interfaces/IAssertionStakingPool.sol +36 -0
  341. package/src/assertionStakingPool/interfaces/IAssertionStakingPoolCreator.sol +31 -0
  342. package/src/assertionStakingPool/interfaces/IEdgeStakingPool.sol +27 -0
  343. package/src/assertionStakingPool/interfaces/IEdgeStakingPoolCreator.sol +28 -0
  344. package/src/bridge/AbsBridge.sol +38 -48
  345. package/src/bridge/AbsInbox.sol +88 -97
  346. package/src/bridge/AbsOutbox.sol +23 -37
  347. package/src/bridge/Bridge.sol +6 -4
  348. package/src/bridge/DelayBuffer.sol +123 -0
  349. package/src/bridge/DelayBufferTypes.sol +38 -0
  350. package/src/bridge/ERC20Bridge.sol +8 -4
  351. package/src/bridge/ERC20Inbox.sol +46 -53
  352. package/src/bridge/ERC20Outbox.sol +7 -3
  353. package/src/bridge/GasRefunder.sol +38 -24
  354. package/src/bridge/IBridge.sol +30 -21
  355. package/src/bridge/IERC20Bridge.sol +1 -1
  356. package/src/bridge/IERC20Inbox.sol +4 -2
  357. package/src/bridge/IEthBridge.sol +4 -2
  358. package/src/bridge/IInbox.sol +4 -2
  359. package/src/bridge/IInboxBase.sol +17 -13
  360. package/src/bridge/IOutbox.sol +13 -8
  361. package/src/bridge/ISequencerInbox.sol +118 -13
  362. package/src/bridge/Inbox.sol +131 -151
  363. package/src/bridge/Messages.sol +48 -18
  364. package/src/bridge/Outbox.sol +6 -2
  365. package/src/bridge/SequencerInbox.sol +339 -274
  366. package/src/chain/CacheManager.sol +49 -18
  367. package/src/challengeV2/EdgeChallengeManager.sol +783 -0
  368. package/src/challengeV2/IAssertionChain.sol +39 -0
  369. package/src/challengeV2/libraries/ArrayUtilsLib.sol +61 -0
  370. package/src/challengeV2/libraries/ChallengeEdgeLib.sol +333 -0
  371. package/src/challengeV2/libraries/ChallengeErrors.sol +108 -0
  372. package/src/challengeV2/libraries/EdgeChallengeManagerLib.sol +930 -0
  373. package/src/challengeV2/libraries/Enums.sol +26 -0
  374. package/src/challengeV2/libraries/MerkleTreeAccumulatorLib.sol +390 -0
  375. package/src/challengeV2/libraries/UintUtilsLib.sol +74 -0
  376. package/src/libraries/AddressAliasHelper.sol +6 -2
  377. package/src/libraries/AdminFallbackProxy.sol +8 -4
  378. package/src/libraries/ArbitrumChecker.sol +3 -4
  379. package/src/libraries/CryptographyPrimitives.sol +39 -46
  380. package/src/libraries/DecimalsConverterHelper.sol +2 -4
  381. package/src/libraries/DoubleLogicUUPSUpgradeable.sol +10 -7
  382. package/src/libraries/Error.sol +18 -3
  383. package/src/libraries/GasRefundEnabled.sol +3 -4
  384. package/src/libraries/MerkleLib.sol +6 -5
  385. package/src/libraries/UUPSNotUpgradeable.sol +2 -4
  386. package/src/mocks/BridgeStub.sol +50 -48
  387. package/src/mocks/BridgeUnproxied.sol +2 -0
  388. package/src/mocks/InboxStub.sol +22 -17
  389. package/src/mocks/MerkleTreeAccess.sol +72 -0
  390. package/src/mocks/MockRollupEventInbox.sol +59 -0
  391. package/src/mocks/MultiCallTest.sol +3 -1
  392. package/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol +3 -1
  393. package/src/mocks/Program.sol +9 -7
  394. package/src/mocks/SequencerInboxBlobMock.sol +38 -0
  395. package/src/mocks/SequencerInboxStub.sol +9 -12
  396. package/src/mocks/Simple.sol +13 -25
  397. package/src/mocks/SimpleCacheManager.sol +10 -3
  398. package/src/mocks/SimpleOneStepProofEntry.sol +60 -0
  399. package/src/mocks/SimpleProxy.sol +3 -1
  400. package/src/mocks/TestWETH9.sol +30 -0
  401. package/src/mocks/UpgradeExecutorMock.sol +10 -17
  402. package/src/node-interface/NodeInterface.sol +23 -22
  403. package/src/node-interface/NodeInterfaceDebug.sol +5 -3
  404. package/src/osp/HashProofHelper.sol +9 -10
  405. package/src/osp/IOneStepProofEntry.sol +14 -9
  406. package/src/osp/IOneStepProver.sol +1 -0
  407. package/src/osp/OneStepProofEntry.sol +63 -54
  408. package/src/osp/OneStepProver0.sol +14 -27
  409. package/src/osp/OneStepProverHostIo.sol +31 -58
  410. package/src/osp/OneStepProverMath.sol +15 -23
  411. package/src/osp/OneStepProverMemory.sol +9 -23
  412. package/src/precompiles/ArbAddressTable.sol +19 -9
  413. package/src/precompiles/ArbAggregator.sol +12 -4
  414. package/src/precompiles/ArbBLS.sol +1 -3
  415. package/src/precompiles/ArbDebug.sol +5 -11
  416. package/src/precompiles/ArbFunctionTable.sol +7 -10
  417. package/src/precompiles/ArbGasInfo.sol +9 -43
  418. package/src/precompiles/ArbInfo.sol +6 -2
  419. package/src/precompiles/ArbOwner.sol +101 -34
  420. package/src/precompiles/ArbOwnerPublic.sol +6 -2
  421. package/src/precompiles/ArbRetryableTx.sol +15 -5
  422. package/src/precompiles/ArbStatistics.sol +1 -8
  423. package/src/precompiles/ArbSys.sol +16 -18
  424. package/src/precompiles/ArbWasm.sol +24 -14
  425. package/src/precompiles/ArbWasmCache.sol +15 -5
  426. package/src/precompiles/ArbosTest.sol +3 -1
  427. package/src/rollup/AbsRollupEventInbox.sol +15 -16
  428. package/src/rollup/Assertion.sol +100 -0
  429. package/src/rollup/AssertionState.sol +29 -0
  430. package/src/rollup/BOLDUpgradeAction.sol +631 -0
  431. package/src/rollup/BridgeCreator.sol +42 -15
  432. package/src/rollup/Config.sol +15 -7
  433. package/src/rollup/DeployHelper.sol +12 -31
  434. package/src/rollup/ERC20RollupEventInbox.sol +8 -9
  435. package/src/rollup/FactoryDeployerHelper.sol +8 -10
  436. package/src/rollup/IRollupAdmin.sol +127 -45
  437. package/src/rollup/IRollupCore.sol +64 -84
  438. package/src/rollup/IRollupEventInbox.sol +3 -1
  439. package/src/rollup/IRollupLogic.sol +35 -72
  440. package/src/rollup/RollupAdminLogic.sol +224 -203
  441. package/src/rollup/RollupCore.sol +407 -428
  442. package/src/rollup/RollupCreator.sol +88 -75
  443. package/src/rollup/RollupEventInbox.sol +7 -7
  444. package/src/rollup/RollupLib.sol +50 -86
  445. package/src/rollup/RollupProxy.sol +8 -12
  446. package/src/rollup/RollupUserLogic.sol +279 -644
  447. package/src/rollup/ValidatorUtils.sol +0 -242
  448. package/src/rollup/ValidatorWallet.sol +22 -38
  449. package/src/rollup/ValidatorWalletCreator.sol +8 -8
  450. package/src/state/Deserialize.sol +74 -96
  451. package/src/state/GlobalState.sol +74 -20
  452. package/src/state/Instructions.sol +4 -3
  453. package/src/state/Machine.sol +18 -19
  454. package/src/state/Module.sol +14 -13
  455. package/src/state/ModuleMemory.sol +6 -25
  456. package/src/state/ModuleMemoryCompact.sol +3 -1
  457. package/src/state/MultiStack.sol +16 -20
  458. package/src/state/PcArray.sol +7 -7
  459. package/src/state/StackFrame.sol +21 -14
  460. package/src/state/Value.sol +18 -6
  461. package/src/state/ValueArray.sol +7 -7
  462. package/src/state/ValueStack.sol +9 -3
  463. package/src/test-helpers/BridgeTester.sol +32 -42
  464. package/src/test-helpers/CryptographyPrimitivesTester.sol +12 -13
  465. package/src/test-helpers/EthVault.sol +4 -2
  466. package/src/test-helpers/InterfaceCompatibilityTester.sol +1 -1
  467. package/src/test-helpers/MessageTester.sol +3 -10
  468. package/src/test-helpers/OutboxWithoutOptTester.sol +12 -19
  469. package/src/test-helpers/RollupMock.sol +3 -7
  470. package/src/test-helpers/TestToken.sol +4 -2
  471. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol/IERC20Upgradeable.dbg.json +0 -4
  472. package/build/contracts/src/challenge/ChallengeLib.sol/ChallengeLib.dbg.json +0 -4
  473. package/build/contracts/src/challenge/ChallengeManager.sol/ChallengeManager.dbg.json +0 -4
  474. package/build/contracts/src/challenge/ChallengeManager.sol/ChallengeManager.json +0 -746
  475. package/build/contracts/src/challenge/IChallengeManager.sol/IChallengeManager.dbg.json +0 -4
  476. package/build/contracts/src/challenge/IChallengeManager.sol/IChallengeManager.json +0 -441
  477. package/build/contracts/src/challenge/IChallengeResultReceiver.sol/IChallengeResultReceiver.dbg.json +0 -4
  478. package/build/contracts/src/challenge/IChallengeResultReceiver.sol/IChallengeResultReceiver.json +0 -34
  479. package/build/contracts/src/mocks/MockResultReceiver.sol/MockResultReceiver.dbg.json +0 -4
  480. package/build/contracts/src/mocks/MockResultReceiver.sol/MockResultReceiver.json +0 -188
  481. package/build/contracts/src/mocks/SingleExecutionChallenge.sol/SingleExecutionChallenge.dbg.json +0 -4
  482. package/build/contracts/src/mocks/SingleExecutionChallenge.sol/SingleExecutionChallenge.json +0 -797
  483. package/build/contracts/src/mocks/TimedOutChallengeManager.sol/TimedOutChallengeManager.dbg.json +0 -4
  484. package/build/contracts/src/mocks/TimedOutChallengeManager.sol/TimedOutChallengeManager.json +0 -746
  485. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserAbs.dbg.json +0 -4
  486. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserAbs.json +0 -1332
  487. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserERC20.dbg.json +0 -4
  488. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserERC20.json +0 -1466
  489. package/build/contracts/src/rollup/Node.sol/NodeLib.dbg.json +0 -4
  490. package/build/contracts/src/rollup/RollupUserLogic.sol/AbsRollupUserLogic.dbg.json +0 -4
  491. package/build/contracts/src/rollup/RollupUserLogic.sol/AbsRollupUserLogic.json +0 -1614
  492. package/build/contracts/src/rollup/RollupUserLogic.sol/ERC20RollupUserLogic.dbg.json +0 -4
  493. package/build/contracts/src/rollup/RollupUserLogic.sol/ERC20RollupUserLogic.json +0 -1748
  494. package/build/contracts/src/rollup/ValidatorUtils.sol/ValidatorUtils.dbg.json +0 -4
  495. package/build/contracts/src/rollup/ValidatorUtils.sol/ValidatorUtils.json +0 -379
  496. package/src/challenge/ChallengeLib.sol +0 -88
  497. package/src/challenge/ChallengeManager.sol +0 -375
  498. package/src/challenge/IChallengeManager.sol +0 -86
  499. package/src/challenge/IChallengeResultReceiver.sol +0 -13
  500. package/src/mocks/MockResultReceiver.sol +0 -59
  501. package/src/mocks/SingleExecutionChallenge.sol +0 -41
  502. package/src/mocks/TimedOutChallengeManager.sol +0 -13
  503. package/src/rollup/Node.sol +0 -113
@@ -5,139 +5,173 @@
5
5
  pragma solidity ^0.8.0;
6
6
 
7
7
  import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
8
+ import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol";
8
9
 
9
- import "./Node.sol";
10
+ import "./Assertion.sol";
10
11
  import "./RollupLib.sol";
11
12
  import "./IRollupEventInbox.sol";
12
13
  import "./IRollupCore.sol";
13
14
 
14
- import "../challenge/IChallengeManager.sol";
15
+ import "../state/Machine.sol";
15
16
 
16
17
  import "../bridge/ISequencerInbox.sol";
17
18
  import "../bridge/IBridge.sol";
18
19
  import "../bridge/IOutbox.sol";
19
-
20
- import "../precompiles/ArbSys.sol";
21
-
20
+ import "../challengeV2/EdgeChallengeManager.sol";
22
21
  import "../libraries/ArbitrumChecker.sol";
23
- import {NO_CHAL_INDEX} from "../libraries/Constants.sol";
24
22
 
25
23
  abstract contract RollupCore is IRollupCore, PausableUpgradeable {
26
- using NodeLib for Node;
24
+ using AssertionNodeLib for AssertionNode;
27
25
  using GlobalStateLib for GlobalState;
26
+ using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet;
28
27
 
29
28
  // Rollup Config
30
- uint64 public confirmPeriodBlocks;
31
- uint64 public extraChallengeTimeBlocks;
32
29
  uint256 public chainId;
30
+
31
+ // These 4 config should be stored into the prev and not used directly
32
+ // An assertion can be confirmed after confirmPeriodBlocks when it is unchallenged
33
+ uint64 public confirmPeriodBlocks;
34
+ // The validator whitelist can be dropped permissionlessly once the last confirmed assertion or its first child is at least validatorAfkBlocks old
35
+ uint64 public validatorAfkBlocks;
36
+
37
+ // ------------------------------
38
+ // STAKING
39
+ // ------------------------------
40
+
41
+ // Overall
42
+ // ------------------------------
43
+ // In order to create a new assertion the validator creating it must be staked. Only one stake
44
+ // is needed per consistent lineage of assertions, so additional stakes must be placed when
45
+ // lineages diverge.
46
+ // As an example, for the following chain only one stake would be locked up in the C assertion
47
+ // A -- B -- C
48
+ // However for the following chain 2 stakes would be locked up, in C and in D
49
+ // A -- B -- C
50
+ // \-- D
51
+ // Since we know that only one assertion chain can be correct, we only need one stake available
52
+ // to be refunded at any one time, and any more than one stake can be immediately confiscated.
53
+ // So in the above situation although 2 stakes are not available to be withdrawn as they are locked
54
+ // by C and D, only 1 stake needs to remain in the contract since one of the stakes will eventually
55
+ // be confiscated anyway.
56
+ // In practice, what we do here is increase the withdrawable amount of an escrow address that is
57
+ // expected to be controlled by the rollup owner, whenever the lineage forks.
58
+
59
+ // Moving stake
60
+ // ------------------------------
61
+ // Since we only need one stake per lineage we can lock the stake of the validator that last extended that
62
+ // lineage. All other stakes within that lineage are then free to be moved to other lineages, or be withdrawn.
63
+ // Additionally, it's inconsistent for a validator to stake on two different lineages, and as a validator
64
+ // should only need to have one stake in the system at any one time.
65
+ // In order to create a new assertion a validator needs to have free stake. Since stake is freed from an assertion
66
+ // when another assertion builds on it, we know that if the assertion that was last staked on by a validator
67
+ // has children, then that validator has free stake. Likewise, if the last staked assertion does not have children
68
+ // but it is the parent of the assertion the validator is trying to create, then we know that by the time the assertion
69
+ // is created it will have children, so we can allow this condition as well.
70
+
71
+ // Updating stake amount
72
+ // ------------------------------
73
+ // The stake required to create an assertion can be updated by the rollup owner. A required stake value is stored on each
74
+ // assertion, and shows how much stake is required to create the next assertion. Since we only store the last
75
+ // assertion made by a validator, we don't know if it has previously staked on lower/higher amounts and
76
+ // therefore offer partial withdrawals due to this difference. Instead we enforce that either all of the
77
+ // validators stake is locked, or none of it.
33
78
  uint256 public baseStake;
79
+
34
80
  bytes32 public wasmModuleRoot;
81
+ // When there is a challenge, we trust the challenge manager to determine the winner
82
+ IEdgeChallengeManager public challengeManager;
83
+
84
+ // If an assertion was challenged we leave an additional period after it could have completed
85
+ // so that the result of a challenge is observable widely before it causes an assertion to be confirmed
86
+ uint64 public challengeGracePeriodBlocks;
35
87
 
36
88
  IInboxBase public inbox;
37
89
  IBridge public bridge;
38
90
  IOutbox public outbox;
39
- ISequencerInbox public sequencerInbox;
40
91
  IRollupEventInbox public rollupEventInbox;
41
- IChallengeManager public override challengeManager;
42
92
 
43
- // misc useful contracts when interacting with the rollup
44
- address public validatorUtils;
45
93
  address public validatorWalletCreator;
46
94
 
47
- // when a staker loses a challenge, half of their funds get escrowed in this address
95
+ // only 1 child can be confirmed, the excess/loser stake will be sent to this address
48
96
  address public loserStakeEscrow;
49
97
  address public stakeToken;
50
98
  uint256 public minimumAssertionPeriod;
51
99
 
52
- mapping(address => bool) public isValidator;
53
-
54
- // Stakers become Zombies after losing a challenge
55
- struct Zombie {
56
- address stakerAddress;
57
- uint64 latestStakedNode;
58
- }
100
+ EnumerableSetUpgradeable.AddressSet internal validators;
59
101
 
60
- uint64 private _latestConfirmed;
61
- uint64 private _firstUnresolvedNode;
62
- uint64 private _latestNodeCreated;
63
- uint64 private _lastStakeBlock;
64
- mapping(uint64 => Node) private _nodes;
65
- mapping(uint64 => mapping(address => bool)) private _nodeStakers;
102
+ bytes32 private _latestConfirmed;
103
+ mapping(bytes32 => AssertionNode) private _assertions;
66
104
 
67
105
  address[] private _stakerList;
68
106
  mapping(address => Staker) public _stakerMap;
69
107
 
70
- Zombie[] private _zombies;
71
-
72
108
  mapping(address => uint256) private _withdrawableFunds;
73
109
  uint256 public totalWithdrawableFunds;
74
110
  uint256 public rollupDeploymentBlock;
75
111
 
76
- // The node number of the initial node
77
- uint64 internal constant GENESIS_NODE = 0;
78
-
79
112
  bool public validatorWhitelistDisabled;
80
113
  address public anyTrustFastConfirmer;
81
114
 
82
115
  // If the chain this RollupCore is deployed on is an Arbitrum chain.
83
116
  bool internal immutable _hostChainIsArbitrum = ArbitrumChecker.runningOnArbitrum();
84
117
  // If the chain RollupCore is deployed on, this will contain the ArbSys.blockNumber() at each node's creation.
85
- mapping(uint64 => uint256) internal _nodeCreatedAtArbSysBlock;
118
+ mapping(bytes32 => uint256) internal _assertionCreatedAtArbSysBlock;
119
+
120
+ function sequencerInbox() public view virtual returns (ISequencerInbox) {
121
+ return ISequencerInbox(bridge.sequencerInbox());
122
+ }
86
123
 
87
124
  /**
88
- * @notice Get a storage reference to the Node for the given node index
89
- * @param nodeNum Index of the node
90
- * @return Node struct
125
+ * @notice Get a storage reference to the Assertion for the given assertion hash
126
+ * @dev The assertion may not exists
127
+ * @param assertionHash Id of the assertion
128
+ * @return Assertion struct
91
129
  */
92
- function getNodeStorage(uint64 nodeNum) internal view returns (Node storage) {
93
- return _nodes[nodeNum];
130
+ function getAssertionStorage(
131
+ bytes32 assertionHash
132
+ ) internal view returns (AssertionNode storage) {
133
+ require(assertionHash != bytes32(0), "ASSERTION_ID_CANNOT_BE_ZERO");
134
+ return _assertions[assertionHash];
94
135
  }
95
136
 
96
137
  /**
97
- * @notice Get the Node for the given index.
138
+ * @notice Get the Assertion for the given index.
98
139
  */
99
- function getNode(uint64 nodeNum) public view override returns (Node memory) {
100
- return getNodeStorage(nodeNum);
140
+ function getAssertion(
141
+ bytes32 assertionHash
142
+ ) public view override returns (AssertionNode memory) {
143
+ return getAssertionStorage(assertionHash);
101
144
  }
102
145
 
103
146
  /**
104
- * @notice Returns the block in which the given node was created for looking up its creation event.
105
- * Unlike the Node's createdAtBlock field, this will be the ArbSys blockNumber if the host chain is an Arbitrum chain.
147
+ * @notice Returns the block in which the given assertion was created for looking up its creation event.
148
+ * Unlike the assertion's createdAtBlock field, this will be the ArbSys blockNumber if the host chain is an Arbitrum chain.
106
149
  * That means that the block number returned for this is usable for event queries.
107
- * This function will revert if the given node number does not exist.
150
+ * This function will revert if the given assertion hash does not exist.
108
151
  * @dev This function is meant for internal use only and has no stability guarantees.
109
152
  */
110
- function getNodeCreationBlockForLogLookup(uint64 nodeNum)
111
- external
112
- view
113
- override
114
- returns (uint256)
115
- {
153
+ function getAssertionCreationBlockForLogLookup(
154
+ bytes32 assertionHash
155
+ ) external view override returns (uint256) {
116
156
  if (_hostChainIsArbitrum) {
117
- uint256 blockNum = _nodeCreatedAtArbSysBlock[nodeNum];
118
- require(blockNum > 0, "NO_NODE");
157
+ uint256 blockNum = _assertionCreatedAtArbSysBlock[assertionHash];
158
+ require(blockNum > 0, "NO_ASSERTION");
119
159
  return blockNum;
120
160
  } else {
121
- Node storage node = getNodeStorage(nodeNum);
122
- require(node.deadlineBlock != 0, "NO_NODE");
123
- return node.createdAtBlock;
161
+ AssertionNode storage assertion = getAssertionStorage(assertionHash);
162
+ assertion.requireExists();
163
+ return assertion.createdAtBlock;
124
164
  }
125
165
  }
126
166
 
127
- /**
128
- * @notice Check if the specified node has been staked on by the provided staker.
129
- * Only accurate at the latest confirmed node and afterwards.
130
- */
131
- function nodeHasStaker(uint64 nodeNum, address staker) public view override returns (bool) {
132
- return _nodeStakers[nodeNum][staker];
133
- }
134
-
135
167
  /**
136
168
  * @notice Get the address of the staker at the given index
137
169
  * @param stakerNum Index of the staker
138
170
  * @return Address of the staker
139
171
  */
140
- function getStakerAddress(uint64 stakerNum) external view override returns (address) {
172
+ function getStakerAddress(
173
+ uint64 stakerNum
174
+ ) external view override returns (address) {
141
175
  return _stakerList[stakerNum];
142
176
  }
143
177
 
@@ -146,45 +180,43 @@ abstract contract RollupCore is IRollupCore, PausableUpgradeable {
146
180
  * @param staker Staker address to check
147
181
  * @return True or False for whether the staker was staked
148
182
  */
149
- function isStaked(address staker) public view override returns (bool) {
183
+ function isStaked(
184
+ address staker
185
+ ) public view override returns (bool) {
150
186
  return _stakerMap[staker].isStaked;
151
187
  }
152
188
 
153
189
  /**
154
- * @notice Check whether the given staker is staked on the latest confirmed node,
155
- * which includes if the staker is staked on a descendent of the latest confirmed node.
156
- * @param staker Staker address to check
157
- * @return True or False for whether the staker was staked
158
- */
159
- function isStakedOnLatestConfirmed(address staker) public view returns (bool) {
160
- return _stakerMap[staker].isStaked && nodeHasStaker(_latestConfirmed, staker);
161
- }
162
-
163
- /**
164
- * @notice Get the latest staked node of the given staker
190
+ * @notice Get the latest staked assertion of the given staker
165
191
  * @param staker Staker address to lookup
166
- * @return Latest node staked of the staker
192
+ * @return Latest assertion staked of the staker
167
193
  */
168
- function latestStakedNode(address staker) public view override returns (uint64) {
169
- return _stakerMap[staker].latestStakedNode;
194
+ function latestStakedAssertion(
195
+ address staker
196
+ ) public view override returns (bytes32) {
197
+ return _stakerMap[staker].latestStakedAssertion;
170
198
  }
171
199
 
172
200
  /**
173
- * @notice Get the current challenge of the given staker
201
+ * @notice Get the amount staked of the given staker
174
202
  * @param staker Staker address to lookup
175
- * @return Current challenge of the staker
203
+ * @return Amount staked of the staker
176
204
  */
177
- function currentChallenge(address staker) public view override returns (uint64) {
178
- return _stakerMap[staker].currentChallenge;
205
+ function amountStaked(
206
+ address staker
207
+ ) public view override returns (uint256) {
208
+ return _stakerMap[staker].amountStaked;
179
209
  }
180
210
 
181
211
  /**
182
- * @notice Get the amount staked of the given staker
212
+ * @notice Get the withdrawal address of the given staker
183
213
  * @param staker Staker address to lookup
184
- * @return Amount staked of the staker
214
+ * @return Withdrawal address of the staker
185
215
  */
186
- function amountStaked(address staker) public view override returns (uint256) {
187
- return _stakerMap[staker].amountStaked;
216
+ function withdrawalAddress(
217
+ address staker
218
+ ) public view override returns (address) {
219
+ return _stakerMap[staker].withdrawalAddress;
188
220
  }
189
221
 
190
222
  /**
@@ -192,197 +224,99 @@ abstract contract RollupCore is IRollupCore, PausableUpgradeable {
192
224
  * @param staker Staker address to retrieve
193
225
  * @return A structure with information about the requested staker
194
226
  */
195
- function getStaker(address staker) external view override returns (Staker memory) {
227
+ function getStaker(
228
+ address staker
229
+ ) external view override returns (Staker memory) {
196
230
  return _stakerMap[staker];
197
231
  }
198
232
 
199
- /**
200
- * @notice Get the original staker address of the zombie at the given index
201
- * @param zombieNum Index of the zombie to lookup
202
- * @return Original staker address of the zombie
203
- */
204
- function zombieAddress(uint256 zombieNum) public view override returns (address) {
205
- return _zombies[zombieNum].stakerAddress;
206
- }
207
-
208
- /**
209
- * @notice Get Latest node that the given zombie at the given index is staked on
210
- * @param zombieNum Index of the zombie to lookup
211
- * @return Latest node that the given zombie is staked on
212
- */
213
- function zombieLatestStakedNode(uint256 zombieNum) public view override returns (uint64) {
214
- return _zombies[zombieNum].latestStakedNode;
215
- }
216
-
217
- /**
218
- * @notice Retrieves stored information about a requested zombie
219
- * @param zombieNum Index of the zombie to lookup
220
- * @return A structure with information about the requested staker
221
- */
222
- function getZombieStorage(uint256 zombieNum) internal view returns (Zombie storage) {
223
- return _zombies[zombieNum];
224
- }
225
-
226
- /// @return Current number of un-removed zombies
227
- function zombieCount() public view override returns (uint256) {
228
- return _zombies.length;
229
- }
230
-
231
- function isZombie(address staker) public view override returns (bool) {
232
- for (uint256 i = 0; i < _zombies.length; i++) {
233
- if (staker == _zombies[i].stakerAddress) {
234
- return true;
235
- }
236
- }
237
- return false;
238
- }
239
-
240
233
  /**
241
234
  * @notice Get the amount of funds withdrawable by the given address
242
235
  * @param user Address to check the funds of
243
236
  * @return Amount of funds withdrawable by user
244
237
  */
245
- function withdrawableFunds(address user) external view override returns (uint256) {
238
+ function withdrawableFunds(
239
+ address user
240
+ ) external view override returns (uint256) {
246
241
  return _withdrawableFunds[user];
247
242
  }
248
243
 
249
- /**
250
- * @return Index of the first unresolved node
251
- * @dev If all nodes have been resolved, this will be latestNodeCreated + 1
252
- */
253
- function firstUnresolvedNode() public view override returns (uint64) {
254
- return _firstUnresolvedNode;
255
- }
256
-
257
- /// @return Index of the latest confirmed node
258
- function latestConfirmed() public view override returns (uint64) {
244
+ /// @return Index of the latest confirmed assertion
245
+ function latestConfirmed() public view override returns (bytes32) {
259
246
  return _latestConfirmed;
260
247
  }
261
248
 
262
- /// @return Index of the latest rollup node created
263
- function latestNodeCreated() public view override returns (uint64) {
264
- return _latestNodeCreated;
265
- }
266
-
267
- /// @return Ethereum block that the most recent stake was created
268
- function lastStakeBlock() external view override returns (uint64) {
269
- return _lastStakeBlock;
270
- }
271
-
272
249
  /// @return Number of active stakers currently staked
273
250
  function stakerCount() public view override returns (uint64) {
274
251
  return uint64(_stakerList.length);
275
252
  }
276
253
 
277
254
  /**
278
- * @notice Initialize the core with an initial node
279
- * @param initialNode Initial node to start the chain with
255
+ * @notice Initialize the core with an initial assertion
256
+ * @param initialAssertion Initial assertion to start the chain with
280
257
  */
281
- function initializeCore(Node memory initialNode) internal {
258
+ function initializeCore(
259
+ AssertionNode memory initialAssertion,
260
+ bytes32 assertionHash
261
+ ) internal {
282
262
  __Pausable_init();
283
- _nodes[GENESIS_NODE] = initialNode;
284
- _firstUnresolvedNode = GENESIS_NODE + 1;
285
- if (_hostChainIsArbitrum) {
286
- _nodeCreatedAtArbSysBlock[GENESIS_NODE] = ArbSys(address(100)).arbBlockNumber();
287
- }
263
+ initialAssertion.status = AssertionStatus.Confirmed;
264
+ _assertions[assertionHash] = initialAssertion;
265
+ _latestConfirmed = assertionHash;
288
266
  }
289
267
 
290
268
  /**
291
- * @notice React to a new node being created by storing it an incrementing the latest node counter
292
- * @param node Node that was newly created
269
+ * @dev This function will validate the parentAssertionHash, confirmState and inboxAcc against the assertionHash
270
+ * and check if the assertionHash is currently pending. If all checks pass, the assertion will be confirmed.
293
271
  */
294
- function nodeCreated(Node memory node) internal {
295
- _latestNodeCreated++;
296
- _nodes[_latestNodeCreated] = node;
297
- if (_hostChainIsArbitrum) {
298
- _nodeCreatedAtArbSysBlock[_latestNodeCreated] = ArbSys(address(100)).arbBlockNumber();
299
- }
300
- }
272
+ function confirmAssertionInternal(
273
+ bytes32 assertionHash,
274
+ bytes32 parentAssertionHash,
275
+ AssertionState calldata confirmState,
276
+ bytes32 inboxAcc
277
+ ) internal {
278
+ AssertionNode storage assertion = getAssertionStorage(assertionHash);
279
+ // Check that assertion is pending, this also checks that assertion exists
280
+ require(assertion.status == AssertionStatus.Pending, "NOT_PENDING");
301
281
 
302
- /// @notice Reject the next unresolved node
303
- function _rejectNextNode() internal {
304
- _firstUnresolvedNode++;
305
- }
282
+ // Authenticate data against assertionHash pre-image
283
+ require(
284
+ assertionHash
285
+ == RollupLib.assertionHash({
286
+ parentAssertionHash: parentAssertionHash,
287
+ afterState: confirmState,
288
+ inboxAcc: inboxAcc
289
+ }),
290
+ "CONFIRM_DATA"
291
+ );
306
292
 
307
- function confirmNode(
308
- uint64 nodeNum,
309
- bytes32 blockHash,
310
- bytes32 sendRoot
311
- ) internal {
312
- Node storage node = getNodeStorage(nodeNum);
313
- // Authenticate data against node's confirm data pre-image
314
- require(node.confirmData == RollupLib.confirmHash(blockHash, sendRoot), "CONFIRM_DATA");
293
+ bytes32 blockHash = confirmState.globalState.getBlockHash();
294
+ bytes32 sendRoot = confirmState.globalState.getSendRoot();
315
295
 
316
296
  // trusted external call to outbox
317
297
  outbox.updateSendRoot(sendRoot, blockHash);
318
298
 
319
- _latestConfirmed = nodeNum;
320
- _firstUnresolvedNode = nodeNum + 1;
299
+ _latestConfirmed = assertionHash;
300
+ assertion.status = AssertionStatus.Confirmed;
321
301
 
322
- emit NodeConfirmed(nodeNum, blockHash, sendRoot);
302
+ emit AssertionConfirmed(assertionHash, blockHash, sendRoot);
323
303
  }
324
304
 
325
305
  /**
326
- * @notice Create a new stake at latest confirmed node
306
+ * @notice Create a new stake at latest confirmed assertion
327
307
  * @param stakerAddress Address of the new staker
328
308
  * @param depositAmount Stake amount of the new staker
329
309
  */
330
- function createNewStake(address stakerAddress, uint256 depositAmount) internal {
310
+ function createNewStake(
311
+ address stakerAddress,
312
+ uint256 depositAmount,
313
+ address _withdrawalAddress
314
+ ) internal {
331
315
  uint64 stakerIndex = uint64(_stakerList.length);
332
316
  _stakerList.push(stakerAddress);
333
- _stakerMap[stakerAddress] = Staker(
334
- depositAmount,
335
- stakerIndex,
336
- _latestConfirmed,
337
- NO_CHAL_INDEX, // new staker is not in challenge
338
- true
339
- );
340
- _nodeStakers[_latestConfirmed][stakerAddress] = true;
341
- _lastStakeBlock = uint64(block.number);
342
- emit UserStakeUpdated(stakerAddress, 0, depositAmount);
343
- }
344
-
345
- /**
346
- * @notice Check to see whether the two stakers are in the same challenge
347
- * @param stakerAddress1 Address of the first staker
348
- * @param stakerAddress2 Address of the second staker
349
- * @return Address of the challenge that the two stakers are in
350
- */
351
- function inChallenge(address stakerAddress1, address stakerAddress2)
352
- internal
353
- view
354
- returns (uint64)
355
- {
356
- Staker storage staker1 = _stakerMap[stakerAddress1];
357
- Staker storage staker2 = _stakerMap[stakerAddress2];
358
- uint64 challenge = staker1.currentChallenge;
359
- require(challenge != NO_CHAL_INDEX, "NO_CHAL");
360
- require(challenge == staker2.currentChallenge, "DIFF_IN_CHAL");
361
- return challenge;
362
- }
363
-
364
- /**
365
- * @notice Make the given staker as not being in a challenge
366
- * @param stakerAddress Address of the staker to remove from a challenge
367
- */
368
- function clearChallenge(address stakerAddress) internal {
369
- Staker storage staker = _stakerMap[stakerAddress];
370
- staker.currentChallenge = NO_CHAL_INDEX;
371
- }
372
-
373
- /**
374
- * @notice Mark both the given stakers as engaged in the challenge
375
- * @param staker1 Address of the first staker
376
- * @param staker2 Address of the second staker
377
- * @param challenge Address of the challenge both stakers are now in
378
- */
379
- function challengeStarted(
380
- address staker1,
381
- address staker2,
382
- uint64 challenge
383
- ) internal {
384
- _stakerMap[staker1].currentChallenge = challenge;
385
- _stakerMap[staker2].currentChallenge = challenge;
317
+ _stakerMap[stakerAddress] =
318
+ Staker(depositAmount, _latestConfirmed, stakerIndex, true, _withdrawalAddress);
319
+ emit UserStakeUpdated(stakerAddress, _withdrawalAddress, 0, depositAmount);
386
320
  }
387
321
 
388
322
  /**
@@ -395,7 +329,7 @@ abstract contract RollupCore is IRollupCore, PausableUpgradeable {
395
329
  uint256 initialStaked = staker.amountStaked;
396
330
  uint256 finalStaked = initialStaked + amountAdded;
397
331
  staker.amountStaked = finalStaked;
398
- emit UserStakeUpdated(stakerAddress, initialStaked, finalStaked);
332
+ emit UserStakeUpdated(stakerAddress, staker.withdrawalAddress, initialStaked, finalStaked);
399
333
  }
400
334
 
401
335
  /**
@@ -406,109 +340,30 @@ abstract contract RollupCore is IRollupCore, PausableUpgradeable {
406
340
  */
407
341
  function reduceStakeTo(address stakerAddress, uint256 target) internal returns (uint256) {
408
342
  Staker storage staker = _stakerMap[stakerAddress];
343
+ address _withdrawalAddress = staker.withdrawalAddress;
409
344
  uint256 current = staker.amountStaked;
410
345
  require(target <= current, "TOO_LITTLE_STAKE");
411
346
  uint256 amountWithdrawn = current - target;
412
347
  staker.amountStaked = target;
413
- increaseWithdrawableFunds(stakerAddress, amountWithdrawn);
414
- emit UserStakeUpdated(stakerAddress, current, target);
348
+ increaseWithdrawableFunds(_withdrawalAddress, amountWithdrawn);
349
+ emit UserStakeUpdated(stakerAddress, _withdrawalAddress, current, target);
415
350
  return amountWithdrawn;
416
351
  }
417
352
 
418
- /**
419
- * @notice Remove the given staker and turn them into a zombie
420
- * @param stakerAddress Address of the staker to remove
421
- */
422
- function turnIntoZombie(address stakerAddress) internal {
423
- Staker storage staker = _stakerMap[stakerAddress];
424
- _zombies.push(Zombie(stakerAddress, staker.latestStakedNode));
425
- deleteStaker(stakerAddress);
426
- }
427
-
428
- /**
429
- * @notice Update the latest staked node of the zombie at the given index
430
- * @param zombieNum Index of the zombie to move
431
- * @param latest New latest node the zombie is staked on
432
- */
433
- function zombieUpdateLatestStakedNode(uint256 zombieNum, uint64 latest) internal {
434
- _zombies[zombieNum].latestStakedNode = latest;
435
- }
436
-
437
- /**
438
- * @notice Remove the zombie at the given index
439
- * @param zombieNum Index of the zombie to remove
440
- */
441
- function removeZombie(uint256 zombieNum) internal {
442
- _zombies[zombieNum] = _zombies[_zombies.length - 1];
443
- _zombies.pop();
444
- }
445
-
446
- /**
447
- * @notice Mark the given staker as staked on this node
448
- * @param staker Address of the staker to mark
449
- */
450
- function addStaker(uint64 nodeNum, address staker) internal {
451
- require(!_nodeStakers[nodeNum][staker], "ALREADY_STAKED");
452
- _nodeStakers[nodeNum][staker] = true;
453
- Node storage node = getNodeStorage(nodeNum);
454
- require(node.deadlineBlock != 0, "NO_NODE");
455
-
456
- uint64 prevCount = node.stakerCount;
457
- node.stakerCount = prevCount + 1;
458
-
459
- if (nodeNum > GENESIS_NODE) {
460
- Node storage parent = getNodeStorage(node.prevNum);
461
- parent.childStakerCount++;
462
- if (prevCount == 0) {
463
- parent.newChildConfirmDeadline(uint64(block.number) + confirmPeriodBlocks);
464
- }
465
- }
466
- }
467
-
468
- /**
469
- * @notice Remove the given staker from this node
470
- * @param staker Address of the staker to remove
471
- */
472
- function removeStaker(uint64 nodeNum, address staker) internal {
473
- require(_nodeStakers[nodeNum][staker], "NOT_STAKED");
474
- _nodeStakers[nodeNum][staker] = false;
475
-
476
- Node storage node = getNodeStorage(nodeNum);
477
- node.stakerCount--;
478
-
479
- if (nodeNum > GENESIS_NODE) {
480
- getNodeStorage(node.prevNum).childStakerCount--;
481
- }
482
- }
483
-
484
353
  /**
485
354
  * @notice Remove the given staker and return their stake
486
- * This should not be called if the staker is staked on a descendent of the latest confirmed node
355
+ * This should only be called when the staker is inactive
487
356
  * @param stakerAddress Address of the staker withdrawing their stake
488
357
  */
489
- function withdrawStaker(address stakerAddress) internal {
358
+ function withdrawStaker(
359
+ address stakerAddress
360
+ ) internal {
490
361
  Staker storage staker = _stakerMap[stakerAddress];
491
- uint64 latestConfirmedNum = latestConfirmed();
492
- if (nodeHasStaker(latestConfirmedNum, stakerAddress)) {
493
- // Withdrawing a staker whose latest staked node isn't resolved should be impossible
494
- assert(staker.latestStakedNode == latestConfirmedNum);
495
- removeStaker(latestConfirmedNum, stakerAddress);
496
- }
362
+ address _withdrawalAddress = staker.withdrawalAddress;
497
363
  uint256 initialStaked = staker.amountStaked;
498
- increaseWithdrawableFunds(stakerAddress, initialStaked);
364
+ increaseWithdrawableFunds(_withdrawalAddress, initialStaked);
499
365
  deleteStaker(stakerAddress);
500
- emit UserStakeUpdated(stakerAddress, initialStaked, 0);
501
- }
502
-
503
- /**
504
- * @notice Advance the given staker to the given node
505
- * @param stakerAddress Address of the staker adding their stake
506
- * @param nodeNum Index of the node to stake on
507
- */
508
- function stakeOnNode(address stakerAddress, uint64 nodeNum) internal {
509
- Staker storage staker = _stakerMap[stakerAddress];
510
- addStaker(nodeNum, stakerAddress);
511
- staker.latestStakedNode = nodeNum;
366
+ emit UserStakeUpdated(stakerAddress, _withdrawalAddress, initialStaked, 0);
512
367
  }
513
368
 
514
369
  /**
@@ -516,7 +371,9 @@ abstract contract RollupCore is IRollupCore, PausableUpgradeable {
516
371
  * @param account Address of the account to remove funds from
517
372
  * @return Amount of funds removed from account
518
373
  */
519
- function withdrawFunds(address account) internal returns (uint256) {
374
+ function withdrawFunds(
375
+ address account
376
+ ) internal returns (uint256) {
520
377
  uint256 amount = _withdrawableFunds[account];
521
378
  _withdrawableFunds[account] = 0;
522
379
  totalWithdrawableFunds -= amount;
@@ -540,7 +397,9 @@ abstract contract RollupCore is IRollupCore, PausableUpgradeable {
540
397
  * @notice Remove the given staker
541
398
  * @param stakerAddress Address of the staker to remove
542
399
  */
543
- function deleteStaker(address stakerAddress) private {
400
+ function deleteStaker(
401
+ address stakerAddress
402
+ ) private {
544
403
  Staker storage staker = _stakerMap[stakerAddress];
545
404
  require(staker.isStaked, "NOT_STAKED");
546
405
  uint64 stakerIndex = staker.index;
@@ -550,130 +409,250 @@ abstract contract RollupCore is IRollupCore, PausableUpgradeable {
550
409
  delete _stakerMap[stakerAddress];
551
410
  }
552
411
 
553
- struct StakeOnNewNodeFrame {
554
- uint256 currentInboxSize;
555
- Node node;
556
- bytes32 executionHash;
557
- Node prevNode;
558
- bytes32 lastHash;
559
- bool hasSibling;
560
- uint64 deadlineBlock;
561
- bytes32 sequencerBatchAcc;
562
- }
412
+ function createNewAssertion(
413
+ AssertionInputs calldata assertion,
414
+ bytes32 prevAssertionHash,
415
+ bytes32 expectedAssertionHash
416
+ ) internal returns (bytes32 newAssertionHash, bool overflowAssertion) {
417
+ // Validate the config hash
418
+ RollupLib.validateConfigHash(
419
+ assertion.beforeStateData.configData, getAssertionStorage(prevAssertionHash).configHash
420
+ );
563
421
 
564
- function createNewNode(
565
- Assertion calldata assertion,
566
- uint64 prevNodeNum,
567
- uint256 prevNodeInboxMaxCount,
568
- bytes32 expectedNodeHash
569
- ) internal returns (bytes32 newNodeHash) {
422
+ // reading inbox messages always terminates in either a finished or errored state
423
+ // although the challenge protocol that any invalid terminal state will be proven incorrect
424
+ // we can do a quick sanity check here
570
425
  require(
571
- assertion.afterState.machineStatus == MachineStatus.FINISHED ||
572
- assertion.afterState.machineStatus == MachineStatus.ERRORED,
426
+ assertion.afterState.machineStatus == MachineStatus.FINISHED
427
+ || assertion.afterState.machineStatus == MachineStatus.ERRORED,
573
428
  "BAD_AFTER_STATUS"
574
429
  );
575
430
 
576
- StakeOnNewNodeFrame memory memoryFrame;
577
- {
578
- // validate data
579
- memoryFrame.prevNode = getNode(prevNodeNum);
580
- memoryFrame.currentInboxSize = bridge.sequencerMessageCount();
431
+ // validate the provided before state is correct by checking that it's part of the prev assertion hash
432
+ require(
433
+ RollupLib.assertionHash(
434
+ assertion.beforeStateData.prevPrevAssertionHash,
435
+ assertion.beforeState,
436
+ assertion.beforeStateData.sequencerBatchAcc
437
+ ) == prevAssertionHash,
438
+ "INVALID_BEFORE_STATE"
439
+ );
581
440
 
582
- // Make sure the previous state is correct against the node being built on
583
- require(
584
- RollupLib.stateHash(assertion.beforeState, prevNodeInboxMaxCount) ==
585
- memoryFrame.prevNode.stateHash,
586
- "PREV_STATE_HASH"
441
+ // The rollup cannot advance from an errored state
442
+ // If it reaches an errored state it must be corrected by an administrator
443
+ // This will involve updating the wasm root and creating an alternative assertion
444
+ // that consumes the correct number of inbox messages, and correctly transitions to the
445
+ // FINISHED state so that normal progress can continue
446
+ require(assertion.beforeState.machineStatus == MachineStatus.FINISHED, "BAD_PREV_STATUS");
447
+
448
+ AssertionNode storage prevAssertion = getAssertionStorage(prevAssertionHash);
449
+ // Required inbox position through which the next assertion (the one after this new assertion) must consume
450
+ uint256 nextInboxPosition;
451
+ bytes32 sequencerBatchAcc;
452
+ {
453
+ // This new assertion consumes the messages from prevInboxPosition to afterInboxPosition
454
+ GlobalState calldata afterGS = assertion.afterState.globalState;
455
+ GlobalState calldata beforeGS = assertion.beforeState.globalState;
456
+
457
+ // there are 3 kinds of assertions that can be made. Assertions must be made when they fill the maximum number
458
+ // of blocks, or when they process all messages up to prev.nextInboxPosition. When they fill the max
459
+ // blocks, but dont manage to process all messages, we call this an "overflow" assertion.
460
+ // 1. ERRORED assertion
461
+ // The machine finished in an ERRORED state. This can happen with processing any
462
+ // messages, or moving the position in the message.
463
+ // 2. FINISHED assertion that did not overflow
464
+ // The machine finished as normal, and fully processed all the messages up to prev.nextInboxPosition.
465
+ // In this case the inbox position must equal prev.nextInboxPosition and position in message must be 0
466
+ // 3. FINISHED assertion that did overflow
467
+ // The machine finished as normal, but didn't process all messages in the inbox.
468
+ // The inbox can be anywhere between the previous assertion's position and the nextInboxPosition, exclusive.
469
+
470
+ // All types of assertion must have inbox position in the range prev.inboxPosition <= x <= prev.nextInboxPosition
471
+ require(afterGS.comparePositions(beforeGS) >= 0, "INBOX_BACKWARDS");
472
+ int256 afterStateCmpMaxInbox = afterGS.comparePositionsAgainstStartOfBatch(
473
+ assertion.beforeStateData.configData.nextInboxPosition
587
474
  );
475
+ require(afterStateCmpMaxInbox <= 0, "INBOX_TOO_FAR");
588
476
 
589
- // Ensure that the assertion doesn't read past the end of the current inbox
590
- uint64 afterInboxCount = assertion.afterState.globalState.getInboxPosition();
591
- uint64 prevInboxPosition = assertion.beforeState.globalState.getInboxPosition();
592
- require(afterInboxCount >= prevInboxPosition, "INBOX_BACKWARDS");
593
- if (afterInboxCount == prevInboxPosition) {
594
- require(
595
- assertion.afterState.globalState.getPositionInMessage() >=
596
- assertion.beforeState.globalState.getPositionInMessage(),
597
- "INBOX_POS_IN_MSG_BACKWARDS"
598
- );
599
- }
600
- // See validator/assertion.go ExecutionState RequiredBatches() for reasoning
601
477
  if (
602
- assertion.afterState.machineStatus == MachineStatus.ERRORED ||
603
- assertion.afterState.globalState.getPositionInMessage() > 0
478
+ assertion.afterState.machineStatus != MachineStatus.ERRORED
479
+ && afterStateCmpMaxInbox < 0
604
480
  ) {
605
- // The current inbox message was read
606
- afterInboxCount++;
607
- }
608
- require(afterInboxCount <= memoryFrame.currentInboxSize, "INBOX_PAST_END");
609
- // This gives replay protection against the state of the inbox
610
- if (afterInboxCount > 0) {
611
- memoryFrame.sequencerBatchAcc = bridge.sequencerInboxAccs(afterInboxCount - 1);
481
+ // If we didn't reach the target next inbox position, this is an overflow assertion.
482
+ overflowAssertion = true;
483
+ // This shouldn't be necessary, but might as well constrain the assertion to be non-empty
484
+ require(afterGS.comparePositions(beforeGS) > 0, "OVERFLOW_STANDSTILL");
612
485
  }
613
- }
614
-
615
- {
616
- memoryFrame.executionHash = RollupLib.executionHash(assertion);
486
+ // Inbox position at the time of this assertion being created
487
+ uint256 currentInboxPosition = bridge.sequencerMessageCount();
488
+ // Cannot read more messages than currently exist in the inbox
489
+ require(
490
+ afterGS.comparePositionsAgainstStartOfBatch(currentInboxPosition) <= 0,
491
+ "INBOX_PAST_END"
492
+ );
617
493
 
618
- memoryFrame.deadlineBlock = uint64(block.number) + confirmPeriodBlocks;
494
+ // under normal circumstances prev.nextInboxPosition is guaranteed to exist
495
+ // because we populate it from bridge.sequencerMessageCount(). However, when
496
+ // the inbox message count doesnt change we artificially increase it by 1 as explained below
497
+ // in this case we need to ensure when the assertion is made the inbox messages are available
498
+ // to ensure that a valid assertion can actually be made.
499
+ require(
500
+ assertion.beforeStateData.configData.nextInboxPosition <= currentInboxPosition,
501
+ "INBOX_NOT_POPULATED"
502
+ );
619
503
 
620
- memoryFrame.hasSibling = memoryFrame.prevNode.latestChildNumber > 0;
621
- // here we don't use ternacy operator to remain compatible with slither
622
- if (memoryFrame.hasSibling) {
623
- memoryFrame.lastHash = getNodeStorage(memoryFrame.prevNode.latestChildNumber)
624
- .nodeHash;
504
+ // The next assertion must consume all the messages that are currently found in the inbox
505
+ uint256 afterInboxPosition = afterGS.getInboxPosition();
506
+ if (afterInboxPosition == currentInboxPosition) {
507
+ // No new messages have been added to the inbox since the last assertion
508
+ // In this case if we set the next inbox position to the current one we would be insisting that
509
+ // the next assertion process no messages. So instead we increment the next inbox position to current
510
+ // plus one, so that the next assertion will process exactly one message.
511
+ // Thus, no assertion can be empty (except the genesis assertion, which is created
512
+ // via a different codepath).
513
+ nextInboxPosition = currentInboxPosition + 1;
625
514
  } else {
626
- memoryFrame.lastHash = memoryFrame.prevNode.nodeHash;
515
+ nextInboxPosition = currentInboxPosition;
627
516
  }
628
517
 
629
- newNodeHash = RollupLib.nodeHash(
630
- memoryFrame.hasSibling,
631
- memoryFrame.lastHash,
632
- memoryFrame.executionHash,
633
- memoryFrame.sequencerBatchAcc,
634
- wasmModuleRoot
635
- );
636
- require(
637
- newNodeHash == expectedNodeHash || expectedNodeHash == bytes32(0),
638
- "UNEXPECTED_NODE_HASH"
639
- );
518
+ // only the genesis assertion processes no messages, and that assertion is created
519
+ // when we initialize this contract. Therefore, all assertions created here should have a non
520
+ // zero inbox position.
521
+ require(afterInboxPosition != 0, "EMPTY_INBOX_COUNT");
640
522
 
641
- memoryFrame.node = NodeLib.createNode(
642
- RollupLib.stateHash(assertion.afterState, memoryFrame.currentInboxSize),
643
- RollupLib.challengeRootHash(
644
- memoryFrame.executionHash,
645
- block.number,
646
- wasmModuleRoot
647
- ),
648
- RollupLib.confirmHash(assertion),
649
- prevNodeNum,
650
- memoryFrame.deadlineBlock,
651
- newNodeHash
652
- );
523
+ // Fetch the inbox accumulator for this message count. Fetching this and checking against it
524
+ // allows the assertion creator to ensure they're creating an assertion against the expected
525
+ // inbox messages
526
+ sequencerBatchAcc = bridge.sequencerInboxAccs(afterInboxPosition - 1);
653
527
  }
654
528
 
655
- {
656
- uint64 nodeNum = latestNodeCreated() + 1;
529
+ newAssertionHash =
530
+ RollupLib.assertionHash(prevAssertionHash, assertion.afterState, sequencerBatchAcc);
531
+
532
+ // allow an assertion creator to ensure that they're creating their assertion against the expected state
533
+ require(
534
+ newAssertionHash == expectedAssertionHash || expectedAssertionHash == bytes32(0),
535
+ "UNEXPECTED_ASSERTION_HASH"
536
+ );
657
537
 
658
- // Fetch a storage reference to prevNode since we copied our other one into memory
659
- // and we don't have enough stack available to keep to keep the previous storage reference around
660
- Node storage prevNode = getNodeStorage(prevNodeNum);
661
- prevNode.childCreated(nodeNum);
538
+ // the assertion hash is unique - it's only possible to have one correct assertion hash
539
+ // per assertion. Therefore we can check if this assertion has already been made, and if so
540
+ // we can revert
541
+ require(
542
+ getAssertionStorage(newAssertionHash).status == AssertionStatus.NoAssertion,
543
+ "ASSERTION_SEEN"
544
+ );
662
545
 
663
- nodeCreated(memoryFrame.node);
664
- }
546
+ // state updates
547
+ AssertionNode memory newAssertion = AssertionNodeLib.createAssertion(
548
+ prevAssertion.firstChildBlock == 0, // assumes block 0 is impossible
549
+ RollupLib.configHash({
550
+ wasmModuleRoot: wasmModuleRoot,
551
+ requiredStake: baseStake,
552
+ challengeManager: address(challengeManager),
553
+ confirmPeriodBlocks: confirmPeriodBlocks,
554
+ nextInboxPosition: uint64(nextInboxPosition)
555
+ })
556
+ );
665
557
 
666
- emit NodeCreated(
667
- latestNodeCreated(),
668
- memoryFrame.prevNode.nodeHash,
669
- newNodeHash,
670
- memoryFrame.executionHash,
558
+ // Fetch a storage reference to prevAssertion since we copied our other one into memory
559
+ // and we don't have enough stack available to keep to keep the previous storage reference around
560
+ prevAssertion.childCreated();
561
+ _assertions[newAssertionHash] = newAssertion;
562
+
563
+ emit AssertionCreated(
564
+ newAssertionHash,
565
+ prevAssertionHash,
671
566
  assertion,
672
- memoryFrame.sequencerBatchAcc,
567
+ sequencerBatchAcc,
568
+ nextInboxPosition,
673
569
  wasmModuleRoot,
674
- memoryFrame.currentInboxSize
570
+ baseStake,
571
+ address(challengeManager),
572
+ confirmPeriodBlocks
675
573
  );
574
+ if (_hostChainIsArbitrum) {
575
+ _assertionCreatedAtArbSysBlock[newAssertionHash] = ArbSys(address(100)).arbBlockNumber();
576
+ }
577
+ }
676
578
 
677
- return newNodeHash;
579
+ function genesisAssertionHash() external pure returns (bytes32) {
580
+ GlobalState memory emptyGlobalState;
581
+ AssertionState memory emptyAssertionState =
582
+ AssertionState(emptyGlobalState, MachineStatus.FINISHED, bytes32(0));
583
+ bytes32 parentAssertionHash = bytes32(0);
584
+ bytes32 inboxAcc = bytes32(0);
585
+ return RollupLib.assertionHash({
586
+ parentAssertionHash: parentAssertionHash,
587
+ afterState: emptyAssertionState,
588
+ inboxAcc: inboxAcc
589
+ });
590
+ }
591
+
592
+ function getFirstChildCreationBlock(
593
+ bytes32 assertionHash
594
+ ) external view returns (uint64) {
595
+ return getAssertionStorage(assertionHash).firstChildBlock;
596
+ }
597
+
598
+ function getSecondChildCreationBlock(
599
+ bytes32 assertionHash
600
+ ) external view returns (uint64) {
601
+ return getAssertionStorage(assertionHash).secondChildBlock;
602
+ }
603
+
604
+ function validateAssertionHash(
605
+ bytes32 assertionHash,
606
+ AssertionState calldata state,
607
+ bytes32 prevAssertionHash,
608
+ bytes32 inboxAcc
609
+ ) external pure {
610
+ require(
611
+ assertionHash == RollupLib.assertionHash(prevAssertionHash, state, inboxAcc),
612
+ "INVALID_ASSERTION_HASH"
613
+ );
614
+ }
615
+
616
+ function validateConfig(bytes32 assertionHash, ConfigData calldata configData) external view {
617
+ RollupLib.validateConfigHash(configData, getAssertionStorage(assertionHash).configHash);
618
+ }
619
+
620
+ function isFirstChild(
621
+ bytes32 assertionHash
622
+ ) external view returns (bool) {
623
+ return getAssertionStorage(assertionHash).isFirstChild;
624
+ }
625
+
626
+ function isPending(
627
+ bytes32 assertionHash
628
+ ) external view returns (bool) {
629
+ return getAssertionStorage(assertionHash).status == AssertionStatus.Pending;
630
+ }
631
+
632
+ function getValidators() external view returns (address[] memory) {
633
+ return validators.values();
634
+ }
635
+
636
+ function isValidator(
637
+ address validator
638
+ ) external view returns (bool) {
639
+ return validators.contains(validator);
640
+ }
641
+
642
+ /**
643
+ * @notice Verify that the given staker is not active
644
+ * @param stakerAddress Address to check
645
+ */
646
+ function requireInactiveStaker(
647
+ address stakerAddress
648
+ ) internal view {
649
+ require(isStaked(stakerAddress), "NOT_STAKED");
650
+ // A staker is inactive if
651
+ // a) their last staked assertion is the latest confirmed assertion
652
+ // b) their last staked assertion have a child
653
+ bytes32 lastestAssertion = latestStakedAssertion(stakerAddress);
654
+ bool isLatestConfirmed = lastestAssertion == latestConfirmed();
655
+ bool haveChild = getAssertionStorage(lastestAssertion).firstChildBlock > 0;
656
+ require(isLatestConfirmed || haveChild, "STAKE_ACTIVE");
678
657
  }
679
658
  }