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

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