@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
@@ -0,0 +1,930 @@
1
+ // Copyright 2023, Offchain Labs, Inc.
2
+ // For license information, see https://github.com/offchainlabs/bold/blob/main/LICENSE
3
+ // SPDX-License-Identifier: BUSL-1.1
4
+ //
5
+ pragma solidity ^0.8.17;
6
+
7
+ import "./UintUtilsLib.sol";
8
+ import "./MerkleTreeAccumulatorLib.sol";
9
+ import "./ChallengeEdgeLib.sol";
10
+ import "../../osp/IOneStepProofEntry.sol";
11
+ import "../../rollup/AssertionState.sol";
12
+ import "../../libraries/Constants.sol";
13
+ import "./ChallengeErrors.sol";
14
+
15
+ /// @notice An execution state and proof to show that it's valid
16
+ struct AssertionStateData {
17
+ /// @notice An execution state
18
+ AssertionState assertionState;
19
+ /// @notice assertion Hash of the prev assertion
20
+ bytes32 prevAssertionHash;
21
+ /// @notice Inbox accumulator of the assertion
22
+ bytes32 inboxAcc;
23
+ }
24
+
25
+ /// @notice Data for creating a layer zero edge
26
+ struct CreateEdgeArgs {
27
+ /// @notice The level of edge to be created. Challenges are decomposed into multiple levels.
28
+ /// The first (level 0) being of type Block, followed by n (set by NUM_BIGSTEP_LEVEL) levels of type BigStep, and finally
29
+ /// followed by a single level of type SmallStep. Each level is bisected until an edge
30
+ /// of length one is reached before proceeding to the next level. The first edge in each level (the layer zero edge)
31
+ /// makes a claim about an assertion or assertion in the lower level.
32
+ /// Finally in the last level, a SmallStep edge is added that claims a lower level length one BigStep edge, and these
33
+ /// SmallStep edges are bisected until they reach length one. A length one small step edge
34
+ /// can then be directly executed using a one-step proof.
35
+ uint8 level;
36
+ /// @notice The end history root of the edge to be created
37
+ bytes32 endHistoryRoot;
38
+ /// @notice The end height of the edge to be created.
39
+ /// @dev End height is deterministic for different levels but supplying it here gives the
40
+ /// caller a bit of extra security that they are supplying data for the correct level of edge
41
+ uint256 endHeight;
42
+ /// @notice The edge, or assertion, that is being claimed correct by the newly created edge.
43
+ bytes32 claimId;
44
+ /// @notice Proof that the start history root commits to a prefix of the states that
45
+ /// end history root commits to
46
+ bytes prefixProof;
47
+ /// @notice Edge type specific data
48
+ /// For Block type edges this is the abi encoding of:
49
+ /// bytes32[]: Inclusion proof - proof to show that the end state is the last state in the end history root
50
+ /// AssertionStateData: the before state of the edge
51
+ /// AssertionStateData: the after state of the edge
52
+ /// bytes32 predecessorId: id of the prev assertion
53
+ /// bytes32 inboxAcc: the inbox accumulator of the assertion
54
+ /// For BigStep and SmallStep edges this is the abi encoding of:
55
+ /// bytes32: Start state - first state the edge commits to
56
+ /// bytes32: End state - last state the edge commits to
57
+ /// bytes32[]: Claim start inclusion proof - proof to show the start state is the first state in the claim edge
58
+ /// bytes32[]: Claim end inclusion proof - proof to show the end state is the last state in the claim edge
59
+ /// bytes32[]: Inclusion proof - proof to show that the end state is the last state in the end history root
60
+ bytes proof;
61
+ }
62
+
63
+ /// @notice Data parsed raw proof data
64
+ struct ProofData {
65
+ /// @notice The first state being committed to by an edge
66
+ bytes32 startState;
67
+ /// @notice The last state being committed to by an edge
68
+ bytes32 endState;
69
+ /// @notice A proof that the end state is included in the edge
70
+ bytes32[] inclusionProof;
71
+ }
72
+
73
+ /// @notice Stores all edges and their rival status
74
+ struct EdgeStore {
75
+ /// @notice A mapping of edge id to edges. Edges are never deleted, only created, and potentially confirmed.
76
+ mapping(bytes32 => ChallengeEdge) edges;
77
+ /// @notice A mapping of mutualId to edge id. Rivals share the same mutual id, and here we
78
+ /// store the edge id of the second edge that was created with the same mutual id - the first rival
79
+ /// When only one edge exists for a specific mutual id then a special magic string hash is stored instead
80
+ /// of the first rival id, to signify that a single edge does exist with this mutual id
81
+ mapping(bytes32 => bytes32) firstRivals;
82
+ /// @notice A mapping of mutualId to the edge id of the confirmed rival with that mutualId
83
+ /// @dev Each group of rivals (edges sharing mutual id) can only have at most one confirmed edge
84
+ mapping(bytes32 => bytes32) confirmedRivals;
85
+ /// @notice A mapping of account -> mutualId -> bool indicating if the account has created a layer zero edge with a mutual id
86
+ mapping(address => mapping(bytes32 => bool)) hasMadeLayerZeroRival;
87
+ }
88
+
89
+ /// @notice Input data to a one step proof
90
+ struct OneStepData {
91
+ /// @notice The hash of the state that's being executed from
92
+ bytes32 beforeHash;
93
+ /// @notice Proof data to accompany the execution context
94
+ bytes proof;
95
+ }
96
+
97
+ /// @notice Data about a recently added edge
98
+ struct EdgeAddedData {
99
+ bytes32 edgeId;
100
+ bytes32 mutualId;
101
+ bytes32 originId;
102
+ bytes32 claimId;
103
+ uint256 length;
104
+ uint8 level;
105
+ bool hasRival;
106
+ bool isLayerZero;
107
+ }
108
+
109
+ /// @notice Data about an assertion that is being claimed by an edge
110
+ /// @dev This extra information that is needed in order to verify that a block edge can be created
111
+ struct AssertionReferenceData {
112
+ /// @notice The id of the assertion - will be used in a sanity check
113
+ bytes32 assertionHash;
114
+ /// @notice The predecessor of the assertion
115
+ bytes32 predecessorId;
116
+ /// @notice Is the assertion pending
117
+ bool isPending;
118
+ /// @notice Does the assertion have a sibling
119
+ bool hasSibling;
120
+ /// @notice The execution state of the predecessor assertion
121
+ AssertionState startState;
122
+ /// @notice The execution state of the assertion being claimed
123
+ AssertionState endState;
124
+ }
125
+
126
+ /// @title Core functionality for the Edge Challenge Manager
127
+ /// @notice The edge manager library allows edges to be added and bisected, and keeps track of the amount
128
+ /// of time an edge remained unrivaled.
129
+ library EdgeChallengeManagerLib {
130
+ using ChallengeEdgeLib for ChallengeEdge;
131
+ using GlobalStateLib for GlobalState;
132
+ using AssertionStateLib for AssertionState;
133
+
134
+ /// @dev Magic string hash to represent that a edges with a given mutual id have no rivals
135
+ bytes32 public constant UNRIVALED = keccak256(abi.encodePacked("UNRIVALED"));
136
+
137
+ /// @notice Get an edge from the store
138
+ /// @dev Throws if the edge does not exist in the store
139
+ /// @param store The edge store to fetch an id from
140
+ /// @param edgeId The id of the edge to fetch
141
+ function get(
142
+ EdgeStore storage store,
143
+ bytes32 edgeId
144
+ ) internal view returns (ChallengeEdge storage) {
145
+ if (!store.edges[edgeId].exists()) {
146
+ revert EdgeNotExists(edgeId);
147
+ }
148
+ return store.edges[edgeId];
149
+ }
150
+
151
+ /// @notice Gets an edge from the store without checking if it exists
152
+ /// @dev Useful where you already know the edge exists in the store - avoid a storage lookup
153
+ /// @param store The edge store to fetch an id from
154
+ /// @param edgeId The id of the edge to fetch
155
+ function getNoCheck(
156
+ EdgeStore storage store,
157
+ bytes32 edgeId
158
+ ) internal view returns (ChallengeEdge storage) {
159
+ return store.edges[edgeId];
160
+ }
161
+
162
+ /// @notice Adds a new edge to the store
163
+ /// @dev Updates first rival info for later use in calculating time unrivaled
164
+ /// @param store The store to add the edge to
165
+ /// @param edge The edge to add
166
+ function add(
167
+ EdgeStore storage store,
168
+ ChallengeEdge memory edge
169
+ ) internal returns (EdgeAddedData memory) {
170
+ bytes32 eId = edge.idMem();
171
+ // add the edge if it doesnt exist already
172
+ if (store.edges[eId].exists()) {
173
+ revert EdgeAlreadyExists(eId);
174
+ }
175
+ store.edges[eId] = edge;
176
+
177
+ // edges that are rivals share the same mutual id
178
+ // we use records of whether a mutual id has ever been added to decide if
179
+ // the new edge is a rival. This will later allow us to calculate time an edge
180
+ // stayed unrivaled
181
+ bytes32 mutualId = ChallengeEdgeLib.mutualIdComponent(
182
+ edge.level, edge.originId, edge.startHeight, edge.startHistoryRoot, edge.endHeight
183
+ );
184
+ bytes32 firstRival = store.firstRivals[mutualId];
185
+
186
+ // the first time we add a mutual id we store a magic string hash against it
187
+ // We do this to distinguish from there being no edges
188
+ // with this mutual. And to distinguish it from the first rival, where we
189
+ // will use an actual edge id so that we can look up the created when time
190
+ // of the first rival, and use it for calculating time unrivaled
191
+ if (firstRival == 0) {
192
+ store.firstRivals[mutualId] = UNRIVALED;
193
+ } else if (firstRival == UNRIVALED) {
194
+ store.firstRivals[mutualId] = eId;
195
+ } else {
196
+ // after we've stored the first rival we dont need to keep a record of any
197
+ // other rival edges - they will all have a zero time unrivaled
198
+ }
199
+
200
+ return EdgeAddedData(
201
+ eId,
202
+ mutualId,
203
+ edge.originId,
204
+ edge.claimId,
205
+ store.edges[eId].length(),
206
+ edge.level,
207
+ firstRival != 0,
208
+ edge.claimId != 0
209
+ );
210
+ }
211
+
212
+ /// @notice Conduct checks that are specific to the edge type.
213
+ /// @dev Since different edge types also require different proofs, we also include the specific
214
+ /// proof parsing logic and return the common parts for later use.
215
+ /// @param store The store containing current edges
216
+ /// @param args The edge creation args
217
+ /// @param ard Data about the assertion data is is also need to when creating a Block edge type
218
+ /// The created edge must be shown to be consistent with the states in the assertion chain
219
+ /// Empty for non block edge type edges
220
+ /// @param oneStepProofEntry The one step proof contract that defines how machine states are hashed
221
+ /// @return Data parsed from the proof, or fetched from elsewhere. Also the origin id for the edge to be created.
222
+ function layerZeroTypeSpecificChecks(
223
+ EdgeStore storage store,
224
+ CreateEdgeArgs calldata args,
225
+ AssertionReferenceData memory ard,
226
+ IOneStepProofEntry oneStepProofEntry,
227
+ uint8 numBigStepLevel
228
+ ) private view returns (ProofData memory, bytes32) {
229
+ if (ChallengeEdgeLib.levelToType(args.level, numBigStepLevel) == EdgeType.Block) {
230
+ // origin id is the assertion which is the root of challenge
231
+ // all rivals and their children share the same origin id - it is a link to the information
232
+ // they agree on
233
+ bytes32 originId = ard.predecessorId;
234
+
235
+ // Sanity check: The assertion reference data should be related to the claim
236
+ // Of course the caller can provide whatever args they wish, so this is really just a helpful
237
+ // check to avoid mistakes
238
+ if (ard.assertionHash == 0) {
239
+ revert AssertionHashEmpty();
240
+ }
241
+ if (ard.assertionHash != args.claimId) {
242
+ revert AssertionHashMismatch(ard.assertionHash, args.claimId);
243
+ }
244
+
245
+ // if the assertion is already confirmed or rejected then it cant be referenced as a claim
246
+ if (!ard.isPending) {
247
+ revert AssertionNotPending();
248
+ }
249
+
250
+ // if the claim doesnt have a sibling then it is undisputed, there's no need
251
+ // to open challenge edges for it
252
+ if (!ard.hasSibling) {
253
+ revert AssertionNoSibling();
254
+ }
255
+
256
+ // parse the inclusion proof for later use
257
+ if (args.proof.length == 0) {
258
+ revert EmptyEdgeSpecificProof();
259
+ }
260
+ (bytes32[] memory inclusionProof,,) =
261
+ abi.decode(args.proof, (bytes32[], AssertionStateData, AssertionStateData));
262
+
263
+ // check the start and end execution states exist, the block hash entry should be non zero
264
+ if (ard.startState.machineStatus == MachineStatus.RUNNING) {
265
+ revert EmptyStartMachineStatus();
266
+ }
267
+ if (ard.endState.machineStatus == MachineStatus.RUNNING) {
268
+ revert EmptyEndMachineStatus();
269
+ }
270
+
271
+ // Create machine hashes out of the proven state
272
+ bytes32 startStateHash =
273
+ oneStepProofEntry.getMachineHash(ard.startState.toExecutionState());
274
+ bytes32 endStateHash = oneStepProofEntry.getMachineHash(ard.endState.toExecutionState());
275
+
276
+ return (ProofData(startStateHash, endStateHash, inclusionProof), originId);
277
+ } else {
278
+ // Claim must be length one. If it is unrivaled then its unrivaled time is ticking up, so there's
279
+ // no need to create claims against it
280
+ if (!hasLengthOneRival(store, args.claimId)) {
281
+ revert ClaimEdgeNotLengthOneRival(args.claimId);
282
+ }
283
+
284
+ // hasLengthOneRival checks existance, so we can use getNoCheck
285
+ ChallengeEdge storage claimEdge = getNoCheck(store, args.claimId);
286
+
287
+ // origin id is the mutual id of the claim
288
+ // all rivals and their children share the same origin id - it is a link to the information
289
+ // they agree on
290
+ bytes32 originId = claimEdge.mutualId();
291
+
292
+ // once a claim is confirmed it's status can never become pending again, so there is no point
293
+ // opening a challenge that references it
294
+ if (claimEdge.status != EdgeStatus.Pending) {
295
+ revert ClaimEdgeNotPending();
296
+ }
297
+
298
+ // the edge must be a level up from the claim
299
+ if (args.level != nextEdgeLevel(claimEdge.level, numBigStepLevel)) {
300
+ revert ClaimEdgeInvalidLevel(args.level, claimEdge.level);
301
+ }
302
+
303
+ // parse the proofs
304
+ if (args.proof.length == 0) {
305
+ revert EmptyEdgeSpecificProof();
306
+ }
307
+ (
308
+ bytes32 startState,
309
+ bytes32 endState,
310
+ bytes32[] memory claimStartInclusionProof,
311
+ bytes32[] memory claimEndInclusionProof,
312
+ bytes32[] memory edgeInclusionProof
313
+ ) = abi.decode(args.proof, (bytes32, bytes32, bytes32[], bytes32[], bytes32[]));
314
+
315
+ // if the start and end states are consistent with the claim edge
316
+ // this guarantees that the edge we're creating is a 'continuation' of the claim edge, it is
317
+ // a commitment to the states that between start and end states of the claim
318
+ MerkleTreeAccumulatorLib.verifyInclusionProof(
319
+ claimEdge.startHistoryRoot,
320
+ startState,
321
+ claimEdge.startHeight,
322
+ claimStartInclusionProof
323
+ );
324
+
325
+ // it's doubly important to check the end state since if the end state since the claim id is
326
+ // not part of the edge id, so we need to ensure that it's not possible to create two edges of the
327
+ // same id, but with different claim id. Ensuring that the end state is linked to the claim,
328
+ // and later ensuring that the end state is part of the history commitment of the new edge ensures
329
+ // that the end history root of the new edge will be different for different claim ids, and therefore
330
+ // the edge ids will be different
331
+ MerkleTreeAccumulatorLib.verifyInclusionProof(
332
+ claimEdge.endHistoryRoot, endState, claimEdge.endHeight, claimEndInclusionProof
333
+ );
334
+
335
+ return (ProofData(startState, endState, edgeInclusionProof), originId);
336
+ }
337
+ }
338
+
339
+ /// @notice Check that a uint is a power of 2
340
+ function isPowerOfTwo(
341
+ uint256 x
342
+ ) internal pure returns (bool) {
343
+ // zero is not a power of 2
344
+ if (x == 0) {
345
+ return false;
346
+ }
347
+
348
+ // if x is a power of 2, then this will be 0111111
349
+ uint256 y = x - 1;
350
+
351
+ // if x is a power of 2 then y will share no bits with x
352
+ return ((x & y) == 0);
353
+ }
354
+
355
+ /// @notice Common checks that apply to all layer zero edges
356
+ /// @param proofData Data extracted from supplied proof
357
+ /// @param args The edge creation args
358
+ /// @param expectedEndHeight Edges have a deterministic end height dependent on their level
359
+ function layerZeroCommonChecks(
360
+ ProofData memory proofData,
361
+ CreateEdgeArgs calldata args,
362
+ uint256 expectedEndHeight
363
+ ) private pure returns (bytes32) {
364
+ // since zero layer edges have a start height of zero, we know that they are a size
365
+ // one tree containing only the start state. We can then compute the history root directly
366
+ bytes32 startHistoryRoot = MerkleTreeAccumulatorLib.root(
367
+ MerkleTreeAccumulatorLib.appendLeaf(new bytes32[](0), proofData.startState)
368
+ );
369
+
370
+ // all end heights are expected to be a power of 2, the specific power is defined by the
371
+ // edge challenge manager itself
372
+ if (!isPowerOfTwo(expectedEndHeight)) {
373
+ revert NotPowerOfTwo(expectedEndHeight);
374
+ }
375
+
376
+ // It isnt strictly necessary to pass in the end height, we know what it
377
+ // should be so we could just use the end height that we get from getLayerZeroEndHeight
378
+ // However it's a nice sanity check for the calling code to check that their local edge
379
+ // will have the same height as the one created here
380
+ if (args.endHeight != expectedEndHeight) {
381
+ revert InvalidEndHeight(args.endHeight, expectedEndHeight);
382
+ }
383
+
384
+ // the end state is checked/determined as part of the specific edge level
385
+ // We then ensure that that same end state is part of the end history root we're creating
386
+ // This ensures continuity of states between levels - the state is present in both this
387
+ // level and the one below
388
+ MerkleTreeAccumulatorLib.verifyInclusionProof(
389
+ args.endHistoryRoot, proofData.endState, args.endHeight, proofData.inclusionProof
390
+ );
391
+
392
+ // start root must always be a prefix of end root, we ensure that
393
+ // this new edge adheres to this. Future bisections will ensure that this
394
+ // property is conserved
395
+ if (args.prefixProof.length == 0) {
396
+ revert EmptyPrefixProof();
397
+ }
398
+ (bytes32[] memory preExpansion, bytes32[] memory preProof) =
399
+ abi.decode(args.prefixProof, (bytes32[], bytes32[]));
400
+ MerkleTreeAccumulatorLib.verifyPrefixProof(
401
+ startHistoryRoot, 1, args.endHistoryRoot, args.endHeight + 1, preExpansion, preProof
402
+ );
403
+
404
+ return (startHistoryRoot);
405
+ }
406
+
407
+ /// @notice Creates a new layer zero edges from edge creation args
408
+ function toLayerZeroEdge(
409
+ bytes32 originId,
410
+ bytes32 startHistoryRoot,
411
+ CreateEdgeArgs calldata args
412
+ ) private view returns (ChallengeEdge memory) {
413
+ return ChallengeEdgeLib.newLayerZeroEdge(
414
+ originId,
415
+ startHistoryRoot,
416
+ 0,
417
+ args.endHistoryRoot,
418
+ args.endHeight,
419
+ args.claimId,
420
+ msg.sender,
421
+ args.level
422
+ );
423
+ }
424
+
425
+ /// @notice Performs necessary checks and creates a new layer zero edge
426
+ /// @param store The store containing existing edges
427
+ /// @param args Edge data
428
+ /// @param ard If the edge being added is of Block type then additional assertion data is required
429
+ /// to check if the edge can be added. Empty if edge is not of type Block.
430
+ /// The supplied assertion data must be related to the assertion that is being claimed
431
+ /// by the supplied edge args
432
+ /// @param oneStepProofEntry The one step proof contract that defines how machine states are hashed
433
+ /// @param expectedEndHeight The expected end height of an edge. Layer zero block edges have predefined heights.
434
+ /// @param numBigStepLevel The number of big step levels in this challenge
435
+ function createLayerZeroEdge(
436
+ EdgeStore storage store,
437
+ CreateEdgeArgs calldata args,
438
+ AssertionReferenceData memory ard,
439
+ IOneStepProofEntry oneStepProofEntry,
440
+ uint256 expectedEndHeight,
441
+ uint8 numBigStepLevel,
442
+ bool whitelistEnabled
443
+ ) internal returns (EdgeAddedData memory) {
444
+ // each edge type requires some specific checks
445
+ (ProofData memory proofData, bytes32 originId) =
446
+ layerZeroTypeSpecificChecks(store, args, ard, oneStepProofEntry, numBigStepLevel);
447
+ // all edge types share some common checks
448
+ (bytes32 startHistoryRoot) = layerZeroCommonChecks(proofData, args, expectedEndHeight);
449
+ // we only wrap the struct creation in a function as doing so with exceeds the stack limit
450
+ ChallengeEdge memory ce = toLayerZeroEdge(originId, startHistoryRoot, args);
451
+
452
+ // if the validator whitelist is enabled, we can enforce that a single party cannot create two layer zero edges that rival each other
453
+ // if the validator whitelist is disabled, this check serves no purpose since an attacker can create new accounts
454
+ if (whitelistEnabled) {
455
+ bytes32 mutualId = ce.mutualIdMem();
456
+ if (store.hasMadeLayerZeroRival[msg.sender][mutualId]) {
457
+ revert AccountHasMadeLayerZeroRival(msg.sender, mutualId);
458
+ }
459
+ store.hasMadeLayerZeroRival[msg.sender][mutualId] = true;
460
+ }
461
+
462
+ return add(store, ce);
463
+ }
464
+
465
+ /// @notice From any given edge, get the id of the previous assertion
466
+ /// @param edgeId The edge to get the prev assertion hash
467
+ function getPrevAssertionHash(
468
+ EdgeStore storage store,
469
+ bytes32 edgeId
470
+ ) internal view returns (bytes32) {
471
+ ChallengeEdge storage edge = get(store, edgeId);
472
+ while (edge.level > 0) {
473
+ // the origin id gives us a link to the lower level
474
+ // we know a first rival must exist, since otherwise we would not have had a one step fork
475
+ // and we wouldnt be able to go to the next level
476
+ // we can use the first rival to get an edge id, and from there get the next origin id
477
+ bytes32 lowerLevelId = store.firstRivals[edge.originId];
478
+ edge = get(store, lowerLevelId);
479
+ }
480
+
481
+ // For Block type edges the origin id is the assertion hash of claim prev
482
+ return edge.originId;
483
+ }
484
+
485
+ /// @notice Does this edge currently have one or more rivals
486
+ /// Rival edges share the same startHeight, startHistoryCommitment and the same endHeight,
487
+ /// but they have a different endHistoryRoot. Rival edges have the same mutualId
488
+ /// @param store The edge store containing the edge
489
+ /// @param edgeId The edge if to test if it is unrivaled
490
+ function hasRival(EdgeStore storage store, bytes32 edgeId) internal view returns (bool) {
491
+ if (!store.edges[edgeId].exists()) {
492
+ revert EdgeNotExists(edgeId);
493
+ }
494
+
495
+ // rivals have the same mutual id
496
+ bytes32 mutualId = store.edges[edgeId].mutualId();
497
+ bytes32 firstRival = store.firstRivals[mutualId];
498
+ // Sanity check: it should never be possible to create an edge without having an entry in firstRivals
499
+ if (firstRival == 0) {
500
+ revert EmptyFirstRival();
501
+ }
502
+
503
+ // can only have no rival if the firstRival is the UNRIVALED magic hash
504
+ return firstRival != UNRIVALED;
505
+ }
506
+
507
+ /// @notice Is the edge a single step in length, and does it have at least one rival.
508
+ /// @param store The edge store containing the edge
509
+ /// @param edgeId The edge id to test for single step and rivaled
510
+ function hasLengthOneRival(
511
+ EdgeStore storage store,
512
+ bytes32 edgeId
513
+ ) internal view returns (bool) {
514
+ // must be length 1 and have rivals - all rivals have the same length
515
+ return (hasRival(store, edgeId) && store.edges[edgeId].length() == 1);
516
+ }
517
+
518
+ function timeUnrivaledTotal(
519
+ EdgeStore storage store,
520
+ bytes32 edgeId
521
+ ) internal view returns (uint256) {
522
+ uint256 totalTimeUnrivaled = timeUnrivaled(store, edgeId);
523
+ if (store.edges[edgeId].lowerChildId != bytes32(0)) {
524
+ uint256 lowerTimer =
525
+ store.edges[store.edges[edgeId].lowerChildId].totalTimeUnrivaledCache;
526
+ uint256 upperTimer =
527
+ store.edges[store.edges[edgeId].upperChildId].totalTimeUnrivaledCache;
528
+ totalTimeUnrivaled += lowerTimer < upperTimer ? lowerTimer : upperTimer;
529
+ }
530
+ return totalTimeUnrivaled;
531
+ }
532
+
533
+ /// @dev revert if the current totalTimeUnrivaledCache on the edge is greater than or equal to maximumCachedTime
534
+ /// @return the current totalTimeUnrivaledCache on the edge
535
+ function validateCurrentTimer(
536
+ EdgeStore storage store,
537
+ bytes32 edgeId,
538
+ uint256 maximumCachedTime
539
+ ) internal view returns (uint256) {
540
+ uint256 currentAccuTimer = store.edges[edgeId].totalTimeUnrivaledCache;
541
+ if (currentAccuTimer >= maximumCachedTime) {
542
+ revert CachedTimeSufficient(currentAccuTimer, maximumCachedTime);
543
+ }
544
+ return currentAccuTimer;
545
+ }
546
+
547
+ /// @notice Update the timer cache for an edge
548
+ /// @dev The cache is only updated if the new value is greater than the current value.
549
+ /// If the new value is greater than uint64 max then the cache is set to uint64 max
550
+ /// @return (bool, uint256) A boolean indicating if the cache was updated, and the value of the cache
551
+ function updateTimerCache(
552
+ EdgeStore storage store,
553
+ bytes32 edgeId,
554
+ uint256 newValue,
555
+ uint256 maximumCachedTime
556
+ ) internal returns (bool, uint256) {
557
+ uint256 currentAccuTimer = validateCurrentTimer(store, edgeId, maximumCachedTime);
558
+ newValue = newValue > type(uint64).max ? type(uint64).max : newValue;
559
+ // only update when increased
560
+ if (newValue > currentAccuTimer) {
561
+ store.edges[edgeId].totalTimeUnrivaledCache = uint64(newValue);
562
+ return (true, newValue);
563
+ }
564
+ return (false, currentAccuTimer);
565
+ }
566
+
567
+ function updateTimerCacheByChildren(
568
+ EdgeStore storage store,
569
+ bytes32 edgeId,
570
+ uint256 maximumCachedTime
571
+ ) internal returns (bool, uint256) {
572
+ return updateTimerCache(store, edgeId, timeUnrivaledTotal(store, edgeId), maximumCachedTime);
573
+ }
574
+
575
+ function updateTimerCacheByClaim(
576
+ EdgeStore storage store,
577
+ bytes32 edgeId,
578
+ bytes32 claimingEdgeId,
579
+ uint8 numBigStepLevel,
580
+ uint256 maximumCachedTime
581
+ ) internal returns (bool, uint256) {
582
+ // calculate the time unrivaled without inheritance
583
+ uint256 totalTimeUnrivaled = timeUnrivaled(store, edgeId);
584
+ checkClaimIdLink(store, edgeId, claimingEdgeId, numBigStepLevel);
585
+ totalTimeUnrivaled += store.edges[claimingEdgeId].totalTimeUnrivaledCache;
586
+ return updateTimerCache(store, edgeId, totalTimeUnrivaled, maximumCachedTime);
587
+ }
588
+
589
+ /// @notice The amount of time (in blocks) this edge has spent without rivals
590
+ /// This value is increasing whilst an edge is unrivaled, once a rival is created
591
+ /// it is fixed. If an edge has rivals from the moment it is created then it will have
592
+ /// a zero time unrivaled
593
+ function timeUnrivaled(
594
+ EdgeStore storage store,
595
+ bytes32 edgeId
596
+ ) internal view returns (uint256) {
597
+ if (!store.edges[edgeId].exists()) {
598
+ revert EdgeNotExists(edgeId);
599
+ }
600
+
601
+ bytes32 mutualId = store.edges[edgeId].mutualId();
602
+ bytes32 firstRival = store.firstRivals[mutualId];
603
+ // Sanity check: it's not possible to have a 0 first rival for an edge that exists
604
+ if (firstRival == 0) {
605
+ revert EmptyFirstRival();
606
+ }
607
+
608
+ // this edge has no rivals, the time is still going up
609
+ // we give the current amount of time unrivaled
610
+ if (firstRival == UNRIVALED) {
611
+ return block.number - store.edges[edgeId].createdAtBlock;
612
+ } else {
613
+ // Sanity check: it's not possible an edge does not exist for a first rival record
614
+ if (!store.edges[firstRival].exists()) {
615
+ revert EdgeNotExists(firstRival);
616
+ }
617
+
618
+ // rivals exist for this edge
619
+ uint256 firstRivalCreatedAtBlock = store.edges[firstRival].createdAtBlock;
620
+ uint256 edgeCreatedAtBlock = store.edges[edgeId].createdAtBlock;
621
+ if (firstRivalCreatedAtBlock > edgeCreatedAtBlock) {
622
+ // if this edge was created before the first rival then we return the difference
623
+ // in createdAtBlock number
624
+ return firstRivalCreatedAtBlock - edgeCreatedAtBlock;
625
+ } else {
626
+ // if this was created at the same time as, or after the the first rival
627
+ // then we return 0
628
+ return 0;
629
+ }
630
+ }
631
+ }
632
+
633
+ /// @notice Given a start and an endpoint determine the bisection height
634
+ /// @dev Returns the highest power of 2 in the differing lower bits of start and end
635
+ function mandatoryBisectionHeight(uint256 start, uint256 end) internal pure returns (uint256) {
636
+ if (end - start < 2) {
637
+ revert HeightDiffLtTwo(start, end);
638
+ }
639
+ if (end - start == 2) {
640
+ return start + 1;
641
+ }
642
+
643
+ uint256 diff = (end - 1) ^ start;
644
+ uint256 mostSignificantSharedBit = UintUtilsLib.mostSignificantBit(diff);
645
+ uint256 mask = type(uint256).max << mostSignificantSharedBit;
646
+ return ((end - 1) & mask);
647
+ }
648
+
649
+ /// @notice Bisect and edge. This creates two child edges:
650
+ /// lowerChild: has the same start root and height as this edge, but a different end root and height
651
+ /// upperChild: has the same end root and height as this edge, but a different start root and height
652
+ /// The lower child end root and height are equal to the upper child start root and height. This height
653
+ /// is the mandatoryBisectionHeight.
654
+ /// The lower child may already exist, however it's not possible for the upper child to exist as that would
655
+ /// mean that the edge has already been bisected
656
+ /// @param store The edge store containing the edge to bisect
657
+ /// @param edgeId Edge to bisect
658
+ /// @param bisectionHistoryRoot The new history root to be used in the lower and upper children
659
+ /// @param prefixProof A proof to show that the bisectionHistoryRoot commits to a prefix of the current endHistoryRoot
660
+ /// @return lowerChildId The id of the newly created lower child edge
661
+ /// @return lowerChildAdded Data about the lower child edge, empty if the lower child already existed
662
+ /// @return upperChildAdded Data about the upper child edge, never empty
663
+ function bisectEdge(
664
+ EdgeStore storage store,
665
+ bytes32 edgeId,
666
+ bytes32 bisectionHistoryRoot,
667
+ bytes memory prefixProof
668
+ ) internal returns (bytes32, EdgeAddedData memory, EdgeAddedData memory) {
669
+ if (store.edges[edgeId].status != EdgeStatus.Pending) {
670
+ revert EdgeNotPending(edgeId, store.edges[edgeId].status);
671
+ }
672
+ if (!hasRival(store, edgeId)) {
673
+ revert EdgeUnrivaled(edgeId);
674
+ }
675
+
676
+ // cannot bisect an edge twice
677
+ // has rival above checks the edge - so no need to check again
678
+ ChallengeEdge memory ce = getNoCheck(store, edgeId);
679
+
680
+ // bisections occur at deterministic heights, this ensures that
681
+ // rival edges bisect at the same height, and create the same child if they agree
682
+ uint256 middleHeight = mandatoryBisectionHeight(ce.startHeight, ce.endHeight);
683
+ {
684
+ (bytes32[] memory preExpansion, bytes32[] memory proof) =
685
+ abi.decode(prefixProof, (bytes32[], bytes32[]));
686
+ MerkleTreeAccumulatorLib.verifyPrefixProof(
687
+ bisectionHistoryRoot,
688
+ middleHeight + 1,
689
+ ce.endHistoryRoot,
690
+ ce.endHeight + 1,
691
+ preExpansion,
692
+ proof
693
+ );
694
+ }
695
+
696
+ bytes32 lowerChildId;
697
+ EdgeAddedData memory lowerChildAdded;
698
+ {
699
+ // midpoint proof it valid, create and store the children
700
+ ChallengeEdge memory lowerChild = ChallengeEdgeLib.newChildEdge(
701
+ ce.originId,
702
+ ce.startHistoryRoot,
703
+ ce.startHeight,
704
+ bisectionHistoryRoot,
705
+ middleHeight,
706
+ ce.level
707
+ );
708
+ lowerChildId = lowerChild.idMem();
709
+ // it's possible that the store already has the lower child if it was created by a rival
710
+ // (aka a merge move)
711
+ if (!store.edges[lowerChildId].exists()) {
712
+ lowerChildAdded = add(store, lowerChild);
713
+ }
714
+ }
715
+
716
+ EdgeAddedData memory upperChildAdded;
717
+ {
718
+ ChallengeEdge memory upperChild = ChallengeEdgeLib.newChildEdge(
719
+ ce.originId,
720
+ bisectionHistoryRoot,
721
+ middleHeight,
722
+ ce.endHistoryRoot,
723
+ ce.endHeight,
724
+ ce.level
725
+ );
726
+
727
+ // add checks existence and throws if the id already exists
728
+ upperChildAdded = add(store, upperChild);
729
+ }
730
+
731
+ store.edges[edgeId].setChildren(lowerChildId, upperChildAdded.edgeId);
732
+
733
+ return (lowerChildId, lowerChildAdded, upperChildAdded);
734
+ }
735
+
736
+ /// @notice Store that an edge has been confirmed. Recorded against the mutual id
737
+ /// so that rivals can look up rival confirmed edges
738
+ /// @dev Checks that a rival edge has not already been confirmed
739
+ function setConfirmedRival(EdgeStore storage store, bytes32 edgeId) internal {
740
+ bytes32 mutualId = store.edges[edgeId].mutualId();
741
+ bytes32 confirmedRivalId = store.confirmedRivals[mutualId];
742
+ if (confirmedRivalId != bytes32(0)) {
743
+ revert RivalEdgeConfirmed(edgeId, confirmedRivalId);
744
+ }
745
+ store.confirmedRivals[mutualId] = edgeId;
746
+ }
747
+
748
+ /// @notice Returns the sub edge level of the provided edge level
749
+ /// @param level The edge level to fetch the next of
750
+ /// @param numBigStepLevel The number of big step levels in this challenge
751
+ function nextEdgeLevel(uint8 level, uint8 numBigStepLevel) internal pure returns (uint8) {
752
+ uint8 nextLevel = level + 1;
753
+
754
+ // levelToType throws an error when level is not a valid type
755
+ ChallengeEdgeLib.levelToType(nextLevel, numBigStepLevel);
756
+
757
+ return nextLevel;
758
+ }
759
+
760
+ /// @notice Check that the originId of a claiming edge matched the mutualId() of a supplied edge
761
+ /// @dev Does some additional sanity checks to ensure that the claim id link is valid
762
+ /// @param store The store containing all edges and rivals
763
+ /// @param edgeId The edge being claimed
764
+ /// @param claimingEdgeId The edge with a claim id equal to edge id
765
+ /// @param numBigStepLevel The number of big step levels in this challenge
766
+ function checkClaimIdLink(
767
+ EdgeStore storage store,
768
+ bytes32 edgeId,
769
+ bytes32 claimingEdgeId,
770
+ uint8 numBigStepLevel
771
+ ) private view {
772
+ if (edgeId != store.edges[claimingEdgeId].claimId) {
773
+ revert EdgeClaimMismatch(edgeId, store.edges[claimingEdgeId].claimId);
774
+ }
775
+ // we do some extra checks that edge being claimed is eligible to be claimed by the claiming edge
776
+ // these shouldn't be necessary since it should be impossible to add layer zero edges that do not
777
+ // satisfy the checks below, but we conduct these checks anyway for double safety
778
+
779
+ // the origin id of an edge should be the mutual id of the edge in the level below
780
+ if (store.edges[edgeId].mutualId() != store.edges[claimingEdgeId].originId) {
781
+ revert OriginIdMutualIdMismatch(
782
+ store.edges[edgeId].mutualId(), store.edges[claimingEdgeId].originId
783
+ );
784
+ }
785
+ // the claiming edge must be exactly one level below
786
+ if (
787
+ nextEdgeLevel(store.edges[edgeId].level, numBigStepLevel)
788
+ != store.edges[claimingEdgeId].level
789
+ ) {
790
+ revert EdgeLevelInvalid(
791
+ edgeId,
792
+ claimingEdgeId,
793
+ nextEdgeLevel(store.edges[edgeId].level, numBigStepLevel),
794
+ store.edges[claimingEdgeId].level
795
+ );
796
+ }
797
+ }
798
+
799
+ /// @notice An edge can be confirmed if the total amount of time (in blocks) it and a single chain of its direct ancestors
800
+ /// has spent unrivaled is greater than the challenge period.
801
+ /// @dev Edges inherit time from their parents, so the sum of unrivaled timer is compared against the threshold.
802
+ /// Given that an edge cannot become unrivaled after becoming rivaled, once the threshold is passed
803
+ /// it will always remain passed. The direct ancestors of an edge are linked by parent-child links for edges
804
+ /// of the same level, and claimId-edgeId links for zero layer edges that claim an edge in the level below.
805
+ /// @param store The edge store containing all edges and rival data
806
+ /// @param edgeId The id of the edge to confirm
807
+ /// @param claimedAssertionUnrivaledBlocks The number of blocks that the assertion ultimately being claimed by this edge spent unrivaled
808
+ /// @param confirmationThresholdBlock The number of blocks that the total unrivaled time of an ancestor chain needs to exceed in
809
+ /// order to be confirmed
810
+ function confirmEdgeByTime(
811
+ EdgeStore storage store,
812
+ bytes32 edgeId,
813
+ uint64 claimedAssertionUnrivaledBlocks,
814
+ uint64 confirmationThresholdBlock
815
+ ) internal returns (uint256) {
816
+ if (!store.edges[edgeId].exists()) {
817
+ revert EdgeNotExists(edgeId);
818
+ }
819
+
820
+ uint256 totalTimeUnrivaled = timeUnrivaledTotal(store, edgeId);
821
+
822
+ // since sibling assertions have the same predecessor, they can be viewed as
823
+ // rival edges. Adding the assertion unrivaled time allows us to start the confirmation
824
+ // timer from the moment the first assertion is made, rather than having to wait until the
825
+ // second assertion is made.
826
+ totalTimeUnrivaled += claimedAssertionUnrivaledBlocks;
827
+
828
+ if (totalTimeUnrivaled < confirmationThresholdBlock) {
829
+ revert InsufficientConfirmationBlocks(totalTimeUnrivaled, confirmationThresholdBlock);
830
+ }
831
+
832
+ // we also check the edge is pending in setConfirmed()
833
+ store.edges[edgeId].setConfirmed();
834
+
835
+ // also checks that no other rival has been confirmed
836
+ setConfirmedRival(store, edgeId);
837
+
838
+ return totalTimeUnrivaled;
839
+ }
840
+
841
+ /// @notice Confirm an edge by executing a one step proof
842
+ /// @dev One step proofs can only be executed against edges that have length one and of type SmallStep
843
+ /// @param store The edge store containing all edges and rival data
844
+ /// @param edgeId The id of the edge to confirm
845
+ /// @param oneStepProofEntry The one step proof contract
846
+ /// @param oneStepData Input data to the one step proof
847
+ /// @param execCtx The execution context to be supplied to the one step proof entry
848
+ /// @param beforeHistoryInclusionProof Proof that the state which is the start of the edge is committed to by the startHistoryRoot
849
+ /// @param afterHistoryInclusionProof Proof that the state which is the end of the edge is committed to by the endHistoryRoot
850
+ /// @param numBigStepLevel The number of big step levels in this challenge
851
+ /// @param bigStepHeight The height of the zero layer levels of big step type
852
+ /// @param smallStepHeight The height of the zero layer levels of big step type
853
+ function confirmEdgeByOneStepProof(
854
+ EdgeStore storage store,
855
+ bytes32 edgeId,
856
+ IOneStepProofEntry oneStepProofEntry,
857
+ OneStepData calldata oneStepData,
858
+ ExecutionContext memory execCtx,
859
+ bytes32[] calldata beforeHistoryInclusionProof,
860
+ bytes32[] calldata afterHistoryInclusionProof,
861
+ uint8 numBigStepLevel,
862
+ uint256 bigStepHeight,
863
+ uint256 smallStepHeight
864
+ ) internal {
865
+ if (!store.edges[edgeId].exists()) {
866
+ revert EdgeNotExists(edgeId);
867
+ }
868
+
869
+ // edge must of type SmallStep
870
+ if (
871
+ ChallengeEdgeLib.levelToType(store.edges[edgeId].level, numBigStepLevel)
872
+ != EdgeType.SmallStep
873
+ ) {
874
+ revert EdgeTypeNotSmallStep(store.edges[edgeId].level);
875
+ }
876
+
877
+ // edge must be length one to execute one step proofs against
878
+ if (store.edges[edgeId].length() != 1) {
879
+ revert EdgeNotLengthOne(store.edges[edgeId].length());
880
+ }
881
+
882
+ // Get the machine step that corresponds to the start height of this edge
883
+ // To do this we sum the machine steps of the edges in each of the preceeding levels.
884
+ // We do not include the block height, since each step at the block level is a new block
885
+ // and new blocks reset the machine step to 0.
886
+ uint256 machineStep = store.edges[edgeId].startHeight;
887
+ {
888
+ bytes32 cursor = edgeId;
889
+ uint256 stepSize = smallStepHeight;
890
+ while (store.edges[cursor].level > 1) {
891
+ bytes32 nextEdgeId = store.edges[cursor].originId;
892
+ // We can traverse to previous levels using the origin id
893
+ cursor = store.firstRivals[nextEdgeId];
894
+ // sum the stepSize * offset from 0 at this level
895
+ machineStep += stepSize * store.edges[cursor].startHeight;
896
+ // the step size at each level is the product of the heights at all succeeding levels
897
+ stepSize *= bigStepHeight;
898
+ }
899
+ }
900
+
901
+ // the state in the onestep data must be committed to by the startHistoryRoot
902
+ MerkleTreeAccumulatorLib.verifyInclusionProof(
903
+ store.edges[edgeId].startHistoryRoot,
904
+ oneStepData.beforeHash,
905
+ machineStep,
906
+ beforeHistoryInclusionProof
907
+ );
908
+
909
+ // execute the single step to produce the after state
910
+ bytes32 afterHash = oneStepProofEntry.proveOneStep(
911
+ execCtx, machineStep, oneStepData.beforeHash, oneStepData.proof
912
+ );
913
+
914
+ // check that the after state was indeed committed to by the endHistoryRoot
915
+ MerkleTreeAccumulatorLib.verifyInclusionProof(
916
+ store.edges[edgeId].endHistoryRoot,
917
+ afterHash,
918
+ machineStep + 1,
919
+ afterHistoryInclusionProof
920
+ );
921
+
922
+ // we also check the edge is pending in setConfirmed()
923
+ store.edges[edgeId].setConfirmed();
924
+
925
+ // also checks that no other rival has been confirmed
926
+ setConfirmedRival(store, edgeId);
927
+
928
+ store.edges[edgeId].totalTimeUnrivaledCache = type(uint64).max;
929
+ }
930
+ }