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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (503) hide show
  1. package/build/contracts/@openzeppelin/contracts/access/Ownable.sol/Ownable.dbg.json +1 -1
  2. package/build/contracts/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.dbg.json +1 -1
  3. package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.dbg.json +1 -1
  4. package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.json +2 -2
  5. package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol/ERC1967Upgrade.dbg.json +1 -1
  6. package/build/contracts/@openzeppelin/contracts/proxy/Proxy.sol/Proxy.dbg.json +1 -1
  7. package/build/contracts/@openzeppelin/contracts/proxy/beacon/IBeacon.sol/IBeacon.dbg.json +1 -1
  8. package/build/contracts/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol/UpgradeableBeacon.dbg.json +1 -1
  9. package/build/contracts/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol/UpgradeableBeacon.json +2 -2
  10. package/build/contracts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.dbg.json +1 -1
  11. package/build/contracts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +2 -2
  12. package/build/contracts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.dbg.json +1 -1
  13. package/build/contracts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +2 -2
  14. package/build/contracts/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol/UUPSUpgradeable.dbg.json +1 -1
  15. package/build/contracts/@openzeppelin/contracts/security/ReentrancyGuard.sol/ReentrancyGuard.dbg.json +1 -1
  16. package/build/contracts/@openzeppelin/contracts/token/ERC20/ERC20.sol/ERC20.dbg.json +1 -1
  17. package/build/contracts/@openzeppelin/contracts/token/ERC20/ERC20.sol/ERC20.json +2 -2
  18. package/build/contracts/@openzeppelin/contracts/token/ERC20/IERC20.sol/IERC20.dbg.json +1 -1
  19. package/build/contracts/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol/IERC20Metadata.dbg.json +1 -1
  20. package/build/contracts/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit.dbg.json +4 -0
  21. package/build/contracts/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit.json +86 -0
  22. package/build/contracts/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol/SafeERC20.dbg.json +1 -1
  23. package/build/contracts/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol/SafeERC20.json +2 -2
  24. package/build/contracts/@openzeppelin/contracts/utils/Address.sol/Address.dbg.json +1 -1
  25. package/build/contracts/@openzeppelin/contracts/utils/Address.sol/Address.json +2 -2
  26. package/build/contracts/@openzeppelin/contracts/utils/Context.sol/Context.dbg.json +1 -1
  27. package/build/contracts/@openzeppelin/contracts/utils/Create2.sol/Create2.dbg.json +4 -0
  28. package/build/contracts/@openzeppelin/contracts/utils/Create2.sol/Create2.json +10 -0
  29. package/build/contracts/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.dbg.json +1 -1
  30. package/build/contracts/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.json +2 -2
  31. package/build/contracts/@openzeppelin/contracts/utils/Strings.sol/Strings.dbg.json +1 -1
  32. package/build/contracts/@openzeppelin/contracts/utils/Strings.sol/Strings.json +2 -2
  33. package/build/contracts/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol/AccessControlUpgradeable.dbg.json +1 -1
  34. package/build/contracts/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol/AccessControlUpgradeable.json +13 -0
  35. package/build/contracts/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol/IAccessControlUpgradeable.dbg.json +1 -1
  36. package/build/contracts/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol/OwnableUpgradeable.dbg.json +1 -1
  37. package/build/contracts/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol/OwnableUpgradeable.json +13 -0
  38. package/build/contracts/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol/Initializable.dbg.json +1 -1
  39. package/build/contracts/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol/Initializable.json +15 -1
  40. package/build/contracts/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol/PausableUpgradeable.dbg.json +1 -1
  41. package/build/contracts/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol/PausableUpgradeable.json +13 -0
  42. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol/AddressUpgradeable.dbg.json +1 -1
  43. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol/AddressUpgradeable.json +2 -2
  44. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol/ContextUpgradeable.dbg.json +1 -1
  45. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol/ContextUpgradeable.json +15 -1
  46. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/Create2Upgradeable.sol/Create2Upgradeable.dbg.json +4 -0
  47. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/Create2Upgradeable.sol/Create2Upgradeable.json +10 -0
  48. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol/StorageSlotUpgradeable.dbg.json +1 -1
  49. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol/StorageSlotUpgradeable.json +2 -2
  50. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol/StringsUpgradeable.dbg.json +1 -1
  51. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol/StringsUpgradeable.json +2 -2
  52. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol/ERC165Upgradeable.dbg.json +1 -1
  53. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol/ERC165Upgradeable.json +13 -0
  54. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol/IERC165Upgradeable.dbg.json +1 -1
  55. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol/EnumerableSetUpgradeable.dbg.json +4 -0
  56. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol/EnumerableSetUpgradeable.json +10 -0
  57. package/build/contracts/src/assertionStakingPool/AbsBoldStakingPool.sol/AbsBoldStakingPool.dbg.json +4 -0
  58. package/build/contracts/{@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol/IERC20Upgradeable.json → src/assertionStakingPool/AbsBoldStakingPool.sol/AbsBoldStakingPool.json} +41 -95
  59. package/build/contracts/src/assertionStakingPool/AssertionStakingPool.sol/AssertionStakingPool.dbg.json +4 -0
  60. package/build/contracts/src/assertionStakingPool/AssertionStakingPool.sol/AssertionStakingPool.json +340 -0
  61. package/build/contracts/src/assertionStakingPool/AssertionStakingPoolCreator.sol/AssertionStakingPoolCreator.dbg.json +4 -0
  62. package/build/contracts/src/assertionStakingPool/AssertionStakingPoolCreator.sol/AssertionStakingPoolCreator.json +89 -0
  63. package/build/contracts/src/assertionStakingPool/EdgeStakingPool.sol/EdgeStakingPool.dbg.json +4 -0
  64. package/build/contracts/src/assertionStakingPool/EdgeStakingPool.sol/EdgeStakingPool.json +248 -0
  65. package/build/contracts/src/assertionStakingPool/EdgeStakingPoolCreator.sol/EdgeStakingPoolCreator.dbg.json +4 -0
  66. package/build/contracts/src/assertionStakingPool/EdgeStakingPoolCreator.sol/EdgeStakingPoolCreator.json +83 -0
  67. package/build/contracts/src/assertionStakingPool/StakingPoolCreatorUtils.sol/StakingPoolCreatorUtils.dbg.json +4 -0
  68. package/build/contracts/src/assertionStakingPool/StakingPoolCreatorUtils.sol/StakingPoolCreatorUtils.json +16 -0
  69. package/build/contracts/src/assertionStakingPool/interfaces/IAbsBoldStakingPool.sol/IAbsBoldStakingPool.dbg.json +4 -0
  70. package/build/contracts/src/assertionStakingPool/interfaces/IAbsBoldStakingPool.sol/IAbsBoldStakingPool.json +140 -0
  71. package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPool.sol/IAssertionStakingPool.dbg.json +4 -0
  72. package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPool.sol/IAssertionStakingPool.json +324 -0
  73. package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPoolCreator.sol/IAssertionStakingPoolCreator.dbg.json +4 -0
  74. package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPoolCreator.sol/IAssertionStakingPoolCreator.json +84 -0
  75. package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPool.sol/IEdgeStakingPool.dbg.json +4 -0
  76. package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPool.sol/IEdgeStakingPool.json +232 -0
  77. package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPoolCreator.sol/IEdgeStakingPoolCreator.dbg.json +4 -0
  78. package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPoolCreator.sol/IEdgeStakingPoolCreator.json +78 -0
  79. package/build/contracts/src/bridge/AbsBridge.sol/AbsBridge.dbg.json +1 -1
  80. package/build/contracts/src/bridge/AbsBridge.sol/AbsBridge.json +13 -0
  81. package/build/contracts/src/bridge/AbsInbox.sol/AbsInbox.dbg.json +1 -1
  82. package/build/contracts/src/bridge/AbsInbox.sol/AbsInbox.json +20 -7
  83. package/build/contracts/src/bridge/AbsOutbox.sol/AbsOutbox.dbg.json +1 -1
  84. package/build/contracts/src/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  85. package/build/contracts/src/bridge/Bridge.sol/Bridge.json +15 -2
  86. package/build/contracts/src/bridge/DelayBuffer.sol/DelayBuffer.dbg.json +4 -0
  87. package/build/contracts/src/bridge/DelayBuffer.sol/DelayBuffer.json +24 -0
  88. package/build/contracts/src/bridge/ERC20Bridge.sol/ERC20Bridge.dbg.json +1 -1
  89. package/build/contracts/src/bridge/ERC20Bridge.sol/ERC20Bridge.json +15 -2
  90. package/build/contracts/src/bridge/ERC20Inbox.sol/ERC20Inbox.dbg.json +1 -1
  91. package/build/contracts/src/bridge/ERC20Inbox.sol/ERC20Inbox.json +22 -9
  92. package/build/contracts/src/bridge/ERC20Outbox.sol/ERC20Outbox.dbg.json +1 -1
  93. package/build/contracts/src/bridge/ERC20Outbox.sol/ERC20Outbox.json +2 -2
  94. package/build/contracts/src/bridge/GasRefunder.sol/GasRefunder.dbg.json +1 -1
  95. package/build/contracts/src/bridge/GasRefunder.sol/GasRefunder.json +2 -2
  96. package/build/contracts/src/bridge/IBridge.sol/IBridge.dbg.json +1 -1
  97. package/build/contracts/src/bridge/IDelayedMessageProvider.sol/IDelayedMessageProvider.dbg.json +1 -1
  98. package/build/contracts/src/bridge/IERC20Bridge.sol/IERC20Bridge.dbg.json +1 -1
  99. package/build/contracts/src/bridge/IERC20Inbox.sol/IERC20Inbox.dbg.json +1 -1
  100. package/build/contracts/src/bridge/IERC20Inbox.sol/IERC20Inbox.json +1 -1
  101. package/build/contracts/src/bridge/IEthBridge.sol/IEthBridge.dbg.json +1 -1
  102. package/build/contracts/src/bridge/IInbox.sol/IInbox.dbg.json +1 -1
  103. package/build/contracts/src/bridge/IInbox.sol/IInbox.json +1 -1
  104. package/build/contracts/src/bridge/IInboxBase.sol/IInboxBase.dbg.json +1 -1
  105. package/build/contracts/src/bridge/IInboxBase.sol/IInboxBase.json +1 -1
  106. package/build/contracts/src/bridge/IOutbox.sol/IOutbox.dbg.json +1 -1
  107. package/build/contracts/src/bridge/IOwnable.sol/IOwnable.dbg.json +1 -1
  108. package/build/contracts/src/bridge/ISequencerInbox.sol/ISequencerInbox.dbg.json +1 -1
  109. package/build/contracts/src/bridge/ISequencerInbox.sol/ISequencerInbox.json +441 -0
  110. package/build/contracts/src/bridge/Inbox.sol/Inbox.dbg.json +1 -1
  111. package/build/contracts/src/bridge/Inbox.sol/Inbox.json +22 -4
  112. package/build/contracts/src/bridge/Messages.sol/Messages.dbg.json +1 -1
  113. package/build/contracts/src/bridge/Messages.sol/Messages.json +2 -2
  114. package/build/contracts/src/bridge/Outbox.sol/Outbox.dbg.json +1 -1
  115. package/build/contracts/src/bridge/Outbox.sol/Outbox.json +2 -2
  116. package/build/contracts/src/bridge/SequencerInbox.sol/SequencerInbox.dbg.json +1 -1
  117. package/build/contracts/src/bridge/SequencerInbox.sol/SequencerInbox.json +564 -7
  118. package/build/contracts/src/chain/CacheManager.sol/CacheManager.dbg.json +1 -1
  119. package/build/contracts/src/chain/CacheManager.sol/CacheManager.json +15 -2
  120. package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/EdgeChallengeManager.dbg.json +4 -0
  121. package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/EdgeChallengeManager.json +1631 -0
  122. package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/IEdgeChallengeManager.dbg.json +4 -0
  123. package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/IEdgeChallengeManager.json +762 -0
  124. package/build/contracts/src/challengeV2/IAssertionChain.sol/IAssertionChain.dbg.json +4 -0
  125. package/build/contracts/src/challengeV2/IAssertionChain.sol/IAssertionChain.json +247 -0
  126. package/build/contracts/src/challengeV2/libraries/ArrayUtilsLib.sol/ArrayUtilsLib.dbg.json +4 -0
  127. package/build/contracts/src/challengeV2/libraries/ArrayUtilsLib.sol/ArrayUtilsLib.json +10 -0
  128. package/build/contracts/src/challengeV2/libraries/ChallengeEdgeLib.sol/ChallengeEdgeLib.dbg.json +4 -0
  129. package/build/contracts/src/challengeV2/libraries/ChallengeEdgeLib.sol/ChallengeEdgeLib.json +10 -0
  130. package/build/contracts/src/challengeV2/libraries/EdgeChallengeManagerLib.sol/EdgeChallengeManagerLib.dbg.json +4 -0
  131. package/build/contracts/src/challengeV2/libraries/EdgeChallengeManagerLib.sol/EdgeChallengeManagerLib.json +24 -0
  132. package/build/contracts/src/challengeV2/libraries/MerkleTreeAccumulatorLib.sol/MerkleTreeAccumulatorLib.dbg.json +4 -0
  133. package/build/contracts/src/challengeV2/libraries/MerkleTreeAccumulatorLib.sol/MerkleTreeAccumulatorLib.json +24 -0
  134. package/build/contracts/src/challengeV2/libraries/UintUtilsLib.sol/UintUtilsLib.dbg.json +4 -0
  135. package/build/contracts/src/challengeV2/libraries/UintUtilsLib.sol/UintUtilsLib.json +10 -0
  136. package/build/contracts/src/libraries/AddressAliasHelper.sol/AddressAliasHelper.dbg.json +1 -1
  137. package/build/contracts/src/libraries/AddressAliasHelper.sol/AddressAliasHelper.json +2 -2
  138. package/build/contracts/src/libraries/AdminFallbackProxy.sol/AdminFallbackProxy.dbg.json +1 -1
  139. package/build/contracts/src/libraries/AdminFallbackProxy.sol/AdminFallbackProxy.json +2 -2
  140. package/build/contracts/src/libraries/AdminFallbackProxy.sol/DoubleLogicERC1967Upgrade.dbg.json +1 -1
  141. package/build/contracts/src/libraries/ArbitrumChecker.sol/ArbitrumChecker.dbg.json +1 -1
  142. package/build/contracts/src/libraries/ArbitrumChecker.sol/ArbitrumChecker.json +2 -2
  143. package/build/contracts/src/libraries/CryptographyPrimitives.sol/CryptographyPrimitives.dbg.json +1 -1
  144. package/build/contracts/src/libraries/CryptographyPrimitives.sol/CryptographyPrimitives.json +2 -2
  145. package/build/contracts/src/libraries/DecimalsConverterHelper.sol/DecimalsConverterHelper.dbg.json +1 -1
  146. package/build/contracts/src/libraries/DecimalsConverterHelper.sol/DecimalsConverterHelper.json +2 -2
  147. package/build/contracts/src/libraries/DelegateCallAware.sol/DelegateCallAware.dbg.json +1 -1
  148. package/build/contracts/src/libraries/DoubleLogicUUPSUpgradeable.sol/DoubleLogicUUPSUpgradeable.dbg.json +1 -1
  149. package/build/contracts/src/libraries/GasRefundEnabled.sol/GasRefundEnabled.dbg.json +1 -1
  150. package/build/contracts/src/libraries/IGasRefunder.sol/IGasRefunder.dbg.json +1 -1
  151. package/build/contracts/src/libraries/IReader4844.sol/IReader4844.dbg.json +1 -1
  152. package/build/contracts/src/libraries/MerkleLib.sol/MerkleLib.dbg.json +1 -1
  153. package/build/contracts/src/libraries/MerkleLib.sol/MerkleLib.json +2 -2
  154. package/build/contracts/src/libraries/UUPSNotUpgradeable.sol/UUPSNotUpgradeable.dbg.json +1 -1
  155. package/build/contracts/src/mocks/Benchmarks.sol/Benchmarks.dbg.json +1 -1
  156. package/build/contracts/src/mocks/Benchmarks.sol/Benchmarks.json +2 -2
  157. package/build/contracts/src/mocks/BridgeStub.sol/BridgeStub.dbg.json +1 -1
  158. package/build/contracts/src/mocks/BridgeStub.sol/BridgeStub.json +8 -8
  159. package/build/contracts/src/mocks/BridgeUnproxied.sol/BridgeUnproxied.dbg.json +1 -1
  160. package/build/contracts/src/mocks/BridgeUnproxied.sol/BridgeUnproxied.json +28 -2
  161. package/build/contracts/src/mocks/InboxStub.sol/InboxStub.dbg.json +1 -1
  162. package/build/contracts/src/mocks/InboxStub.sol/InboxStub.json +2 -2
  163. package/build/contracts/src/mocks/MerkleTreeAccess.sol/MerkleTreeAccess.dbg.json +4 -0
  164. package/build/contracts/src/mocks/MerkleTreeAccess.sol/MerkleTreeAccess.json +227 -0
  165. package/build/contracts/src/mocks/MockRollupEventInbox.sol/MockRollupEventInbox.dbg.json +4 -0
  166. package/build/contracts/src/mocks/MockRollupEventInbox.sol/MockRollupEventInbox.json +133 -0
  167. package/build/contracts/src/mocks/MultiCallTest.sol/MultiCallTest.dbg.json +1 -1
  168. package/build/contracts/src/mocks/MultiCallTest.sol/MultiCallTest.json +2 -2
  169. package/build/contracts/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol/PendingBlkTimeAndNrAdvanceCheck.dbg.json +1 -1
  170. package/build/contracts/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol/PendingBlkTimeAndNrAdvanceCheck.json +2 -2
  171. package/build/contracts/src/mocks/Program.sol/ProgramTest.dbg.json +1 -1
  172. package/build/contracts/src/mocks/Program.sol/ProgramTest.json +2 -2
  173. package/build/contracts/src/mocks/ProxyAdminForBinding.sol/ProxyAdminForBinding.dbg.json +1 -1
  174. package/build/contracts/src/mocks/ProxyAdminForBinding.sol/ProxyAdminForBinding.json +2 -2
  175. package/build/contracts/src/mocks/SdkStorage.sol/SdkStorage.dbg.json +1 -1
  176. package/build/contracts/src/mocks/SdkStorage.sol/SdkStorage.json +2 -2
  177. package/build/contracts/src/mocks/SequencerInboxBlobMock.sol/SequencerInboxBlobMock.dbg.json +4 -0
  178. package/build/contracts/src/mocks/SequencerInboxBlobMock.sol/SequencerInboxBlobMock.json +1632 -0
  179. package/build/contracts/src/mocks/SequencerInboxStub.sol/SequencerInboxStub.dbg.json +1 -1
  180. package/build/contracts/src/mocks/SequencerInboxStub.sol/SequencerInboxStub.json +564 -7
  181. package/build/contracts/src/mocks/Simple.sol/Simple.dbg.json +1 -1
  182. package/build/contracts/src/mocks/Simple.sol/Simple.json +2 -2
  183. package/build/contracts/src/mocks/SimpleCacheManager.sol/SimpleCacheManager.dbg.json +1 -1
  184. package/build/contracts/src/mocks/SimpleCacheManager.sol/SimpleCacheManager.json +2 -2
  185. package/build/contracts/src/mocks/SimpleOneStepProofEntry.sol/SimpleOneStepProofEntry.dbg.json +4 -0
  186. package/build/contracts/src/mocks/SimpleOneStepProofEntry.sol/SimpleOneStepProofEntry.json +142 -0
  187. package/build/contracts/src/mocks/SimpleProxy.sol/SimpleProxy.dbg.json +1 -1
  188. package/build/contracts/src/mocks/SimpleProxy.sol/SimpleProxy.json +2 -2
  189. package/build/contracts/src/mocks/TestWETH9.sol/IWETH9.dbg.json +4 -0
  190. package/build/contracts/src/mocks/TestWETH9.sol/IWETH9.json +31 -0
  191. package/build/contracts/src/mocks/TestWETH9.sol/TestWETH9.dbg.json +4 -0
  192. package/build/contracts/src/mocks/TestWETH9.sol/TestWETH9.json +317 -0
  193. package/build/contracts/src/mocks/UpgradeExecutorMock.sol/UpgradeExecutorMock.dbg.json +1 -1
  194. package/build/contracts/src/mocks/UpgradeExecutorMock.sol/UpgradeExecutorMock.json +15 -2
  195. package/build/contracts/src/node-interface/NodeInterface.sol/NodeInterface.dbg.json +1 -1
  196. package/build/contracts/src/node-interface/NodeInterfaceDebug.sol/NodeInterfaceDebug.dbg.json +1 -1
  197. package/build/contracts/src/osp/HashProofHelper.sol/HashProofHelper.dbg.json +1 -1
  198. package/build/contracts/src/osp/HashProofHelper.sol/HashProofHelper.json +2 -2
  199. package/build/contracts/src/osp/IOneStepProofEntry.sol/IOneStepProofEntry.dbg.json +1 -1
  200. package/build/contracts/src/osp/IOneStepProofEntry.sol/IOneStepProofEntry.json +33 -9
  201. package/build/contracts/src/osp/IOneStepProofEntry.sol/OneStepProofEntryLib.dbg.json +1 -1
  202. package/build/contracts/src/osp/IOneStepProofEntry.sol/OneStepProofEntryLib.json +2 -2
  203. package/build/contracts/src/osp/IOneStepProver.sol/IOneStepProver.dbg.json +1 -1
  204. package/build/contracts/src/osp/IOneStepProver.sol/IOneStepProver.json +5 -0
  205. package/build/contracts/src/osp/OneStepProofEntry.sol/OneStepProofEntry.dbg.json +1 -1
  206. package/build/contracts/src/osp/OneStepProofEntry.sol/OneStepProofEntry.json +35 -11
  207. package/build/contracts/src/osp/OneStepProver0.sol/OneStepProver0.dbg.json +1 -1
  208. package/build/contracts/src/osp/OneStepProver0.sol/OneStepProver0.json +7 -2
  209. package/build/contracts/src/osp/OneStepProverHostIo.sol/OneStepProverHostIo.dbg.json +1 -1
  210. package/build/contracts/src/osp/OneStepProverHostIo.sol/OneStepProverHostIo.json +7 -2
  211. package/build/contracts/src/osp/OneStepProverMath.sol/OneStepProverMath.dbg.json +1 -1
  212. package/build/contracts/src/osp/OneStepProverMath.sol/OneStepProverMath.json +7 -2
  213. package/build/contracts/src/osp/OneStepProverMemory.sol/OneStepProverMemory.dbg.json +1 -1
  214. package/build/contracts/src/osp/OneStepProverMemory.sol/OneStepProverMemory.json +7 -2
  215. package/build/contracts/src/precompiles/ArbAddressTable.sol/ArbAddressTable.dbg.json +1 -1
  216. package/build/contracts/src/precompiles/ArbAggregator.sol/ArbAggregator.dbg.json +1 -1
  217. package/build/contracts/src/precompiles/ArbBLS.sol/ArbBLS.dbg.json +1 -1
  218. package/build/contracts/src/precompiles/ArbDebug.sol/ArbDebug.dbg.json +1 -1
  219. package/build/contracts/src/precompiles/ArbFunctionTable.sol/ArbFunctionTable.dbg.json +1 -1
  220. package/build/contracts/src/precompiles/ArbGasInfo.sol/ArbGasInfo.dbg.json +1 -1
  221. package/build/contracts/src/precompiles/ArbInfo.sol/ArbInfo.dbg.json +1 -1
  222. package/build/contracts/src/precompiles/ArbOwner.sol/ArbOwner.dbg.json +1 -1
  223. package/build/contracts/src/precompiles/ArbOwnerPublic.sol/ArbOwnerPublic.dbg.json +1 -1
  224. package/build/contracts/src/precompiles/ArbRetryableTx.sol/ArbRetryableTx.dbg.json +1 -1
  225. package/build/contracts/src/precompiles/ArbStatistics.sol/ArbStatistics.dbg.json +1 -1
  226. package/build/contracts/src/precompiles/ArbSys.sol/ArbSys.dbg.json +1 -1
  227. package/build/contracts/src/precompiles/ArbWasm.sol/ArbWasm.dbg.json +1 -1
  228. package/build/contracts/src/precompiles/ArbWasmCache.sol/ArbWasmCache.dbg.json +1 -1
  229. package/build/contracts/src/precompiles/ArbosActs.sol/ArbosActs.dbg.json +1 -1
  230. package/build/contracts/src/precompiles/ArbosTest.sol/ArbosTest.dbg.json +1 -1
  231. package/build/contracts/src/rollup/AbsRollupEventInbox.sol/AbsRollupEventInbox.dbg.json +1 -1
  232. package/build/contracts/src/rollup/Assertion.sol/AssertionNodeLib.dbg.json +4 -0
  233. package/build/contracts/src/rollup/{Node.sol/NodeLib.json → Assertion.sol/AssertionNodeLib.json} +4 -4
  234. package/build/contracts/src/rollup/AssertionState.sol/AssertionStateLib.dbg.json +4 -0
  235. package/build/contracts/src/{challenge/ChallengeLib.sol/ChallengeLib.json → rollup/AssertionState.sol/AssertionStateLib.json} +4 -4
  236. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/BOLDUpgradeAction.dbg.json +4 -0
  237. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/BOLDUpgradeAction.json +807 -0
  238. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ConstantArrayStorage.dbg.json +4 -0
  239. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ConstantArrayStorage.json +35 -0
  240. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollup.dbg.json +4 -0
  241. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollup.json +361 -0
  242. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollupAdmin.dbg.json +4 -0
  243. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollupAdmin.json +38 -0
  244. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ISeqInboxPostUpgradeInit.dbg.json +4 -0
  245. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ISeqInboxPostUpgradeInit.json +41 -0
  246. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/RollupReader.dbg.json +4 -0
  247. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/RollupReader.json +385 -0
  248. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/StateHashPreImageLookup.dbg.json +4 -0
  249. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/StateHashPreImageLookup.json +203 -0
  250. package/build/contracts/src/rollup/BridgeCreator.sol/BridgeCreator.dbg.json +1 -1
  251. package/build/contracts/src/rollup/BridgeCreator.sol/BridgeCreator.json +62 -10
  252. package/build/contracts/src/rollup/DeployHelper.sol/DeployHelper.dbg.json +1 -1
  253. package/build/contracts/src/rollup/DeployHelper.sol/DeployHelper.json +2 -2
  254. package/build/contracts/src/rollup/ERC20RollupEventInbox.sol/ERC20RollupEventInbox.dbg.json +1 -1
  255. package/build/contracts/src/rollup/ERC20RollupEventInbox.sol/ERC20RollupEventInbox.json +2 -2
  256. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/FactoryDeployerHelper.dbg.json +1 -1
  257. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/FactoryDeployerHelper.json +2 -2
  258. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IDeployHelper.dbg.json +1 -1
  259. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IERC20.dbg.json +1 -1
  260. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IERC20Bridge.dbg.json +1 -1
  261. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IInboxBase.dbg.json +1 -1
  262. package/build/contracts/src/rollup/IRollupAdmin.sol/IRollupAdmin.dbg.json +1 -1
  263. package/build/contracts/src/rollup/IRollupAdmin.sol/IRollupAdmin.json +473 -99
  264. package/build/contracts/src/rollup/IRollupCore.sol/IRollupCore.dbg.json +1 -1
  265. package/build/contracts/src/rollup/IRollupCore.sol/IRollupCore.json +315 -221
  266. package/build/contracts/src/rollup/IRollupEventInbox.sol/IRollupEventInbox.dbg.json +1 -1
  267. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUser.dbg.json +1 -1
  268. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUser.json +678 -499
  269. package/build/contracts/src/rollup/RollupAdminLogic.sol/RollupAdminLogic.dbg.json +1 -1
  270. package/build/contracts/src/rollup/RollupAdminLogic.sol/RollupAdminLogic.json +806 -435
  271. package/build/contracts/src/rollup/RollupCore.sol/RollupCore.dbg.json +1 -1
  272. package/build/contracts/src/rollup/RollupCore.sol/RollupCore.json +323 -235
  273. package/build/contracts/src/rollup/RollupCreator.sol/RollupCreator.dbg.json +1 -1
  274. package/build/contracts/src/rollup/RollupCreator.sol/RollupCreator.json +98 -36
  275. package/build/contracts/src/rollup/RollupEventInbox.sol/RollupEventInbox.dbg.json +1 -1
  276. package/build/contracts/src/rollup/RollupEventInbox.sol/RollupEventInbox.json +2 -2
  277. package/build/contracts/src/rollup/RollupLib.sol/RollupLib.dbg.json +1 -1
  278. package/build/contracts/src/rollup/RollupLib.sol/RollupLib.json +2 -2
  279. package/build/contracts/src/rollup/RollupProxy.sol/RollupProxy.dbg.json +1 -1
  280. package/build/contracts/src/rollup/RollupProxy.sol/RollupProxy.json +97 -16
  281. package/build/contracts/src/rollup/RollupUserLogic.sol/RollupUserLogic.dbg.json +1 -1
  282. package/build/contracts/src/rollup/RollupUserLogic.sol/RollupUserLogic.json +924 -535
  283. package/build/contracts/src/rollup/ValidatorWallet.sol/ValidatorWallet.dbg.json +1 -1
  284. package/build/contracts/src/rollup/ValidatorWallet.sol/ValidatorWallet.json +15 -43
  285. package/build/contracts/src/rollup/ValidatorWalletCreator.sol/ValidatorWalletCreator.dbg.json +1 -1
  286. package/build/contracts/src/rollup/ValidatorWalletCreator.sol/ValidatorWalletCreator.json +2 -2
  287. package/build/contracts/src/state/Deserialize.sol/Deserialize.dbg.json +1 -1
  288. package/build/contracts/src/state/Deserialize.sol/Deserialize.json +2 -2
  289. package/build/contracts/src/state/GlobalState.sol/GlobalStateLib.dbg.json +1 -1
  290. package/build/contracts/src/state/GlobalState.sol/GlobalStateLib.json +2 -2
  291. package/build/contracts/src/state/Instructions.sol/Instructions.dbg.json +1 -1
  292. package/build/contracts/src/state/Instructions.sol/Instructions.json +2 -2
  293. package/build/contracts/src/state/Machine.sol/MachineLib.dbg.json +1 -1
  294. package/build/contracts/src/state/Machine.sol/MachineLib.json +2 -2
  295. package/build/contracts/src/state/MerkleProof.sol/MerkleProofLib.dbg.json +1 -1
  296. package/build/contracts/src/state/MerkleProof.sol/MerkleProofLib.json +2 -2
  297. package/build/contracts/src/state/Module.sol/ModuleLib.dbg.json +1 -1
  298. package/build/contracts/src/state/Module.sol/ModuleLib.json +2 -2
  299. package/build/contracts/src/state/ModuleMemory.sol/ModuleMemoryLib.dbg.json +1 -1
  300. package/build/contracts/src/state/ModuleMemory.sol/ModuleMemoryLib.json +2 -2
  301. package/build/contracts/src/state/ModuleMemoryCompact.sol/ModuleMemoryCompactLib.dbg.json +1 -1
  302. package/build/contracts/src/state/ModuleMemoryCompact.sol/ModuleMemoryCompactLib.json +2 -2
  303. package/build/contracts/src/state/MultiStack.sol/MultiStackLib.dbg.json +1 -1
  304. package/build/contracts/src/state/MultiStack.sol/MultiStackLib.json +2 -2
  305. package/build/contracts/src/state/PcArray.sol/PcArrayLib.dbg.json +1 -1
  306. package/build/contracts/src/state/PcArray.sol/PcArrayLib.json +2 -2
  307. package/build/contracts/src/state/StackFrame.sol/StackFrameLib.dbg.json +1 -1
  308. package/build/contracts/src/state/StackFrame.sol/StackFrameLib.json +2 -2
  309. package/build/contracts/src/state/Value.sol/ValueLib.dbg.json +1 -1
  310. package/build/contracts/src/state/Value.sol/ValueLib.json +2 -2
  311. package/build/contracts/src/state/ValueArray.sol/ValueArrayLib.dbg.json +1 -1
  312. package/build/contracts/src/state/ValueArray.sol/ValueArrayLib.json +2 -2
  313. package/build/contracts/src/state/ValueStack.sol/ValueStackLib.dbg.json +1 -1
  314. package/build/contracts/src/state/ValueStack.sol/ValueStackLib.json +2 -2
  315. package/build/contracts/src/test-helpers/BridgeTester.sol/BridgeTester.dbg.json +1 -1
  316. package/build/contracts/src/test-helpers/BridgeTester.sol/BridgeTester.json +15 -2
  317. package/build/contracts/src/test-helpers/CryptographyPrimitivesTester.sol/CryptographyPrimitivesTester.dbg.json +1 -1
  318. package/build/contracts/src/test-helpers/CryptographyPrimitivesTester.sol/CryptographyPrimitivesTester.json +2 -2
  319. package/build/contracts/src/test-helpers/EthVault.sol/EthVault.dbg.json +1 -1
  320. package/build/contracts/src/test-helpers/EthVault.sol/EthVault.json +2 -2
  321. package/build/contracts/src/test-helpers/MessageTester.sol/MessageTester.dbg.json +1 -1
  322. package/build/contracts/src/test-helpers/MessageTester.sol/MessageTester.json +2 -2
  323. package/build/contracts/src/test-helpers/OutboxWithoutOptTester.sol/OutboxWithoutOptTester.dbg.json +1 -1
  324. package/build/contracts/src/test-helpers/OutboxWithoutOptTester.sol/OutboxWithoutOptTester.json +2 -2
  325. package/build/contracts/src/test-helpers/RollupMock.sol/RollupMock.dbg.json +1 -1
  326. package/build/contracts/src/test-helpers/RollupMock.sol/RollupMock.json +2 -15
  327. package/build/contracts/src/test-helpers/TestToken.sol/TestToken.dbg.json +1 -1
  328. package/build/contracts/src/test-helpers/TestToken.sol/TestToken.json +2 -2
  329. package/build/contracts/src/test-helpers/ValueArrayTester.sol/ValueArrayTester.dbg.json +1 -1
  330. package/build/contracts/src/test-helpers/ValueArrayTester.sol/ValueArrayTester.json +2 -2
  331. package/out/yul/Reader4844.yul/Reader4844.json +1 -1
  332. package/package.json +15 -5
  333. package/src/assertionStakingPool/AbsBoldStakingPool.sol +66 -0
  334. package/src/assertionStakingPool/AssertionStakingPool.sol +70 -0
  335. package/src/assertionStakingPool/AssertionStakingPoolCreator.sol +35 -0
  336. package/src/assertionStakingPool/EdgeStakingPool.sol +57 -0
  337. package/src/assertionStakingPool/EdgeStakingPoolCreator.sol +34 -0
  338. package/src/assertionStakingPool/StakingPoolCreatorUtils.sol +25 -0
  339. package/src/assertionStakingPool/interfaces/IAbsBoldStakingPool.sol +41 -0
  340. package/src/assertionStakingPool/interfaces/IAssertionStakingPool.sol +36 -0
  341. package/src/assertionStakingPool/interfaces/IAssertionStakingPoolCreator.sol +31 -0
  342. package/src/assertionStakingPool/interfaces/IEdgeStakingPool.sol +27 -0
  343. package/src/assertionStakingPool/interfaces/IEdgeStakingPoolCreator.sol +28 -0
  344. package/src/bridge/AbsBridge.sol +38 -48
  345. package/src/bridge/AbsInbox.sol +88 -97
  346. package/src/bridge/AbsOutbox.sol +23 -37
  347. package/src/bridge/Bridge.sol +6 -4
  348. package/src/bridge/DelayBuffer.sol +123 -0
  349. package/src/bridge/DelayBufferTypes.sol +38 -0
  350. package/src/bridge/ERC20Bridge.sol +8 -4
  351. package/src/bridge/ERC20Inbox.sol +46 -53
  352. package/src/bridge/ERC20Outbox.sol +7 -3
  353. package/src/bridge/GasRefunder.sol +38 -24
  354. package/src/bridge/IBridge.sol +30 -21
  355. package/src/bridge/IERC20Bridge.sol +1 -1
  356. package/src/bridge/IERC20Inbox.sol +4 -2
  357. package/src/bridge/IEthBridge.sol +4 -2
  358. package/src/bridge/IInbox.sol +4 -2
  359. package/src/bridge/IInboxBase.sol +17 -13
  360. package/src/bridge/IOutbox.sol +13 -8
  361. package/src/bridge/ISequencerInbox.sol +118 -13
  362. package/src/bridge/Inbox.sol +131 -151
  363. package/src/bridge/Messages.sol +48 -18
  364. package/src/bridge/Outbox.sol +6 -2
  365. package/src/bridge/SequencerInbox.sol +339 -274
  366. package/src/chain/CacheManager.sol +49 -18
  367. package/src/challengeV2/EdgeChallengeManager.sol +783 -0
  368. package/src/challengeV2/IAssertionChain.sol +39 -0
  369. package/src/challengeV2/libraries/ArrayUtilsLib.sol +61 -0
  370. package/src/challengeV2/libraries/ChallengeEdgeLib.sol +333 -0
  371. package/src/challengeV2/libraries/ChallengeErrors.sol +108 -0
  372. package/src/challengeV2/libraries/EdgeChallengeManagerLib.sol +930 -0
  373. package/src/challengeV2/libraries/Enums.sol +26 -0
  374. package/src/challengeV2/libraries/MerkleTreeAccumulatorLib.sol +390 -0
  375. package/src/challengeV2/libraries/UintUtilsLib.sol +74 -0
  376. package/src/libraries/AddressAliasHelper.sol +6 -2
  377. package/src/libraries/AdminFallbackProxy.sol +8 -4
  378. package/src/libraries/ArbitrumChecker.sol +3 -4
  379. package/src/libraries/CryptographyPrimitives.sol +39 -46
  380. package/src/libraries/DecimalsConverterHelper.sol +2 -4
  381. package/src/libraries/DoubleLogicUUPSUpgradeable.sol +10 -7
  382. package/src/libraries/Error.sol +18 -3
  383. package/src/libraries/GasRefundEnabled.sol +3 -4
  384. package/src/libraries/MerkleLib.sol +6 -5
  385. package/src/libraries/UUPSNotUpgradeable.sol +2 -4
  386. package/src/mocks/BridgeStub.sol +50 -48
  387. package/src/mocks/BridgeUnproxied.sol +2 -0
  388. package/src/mocks/InboxStub.sol +22 -17
  389. package/src/mocks/MerkleTreeAccess.sol +72 -0
  390. package/src/mocks/MockRollupEventInbox.sol +59 -0
  391. package/src/mocks/MultiCallTest.sol +3 -1
  392. package/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol +3 -1
  393. package/src/mocks/Program.sol +9 -7
  394. package/src/mocks/SequencerInboxBlobMock.sol +38 -0
  395. package/src/mocks/SequencerInboxStub.sol +9 -12
  396. package/src/mocks/Simple.sol +13 -25
  397. package/src/mocks/SimpleCacheManager.sol +10 -3
  398. package/src/mocks/SimpleOneStepProofEntry.sol +60 -0
  399. package/src/mocks/SimpleProxy.sol +3 -1
  400. package/src/mocks/TestWETH9.sol +30 -0
  401. package/src/mocks/UpgradeExecutorMock.sol +10 -17
  402. package/src/node-interface/NodeInterface.sol +23 -22
  403. package/src/node-interface/NodeInterfaceDebug.sol +5 -3
  404. package/src/osp/HashProofHelper.sol +9 -10
  405. package/src/osp/IOneStepProofEntry.sol +14 -9
  406. package/src/osp/IOneStepProver.sol +1 -0
  407. package/src/osp/OneStepProofEntry.sol +63 -54
  408. package/src/osp/OneStepProver0.sol +14 -27
  409. package/src/osp/OneStepProverHostIo.sol +31 -58
  410. package/src/osp/OneStepProverMath.sol +15 -23
  411. package/src/osp/OneStepProverMemory.sol +9 -23
  412. package/src/precompiles/ArbAddressTable.sol +19 -9
  413. package/src/precompiles/ArbAggregator.sol +12 -4
  414. package/src/precompiles/ArbBLS.sol +1 -3
  415. package/src/precompiles/ArbDebug.sol +5 -11
  416. package/src/precompiles/ArbFunctionTable.sol +7 -10
  417. package/src/precompiles/ArbGasInfo.sol +9 -43
  418. package/src/precompiles/ArbInfo.sol +6 -2
  419. package/src/precompiles/ArbOwner.sol +101 -34
  420. package/src/precompiles/ArbOwnerPublic.sol +6 -2
  421. package/src/precompiles/ArbRetryableTx.sol +15 -5
  422. package/src/precompiles/ArbStatistics.sol +1 -8
  423. package/src/precompiles/ArbSys.sol +16 -18
  424. package/src/precompiles/ArbWasm.sol +24 -14
  425. package/src/precompiles/ArbWasmCache.sol +15 -5
  426. package/src/precompiles/ArbosTest.sol +3 -1
  427. package/src/rollup/AbsRollupEventInbox.sol +15 -16
  428. package/src/rollup/Assertion.sol +100 -0
  429. package/src/rollup/AssertionState.sol +29 -0
  430. package/src/rollup/BOLDUpgradeAction.sol +631 -0
  431. package/src/rollup/BridgeCreator.sol +42 -15
  432. package/src/rollup/Config.sol +15 -7
  433. package/src/rollup/DeployHelper.sol +12 -31
  434. package/src/rollup/ERC20RollupEventInbox.sol +8 -9
  435. package/src/rollup/FactoryDeployerHelper.sol +8 -10
  436. package/src/rollup/IRollupAdmin.sol +127 -45
  437. package/src/rollup/IRollupCore.sol +64 -84
  438. package/src/rollup/IRollupEventInbox.sol +3 -1
  439. package/src/rollup/IRollupLogic.sol +35 -72
  440. package/src/rollup/RollupAdminLogic.sol +224 -203
  441. package/src/rollup/RollupCore.sol +407 -428
  442. package/src/rollup/RollupCreator.sol +88 -75
  443. package/src/rollup/RollupEventInbox.sol +7 -7
  444. package/src/rollup/RollupLib.sol +50 -86
  445. package/src/rollup/RollupProxy.sol +8 -12
  446. package/src/rollup/RollupUserLogic.sol +279 -644
  447. package/src/rollup/ValidatorUtils.sol +0 -242
  448. package/src/rollup/ValidatorWallet.sol +22 -38
  449. package/src/rollup/ValidatorWalletCreator.sol +8 -8
  450. package/src/state/Deserialize.sol +74 -96
  451. package/src/state/GlobalState.sol +74 -20
  452. package/src/state/Instructions.sol +4 -3
  453. package/src/state/Machine.sol +18 -19
  454. package/src/state/Module.sol +14 -13
  455. package/src/state/ModuleMemory.sol +6 -25
  456. package/src/state/ModuleMemoryCompact.sol +3 -1
  457. package/src/state/MultiStack.sol +16 -20
  458. package/src/state/PcArray.sol +7 -7
  459. package/src/state/StackFrame.sol +21 -14
  460. package/src/state/Value.sol +18 -6
  461. package/src/state/ValueArray.sol +7 -7
  462. package/src/state/ValueStack.sol +9 -3
  463. package/src/test-helpers/BridgeTester.sol +32 -42
  464. package/src/test-helpers/CryptographyPrimitivesTester.sol +12 -13
  465. package/src/test-helpers/EthVault.sol +4 -2
  466. package/src/test-helpers/InterfaceCompatibilityTester.sol +1 -1
  467. package/src/test-helpers/MessageTester.sol +3 -10
  468. package/src/test-helpers/OutboxWithoutOptTester.sol +12 -19
  469. package/src/test-helpers/RollupMock.sol +3 -7
  470. package/src/test-helpers/TestToken.sol +4 -2
  471. package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol/IERC20Upgradeable.dbg.json +0 -4
  472. package/build/contracts/src/challenge/ChallengeLib.sol/ChallengeLib.dbg.json +0 -4
  473. package/build/contracts/src/challenge/ChallengeManager.sol/ChallengeManager.dbg.json +0 -4
  474. package/build/contracts/src/challenge/ChallengeManager.sol/ChallengeManager.json +0 -746
  475. package/build/contracts/src/challenge/IChallengeManager.sol/IChallengeManager.dbg.json +0 -4
  476. package/build/contracts/src/challenge/IChallengeManager.sol/IChallengeManager.json +0 -441
  477. package/build/contracts/src/challenge/IChallengeResultReceiver.sol/IChallengeResultReceiver.dbg.json +0 -4
  478. package/build/contracts/src/challenge/IChallengeResultReceiver.sol/IChallengeResultReceiver.json +0 -34
  479. package/build/contracts/src/mocks/MockResultReceiver.sol/MockResultReceiver.dbg.json +0 -4
  480. package/build/contracts/src/mocks/MockResultReceiver.sol/MockResultReceiver.json +0 -188
  481. package/build/contracts/src/mocks/SingleExecutionChallenge.sol/SingleExecutionChallenge.dbg.json +0 -4
  482. package/build/contracts/src/mocks/SingleExecutionChallenge.sol/SingleExecutionChallenge.json +0 -797
  483. package/build/contracts/src/mocks/TimedOutChallengeManager.sol/TimedOutChallengeManager.dbg.json +0 -4
  484. package/build/contracts/src/mocks/TimedOutChallengeManager.sol/TimedOutChallengeManager.json +0 -746
  485. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserAbs.dbg.json +0 -4
  486. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserAbs.json +0 -1332
  487. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserERC20.dbg.json +0 -4
  488. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserERC20.json +0 -1466
  489. package/build/contracts/src/rollup/Node.sol/NodeLib.dbg.json +0 -4
  490. package/build/contracts/src/rollup/RollupUserLogic.sol/AbsRollupUserLogic.dbg.json +0 -4
  491. package/build/contracts/src/rollup/RollupUserLogic.sol/AbsRollupUserLogic.json +0 -1614
  492. package/build/contracts/src/rollup/RollupUserLogic.sol/ERC20RollupUserLogic.dbg.json +0 -4
  493. package/build/contracts/src/rollup/RollupUserLogic.sol/ERC20RollupUserLogic.json +0 -1748
  494. package/build/contracts/src/rollup/ValidatorUtils.sol/ValidatorUtils.dbg.json +0 -4
  495. package/build/contracts/src/rollup/ValidatorUtils.sol/ValidatorUtils.json +0 -379
  496. package/src/challenge/ChallengeLib.sol +0 -88
  497. package/src/challenge/ChallengeManager.sol +0 -375
  498. package/src/challenge/IChallengeManager.sol +0 -86
  499. package/src/challenge/IChallengeResultReceiver.sol +0 -13
  500. package/src/mocks/MockResultReceiver.sol +0 -59
  501. package/src/mocks/SingleExecutionChallenge.sol +0 -41
  502. package/src/mocks/TimedOutChallengeManager.sol +0 -13
  503. package/src/rollup/Node.sol +0 -113
@@ -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
  }