@arbitrum/nitro-contracts 2.1.1-beta.0 → 3.0.0-alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (541) 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/{src/express-lane-auction/ELCRound.sol/LatestELCRoundsLib.json → @openzeppelin/contracts/utils/Create2.sol/Create2.json} +4 -4
  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 +1 -1
  56. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol/EnumerableSetUpgradeable.json +2 -2
  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/{@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol/IERC20MetadataUpgradeable.json → src/assertionStakingPool/interfaces/IEdgeStakingPool.sol/IEdgeStakingPool.json} +109 -110
  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 +14 -1
  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 +16 -3
  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/IEthBridge.sol/IEthBridge.dbg.json +1 -1
  101. package/build/contracts/src/bridge/IInbox.sol/IInbox.dbg.json +1 -1
  102. package/build/contracts/src/bridge/IInboxBase.sol/IInboxBase.dbg.json +1 -1
  103. package/build/contracts/src/bridge/IOutbox.sol/IOutbox.dbg.json +1 -1
  104. package/build/contracts/src/bridge/IOwnable.sol/IOwnable.dbg.json +1 -1
  105. package/build/contracts/src/bridge/ISequencerInbox.sol/ISequencerInbox.dbg.json +1 -1
  106. package/build/contracts/src/bridge/ISequencerInbox.sol/ISequencerInbox.json +441 -0
  107. package/build/contracts/src/bridge/Inbox.sol/Inbox.dbg.json +1 -1
  108. package/build/contracts/src/bridge/Inbox.sol/Inbox.json +20 -2
  109. package/build/contracts/src/bridge/Messages.sol/Messages.dbg.json +1 -1
  110. package/build/contracts/src/bridge/Messages.sol/Messages.json +2 -2
  111. package/build/contracts/src/bridge/Outbox.sol/Outbox.dbg.json +1 -1
  112. package/build/contracts/src/bridge/Outbox.sol/Outbox.json +2 -2
  113. package/build/contracts/src/bridge/SequencerInbox.sol/SequencerInbox.dbg.json +1 -1
  114. package/build/contracts/src/bridge/SequencerInbox.sol/SequencerInbox.json +566 -9
  115. package/build/contracts/src/chain/CacheManager.sol/CacheManager.dbg.json +1 -1
  116. package/build/contracts/src/chain/CacheManager.sol/CacheManager.json +15 -2
  117. package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/EdgeChallengeManager.dbg.json +4 -0
  118. package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/EdgeChallengeManager.json +1631 -0
  119. package/build/contracts/src/challengeV2/IAssertionChain.sol/IAssertionChain.dbg.json +4 -0
  120. package/build/contracts/src/challengeV2/IAssertionChain.sol/IAssertionChain.json +247 -0
  121. package/build/contracts/src/challengeV2/IEdgeChallengeManager.sol/IEdgeChallengeManager.dbg.json +4 -0
  122. package/build/contracts/src/challengeV2/IEdgeChallengeManager.sol/IEdgeChallengeManager.json +762 -0
  123. package/build/contracts/src/challengeV2/libraries/ArrayUtilsLib.sol/ArrayUtilsLib.dbg.json +4 -0
  124. package/build/contracts/src/challengeV2/libraries/ArrayUtilsLib.sol/ArrayUtilsLib.json +10 -0
  125. package/build/contracts/src/challengeV2/libraries/ChallengeEdgeLib.sol/ChallengeEdgeLib.dbg.json +4 -0
  126. package/build/contracts/{@openzeppelin/contracts/utils/cryptography/ECDSA.sol/ECDSA.json → src/challengeV2/libraries/ChallengeEdgeLib.sol/ChallengeEdgeLib.json} +4 -4
  127. package/build/contracts/src/challengeV2/libraries/EdgeChallengeManagerLib.sol/EdgeChallengeManagerLib.dbg.json +4 -0
  128. package/build/contracts/src/challengeV2/libraries/EdgeChallengeManagerLib.sol/EdgeChallengeManagerLib.json +24 -0
  129. package/build/contracts/src/challengeV2/libraries/MerkleTreeAccumulatorLib.sol/MerkleTreeAccumulatorLib.dbg.json +4 -0
  130. package/build/contracts/src/challengeV2/libraries/MerkleTreeAccumulatorLib.sol/MerkleTreeAccumulatorLib.json +24 -0
  131. package/build/contracts/src/challengeV2/libraries/UintUtilsLib.sol/UintUtilsLib.dbg.json +4 -0
  132. package/build/contracts/src/challengeV2/libraries/UintUtilsLib.sol/UintUtilsLib.json +10 -0
  133. package/build/contracts/src/libraries/AddressAliasHelper.sol/AddressAliasHelper.dbg.json +1 -1
  134. package/build/contracts/src/libraries/AddressAliasHelper.sol/AddressAliasHelper.json +2 -2
  135. package/build/contracts/src/libraries/AdminFallbackProxy.sol/AdminFallbackProxy.dbg.json +1 -1
  136. package/build/contracts/src/libraries/AdminFallbackProxy.sol/AdminFallbackProxy.json +2 -2
  137. package/build/contracts/src/libraries/AdminFallbackProxy.sol/DoubleLogicERC1967Upgrade.dbg.json +1 -1
  138. package/build/contracts/src/libraries/ArbitrumChecker.sol/ArbitrumChecker.dbg.json +1 -1
  139. package/build/contracts/src/libraries/ArbitrumChecker.sol/ArbitrumChecker.json +2 -2
  140. package/build/contracts/src/libraries/CallerChecker.sol/CallerChecker.dbg.json +4 -0
  141. package/build/contracts/src/{challenge/ChallengeLib.sol/ChallengeLib.json → libraries/CallerChecker.sol/CallerChecker.json} +4 -4
  142. package/build/contracts/src/libraries/CryptographyPrimitives.sol/CryptographyPrimitives.dbg.json +1 -1
  143. package/build/contracts/src/libraries/CryptographyPrimitives.sol/CryptographyPrimitives.json +2 -2
  144. package/build/contracts/src/libraries/DecimalsConverterHelper.sol/DecimalsConverterHelper.dbg.json +1 -1
  145. package/build/contracts/src/libraries/DecimalsConverterHelper.sol/DecimalsConverterHelper.json +2 -2
  146. package/build/contracts/src/libraries/DelegateCallAware.sol/DelegateCallAware.dbg.json +1 -1
  147. package/build/contracts/src/libraries/DoubleLogicUUPSUpgradeable.sol/DoubleLogicUUPSUpgradeable.dbg.json +1 -1
  148. package/build/contracts/src/libraries/GasRefundEnabled.sol/GasRefundEnabled.dbg.json +1 -1
  149. package/build/contracts/src/libraries/IGasRefunder.sol/IGasRefunder.dbg.json +1 -1
  150. package/build/contracts/src/libraries/IReader4844.sol/IReader4844.dbg.json +1 -1
  151. package/build/contracts/src/libraries/MerkleLib.sol/MerkleLib.dbg.json +1 -1
  152. package/build/contracts/src/libraries/MerkleLib.sol/MerkleLib.json +2 -2
  153. package/build/contracts/src/libraries/UUPSNotUpgradeable.sol/UUPSNotUpgradeable.dbg.json +1 -1
  154. package/build/contracts/src/mocks/Benchmarks.sol/Benchmarks.dbg.json +1 -1
  155. package/build/contracts/src/mocks/Benchmarks.sol/Benchmarks.json +2 -2
  156. package/build/contracts/src/mocks/BridgeStub.sol/BridgeStub.dbg.json +1 -1
  157. package/build/contracts/src/mocks/BridgeStub.sol/BridgeStub.json +8 -8
  158. package/build/contracts/src/mocks/BridgeUnproxied.sol/BridgeUnproxied.dbg.json +1 -1
  159. package/build/contracts/src/mocks/BridgeUnproxied.sol/BridgeUnproxied.json +15 -2
  160. package/build/contracts/src/mocks/CreateTest.sol/CreateTest.dbg.json +1 -1
  161. package/build/contracts/src/mocks/CreateTest.sol/CreateTest.json +2 -2
  162. package/build/contracts/src/mocks/HostioTest.sol/HostioTest.dbg.json +1 -1
  163. package/build/contracts/src/mocks/HostioTest.sol/HostioTest.json +2 -2
  164. package/build/contracts/src/mocks/InboxStub.sol/InboxStub.dbg.json +1 -1
  165. package/build/contracts/src/mocks/InboxStub.sol/InboxStub.json +2 -2
  166. package/build/contracts/src/mocks/MerkleTreeAccess.sol/MerkleTreeAccess.dbg.json +4 -0
  167. package/build/contracts/src/mocks/MerkleTreeAccess.sol/MerkleTreeAccess.json +227 -0
  168. package/build/contracts/src/mocks/MockRollupEventInbox.sol/MockRollupEventInbox.dbg.json +4 -0
  169. package/build/contracts/src/mocks/MockRollupEventInbox.sol/MockRollupEventInbox.json +133 -0
  170. package/build/contracts/src/mocks/MultiCallTest.sol/MultiCallTest.dbg.json +1 -1
  171. package/build/contracts/src/mocks/MultiCallTest.sol/MultiCallTest.json +2 -2
  172. package/build/contracts/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol/PendingBlkTimeAndNrAdvanceCheck.dbg.json +1 -1
  173. package/build/contracts/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol/PendingBlkTimeAndNrAdvanceCheck.json +2 -2
  174. package/build/contracts/src/mocks/Program.sol/ProgramTest.dbg.json +1 -1
  175. package/build/contracts/src/mocks/Program.sol/ProgramTest.json +2 -2
  176. package/build/contracts/src/mocks/ProxyAdminForBinding.sol/ProxyAdminForBinding.dbg.json +1 -1
  177. package/build/contracts/src/mocks/ProxyAdminForBinding.sol/ProxyAdminForBinding.json +2 -2
  178. package/build/contracts/src/mocks/SdkStorage.sol/SdkStorage.dbg.json +1 -1
  179. package/build/contracts/src/mocks/SdkStorage.sol/SdkStorage.json +2 -2
  180. package/build/contracts/src/mocks/SequencerInboxBlobMock.sol/SequencerInboxBlobMock.dbg.json +4 -0
  181. package/build/contracts/src/mocks/SequencerInboxBlobMock.sol/SequencerInboxBlobMock.json +1632 -0
  182. package/build/contracts/src/mocks/SequencerInboxStub.sol/SequencerInboxStub.dbg.json +1 -1
  183. package/build/contracts/src/mocks/SequencerInboxStub.sol/SequencerInboxStub.json +566 -9
  184. package/build/contracts/src/mocks/Simple.sol/Simple.dbg.json +1 -1
  185. package/build/contracts/src/mocks/Simple.sol/Simple.json +2 -2
  186. package/build/contracts/src/mocks/SimpleCacheManager.sol/SimpleCacheManager.dbg.json +1 -1
  187. package/build/contracts/src/mocks/SimpleCacheManager.sol/SimpleCacheManager.json +2 -2
  188. package/build/contracts/src/mocks/SimpleOneStepProofEntry.sol/SimpleOneStepProofEntry.dbg.json +4 -0
  189. package/build/contracts/src/mocks/SimpleOneStepProofEntry.sol/SimpleOneStepProofEntry.json +142 -0
  190. package/build/contracts/src/mocks/SimpleProxy.sol/SimpleProxy.dbg.json +1 -1
  191. package/build/contracts/src/mocks/SimpleProxy.sol/SimpleProxy.json +2 -2
  192. package/build/contracts/src/mocks/TestWETH9.sol/IWETH9.dbg.json +4 -0
  193. package/build/contracts/src/mocks/TestWETH9.sol/IWETH9.json +31 -0
  194. package/build/contracts/src/mocks/TestWETH9.sol/TestWETH9.dbg.json +4 -0
  195. package/build/contracts/src/mocks/TestWETH9.sol/TestWETH9.json +317 -0
  196. package/build/contracts/src/mocks/UpgradeExecutorMock.sol/UpgradeExecutorMock.dbg.json +1 -1
  197. package/build/contracts/src/mocks/UpgradeExecutorMock.sol/UpgradeExecutorMock.json +15 -2
  198. package/build/contracts/src/node-interface/NodeInterface.sol/NodeInterface.dbg.json +1 -1
  199. package/build/contracts/src/node-interface/NodeInterfaceDebug.sol/NodeInterfaceDebug.dbg.json +1 -1
  200. package/build/contracts/src/osp/HashProofHelper.sol/HashProofHelper.dbg.json +1 -1
  201. package/build/contracts/src/osp/HashProofHelper.sol/HashProofHelper.json +2 -2
  202. package/build/contracts/src/osp/IOneStepProofEntry.sol/IOneStepProofEntry.dbg.json +1 -1
  203. package/build/contracts/src/osp/IOneStepProofEntry.sol/IOneStepProofEntry.json +33 -9
  204. package/build/contracts/src/osp/IOneStepProofEntry.sol/OneStepProofEntryLib.dbg.json +1 -1
  205. package/build/contracts/src/osp/IOneStepProofEntry.sol/OneStepProofEntryLib.json +2 -2
  206. package/build/contracts/src/osp/IOneStepProver.sol/IOneStepProver.dbg.json +1 -1
  207. package/build/contracts/src/osp/IOneStepProver.sol/IOneStepProver.json +5 -0
  208. package/build/contracts/src/osp/OneStepProofEntry.sol/OneStepProofEntry.dbg.json +1 -1
  209. package/build/contracts/src/osp/OneStepProofEntry.sol/OneStepProofEntry.json +35 -11
  210. package/build/contracts/src/osp/OneStepProver0.sol/OneStepProver0.dbg.json +1 -1
  211. package/build/contracts/src/osp/OneStepProver0.sol/OneStepProver0.json +7 -2
  212. package/build/contracts/src/osp/OneStepProverHostIo.sol/OneStepProverHostIo.dbg.json +1 -1
  213. package/build/contracts/src/osp/OneStepProverHostIo.sol/OneStepProverHostIo.json +7 -2
  214. package/build/contracts/src/osp/OneStepProverMath.sol/OneStepProverMath.dbg.json +1 -1
  215. package/build/contracts/src/osp/OneStepProverMath.sol/OneStepProverMath.json +7 -2
  216. package/build/contracts/src/osp/OneStepProverMemory.sol/OneStepProverMemory.dbg.json +1 -1
  217. package/build/contracts/src/osp/OneStepProverMemory.sol/OneStepProverMemory.json +7 -2
  218. package/build/contracts/src/precompiles/ArbAddressTable.sol/ArbAddressTable.dbg.json +1 -1
  219. package/build/contracts/src/precompiles/ArbAggregator.sol/ArbAggregator.dbg.json +1 -1
  220. package/build/contracts/src/precompiles/ArbBLS.sol/ArbBLS.dbg.json +1 -1
  221. package/build/contracts/src/precompiles/ArbDebug.sol/ArbDebug.dbg.json +1 -1
  222. package/build/contracts/src/precompiles/ArbFunctionTable.sol/ArbFunctionTable.dbg.json +1 -1
  223. package/build/contracts/src/precompiles/ArbGasInfo.sol/ArbGasInfo.dbg.json +1 -1
  224. package/build/contracts/src/precompiles/ArbInfo.sol/ArbInfo.dbg.json +1 -1
  225. package/build/contracts/src/precompiles/ArbOwner.sol/ArbOwner.dbg.json +1 -1
  226. package/build/contracts/src/precompiles/ArbOwnerPublic.sol/ArbOwnerPublic.dbg.json +1 -1
  227. package/build/contracts/src/precompiles/ArbRetryableTx.sol/ArbRetryableTx.dbg.json +1 -1
  228. package/build/contracts/src/precompiles/ArbStatistics.sol/ArbStatistics.dbg.json +1 -1
  229. package/build/contracts/src/precompiles/ArbSys.sol/ArbSys.dbg.json +1 -1
  230. package/build/contracts/src/precompiles/ArbWasm.sol/ArbWasm.dbg.json +1 -1
  231. package/build/contracts/src/precompiles/ArbWasmCache.sol/ArbWasmCache.dbg.json +1 -1
  232. package/build/contracts/src/precompiles/ArbosActs.sol/ArbosActs.dbg.json +1 -1
  233. package/build/contracts/src/precompiles/ArbosTest.sol/ArbosTest.dbg.json +1 -1
  234. package/build/contracts/src/rollup/AbsRollupEventInbox.sol/AbsRollupEventInbox.dbg.json +1 -1
  235. package/build/contracts/src/rollup/Assertion.sol/AssertionNodeLib.dbg.json +4 -0
  236. package/build/contracts/src/rollup/{Node.sol/NodeLib.json → Assertion.sol/AssertionNodeLib.json} +4 -4
  237. package/build/contracts/src/rollup/AssertionState.sol/AssertionStateLib.dbg.json +4 -0
  238. package/build/contracts/src/{express-lane-auction/Balance.sol/BalanceLib.json → rollup/AssertionState.sol/AssertionStateLib.json} +4 -4
  239. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/BOLDUpgradeAction.dbg.json +4 -0
  240. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/BOLDUpgradeAction.json +807 -0
  241. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ConstantArrayStorage.dbg.json +4 -0
  242. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ConstantArrayStorage.json +35 -0
  243. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollup.dbg.json +4 -0
  244. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollup.json +361 -0
  245. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollupAdmin.dbg.json +4 -0
  246. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollupAdmin.json +38 -0
  247. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ISeqInboxPostUpgradeInit.dbg.json +4 -0
  248. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ISeqInboxPostUpgradeInit.json +41 -0
  249. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/RollupReader.dbg.json +4 -0
  250. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/RollupReader.json +385 -0
  251. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/StateHashPreImageLookup.dbg.json +4 -0
  252. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/StateHashPreImageLookup.json +203 -0
  253. package/build/contracts/src/rollup/BridgeCreator.sol/BridgeCreator.dbg.json +1 -1
  254. package/build/contracts/src/rollup/BridgeCreator.sol/BridgeCreator.json +62 -10
  255. package/build/contracts/src/rollup/DeployHelper.sol/DeployHelper.dbg.json +1 -1
  256. package/build/contracts/src/rollup/DeployHelper.sol/DeployHelper.json +2 -2
  257. package/build/contracts/src/rollup/ERC20RollupEventInbox.sol/ERC20RollupEventInbox.dbg.json +1 -1
  258. package/build/contracts/src/rollup/ERC20RollupEventInbox.sol/ERC20RollupEventInbox.json +2 -2
  259. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/FactoryDeployerHelper.dbg.json +1 -1
  260. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/FactoryDeployerHelper.json +2 -2
  261. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IDeployHelper.dbg.json +1 -1
  262. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IERC20.dbg.json +1 -1
  263. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IERC20Bridge.dbg.json +1 -1
  264. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IInboxBase.dbg.json +1 -1
  265. package/build/contracts/src/rollup/IRollupAdmin.sol/IRollupAdmin.dbg.json +1 -1
  266. package/build/contracts/src/rollup/IRollupAdmin.sol/IRollupAdmin.json +473 -99
  267. package/build/contracts/src/rollup/IRollupCore.sol/IRollupCore.dbg.json +1 -1
  268. package/build/contracts/src/rollup/IRollupCore.sol/IRollupCore.json +315 -221
  269. package/build/contracts/src/rollup/IRollupEventInbox.sol/IRollupEventInbox.dbg.json +1 -1
  270. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUser.dbg.json +1 -1
  271. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUser.json +678 -499
  272. package/build/contracts/src/rollup/RollupAdminLogic.sol/RollupAdminLogic.dbg.json +1 -1
  273. package/build/contracts/src/rollup/RollupAdminLogic.sol/RollupAdminLogic.json +806 -435
  274. package/build/contracts/src/rollup/RollupCore.sol/RollupCore.dbg.json +1 -1
  275. package/build/contracts/src/rollup/RollupCore.sol/RollupCore.json +323 -235
  276. package/build/contracts/src/rollup/RollupCreator.sol/RollupCreator.dbg.json +1 -1
  277. package/build/contracts/src/rollup/RollupCreator.sol/RollupCreator.json +98 -36
  278. package/build/contracts/src/rollup/RollupEventInbox.sol/RollupEventInbox.dbg.json +1 -1
  279. package/build/contracts/src/rollup/RollupEventInbox.sol/RollupEventInbox.json +2 -2
  280. package/build/contracts/src/rollup/RollupLib.sol/RollupLib.dbg.json +1 -1
  281. package/build/contracts/src/rollup/RollupLib.sol/RollupLib.json +2 -2
  282. package/build/contracts/src/rollup/RollupProxy.sol/RollupProxy.dbg.json +1 -1
  283. package/build/contracts/src/rollup/RollupProxy.sol/RollupProxy.json +97 -16
  284. package/build/contracts/src/rollup/RollupUserLogic.sol/RollupUserLogic.dbg.json +1 -1
  285. package/build/contracts/src/rollup/RollupUserLogic.sol/RollupUserLogic.json +924 -535
  286. package/build/contracts/src/rollup/ValidatorWallet.sol/ValidatorWallet.dbg.json +1 -1
  287. package/build/contracts/src/rollup/ValidatorWallet.sol/ValidatorWallet.json +15 -43
  288. package/build/contracts/src/rollup/ValidatorWalletCreator.sol/ValidatorWalletCreator.dbg.json +1 -1
  289. package/build/contracts/src/rollup/ValidatorWalletCreator.sol/ValidatorWalletCreator.json +2 -2
  290. package/build/contracts/src/state/Deserialize.sol/Deserialize.dbg.json +1 -1
  291. package/build/contracts/src/state/Deserialize.sol/Deserialize.json +2 -2
  292. package/build/contracts/src/state/GlobalState.sol/GlobalStateLib.dbg.json +1 -1
  293. package/build/contracts/src/state/GlobalState.sol/GlobalStateLib.json +2 -2
  294. package/build/contracts/src/state/Instructions.sol/Instructions.dbg.json +1 -1
  295. package/build/contracts/src/state/Instructions.sol/Instructions.json +2 -2
  296. package/build/contracts/src/state/Machine.sol/MachineLib.dbg.json +1 -1
  297. package/build/contracts/src/state/Machine.sol/MachineLib.json +2 -2
  298. package/build/contracts/src/state/MerkleProof.sol/MerkleProofLib.dbg.json +1 -1
  299. package/build/contracts/src/state/MerkleProof.sol/MerkleProofLib.json +2 -2
  300. package/build/contracts/src/state/Module.sol/ModuleLib.dbg.json +1 -1
  301. package/build/contracts/src/state/Module.sol/ModuleLib.json +2 -2
  302. package/build/contracts/src/state/ModuleMemory.sol/ModuleMemoryLib.dbg.json +1 -1
  303. package/build/contracts/src/state/ModuleMemory.sol/ModuleMemoryLib.json +2 -2
  304. package/build/contracts/src/state/ModuleMemoryCompact.sol/ModuleMemoryCompactLib.dbg.json +1 -1
  305. package/build/contracts/src/state/ModuleMemoryCompact.sol/ModuleMemoryCompactLib.json +2 -2
  306. package/build/contracts/src/state/MultiStack.sol/MultiStackLib.dbg.json +1 -1
  307. package/build/contracts/src/state/MultiStack.sol/MultiStackLib.json +2 -2
  308. package/build/contracts/src/state/PcArray.sol/PcArrayLib.dbg.json +1 -1
  309. package/build/contracts/src/state/PcArray.sol/PcArrayLib.json +2 -2
  310. package/build/contracts/src/state/StackFrame.sol/StackFrameLib.dbg.json +1 -1
  311. package/build/contracts/src/state/StackFrame.sol/StackFrameLib.json +2 -2
  312. package/build/contracts/src/state/Value.sol/ValueLib.dbg.json +1 -1
  313. package/build/contracts/src/state/Value.sol/ValueLib.json +2 -2
  314. package/build/contracts/src/state/ValueArray.sol/ValueArrayLib.dbg.json +1 -1
  315. package/build/contracts/src/state/ValueArray.sol/ValueArrayLib.json +2 -2
  316. package/build/contracts/src/state/ValueStack.sol/ValueStackLib.dbg.json +1 -1
  317. package/build/contracts/src/state/ValueStack.sol/ValueStackLib.json +2 -2
  318. package/build/contracts/src/test-helpers/BridgeTester.sol/BridgeTester.dbg.json +1 -1
  319. package/build/contracts/src/test-helpers/BridgeTester.sol/BridgeTester.json +15 -2
  320. package/build/contracts/src/test-helpers/CryptographyPrimitivesTester.sol/CryptographyPrimitivesTester.dbg.json +1 -1
  321. package/build/contracts/src/test-helpers/CryptographyPrimitivesTester.sol/CryptographyPrimitivesTester.json +2 -2
  322. package/build/contracts/src/test-helpers/EthVault.sol/EthVault.dbg.json +1 -1
  323. package/build/contracts/src/test-helpers/EthVault.sol/EthVault.json +2 -2
  324. package/build/contracts/src/test-helpers/MessageTester.sol/MessageTester.dbg.json +1 -1
  325. package/build/contracts/src/test-helpers/MessageTester.sol/MessageTester.json +2 -2
  326. package/build/contracts/src/test-helpers/OutboxWithoutOptTester.sol/OutboxWithoutOptTester.dbg.json +1 -1
  327. package/build/contracts/src/test-helpers/OutboxWithoutOptTester.sol/OutboxWithoutOptTester.json +2 -2
  328. package/build/contracts/src/test-helpers/RollupMock.sol/RollupMock.dbg.json +1 -1
  329. package/build/contracts/src/test-helpers/RollupMock.sol/RollupMock.json +2 -15
  330. package/build/contracts/src/test-helpers/TestToken.sol/TestToken.dbg.json +1 -1
  331. package/build/contracts/src/test-helpers/TestToken.sol/TestToken.json +2 -2
  332. package/build/contracts/src/test-helpers/ValueArrayTester.sol/ValueArrayTester.dbg.json +1 -1
  333. package/build/contracts/src/test-helpers/ValueArrayTester.sol/ValueArrayTester.json +2 -2
  334. package/out/yul/Reader4844.yul/Reader4844.json +1 -1
  335. package/package.json +11 -4
  336. package/src/assertionStakingPool/AbsBoldStakingPool.sol +66 -0
  337. package/src/assertionStakingPool/AssertionStakingPool.sol +70 -0
  338. package/src/assertionStakingPool/AssertionStakingPoolCreator.sol +35 -0
  339. package/src/assertionStakingPool/EdgeStakingPool.sol +57 -0
  340. package/src/assertionStakingPool/EdgeStakingPoolCreator.sol +34 -0
  341. package/src/assertionStakingPool/StakingPoolCreatorUtils.sol +25 -0
  342. package/src/assertionStakingPool/interfaces/IAbsBoldStakingPool.sol +41 -0
  343. package/src/assertionStakingPool/interfaces/IAssertionStakingPool.sol +36 -0
  344. package/src/assertionStakingPool/interfaces/IAssertionStakingPoolCreator.sol +31 -0
  345. package/src/assertionStakingPool/interfaces/IEdgeStakingPool.sol +27 -0
  346. package/src/assertionStakingPool/interfaces/IEdgeStakingPoolCreator.sol +28 -0
  347. package/src/bridge/AbsBridge.sol +38 -48
  348. package/src/bridge/AbsInbox.sol +89 -92
  349. package/src/bridge/AbsOutbox.sol +23 -37
  350. package/src/bridge/Bridge.sol +6 -4
  351. package/src/bridge/DelayBuffer.sol +123 -0
  352. package/src/bridge/DelayBufferTypes.sol +38 -0
  353. package/src/bridge/ERC20Bridge.sol +8 -4
  354. package/src/bridge/ERC20Inbox.sol +46 -53
  355. package/src/bridge/ERC20Outbox.sol +7 -3
  356. package/src/bridge/GasRefunder.sol +38 -24
  357. package/src/bridge/IBridge.sol +30 -21
  358. package/src/bridge/IERC20Bridge.sol +1 -1
  359. package/src/bridge/IERC20Inbox.sol +4 -2
  360. package/src/bridge/IEthBridge.sol +4 -2
  361. package/src/bridge/IInbox.sol +4 -2
  362. package/src/bridge/IInboxBase.sol +16 -8
  363. package/src/bridge/IOutbox.sol +13 -8
  364. package/src/bridge/ISequencerInbox.sol +118 -13
  365. package/src/bridge/Inbox.sol +134 -151
  366. package/src/bridge/Messages.sol +48 -18
  367. package/src/bridge/Outbox.sol +6 -2
  368. package/src/bridge/SequencerInbox.sol +343 -279
  369. package/src/chain/CacheManager.sol +49 -18
  370. package/src/challengeV2/EdgeChallengeManager.sol +559 -0
  371. package/src/challengeV2/IAssertionChain.sol +39 -0
  372. package/src/challengeV2/IEdgeChallengeManager.sol +233 -0
  373. package/src/challengeV2/libraries/ArrayUtilsLib.sol +61 -0
  374. package/src/challengeV2/libraries/ChallengeEdgeLib.sol +277 -0
  375. package/src/challengeV2/libraries/ChallengeErrors.sol +108 -0
  376. package/src/challengeV2/libraries/EdgeChallengeManagerLib.sol +819 -0
  377. package/src/challengeV2/libraries/Enums.sol +26 -0
  378. package/src/challengeV2/libraries/MerkleTreeAccumulatorLib.sol +390 -0
  379. package/src/challengeV2/libraries/Structs.sol +176 -0
  380. package/src/challengeV2/libraries/UintUtilsLib.sol +74 -0
  381. package/src/libraries/AddressAliasHelper.sol +6 -2
  382. package/src/libraries/AdminFallbackProxy.sol +8 -4
  383. package/src/libraries/ArbitrumChecker.sol +3 -4
  384. package/src/libraries/CallerChecker.sol +18 -0
  385. package/src/libraries/CryptographyPrimitives.sol +39 -46
  386. package/src/libraries/DecimalsConverterHelper.sol +2 -4
  387. package/src/libraries/DoubleLogicUUPSUpgradeable.sol +10 -7
  388. package/src/libraries/Error.sol +21 -3
  389. package/src/libraries/GasRefundEnabled.sol +5 -6
  390. package/src/libraries/MerkleLib.sol +6 -5
  391. package/src/libraries/UUPSNotUpgradeable.sol +2 -4
  392. package/src/mocks/BridgeStub.sol +50 -48
  393. package/src/mocks/CreateTest.sol +3 -1
  394. package/src/mocks/HostioTest.sol +20 -16
  395. package/src/mocks/InboxStub.sol +22 -17
  396. package/src/mocks/MerkleTreeAccess.sol +72 -0
  397. package/src/mocks/MockRollupEventInbox.sol +59 -0
  398. package/src/mocks/MultiCallTest.sol +3 -1
  399. package/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol +3 -1
  400. package/src/mocks/Program.sol +9 -7
  401. package/src/mocks/SequencerInboxBlobMock.sol +38 -0
  402. package/src/mocks/SequencerInboxStub.sol +9 -12
  403. package/src/mocks/Simple.sol +13 -25
  404. package/src/mocks/SimpleCacheManager.sol +10 -3
  405. package/src/mocks/SimpleOneStepProofEntry.sol +60 -0
  406. package/src/mocks/SimpleProxy.sol +3 -1
  407. package/src/mocks/TestWETH9.sol +30 -0
  408. package/src/mocks/UpgradeExecutorMock.sol +10 -17
  409. package/src/node-interface/NodeInterface.sol +23 -22
  410. package/src/node-interface/NodeInterfaceDebug.sol +5 -3
  411. package/src/osp/HashProofHelper.sol +9 -10
  412. package/src/osp/IOneStepProofEntry.sol +14 -9
  413. package/src/osp/IOneStepProver.sol +1 -0
  414. package/src/osp/OneStepProofEntry.sol +63 -54
  415. package/src/osp/OneStepProver0.sol +14 -27
  416. package/src/osp/OneStepProverHostIo.sol +31 -58
  417. package/src/osp/OneStepProverMath.sol +15 -23
  418. package/src/osp/OneStepProverMemory.sol +9 -23
  419. package/src/precompiles/ArbAddressTable.sol +19 -9
  420. package/src/precompiles/ArbAggregator.sol +12 -4
  421. package/src/precompiles/ArbBLS.sol +1 -3
  422. package/src/precompiles/ArbDebug.sol +5 -11
  423. package/src/precompiles/ArbFunctionTable.sol +7 -10
  424. package/src/precompiles/ArbGasInfo.sol +9 -43
  425. package/src/precompiles/ArbInfo.sol +6 -2
  426. package/src/precompiles/ArbOwner.sol +101 -34
  427. package/src/precompiles/ArbOwnerPublic.sol +6 -2
  428. package/src/precompiles/ArbRetryableTx.sol +15 -5
  429. package/src/precompiles/ArbStatistics.sol +1 -8
  430. package/src/precompiles/ArbSys.sol +16 -18
  431. package/src/precompiles/ArbWasm.sol +24 -14
  432. package/src/precompiles/ArbWasmCache.sol +15 -5
  433. package/src/precompiles/ArbosTest.sol +3 -1
  434. package/src/rollup/AbsRollupEventInbox.sol +15 -16
  435. package/src/rollup/Assertion.sol +100 -0
  436. package/src/rollup/AssertionState.sol +29 -0
  437. package/src/rollup/BOLDUpgradeAction.sol +631 -0
  438. package/src/rollup/BridgeCreator.sol +42 -15
  439. package/src/rollup/Config.sol +15 -7
  440. package/src/rollup/DeployHelper.sol +12 -31
  441. package/src/rollup/ERC20RollupEventInbox.sol +8 -9
  442. package/src/rollup/FactoryDeployerHelper.sol +8 -10
  443. package/src/rollup/IRollupAdmin.sol +127 -45
  444. package/src/rollup/IRollupCore.sol +64 -84
  445. package/src/rollup/IRollupEventInbox.sol +3 -1
  446. package/src/rollup/IRollupLogic.sol +35 -72
  447. package/src/rollup/RollupAdminLogic.sol +224 -203
  448. package/src/rollup/RollupCore.sol +407 -428
  449. package/src/rollup/RollupCreator.sol +84 -71
  450. package/src/rollup/RollupEventInbox.sol +7 -7
  451. package/src/rollup/RollupLib.sol +50 -86
  452. package/src/rollup/RollupProxy.sol +8 -12
  453. package/src/rollup/RollupUserLogic.sol +279 -644
  454. package/src/rollup/ValidatorUtils.sol +0 -242
  455. package/src/rollup/ValidatorWallet.sol +22 -38
  456. package/src/rollup/ValidatorWalletCreator.sol +8 -8
  457. package/src/state/Deserialize.sol +74 -96
  458. package/src/state/GlobalState.sol +74 -20
  459. package/src/state/Instructions.sol +4 -3
  460. package/src/state/Machine.sol +18 -19
  461. package/src/state/Module.sol +14 -13
  462. package/src/state/ModuleMemory.sol +6 -25
  463. package/src/state/ModuleMemoryCompact.sol +3 -1
  464. package/src/state/MultiStack.sol +16 -20
  465. package/src/state/PcArray.sol +7 -7
  466. package/src/state/StackFrame.sol +21 -14
  467. package/src/state/Value.sol +18 -6
  468. package/src/state/ValueArray.sol +7 -7
  469. package/src/state/ValueStack.sol +9 -3
  470. package/src/test-helpers/BridgeTester.sol +32 -42
  471. package/src/test-helpers/CryptographyPrimitivesTester.sol +12 -13
  472. package/src/test-helpers/EthVault.sol +4 -2
  473. package/src/test-helpers/InterfaceCompatibilityTester.sol +1 -1
  474. package/src/test-helpers/MessageTester.sol +3 -10
  475. package/src/test-helpers/OutboxWithoutOptTester.sol +12 -19
  476. package/src/test-helpers/RollupMock.sol +3 -7
  477. package/src/test-helpers/TestToken.sol +4 -2
  478. package/build/contracts/@openzeppelin/contracts/utils/cryptography/ECDSA.sol/ECDSA.dbg.json +0 -4
  479. package/build/contracts/@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol/AccessControlEnumerableUpgradeable.dbg.json +0 -4
  480. package/build/contracts/@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol/AccessControlEnumerableUpgradeable.json +0 -258
  481. package/build/contracts/@openzeppelin/contracts-upgradeable/access/IAccessControlEnumerableUpgradeable.sol/IAccessControlEnumerableUpgradeable.dbg.json +0 -4
  482. package/build/contracts/@openzeppelin/contracts-upgradeable/access/IAccessControlEnumerableUpgradeable.sol/IAccessControlEnumerableUpgradeable.json +0 -226
  483. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol/ERC20Upgradeable.dbg.json +0 -4
  484. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol/ERC20Upgradeable.json +0 -281
  485. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol/IERC20Upgradeable.dbg.json +0 -4
  486. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol/ERC20BurnableUpgradeable.dbg.json +0 -4
  487. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol/ERC20BurnableUpgradeable.json +0 -312
  488. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol/IERC20MetadataUpgradeable.dbg.json +0 -4
  489. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol/ECDSAUpgradeable.dbg.json +0 -4
  490. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol/ECDSAUpgradeable.json +0 -10
  491. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol/EIP712Upgradeable.dbg.json +0 -4
  492. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol/EIP712Upgradeable.json +0 -10
  493. package/build/contracts/src/challenge/ChallengeLib.sol/ChallengeLib.dbg.json +0 -4
  494. package/build/contracts/src/challenge/ChallengeManager.sol/ChallengeManager.dbg.json +0 -4
  495. package/build/contracts/src/challenge/ChallengeManager.sol/ChallengeManager.json +0 -746
  496. package/build/contracts/src/challenge/IChallengeManager.sol/IChallengeManager.dbg.json +0 -4
  497. package/build/contracts/src/challenge/IChallengeManager.sol/IChallengeManager.json +0 -441
  498. package/build/contracts/src/challenge/IChallengeResultReceiver.sol/IChallengeResultReceiver.dbg.json +0 -4
  499. package/build/contracts/src/challenge/IChallengeResultReceiver.sol/IChallengeResultReceiver.json +0 -34
  500. package/build/contracts/src/express-lane-auction/Balance.sol/BalanceLib.dbg.json +0 -4
  501. package/build/contracts/src/express-lane-auction/Burner.sol/Burner.dbg.json +0 -4
  502. package/build/contracts/src/express-lane-auction/Burner.sol/Burner.json +0 -47
  503. package/build/contracts/src/express-lane-auction/ELCRound.sol/LatestELCRoundsLib.dbg.json +0 -4
  504. package/build/contracts/src/express-lane-auction/ExpressLaneAuction.sol/ExpressLaneAuction.dbg.json +0 -4
  505. package/build/contracts/src/express-lane-auction/ExpressLaneAuction.sol/ExpressLaneAuction.json +0 -1588
  506. package/build/contracts/src/express-lane-auction/IExpressLaneAuction.sol/IExpressLaneAuction.dbg.json +0 -4
  507. package/build/contracts/src/express-lane-auction/IExpressLaneAuction.sol/IExpressLaneAuction.json +0 -1296
  508. package/build/contracts/src/express-lane-auction/RoundTimingInfo.sol/RoundTimingInfoLib.dbg.json +0 -4
  509. package/build/contracts/src/express-lane-auction/RoundTimingInfo.sol/RoundTimingInfoLib.json +0 -10
  510. package/build/contracts/src/mocks/MockResultReceiver.sol/MockResultReceiver.dbg.json +0 -4
  511. package/build/contracts/src/mocks/MockResultReceiver.sol/MockResultReceiver.json +0 -188
  512. package/build/contracts/src/mocks/SingleExecutionChallenge.sol/SingleExecutionChallenge.dbg.json +0 -4
  513. package/build/contracts/src/mocks/SingleExecutionChallenge.sol/SingleExecutionChallenge.json +0 -797
  514. package/build/contracts/src/mocks/TimedOutChallengeManager.sol/TimedOutChallengeManager.dbg.json +0 -4
  515. package/build/contracts/src/mocks/TimedOutChallengeManager.sol/TimedOutChallengeManager.json +0 -746
  516. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserAbs.dbg.json +0 -4
  517. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserAbs.json +0 -1332
  518. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserERC20.dbg.json +0 -4
  519. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserERC20.json +0 -1466
  520. package/build/contracts/src/rollup/Node.sol/NodeLib.dbg.json +0 -4
  521. package/build/contracts/src/rollup/RollupUserLogic.sol/AbsRollupUserLogic.dbg.json +0 -4
  522. package/build/contracts/src/rollup/RollupUserLogic.sol/AbsRollupUserLogic.json +0 -1614
  523. package/build/contracts/src/rollup/RollupUserLogic.sol/ERC20RollupUserLogic.dbg.json +0 -4
  524. package/build/contracts/src/rollup/RollupUserLogic.sol/ERC20RollupUserLogic.json +0 -1748
  525. package/build/contracts/src/rollup/ValidatorUtils.sol/ValidatorUtils.dbg.json +0 -4
  526. package/build/contracts/src/rollup/ValidatorUtils.sol/ValidatorUtils.json +0 -379
  527. package/src/challenge/ChallengeLib.sol +0 -88
  528. package/src/challenge/ChallengeManager.sol +0 -375
  529. package/src/challenge/IChallengeManager.sol +0 -86
  530. package/src/challenge/IChallengeResultReceiver.sol +0 -13
  531. package/src/express-lane-auction/Balance.sol +0 -142
  532. package/src/express-lane-auction/Burner.sol +0 -25
  533. package/src/express-lane-auction/ELCRound.sol +0 -73
  534. package/src/express-lane-auction/Errors.sol +0 -31
  535. package/src/express-lane-auction/ExpressLaneAuction.sol +0 -565
  536. package/src/express-lane-auction/IExpressLaneAuction.sol +0 -421
  537. package/src/express-lane-auction/RoundTimingInfo.sol +0 -115
  538. package/src/mocks/MockResultReceiver.sol +0 -59
  539. package/src/mocks/SingleExecutionChallenge.sol +0 -41
  540. package/src/mocks/TimedOutChallengeManager.sol +0 -13
  541. package/src/rollup/Node.sol +0 -113
