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

Sign up to get free protection for your applications and to get access to all the features.
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 -494
  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 -530
  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 +16 -6
  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 -12
  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 +36 -69
  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 -642
  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 -1327
  487. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserERC20.dbg.json +0 -4
  488. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserERC20.json +0 -1461
  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 -1609
  492. package/build/contracts/src/rollup/RollupUserLogic.sol/ERC20RollupUserLogic.dbg.json +0 -4
  493. package/build/contracts/src/rollup/RollupUserLogic.sol/ERC20RollupUserLogic.json +0 -1743
  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
  }