@@ -4,32 +4,32 @@
4
4
 
5
5
  pragma solidity ^0.8.0;
6
6
 
7
- import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
7
+ import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
8
8
 
9
9
  import {IRollupUser} from "./IRollupLogic.sol";
10
10
  import "../libraries/UUPSNotUpgradeable.sol";
11
11
  import "./RollupCore.sol";
12
12
  import "./IRollupLogic.sol";
13
13
 
14
- import {ETH_POS_BLOCK_TIME} from "../libraries/Constants.sol";
15
-
16
- abstract contract AbsRollupUserLogic is
17
- RollupCore,
18
- UUPSNotUpgradeable,
19
- IRollupUserAbs,
20
- IChallengeResultReceiver
21
- {
22
- using NodeLib for Node;
14
+ contract RollupUserLogic is RollupCore, UUPSNotUpgradeable, IRollupUser {
15
+ using AssertionNodeLib for AssertionNode;
23
16
  using GlobalStateLib for GlobalState;
17
+ using SafeERC20 for IERC20;
18
+ using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet;
24
19
 
25
- modifier onlyValidator() {
26
- require(isValidator[msg.sender] || validatorWhitelistDisabled, "NOT_VALIDATOR");
20
+ modifier onlyValidator(
21
+ address account
22
+ ) {
23
+ require(validators.contains(account) || validatorWhitelistDisabled, "NOT_VALIDATOR");
27
24
  _;
28
25
  }
29
26
 
30
- modifier whenNotPausedOrDeprecated() {
31
- require(!paused() || address(bridge.rollup()) != address(this), "PAUSED_AND_ACTIVE");
32
- _;
27
+ /// @dev the user logic just validated configuration and shouldn't write to state during init
28
+ /// this allows the admin logic to ensure consistency on parameters.
29
+ function initialize(
30
+ address _stakeToken
31
+ ) external view override onlyProxy {
32
+ require(_stakeToken != address(0), "NEED_STAKE_TOKEN");
33
33
  }
34
34
 
35
35
  uint256 internal immutable deployTimeChainId = block.chainid;
@@ -38,19 +38,17 @@ abstract contract AbsRollupUserLogic is
38
38
  return deployTimeChainId != block.chainid;
39
39
  }
40
40
 
41
- /**
42
- * @notice Extra number of blocks the validator can remain inactive before considered inactive
43
- * This is 7 days assuming a 13.2 seconds block time
44
- */
45
- uint256 public constant VALIDATOR_AFK_BLOCKS = 45818;
46
-
47
41
  function _validatorIsAfk() internal view returns (bool) {
48
- Node memory latestNode = getNodeStorage(latestNodeCreated());
49
- if (latestNode.createdAtBlock == 0) return false;
50
- if (latestNode.createdAtBlock + confirmPeriodBlocks + VALIDATOR_AFK_BLOCKS < block.number) {
51
- return true;
42
+ AssertionNode memory latestConfirmedAssertion = getAssertionStorage(latestConfirmed());
43
+ uint256 _validatorAfkBlocks = validatorAfkBlocks; // cache and cast to uint256 to prevent overflow
44
+ if (_validatorAfkBlocks == 0) return false;
45
+ if (latestConfirmedAssertion.createdAtBlock == 0) return false;
46
+ // We consider the validator is gone if the last known assertion is older than VALIDATOR_AFK_BLOCKS
47
+ // Which is either the latest confirmed assertion or the first child of the latest confirmed assertion
48
+ if (latestConfirmedAssertion.firstChildBlock > 0) {
49
+ return latestConfirmedAssertion.firstChildBlock + _validatorAfkBlocks < block.number;
52
50
  }
53
- return false;
51
+ return latestConfirmedAssertion.createdAtBlock + _validatorAfkBlocks < block.number;
54
52
  }
55
53
 
56
54
  function removeWhitelistAfterFork() external {
@@ -59,711 +57,354 @@ abstract contract AbsRollupUserLogic is
59
57
  validatorWhitelistDisabled = true;
60
58
  }
61
59
 
60
+ /**
61
+ * @notice Remove the whitelist after the validator has been inactive for too long
62
+ */
62
63
  function removeWhitelistAfterValidatorAfk() external {
63
64
  require(!validatorWhitelistDisabled, "WHITELIST_DISABLED");
64
65
  require(_validatorIsAfk(), "VALIDATOR_NOT_AFK");
65
66
  validatorWhitelistDisabled = true;
66
67
  }
67
68
 
68
- function isERC20Enabled() public view override returns (bool) {
69
- return stakeToken != address(0);
70
- }
71
-
72
69
  /**
73
- * @notice Reject the next unresolved node
74
- * @param stakerAddress Example staker staked on sibling, used to prove a node is on an unconfirmable branch and can be rejected
70
+ * @notice Confirm a unresolved assertion
71
+ * @param confirmState The state to confirm
72
+ * @param winningEdgeId The winning edge if a challenge is started
75
73
  */
76
- function rejectNextNode(address stakerAddress) external onlyValidator whenNotPaused {
77
- requireUnresolvedExists();
78
- uint64 latestConfirmedNodeNum = latestConfirmed();
79
- uint64 firstUnresolvedNodeNum = firstUnresolvedNode();
80
- Node storage firstUnresolvedNode_ = getNodeStorage(firstUnresolvedNodeNum);
81
-
82
- if (firstUnresolvedNode_.prevNum == latestConfirmedNodeNum) {
83
- /**If the first unresolved node is a child of the latest confirmed node, to prove it can be rejected, we show:
84
- * a) Its deadline has expired
85
- * b) *Some* staker is staked on a sibling
86
-
87
- * The following three checks are sufficient to prove b:
88
- */
89
-
90
- // 1. StakerAddress is indeed a staker
91
- require(isStakedOnLatestConfirmed(stakerAddress), "NOT_STAKED");
92
-
93
- // 2. Staker's latest staked node hasn't been resolved; this proves that staker's latest staked node can't be a parent of firstUnresolvedNode
94
- requireUnresolved(latestStakedNode(stakerAddress));
95
-
96
- // 3. staker isn't staked on first unresolved node; this proves staker's latest staked can't be a child of firstUnresolvedNode (recall staking on node requires staking on all of its parents)
97
- require(!nodeHasStaker(firstUnresolvedNodeNum, stakerAddress), "STAKED_ON_TARGET");
98
- // If a staker is staked on a node that is neither a child nor a parent of firstUnresolvedNode, it must be a sibling, QED
99
-
100
- // Verify the block's deadline has passed
101
- firstUnresolvedNode_.requirePastDeadline();
102
-
103
- getNodeStorage(latestConfirmedNodeNum).requirePastChildConfirmDeadline();
104
-
105
- removeOldZombies(0);
74
+ function confirmAssertion(
75
+ bytes32 assertionHash,
76
+ bytes32 prevAssertionHash,
77
+ AssertionState calldata confirmState,
78
+ bytes32 winningEdgeId,
79
+ ConfigData calldata prevConfig,
80
+ bytes32 inboxAcc
81
+ ) external onlyValidator(msg.sender) whenNotPaused {
82
+ /*
83
+ * To confirm an assertion, the following must be true:
84
+ * 1. The assertion must be pending
85
+ * 2. The assertion's deadline must have passed
86
+ * 3. The assertion's prev must be latest confirmed
87
+ * 4. The assertion's prev's child confirm deadline must have passed
88
+ * 5. If the assertion's prev has more than 1 child, the assertion must be the winner of the challenge
89
+ *
90
+ * Note that we do not need to ever reject invalid assertion because they can never confirm
91
+ * and the stake on them is swept to the loserStakeEscrow as soon as the leaf is created
92
+ */
93
+
94
+ // The assertion's must exists and be pending and will be validated in RollupCore.confirmAssertionInternal
95
+ AssertionNode storage assertion = getAssertionStorage(assertionHash);
96
+
97
+ // prevAssertionHash is user supplied, but will be validated in RollupCore.confirmAssertionInternal
98
+ AssertionNode storage prevAssertion = getAssertionStorage(prevAssertionHash);
99
+ RollupLib.validateConfigHash(prevConfig, prevAssertion.configHash);
100
+
101
+ // Check that deadline has passed
102
+ require(
103
+ block.number >= assertion.createdAtBlock + prevConfig.confirmPeriodBlocks,
104
+ "BEFORE_DEADLINE"
105
+ );
106
106
 
107
- // Verify that no staker is staked on this node
107
+ // Check that prev is latest confirmed
108
+ require(prevAssertionHash == latestConfirmed(), "PREV_NOT_LATEST_CONFIRMED");
109
+
110
+ if (prevAssertion.secondChildBlock > 0) {
111
+ // if the prev has more than 1 child, check if this assertion is the challenge winner
112
+ ChallengeEdge memory winningEdge =
113
+ IEdgeChallengeManager(prevConfig.challengeManager).getEdge(winningEdgeId);
114
+ require(winningEdge.claimId == assertionHash, "NOT_WINNER");
115
+ require(winningEdge.status == EdgeStatus.Confirmed, "EDGE_NOT_CONFIRMED");
116
+ require(winningEdge.confirmedAtBlock != 0, "ZERO_CONFIRMED_AT_BLOCK");
117
+ // an additional number of blocks is added to ensure that the result of the challenge is widely
118
+ // observable before it causes an assertion to be confirmed. After a winning edge is found, it will
119
+ // always be challengeGracePeriodBlocks before an assertion can be confirmed
108
120
  require(
109
- firstUnresolvedNode_.stakerCount == countStakedZombies(firstUnresolvedNodeNum),
110
- "HAS_STAKERS"
121
+ block.number >= winningEdge.confirmedAtBlock + challengeGracePeriodBlocks,
122
+ "CHALLENGE_GRACE_PERIOD_NOT_PASSED"
111
123
  );
112
124
  }
113
- // Simpler case: if the first unreseolved node doesn't point to the last confirmed node, another branch was confirmed and can simply reject it outright
114
- _rejectNextNode();
115
-
116
- emit NodeRejected(firstUnresolvedNodeNum);
117
- }
118
-
119
- function _confirmNextNode(
120
- bytes32 blockHash,
121
- bytes32 sendRoot,
122
- bool isFastConfirm
123
- ) internal whenNotPaused {
124
- requireUnresolvedExists();
125
-
126
- uint64 nodeNum = firstUnresolvedNode();
127
- Node storage node = getNodeStorage(nodeNum);
128
-
129
- if (!isFastConfirm) {
130
- // Verify the block's deadline has passed
131
- node.requirePastDeadline();
132
- }
133
-
134
- // Check that prev is latest confirmed
135
- assert(node.prevNum == latestConfirmed());
136
-
137
- Node storage prevNode = getNodeStorage(node.prevNum);
138
- if (!isFastConfirm) {
139
- prevNode.requirePastChildConfirmDeadline();
140
- }
141
125
 
142
- removeOldZombies(0);
143
-
144
- // Require only zombies are staked on siblings to this node, and there's at least one non-zombie staked on this node
145
- uint256 stakedZombies = countStakedZombies(nodeNum);
146
- uint256 zombiesStakedOnOtherChildren = countZombiesStakedOnChildren(node.prevNum) -
147
- stakedZombies;
148
- require(node.stakerCount > stakedZombies, "NO_STAKERS");
149
- require(
150
- prevNode.childStakerCount == node.stakerCount + zombiesStakedOnOtherChildren,
151
- "NOT_ALL_STAKED"
152
- );
153
-
154
- confirmNode(nodeNum, blockHash, sendRoot);
155
- }
156
-
157
- /**
158
- * @notice Confirm the next unresolved node
159
- * @param blockHash The block hash at the end of the assertion
160
- * @param sendRoot The send root at the end of the assertion
161
- */
162
- function confirmNextNode(bytes32 blockHash, bytes32 sendRoot) external onlyValidator {
163
- _confirmNextNode(blockHash, sendRoot, false);
164
- }
165
-
166
- /**
167
- * @notice This allow anyTrustFastConfirmer to confirm next node regardless of deadline
168
- * the anyTrustFastConfirmer is supposed to be set only on an AnyTrust chain to
169
- * a contract that can call this function when received sufficient signatures
170
- * node hash must be match the node to be confirmed to protect against reorgs
171
- */
172
- function fastConfirmNextNode(
173
- bytes32 blockHash,
174
- bytes32 sendRoot,
175
- bytes32 nodeHash
176
- ) external {
177
- require(msg.sender == anyTrustFastConfirmer, "NFC");
178
- require(nodeHash == getNodeStorage(firstUnresolvedNode()).nodeHash, "WH");
179
- _confirmNextNode(blockHash, sendRoot, true);
126
+ confirmAssertionInternal(assertionHash, prevAssertionHash, confirmState, inboxAcc);
180
127
  }
181
128
 
182
129
  /**
183
130
  * @notice Create a new stake
184
131
  * @param depositAmount The amount of either eth or tokens staked
132
+ * @param _withdrawalAddress The new staker's withdrawal address
185
133
  */
186
- function _newStake(uint256 depositAmount) internal onlyValidator whenNotPaused {
134
+ function _newStake(
135
+ uint256 depositAmount,
136
+ address _withdrawalAddress
137
+ ) internal onlyValidator(msg.sender) whenNotPaused {
187
138
  // Verify that sender is not already a staker
188
139
  require(!isStaked(msg.sender), "ALREADY_STAKED");
189
- require(!isZombie(msg.sender), "STAKER_IS_ZOMBIE");
190
- require(depositAmount >= currentRequiredStake(), "NOT_ENOUGH_STAKE");
191
-
192
- createNewStake(msg.sender, depositAmount);
140
+ // amount will be checked when creating an assertion
141
+ createNewStake(msg.sender, depositAmount, _withdrawalAddress);
193
142
  }
194
143
 
195
144
  /**
196
- * @notice Move stake onto existing child node
197
- * @param nodeNum Index of the node to move stake to. This must by a child of the node the staker is currently staked on
198
- * @param nodeHash Node hash of nodeNum (protects against reorgs)
145
+ * @notice Computes the hash of an assertion
146
+ * @param state The execution state for the assertion
147
+ * @param prevAssertionHash The hash of the assertion's parent
148
+ * @param inboxAcc The inbox batch accumulator
199
149
  */
200
- function stakeOnExistingNode(uint64 nodeNum, bytes32 nodeHash)
201
- public
202
- onlyValidator
203
- whenNotPaused
204
- {
205
- require(isStakedOnLatestConfirmed(msg.sender), "NOT_STAKED");
206
-
207
- require(
208
- nodeNum >= firstUnresolvedNode() && nodeNum <= latestNodeCreated(),
209
- "NODE_NUM_OUT_OF_RANGE"
210
- );
211
- Node storage node = getNodeStorage(nodeNum);
212
- require(node.nodeHash == nodeHash, "NODE_REORG");
213
- require(latestStakedNode(msg.sender) == node.prevNum, "NOT_STAKED_PREV");
214
- stakeOnNode(msg.sender, nodeNum);
150
+ function computeAssertionHash(
151
+ bytes32 prevAssertionHash,
152
+ AssertionState calldata state,
153
+ bytes32 inboxAcc
154
+ ) external pure returns (bytes32) {
155
+ return RollupLib.assertionHash(prevAssertionHash, state, inboxAcc);
215
156
  }
216
157
 
217
158
  /**
218
- * @notice Create a new node and move stake onto it
159
+ * @notice Create a new assertion and move stake onto it
219
160
  * @param assertion The assertion data
220
- * @param expectedNodeHash The hash of the node being created (protects against reorgs)
221
- */
222
- function stakeOnNewNode(
223
- Assertion calldata assertion,
224
- bytes32 expectedNodeHash,
225
- uint256 prevNodeInboxMaxCount
226
- ) public onlyValidator whenNotPaused {
227
- require(isStakedOnLatestConfirmed(msg.sender), "NOT_STAKED");
228
- // Ensure staker is staked on the previous node
229
- uint64 prevNode = latestStakedNode(msg.sender);
230
-
231
- {
232
- uint256 timeSinceLastNode = block.number - getNode(prevNode).createdAtBlock;
233
- // Verify that assertion meets the minimum Delta time requirement
234
- require(timeSinceLastNode >= minimumAssertionPeriod, "TIME_DELTA");
235
-
236
- // Minimum size requirement: any assertion must consume at least all inbox messages
237
- // put into L1 inbox before the prev node’s L1 blocknum.
238
- // We make an exception if the machine enters the errored state,
239
- // as it can't consume future batches.
240
- require(
241
- assertion.afterState.machineStatus == MachineStatus.ERRORED ||
242
- assertion.afterState.globalState.getInboxPosition() >= prevNodeInboxMaxCount,
243
- "TOO_SMALL"
244
- );
245
- // Minimum size requirement: any assertion must contain at least one block
246
- require(assertion.numBlocks > 0, "EMPTY_ASSERTION");
247
-
248
- // The rollup cannot advance normally from an errored state
249
- require(
250
- assertion.beforeState.machineStatus == MachineStatus.FINISHED,
251
- "BAD_PREV_STATUS"
252
- );
253
- }
254
- createNewNode(assertion, prevNode, prevNodeInboxMaxCount, expectedNodeHash);
255
-
256
- stakeOnNode(msg.sender, latestNodeCreated());
257
- }
258
-
259
- /**
260
- * @notice Refund a staker that is currently staked on or before the latest confirmed node
261
- * @dev Since a staker is initially placed in the latest confirmed node, if they don't move it
262
- * a griefer can remove their stake. It is recomended to batch together the txs to place a stake
263
- * and move it to the desired node.
264
- * @param stakerAddress Address of the staker whose stake is refunded
265
- */
266
- function returnOldDeposit(address stakerAddress)
267
- external
268
- override
269
- onlyValidator
270
- whenNotPausedOrDeprecated
271
- {
272
- require(latestStakedNode(stakerAddress) <= latestConfirmed(), "TOO_RECENT");
273
- requireUnchallengedStaker(stakerAddress);
274
- withdrawStaker(stakerAddress);
275
- }
276
-
277
- /**
278
- * @notice Increase the amount staked for the given staker
279
- * @param stakerAddress Address of the staker whose stake is increased
280
- * @param depositAmount The amount of either eth or tokens deposited
161
+ * @param expectedAssertionHash The hash of the assertion being created (protects against reorgs)
281
162
  */
282
- function _addToDeposit(address stakerAddress, uint256 depositAmount)
283
- internal
284
- onlyValidator
285
- whenNotPaused
286
- {
287
- requireUnchallengedStaker(stakerAddress);
288
- increaseStakeBy(stakerAddress, depositAmount);
289
- }
163
+ function stakeOnNewAssertion(
164
+ AssertionInputs calldata assertion,
165
+ bytes32 expectedAssertionHash
166
+ ) public onlyValidator(msg.sender) whenNotPaused {
167
+ // Early revert on duplicated assertion if expectedAssertionHash is set
168
+ require(
169
+ expectedAssertionHash == bytes32(0)
170
+ || getAssertionStorage(expectedAssertionHash).status == AssertionStatus.NoAssertion,
171
+ "EXPECTED_ASSERTION_SEEN"
172
+ );
290
173
 
291
- /**
292
- * @notice Reduce the amount staked for the sender (difference between initial amount staked and target is creditted back to the sender).
293
- * @param target Target amount of stake for the staker. If this is below the current minimum, it will be set to minimum instead
294
- */
295
- function reduceDeposit(uint256 target) external onlyValidator whenNotPausedOrDeprecated {
296
- requireUnchallengedStaker(msg.sender);
297
- uint256 currentRequired = currentRequiredStake();
298
- if (target < currentRequired) {
299
- target = currentRequired;
300
- }
301
- reduceStakeTo(msg.sender, target);
302
- }
174
+ require(isStaked(msg.sender), "NOT_STAKED");
303
175
 
304
- /**
305
- * @notice Start a challenge between the given stakers over the node created by the first staker assuming that the two are staked on conflicting nodes. N.B.: challenge creator does not necessarily need to be one of the two asserters.
306
- * @param stakers Stakers engaged in the challenge. The first staker should be staked on the first node
307
- * @param nodeNums Nodes of the stakers engaged in the challenge. The first node should be the earliest and is the one challenged
308
- * @param machineStatuses The before and after machine status for the first assertion
309
- * @param globalStates The before and after global state for the first assertion
310
- * @param numBlocks The number of L2 blocks contained in the first assertion
311
- * @param secondExecutionHash The execution hash of the second assertion
312
- * @param proposedBlocks L1 block numbers that the two nodes were proposed at
313
- * @param wasmModuleRoots The wasm module roots at the time of the creation of each assertion
314
- */
315
- function createChallenge(
316
- address[2] calldata stakers,
317
- uint64[2] calldata nodeNums,
318
- MachineStatus[2] calldata machineStatuses,
319
- GlobalState[2] calldata globalStates,
320
- uint64 numBlocks,
321
- bytes32 secondExecutionHash,
322
- uint256[2] calldata proposedBlocks,
323
- bytes32[2] calldata wasmModuleRoots
324
- ) external onlyValidator whenNotPaused {
325
- require(nodeNums[0] < nodeNums[1], "WRONG_ORDER");
326
- require(nodeNums[1] <= latestNodeCreated(), "NOT_PROPOSED");
327
- require(latestConfirmed() < nodeNums[0], "ALREADY_CONFIRMED");
328
-
329
- Node storage node1 = getNodeStorage(nodeNums[0]);
330
- Node storage node2 = getNodeStorage(nodeNums[1]);
331
-
332
- // ensure nodes staked on the same parent (and thus in conflict)
333
- require(node1.prevNum == node2.prevNum, "DIFF_PREV");
334
-
335
- // ensure both stakers aren't currently in challenge
336
- requireUnchallengedStaker(stakers[0]);
337
- requireUnchallengedStaker(stakers[1]);
338
-
339
- require(nodeHasStaker(nodeNums[0], stakers[0]), "STAKER1_NOT_STAKED");
340
- require(nodeHasStaker(nodeNums[1], stakers[1]), "STAKER2_NOT_STAKED");
341
-
342
- // Check param data against challenge hash
176
+ // requiredStake is user supplied, will be verified against configHash later
177
+ // the prev's requiredStake is used to make sure all children have the same stake
178
+ // the staker may have more than enough stake, and the entire stake will be locked
179
+ // we cannot do a refund here because the staker may be staker on an unconfirmed ancestor that requires more stake
180
+ // excess stake can be removed by calling reduceDeposit when the staker is inactive
343
181
  require(
344
- node1.challengeHash ==
345
- RollupLib.challengeRootHash(
346
- RollupLib.executionHash(machineStatuses, globalStates, numBlocks),
347
- proposedBlocks[0],
348
- wasmModuleRoots[0]
349
- ),
350
- "CHAL_HASH1"
182
+ amountStaked(msg.sender) >= assertion.beforeStateData.configData.requiredStake,
183
+ "INSUFFICIENT_STAKE"
351
184
  );
352
185
 
186
+ bytes32 prevAssertion = RollupLib.assertionHash(
187
+ assertion.beforeStateData.prevPrevAssertionHash,
188
+ assertion.beforeState,
189
+ assertion.beforeStateData.sequencerBatchAcc
190
+ );
191
+ getAssertionStorage(prevAssertion).requireExists();
192
+
193
+ // Staker can create new assertion only if
194
+ // a) its last staked assertion is the prev; or
195
+ // b) its last staked assertion have a child
196
+ bytes32 lastAssertion = latestStakedAssertion(msg.sender);
353
197
  require(
354
- node2.challengeHash ==
355
- RollupLib.challengeRootHash(
356
- secondExecutionHash,
357
- proposedBlocks[1],
358
- wasmModuleRoots[1]
359
- ),
360
- "CHAL_HASH2"
198
+ lastAssertion == prevAssertion || getAssertionStorage(lastAssertion).firstChildBlock > 0,
199
+ "STAKED_ON_ANOTHER_BRANCH"
361
200
  );
362
201
 
363
- // Calculate upper limit for allowed node proposal time:
364
- uint256 commonEndBlock = getNodeStorage(node1.prevNum).firstChildBlock +
365
- // Dispute start: dispute timer for a node starts when its first child is created
366
- (node1.deadlineBlock - proposedBlocks[0]) +
367
- extraChallengeTimeBlocks; // add dispute window to dispute start time
368
- if (commonEndBlock < proposedBlocks[1]) {
369
- // The 2nd node was created too late; loses challenge automatically.
370
- completeChallengeImpl(stakers[0], stakers[1]);
371
- return;
202
+ (bytes32 newAssertionHash, bool overflowAssertion) =
203
+ createNewAssertion(assertion, prevAssertion, expectedAssertionHash);
204
+ _stakerMap[msg.sender].latestStakedAssertion = newAssertionHash;
205
+
206
+ if (!overflowAssertion) {
207
+ uint256 timeSincePrev = block.number - getAssertionStorage(prevAssertion).createdAtBlock;
208
+ // Verify that assertion meets the minimum Delta time requirement
209
+ require(timeSincePrev >= minimumAssertionPeriod, "TIME_DELTA");
372
210
  }
373
- // Start a challenge between staker1 and staker2. Staker1 will defend the correctness of node1, and staker2 will challenge it.
374
- uint64 challengeIndex = createChallengeHelper(
375
- stakers,
376
- machineStatuses,
377
- globalStates,
378
- numBlocks,
379
- wasmModuleRoots,
380
- // convert from block counts to real second based timestamps
381
- (commonEndBlock - proposedBlocks[0]) * ETH_POS_BLOCK_TIME,
382
- (commonEndBlock - proposedBlocks[1]) * ETH_POS_BLOCK_TIME
383
- ); // trusted external call
384
-
385
- challengeStarted(stakers[0], stakers[1], challengeIndex);
386
-
387
- emit RollupChallengeStarted(challengeIndex, stakers[0], stakers[1], nodeNums[0]);
388
- }
389
211
 
390
- function createChallengeHelper(
391
- address[2] calldata stakers,
392
- MachineStatus[2] calldata machineStatuses,
393
- GlobalState[2] calldata globalStates,
394
- uint64 numBlocks,
395
- bytes32[2] calldata wasmModuleRoots,
396
- uint256 asserterTimeLeft,
397
- uint256 challengerTimeLeft
398
- ) internal returns (uint64) {
399
- return
400
- challengeManager.createChallenge(
401
- wasmModuleRoots[0],
402
- machineStatuses,
403
- globalStates,
404
- numBlocks,
405
- stakers[0],
406
- stakers[1],
407
- asserterTimeLeft,
408
- challengerTimeLeft
212
+ if (!getAssertionStorage(newAssertionHash).isFirstChild) {
213
+ // We assume assertion.beforeStateData is valid here as it will be validated in createNewAssertion
214
+ // only 1 of the children can be confirmed and get their stake refunded
215
+ // so we send the other children's stake to the loserStakeEscrow
216
+ // NOTE: if the losing staker have staked more than requiredStake, the excess stake will be stuck
217
+ IERC20(stakeToken).safeTransfer(
218
+ loserStakeEscrow, assertion.beforeStateData.configData.requiredStake
409
219
  );
220
+ }
410
221
  }
411
222
 
412
223
  /**
413
- * @notice Inform the rollup that the challenge between the given stakers is completed
414
- * @param winningStaker Address of the winning staker
415
- * @param losingStaker Address of the losing staker
224
+ * @notice Refund a staker that is currently staked on an assertion that either has a chlid assertion or is the latest confirmed assertion.
416
225
  */
417
- function completeChallenge(
418
- uint256 challengeIndex,
419
- address winningStaker,
420
- address losingStaker
421
- ) external override whenNotPaused {
422
- // Only the challenge manager contract can call this to declare the winner and loser
423
- require(msg.sender == address(challengeManager), "WRONG_SENDER");
424
- require(challengeIndex == inChallenge(winningStaker, losingStaker), "NOT_IN_CHAL");
425
- completeChallengeImpl(winningStaker, losingStaker);
426
- }
427
-
428
- function completeChallengeImpl(address winningStaker, address losingStaker) private {
429
- uint256 remainingLoserStake = amountStaked(losingStaker);
430
- uint256 winnerStake = amountStaked(winningStaker);
431
- if (remainingLoserStake > winnerStake) {
432
- // If loser has a higher stake than the winner, refund the difference
433
- remainingLoserStake -= reduceStakeTo(losingStaker, winnerStake);
434
- }
435
-
436
- // Reward the winner with half the remaining stake
437
- uint256 amountWon = remainingLoserStake / 2;
438
- increaseStakeBy(winningStaker, amountWon);
439
- remainingLoserStake -= amountWon;
440
- // We deliberately leave loser in challenge state to prevent them from
441
- // doing certain thing that are allowed only to parties not in a challenge
442
- clearChallenge(winningStaker);
443
- // Credit the other half to the loserStakeEscrow address
444
- increaseWithdrawableFunds(loserStakeEscrow, remainingLoserStake);
445
- // Turning loser into zombie renders the loser's remaining stake inaccessible
446
- turnIntoZombie(losingStaker);
226
+ function returnOldDeposit() external override onlyValidator(msg.sender) whenNotPaused {
227
+ _requireInactiveAndWithdrawStaker(msg.sender);
447
228
  }
448
229
 
449
230
  /**
450
- * @notice Remove the given zombie from nodes it is staked on, moving backwords from the latest node it is staked on
451
- * @param zombieNum Index of the zombie to remove
452
- * @param maxNodes Maximum number of nodes to remove the zombie from (to limit the cost of this transaction)
231
+ * @notice From the staker's withdrawal address,
232
+ * refund a staker that is currently staked on an assertion that either has a chlid assertion or is the latest confirmed assertion.
453
233
  */
454
- function removeZombie(uint256 zombieNum, uint256 maxNodes)
455
- external
456
- onlyValidator
457
- whenNotPaused
458
- {
459
- require(zombieNum < zombieCount(), "NO_SUCH_ZOMBIE");
460
- address zombieStakerAddress = zombieAddress(zombieNum);
461
- uint64 latestNodeStaked = zombieLatestStakedNode(zombieNum);
462
- uint256 nodesRemoved = 0;
463
- uint256 latestConfirmedNum = latestConfirmed();
464
- while (latestNodeStaked >= latestConfirmedNum && nodesRemoved < maxNodes) {
465
- Node storage node = getNodeStorage(latestNodeStaked);
466
- removeStaker(latestNodeStaked, zombieStakerAddress);
467
- latestNodeStaked = node.prevNum;
468
- nodesRemoved++;
469
- }
470
- if (latestNodeStaked < latestConfirmedNum) {
471
- removeZombie(zombieNum);
472
- } else {
473
- zombieUpdateLatestStakedNode(zombieNum, latestNodeStaked);
474
- }
234
+ function returnOldDepositFor(
235
+ address stakerAddress
236
+ ) external override onlyValidator(stakerAddress) whenNotPaused {
237
+ require(msg.sender == withdrawalAddress(stakerAddress), "NOT_WITHDRAWAL_ADDRESS");
238
+ _requireInactiveAndWithdrawStaker(stakerAddress);
475
239
  }
476
240
 
477
241
  /**
478
- * @notice Remove any zombies whose latest stake is earlier than the latest confirmed node
479
- * @param startIndex Index in the zombie list to start removing zombies from (to limit the cost of this transaction)
242
+ * @dev Require that the staker is inactive and withdraw their stake
480
243
  */
481
- function removeOldZombies(uint256 startIndex) public onlyValidator whenNotPaused {
482
- uint256 currentZombieCount = zombieCount();
483
- uint256 latestConfirmedNum = latestConfirmed();
484
- for (uint256 i = startIndex; i < currentZombieCount; i++) {
485
- while (zombieLatestStakedNode(i) < latestConfirmedNum) {
486
- removeZombie(i);
487
- currentZombieCount--;
488
- if (i >= currentZombieCount) {
489
- return;
490
- }
491
- }
492
- }
244
+ function _requireInactiveAndWithdrawStaker(
245
+ address stakerAddress
246
+ ) internal {
247
+ requireInactiveStaker(stakerAddress);
248
+ withdrawStaker(stakerAddress);
493
249
  }
494
250
 
495
251
  /**
496
- * @notice Calculate the current amount of funds required to place a new stake in the rollup
497
- * @dev If the stake requirement get's too high, this function may start reverting due to overflow, but
498
- * that only blocks operations that should be blocked anyway
499
- * @return The current minimum stake requirement
252
+ * @notice Increase the amount staked for the given staker
253
+ * @param stakerAddress Address of the staker whose stake is increased
254
+ * @param depositAmount The amount of either eth or tokens deposited
500
255
  */
501
- function currentRequiredStake(
502
- uint256 _blockNumber,
503
- uint64 _firstUnresolvedNodeNum,
504
- uint256 _latestCreatedNode
505
- ) internal view returns (uint256) {
506
- // If there are no unresolved nodes, then you can use the base stake
507
- if (_firstUnresolvedNodeNum - 1 == _latestCreatedNode) {
508
- return baseStake;
509
- }
510
- uint256 firstUnresolvedDeadline = getNodeStorage(_firstUnresolvedNodeNum).deadlineBlock;
511
- if (_blockNumber < firstUnresolvedDeadline) {
512
- return baseStake;
513
- }
514
- uint24[10] memory numerators = [
515
- 1,
516
- 122971,
517
- 128977,
518
- 80017,
519
- 207329,
520
- 114243,
521
- 314252,
522
- 129988,
523
- 224562,
524
- 162163
525
- ];
526
- uint24[10] memory denominators = [
527
- 1,
528
- 114736,
529
- 112281,
530
- 64994,
531
- 157126,
532
- 80782,
533
- 207329,
534
- 80017,
535
- 128977,
536
- 86901
537
- ];
538
- uint256 firstUnresolvedAge = _blockNumber - firstUnresolvedDeadline;
539
- uint256 periodsPassed = (firstUnresolvedAge * 10) / confirmPeriodBlocks;
540
- uint256 baseMultiplier = 2**(periodsPassed / 10);
541
- uint256 withNumerator = baseMultiplier * numerators[periodsPassed % 10];
542
- uint256 multiplier = withNumerator / denominators[periodsPassed % 10];
543
- if (multiplier == 0) {
544
- multiplier = 1;
545
- }
546
- return baseStake * multiplier;
256
+ function _addToDeposit(
257
+ address stakerAddress,
258
+ address expectedWithdrawalAddress,
259
+ uint256 depositAmount
260
+ ) internal onlyValidator(stakerAddress) whenNotPaused {
261
+ require(isStaked(stakerAddress), "NOT_STAKED");
262
+ require(
263
+ withdrawalAddress(stakerAddress) == expectedWithdrawalAddress,
264
+ "WRONG_WITHDRAWAL_ADDRESS"
265
+ );
266
+ increaseStakeBy(stakerAddress, depositAmount);
547
267
  }
548
268
 
549
269
  /**
550
- * @notice Calculate the current amount of funds required to place a new stake in the rollup
551
- * @dev If the stake requirement get's too high, this function may start reverting due to overflow, but
552
- * that only blocks operations that should be blocked anyway
553
- * @return The current minimum stake requirement
270
+ * @notice Reduce the amount staked for the sender (difference between initial amount staked and target is creditted back to the sender).
271
+ * @param target Target amount of stake for the staker.
554
272
  */
555
- function requiredStake(
556
- uint256 blockNumber,
557
- uint64 firstUnresolvedNodeNum,
558
- uint64 latestCreatedNode
559
- ) external view returns (uint256) {
560
- return currentRequiredStake(blockNumber, firstUnresolvedNodeNum, latestCreatedNode);
561
- }
562
-
563
- function owner() external view returns (address) {
564
- return _getAdmin();
565
- }
566
-
567
- function currentRequiredStake() public view returns (uint256) {
568
- uint64 firstUnresolvedNodeNum = firstUnresolvedNode();
569
-
570
- return currentRequiredStake(block.number, firstUnresolvedNodeNum, latestNodeCreated());
273
+ function reduceDeposit(
274
+ uint256 target
275
+ ) external onlyValidator(msg.sender) whenNotPaused {
276
+ requireInactiveStaker(msg.sender);
277
+ // amount will be checked when creating an assertion
278
+ reduceStakeTo(msg.sender, target);
571
279
  }
572
280
 
573
281
  /**
574
- * @notice Calculate the number of zombies staked on the given node
575
- *
576
- * @dev This function could be uncallable if there are too many zombies. However,
577
- * removeZombie and removeOldZombies can be used to remove any zombies that exist
578
- * so that this will then be callable
579
- *
580
- * @param nodeNum The node on which to count staked zombies
581
- * @return The number of zombies staked on the node
282
+ * @notice This allow the anyTrustFastConfirmer to force confirm any pending assertion
283
+ * the anyTrustFastConfirmer is supposed to be set only on an AnyTrust chain to
284
+ * a contract that can call this function when received sufficient signatures
582
285
  */
583
- function countStakedZombies(uint64 nodeNum) public view override returns (uint256) {
584
- uint256 currentZombieCount = zombieCount();
585
- uint256 stakedZombieCount = 0;
586
- for (uint256 i = 0; i < currentZombieCount; i++) {
587
- if (nodeHasStaker(nodeNum, zombieAddress(i))) {
588
- stakedZombieCount++;
589
- }
590
- }
591
- return stakedZombieCount;
286
+ function fastConfirmAssertion(
287
+ bytes32 assertionHash,
288
+ bytes32 parentAssertionHash,
289
+ AssertionState calldata confirmState,
290
+ bytes32 inboxAcc
291
+ ) public whenNotPaused {
292
+ require(msg.sender == anyTrustFastConfirmer, "NOT_FAST_CONFIRMER");
293
+ // this skip deadline, prev, challenge validations
294
+ confirmAssertionInternal(assertionHash, parentAssertionHash, confirmState, inboxAcc);
592
295
  }
593
296
 
594
297
  /**
595
- * @notice Calculate the number of zombies staked on a child of the given node
596
- *
597
- * @dev This function could be uncallable if there are too many zombies. However,
598
- * removeZombie and removeOldZombies can be used to remove any zombies that exist
599
- * so that this will then be callable
298
+ * @notice This allow the anyTrustFastConfirmer to immediately create and confirm an assertion
299
+ * the anyTrustFastConfirmer is supposed to be set only on an AnyTrust chain to
300
+ * a contract that can call this function when received sufficient signatures
301
+ * The logic in this function is similar to stakeOnNewAssertion, but without staker checks
600
302
  *
601
- * @param nodeNum The parent node on which to count zombies staked on children
602
- * @return The number of zombies staked on children of the node
303
+ * We trust the anyTrustFastConfirmer to not call this function multiple times on the same prev,
304
+ * as doing so would result in incorrect accounting of withdrawable funds in the loserStakeEscrow.
305
+ * This is because the protocol assume there is only 1 unique confirmable child assertion.
603
306
  */
604
- function countZombiesStakedOnChildren(uint64 nodeNum) public view override returns (uint256) {
605
- uint256 currentZombieCount = zombieCount();
606
- uint256 stakedZombieCount = 0;
607
- for (uint256 i = 0; i < currentZombieCount; i++) {
608
- Zombie storage zombie = getZombieStorage(i);
609
- // If this zombie is staked on this node, but its _latest_ staked node isn't this node,
610
- // then it must be staked on a child of this node.
611
- if (
612
- zombie.latestStakedNode != nodeNum && nodeHasStaker(nodeNum, zombie.stakerAddress)
613
- ) {
614
- stakedZombieCount++;
307
+ function fastConfirmNewAssertion(
308
+ AssertionInputs calldata assertion,
309
+ bytes32 expectedAssertionHash
310
+ ) external whenNotPaused {
311
+ // Must supply expectedAssertionHash to fastConfirmNewAssertion
312
+ require(expectedAssertionHash != bytes32(0), "EXPECTED_ASSERTION_HASH");
313
+ AssertionStatus status = getAssertionStorage(expectedAssertionHash).status;
314
+
315
+ bytes32 prevAssertion = RollupLib.assertionHash(
316
+ assertion.beforeStateData.prevPrevAssertionHash,
317
+ assertion.beforeState,
318
+ assertion.beforeStateData.sequencerBatchAcc
319
+ );
320
+ getAssertionStorage(prevAssertion).requireExists();
321
+
322
+ if (status == AssertionStatus.NoAssertion) {
323
+ // If not exists, we create the new assertion
324
+ (bytes32 newAssertionHash,) =
325
+ createNewAssertion(assertion, prevAssertion, expectedAssertionHash);
326
+ if (!getAssertionStorage(newAssertionHash).isFirstChild) {
327
+ // only 1 of the children can be confirmed and get their stake refunded
328
+ // so we send the other children's stake to the loserStakeEscrow
329
+ // NOTE: if the losing staker have staked more than requiredStake, the excess stake will be stuck
330
+ IERC20(stakeToken).safeTransfer(
331
+ loserStakeEscrow, assertion.beforeStateData.configData.requiredStake
332
+ );
615
333
  }
616
334
  }
617
- return stakedZombieCount;
618
- }
619
335
 
620
- /**
621
- * @notice Verify that there are some number of nodes still unresolved
622
- */
623
- function requireUnresolvedExists() public view override {
624
- uint256 firstUnresolved = firstUnresolvedNode();
625
- require(
626
- firstUnresolved > latestConfirmed() && firstUnresolved <= latestNodeCreated(),
627
- "NO_UNRESOLVED"
336
+ // This would revert if the assertion is already confirmed
337
+ fastConfirmAssertion(
338
+ expectedAssertionHash,
339
+ prevAssertion,
340
+ assertion.afterState,
341
+ bridge.sequencerInboxAccs(assertion.afterState.globalState.getInboxPosition() - 1)
628
342
  );
629
343
  }
630
344
 
631
- function requireUnresolved(uint256 nodeNum) public view override {
632
- require(nodeNum >= firstUnresolvedNode(), "ALREADY_DECIDED");
633
- require(nodeNum <= latestNodeCreated(), "DOESNT_EXIST");
634
- }
635
-
636
- /**
637
- * @notice Verify that the given address is staked and not actively in a challenge
638
- * @param stakerAddress Address to check
639
- */
640
- function requireUnchallengedStaker(address stakerAddress) private view {
641
- require(isStaked(stakerAddress), "NOT_STAKED");
642
- require(currentChallenge(stakerAddress) == NO_CHAL_INDEX, "IN_CHAL");
643
- }
644
- }
645
-
646
- contract RollupUserLogic is AbsRollupUserLogic, IRollupUser {
647
- /// @dev the user logic just validated configuration and shouldn't write to state during init
648
- /// this allows the admin logic to ensure consistency on parameters.
649
- function initialize(address _stakeToken) external view override onlyProxy {
650
- require(_stakeToken == address(0), "NO_TOKEN_ALLOWED");
651
- require(!isERC20Enabled(), "FACET_NOT_ERC20");
652
- }
653
-
654
- /**
655
- * @notice Create a new stake on an existing node
656
- * @param nodeNum Number of the node your stake will be place one
657
- * @param nodeHash Node hash of the node with the given nodeNum
658
- */
659
- function newStakeOnExistingNode(uint64 nodeNum, bytes32 nodeHash) external payable override {
660
- _newStake(msg.value);
661
- stakeOnExistingNode(nodeNum, nodeHash);
662
- }
663
-
664
- /**
665
- * @notice Create a new stake on a new node
666
- * @param assertion Assertion describing the state change between the old node and the new one
667
- * @param expectedNodeHash Node hash of the node that will be created
668
- * @param prevNodeInboxMaxCount Total of messages in the inbox as of the previous node
669
- */
670
- function newStakeOnNewNode(
671
- Assertion calldata assertion,
672
- bytes32 expectedNodeHash,
673
- uint256 prevNodeInboxMaxCount
674
- ) external payable override {
675
- _newStake(msg.value);
676
- stakeOnNewNode(assertion, expectedNodeHash, prevNodeInboxMaxCount);
677
- }
678
-
679
- /**
680
- * @notice Increase the amount staked eth for the given staker
681
- * @param stakerAddress Address of the staker whose stake is increased
682
- */
683
- function addToDeposit(address stakerAddress)
684
- external
685
- payable
686
- override
687
- onlyValidator
688
- whenNotPaused
689
- {
690
- _addToDeposit(stakerAddress, msg.value);
345
+ function owner() external view returns (address) {
346
+ return _getAdmin();
691
347
  }
692
348
 
693
349
  /**
694
- * @notice Withdraw uncommitted funds owned by sender from the rollup chain
350
+ * @notice Deprecated, use the function with `withdrawalAddress` instead
351
+ * Using this default `withdrawalAddress` to msg.sender
695
352
  */
696
- function withdrawStakerFunds()
697
- external
698
- override
699
- onlyValidator
700
- whenNotPausedOrDeprecated
701
- returns (uint256)
702
- {
703
- uint256 amount = withdrawFunds(msg.sender);
704
- // This is safe because it occurs after all checks and effects
705
- // solhint-disable-next-line avoid-low-level-calls
706
- (bool success, ) = msg.sender.call{value: amount}("");
707
- require(success, "TRANSFER_FAILED");
708
- return amount;
709
- }
710
- }
711
-
712
- contract ERC20RollupUserLogic is AbsRollupUserLogic, IRollupUserERC20 {
713
- /// @dev the user logic just validated configuration and shouldn't write to state during init
714
- /// this allows the admin logic to ensure consistency on parameters.
715
- function initialize(address _stakeToken) external view override onlyProxy {
716
- require(_stakeToken != address(0), "NEED_STAKE_TOKEN");
717
- require(isERC20Enabled(), "FACET_NOT_ERC20");
353
+ function newStakeOnNewAssertion(
354
+ uint256 tokenAmount,
355
+ AssertionInputs calldata assertion,
356
+ bytes32 expectedAssertionHash
357
+ ) external {
358
+ newStakeOnNewAssertion(tokenAmount, assertion, expectedAssertionHash, msg.sender);
718
359
  }
719
360
 
720
361
  /**
721
- * @notice Create a new stake on an existing node
362
+ * @notice Create a new stake on a new assertion
722
363
  * @param tokenAmount Amount of the rollups staking token to stake
723
- * @param nodeNum Number of the node your stake will be place one
724
- * @param nodeHash Node hash of the node with the given nodeNum
364
+ * @param assertion Assertion describing the state change between the old assertion and the new one
365
+ * @param expectedAssertionHash Assertion hash of the assertion that will be created
366
+ * @param _withdrawalAddress The address the send the stake back upon withdrawal
725
367
  */
726
- function newStakeOnExistingNode(
368
+ function newStakeOnNewAssertion(
727
369
  uint256 tokenAmount,
728
- uint64 nodeNum,
729
- bytes32 nodeHash
730
- ) external override {
731
- _newStake(tokenAmount);
732
- stakeOnExistingNode(nodeNum, nodeHash);
370
+ AssertionInputs calldata assertion,
371
+ bytes32 expectedAssertionHash,
372
+ address _withdrawalAddress
373
+ ) public {
374
+ require(_withdrawalAddress != address(0), "EMPTY_WITHDRAWAL_ADDRESS");
375
+ // _newStake makes sure the validator is whitelisted if the whitelist is enabled
376
+ _newStake(tokenAmount, _withdrawalAddress);
377
+ stakeOnNewAssertion(assertion, expectedAssertionHash);
733
378
  /// @dev This is an external call, safe because it's at the end of the function
734
379
  receiveTokens(tokenAmount);
735
380
  }
736
381
 
737
382
  /**
738
- * @notice Create a new stake on a new node
739
- * @param tokenAmount Amount of the rollups staking token to stake
740
- * @param assertion Assertion describing the state change between the old node and the new one
741
- * @param expectedNodeHash Node hash of the node that will be created
742
- * @param prevNodeInboxMaxCount Total of messages in the inbox as of the previous node
383
+ * @notice Create a new stake without creating a new assertion.
384
+ * Token amount can be zero if the staker wants to use `addToDeposit` from another account
385
+ * @param tokenAmount Amount to stake (can be zero)
386
+ * @param _withdrawalAddress The address the send the stake back upon withdrawal
743
387
  */
744
- function newStakeOnNewNode(
745
- uint256 tokenAmount,
746
- Assertion calldata assertion,
747
- bytes32 expectedNodeHash,
748
- uint256 prevNodeInboxMaxCount
749
- ) external override {
750
- _newStake(tokenAmount);
751
- stakeOnNewNode(assertion, expectedNodeHash, prevNodeInboxMaxCount);
388
+ function newStake(uint256 tokenAmount, address _withdrawalAddress) external whenNotPaused {
389
+ require(_withdrawalAddress != address(0), "EMPTY_WITHDRAWAL_ADDRESS");
390
+ // _newStake makes sure the validator is whitelisted if the whitelist is enabled
391
+ _newStake(tokenAmount, _withdrawalAddress);
752
392
  /// @dev This is an external call, safe because it's at the end of the function
753
- receiveTokens(tokenAmount);
393
+ if (tokenAmount > 0) receiveTokens(tokenAmount);
754
394
  }
755
395
 
756
396
  /**
757
397
  * @notice Increase the amount staked tokens for the given staker
758
398
  * @param stakerAddress Address of the staker whose stake is increased
399
+ * @param expectedWithdrawalAddress The expected withdrawal address of the staker (protects depositor from a staker changing their withdrawal address)
759
400
  * @param tokenAmount the amount of tokens staked
760
401
  */
761
- function addToDeposit(address stakerAddress, uint256 tokenAmount)
762
- external
763
- onlyValidator
764
- whenNotPaused
765
- {
766
- _addToDeposit(stakerAddress, tokenAmount);
402
+ function addToDeposit(
403
+ address stakerAddress,
404
+ address expectedWithdrawalAddress,
405
+ uint256 tokenAmount
406
+ ) external whenNotPaused {
407
+ _addToDeposit(stakerAddress, expectedWithdrawalAddress, tokenAmount);
767
408
  /// @dev This is an external call, safe because it's at the end of the function
768
409
  receiveTokens(tokenAmount);
769
410
  }
@@ -771,23 +412,17 @@ contract ERC20RollupUserLogic is AbsRollupUserLogic, IRollupUserERC20 {
771
412
  /**
772
413
  * @notice Withdraw uncommitted funds owned by sender from the rollup chain
773
414
  */
774
- function withdrawStakerFunds()
775
- external
776
- override
777
- onlyValidator
778
- whenNotPausedOrDeprecated
779
- returns (uint256)
780
- {
415
+ function withdrawStakerFunds() external override whenNotPaused returns (uint256) {
781
416
  uint256 amount = withdrawFunds(msg.sender);
417
+ require(amount > 0, "NO_FUNDS_TO_WITHDRAW");
782
418
  // This is safe because it occurs after all checks and effects
783
- require(IERC20Upgradeable(stakeToken).transfer(msg.sender, amount), "TRANSFER_FAILED");
419
+ IERC20(stakeToken).safeTransfer(msg.sender, amount);
784
420
  return amount;
785
421
  }
786
422
 
787
- function receiveTokens(uint256 tokenAmount) private {
788
- require(
789
- IERC20Upgradeable(stakeToken).transferFrom(msg.sender, address(this), tokenAmount),
790
- "TRANSFER_FAIL"
791
- );
423
+ function receiveTokens(
424
+ uint256 tokenAmount
425
+ ) private {
426
+ IERC20(stakeToken).safeTransferFrom(msg.sender, address(this), tokenAmount);
792
427
  }
793
428
  }