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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (503) hide show
  1. package/build/contracts/@openzeppelin/contracts/access/Ownable.sol/Ownable.dbg.json +1 -1
  2. package/build/contracts/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.dbg.json +1 -1
  3. package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.dbg.json +1 -1
  4. package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.json +2 -2
  5. package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol/ERC1967Upgrade.dbg.json +1 -1
  6. package/build/contracts/@openzeppelin/contracts/proxy/Proxy.sol/Proxy.dbg.json +1 -1
  7. package/build/contracts/@openzeppelin/contracts/proxy/beacon/IBeacon.sol/IBeacon.dbg.json +1 -1
  8. package/build/contracts/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol/UpgradeableBeacon.dbg.json +1 -1
  9. package/build/contracts/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol/UpgradeableBeacon.json +2 -2
  10. package/build/contracts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.dbg.json +1 -1
  11. package/build/contracts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +2 -2
  12. package/build/contracts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.dbg.json +1 -1
  13. package/build/contracts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +2 -2
  14. package/build/contracts/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol/UUPSUpgradeable.dbg.json +1 -1
  15. package/build/contracts/@openzeppelin/contracts/security/ReentrancyGuard.sol/ReentrancyGuard.dbg.json +1 -1
  16. package/build/contracts/@openzeppelin/contracts/token/ERC20/ERC20.sol/ERC20.dbg.json +1 -1
  17. package/build/contracts/@openzeppelin/contracts/token/ERC20/ERC20.sol/ERC20.json +2 -2
  18. package/build/contracts/@openzeppelin/contracts/token/ERC20/IERC20.sol/IERC20.dbg.json +1 -1
  19. package/build/contracts/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol/IERC20Metadata.dbg.json +1 -1
  20. package/build/contracts/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit.dbg.json +4 -0
  21. package/build/contracts/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit.json +86 -0
  22. package/build/contracts/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol/SafeERC20.dbg.json +1 -1
  23. package/build/contracts/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol/SafeERC20.json +2 -2
  24. package/build/contracts/@openzeppelin/contracts/utils/Address.sol/Address.dbg.json +1 -1
  25. package/build/contracts/@openzeppelin/contracts/utils/Address.sol/Address.json +2 -2
  26. package/build/contracts/@openzeppelin/contracts/utils/Context.sol/Context.dbg.json +1 -1
  27. package/build/contracts/@openzeppelin/contracts/utils/Create2.sol/Create2.dbg.json +4 -0
  28. package/build/contracts/@openzeppelin/contracts/utils/Create2.sol/Create2.json +10 -0
  29. package/build/contracts/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.dbg.json +1 -1
  30. package/build/contracts/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.json +2 -2
  31. package/build/contracts/@openzeppelin/contracts/utils/Strings.sol/Strings.dbg.json +1 -1
  32. package/build/contracts/@openzeppelin/contracts/utils/Strings.sol/Strings.json +2 -2
  33. package/build/contracts/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol/AccessControlUpgradeable.dbg.json +1 -1
  34. package/build/contracts/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol/AccessControlUpgradeable.json +13 -0
  35. package/build/contracts/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol/IAccessControlUpgradeable.dbg.json +1 -1
  36. package/build/contracts/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol/OwnableUpgradeable.dbg.json +1 -1
  37. package/build/contracts/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol/OwnableUpgradeable.json +13 -0
  38. package/build/contracts/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol/Initializable.dbg.json +1 -1
  39. package/build/contracts/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol/Initializable.json +15 -1
  40. package/build/contracts/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol/PausableUpgradeable.dbg.json +1 -1
  41. package/build/contracts/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol/PausableUpgradeable.json +13 -0
  42. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol/AddressUpgradeable.dbg.json +1 -1
  43. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol/AddressUpgradeable.json +2 -2
  44. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol/ContextUpgradeable.dbg.json +1 -1
  45. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol/ContextUpgradeable.json +15 -1
  46. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/Create2Upgradeable.sol/Create2Upgradeable.dbg.json +4 -0
  47. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/Create2Upgradeable.sol/Create2Upgradeable.json +10 -0
  48. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol/StorageSlotUpgradeable.dbg.json +1 -1
  49. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol/StorageSlotUpgradeable.json +2 -2
  50. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol/StringsUpgradeable.dbg.json +1 -1
  51. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol/StringsUpgradeable.json +2 -2
  52. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol/ERC165Upgradeable.dbg.json +1 -1
  53. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol/ERC165Upgradeable.json +13 -0
  54. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol/IERC165Upgradeable.dbg.json +1 -1
  55. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol/EnumerableSetUpgradeable.dbg.json +4 -0
  56. package/build/contracts/@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol/EnumerableSetUpgradeable.json +10 -0
  57. package/build/contracts/src/assertionStakingPool/AbsBoldStakingPool.sol/AbsBoldStakingPool.dbg.json +4 -0
  58. package/build/contracts/{@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol/IERC20Upgradeable.json → src/assertionStakingPool/AbsBoldStakingPool.sol/AbsBoldStakingPool.json} +41 -95
  59. package/build/contracts/src/assertionStakingPool/AssertionStakingPool.sol/AssertionStakingPool.dbg.json +4 -0
  60. package/build/contracts/src/assertionStakingPool/AssertionStakingPool.sol/AssertionStakingPool.json +340 -0
  61. package/build/contracts/src/assertionStakingPool/AssertionStakingPoolCreator.sol/AssertionStakingPoolCreator.dbg.json +4 -0
  62. package/build/contracts/src/assertionStakingPool/AssertionStakingPoolCreator.sol/AssertionStakingPoolCreator.json +89 -0
  63. package/build/contracts/src/assertionStakingPool/EdgeStakingPool.sol/EdgeStakingPool.dbg.json +4 -0
  64. package/build/contracts/src/assertionStakingPool/EdgeStakingPool.sol/EdgeStakingPool.json +248 -0
  65. package/build/contracts/src/assertionStakingPool/EdgeStakingPoolCreator.sol/EdgeStakingPoolCreator.dbg.json +4 -0
  66. package/build/contracts/src/assertionStakingPool/EdgeStakingPoolCreator.sol/EdgeStakingPoolCreator.json +83 -0
  67. package/build/contracts/src/assertionStakingPool/StakingPoolCreatorUtils.sol/StakingPoolCreatorUtils.dbg.json +4 -0
  68. package/build/contracts/src/assertionStakingPool/StakingPoolCreatorUtils.sol/StakingPoolCreatorUtils.json +16 -0
  69. package/build/contracts/src/assertionStakingPool/interfaces/IAbsBoldStakingPool.sol/IAbsBoldStakingPool.dbg.json +4 -0
  70. package/build/contracts/src/assertionStakingPool/interfaces/IAbsBoldStakingPool.sol/IAbsBoldStakingPool.json +140 -0
  71. package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPool.sol/IAssertionStakingPool.dbg.json +4 -0
  72. package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPool.sol/IAssertionStakingPool.json +324 -0
  73. package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPoolCreator.sol/IAssertionStakingPoolCreator.dbg.json +4 -0
  74. package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPoolCreator.sol/IAssertionStakingPoolCreator.json +84 -0
  75. package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPool.sol/IEdgeStakingPool.dbg.json +4 -0
  76. package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPool.sol/IEdgeStakingPool.json +232 -0
  77. package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPoolCreator.sol/IEdgeStakingPoolCreator.dbg.json +4 -0
  78. package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPoolCreator.sol/IEdgeStakingPoolCreator.json +78 -0
  79. package/build/contracts/src/bridge/AbsBridge.sol/AbsBridge.dbg.json +1 -1
  80. package/build/contracts/src/bridge/AbsBridge.sol/AbsBridge.json +13 -0
  81. package/build/contracts/src/bridge/AbsInbox.sol/AbsInbox.dbg.json +1 -1
  82. package/build/contracts/src/bridge/AbsInbox.sol/AbsInbox.json +20 -7
  83. package/build/contracts/src/bridge/AbsOutbox.sol/AbsOutbox.dbg.json +1 -1
  84. package/build/contracts/src/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  85. package/build/contracts/src/bridge/Bridge.sol/Bridge.json +15 -2
  86. package/build/contracts/src/bridge/DelayBuffer.sol/DelayBuffer.dbg.json +4 -0
  87. package/build/contracts/src/bridge/DelayBuffer.sol/DelayBuffer.json +24 -0
  88. package/build/contracts/src/bridge/ERC20Bridge.sol/ERC20Bridge.dbg.json +1 -1
  89. package/build/contracts/src/bridge/ERC20Bridge.sol/ERC20Bridge.json +15 -2
  90. package/build/contracts/src/bridge/ERC20Inbox.sol/ERC20Inbox.dbg.json +1 -1
  91. package/build/contracts/src/bridge/ERC20Inbox.sol/ERC20Inbox.json +22 -9
  92. package/build/contracts/src/bridge/ERC20Outbox.sol/ERC20Outbox.dbg.json +1 -1
  93. package/build/contracts/src/bridge/ERC20Outbox.sol/ERC20Outbox.json +2 -2
  94. package/build/contracts/src/bridge/GasRefunder.sol/GasRefunder.dbg.json +1 -1
  95. package/build/contracts/src/bridge/GasRefunder.sol/GasRefunder.json +2 -2
  96. package/build/contracts/src/bridge/IBridge.sol/IBridge.dbg.json +1 -1
  97. package/build/contracts/src/bridge/IDelayedMessageProvider.sol/IDelayedMessageProvider.dbg.json +1 -1
  98. package/build/contracts/src/bridge/IERC20Bridge.sol/IERC20Bridge.dbg.json +1 -1
  99. package/build/contracts/src/bridge/IERC20Inbox.sol/IERC20Inbox.dbg.json +1 -1
  100. package/build/contracts/src/bridge/IERC20Inbox.sol/IERC20Inbox.json +1 -1
  101. package/build/contracts/src/bridge/IEthBridge.sol/IEthBridge.dbg.json +1 -1
  102. package/build/contracts/src/bridge/IInbox.sol/IInbox.dbg.json +1 -1
  103. package/build/contracts/src/bridge/IInbox.sol/IInbox.json +1 -1
  104. package/build/contracts/src/bridge/IInboxBase.sol/IInboxBase.dbg.json +1 -1
  105. package/build/contracts/src/bridge/IInboxBase.sol/IInboxBase.json +1 -1
  106. package/build/contracts/src/bridge/IOutbox.sol/IOutbox.dbg.json +1 -1
  107. package/build/contracts/src/bridge/IOwnable.sol/IOwnable.dbg.json +1 -1
  108. package/build/contracts/src/bridge/ISequencerInbox.sol/ISequencerInbox.dbg.json +1 -1
  109. package/build/contracts/src/bridge/ISequencerInbox.sol/ISequencerInbox.json +441 -0
  110. package/build/contracts/src/bridge/Inbox.sol/Inbox.dbg.json +1 -1
  111. package/build/contracts/src/bridge/Inbox.sol/Inbox.json +22 -4
  112. package/build/contracts/src/bridge/Messages.sol/Messages.dbg.json +1 -1
  113. package/build/contracts/src/bridge/Messages.sol/Messages.json +2 -2
  114. package/build/contracts/src/bridge/Outbox.sol/Outbox.dbg.json +1 -1
  115. package/build/contracts/src/bridge/Outbox.sol/Outbox.json +2 -2
  116. package/build/contracts/src/bridge/SequencerInbox.sol/SequencerInbox.dbg.json +1 -1
  117. package/build/contracts/src/bridge/SequencerInbox.sol/SequencerInbox.json +564 -7
  118. package/build/contracts/src/chain/CacheManager.sol/CacheManager.dbg.json +1 -1
  119. package/build/contracts/src/chain/CacheManager.sol/CacheManager.json +15 -2
  120. package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/EdgeChallengeManager.dbg.json +4 -0
  121. package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/EdgeChallengeManager.json +1631 -0
  122. package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/IEdgeChallengeManager.dbg.json +4 -0
  123. package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/IEdgeChallengeManager.json +762 -0
  124. package/build/contracts/src/challengeV2/IAssertionChain.sol/IAssertionChain.dbg.json +4 -0
  125. package/build/contracts/src/challengeV2/IAssertionChain.sol/IAssertionChain.json +247 -0
  126. package/build/contracts/src/challengeV2/libraries/ArrayUtilsLib.sol/ArrayUtilsLib.dbg.json +4 -0
  127. package/build/contracts/src/challengeV2/libraries/ArrayUtilsLib.sol/ArrayUtilsLib.json +10 -0
  128. package/build/contracts/src/challengeV2/libraries/ChallengeEdgeLib.sol/ChallengeEdgeLib.dbg.json +4 -0
  129. package/build/contracts/src/challengeV2/libraries/ChallengeEdgeLib.sol/ChallengeEdgeLib.json +10 -0
  130. package/build/contracts/src/challengeV2/libraries/EdgeChallengeManagerLib.sol/EdgeChallengeManagerLib.dbg.json +4 -0
  131. package/build/contracts/src/challengeV2/libraries/EdgeChallengeManagerLib.sol/EdgeChallengeManagerLib.json +24 -0
  132. package/build/contracts/src/challengeV2/libraries/MerkleTreeAccumulatorLib.sol/MerkleTreeAccumulatorLib.dbg.json +4 -0
  133. package/build/contracts/src/challengeV2/libraries/MerkleTreeAccumulatorLib.sol/MerkleTreeAccumulatorLib.json +24 -0
  134. package/build/contracts/src/challengeV2/libraries/UintUtilsLib.sol/UintUtilsLib.dbg.json +4 -0
  135. package/build/contracts/src/challengeV2/libraries/UintUtilsLib.sol/UintUtilsLib.json +10 -0
  136. package/build/contracts/src/libraries/AddressAliasHelper.sol/AddressAliasHelper.dbg.json +1 -1
  137. package/build/contracts/src/libraries/AddressAliasHelper.sol/AddressAliasHelper.json +2 -2
  138. package/build/contracts/src/libraries/AdminFallbackProxy.sol/AdminFallbackProxy.dbg.json +1 -1
  139. package/build/contracts/src/libraries/AdminFallbackProxy.sol/AdminFallbackProxy.json +2 -2
  140. package/build/contracts/src/libraries/AdminFallbackProxy.sol/DoubleLogicERC1967Upgrade.dbg.json +1 -1
  141. package/build/contracts/src/libraries/ArbitrumChecker.sol/ArbitrumChecker.dbg.json +1 -1
  142. package/build/contracts/src/libraries/ArbitrumChecker.sol/ArbitrumChecker.json +2 -2
  143. package/build/contracts/src/libraries/CryptographyPrimitives.sol/CryptographyPrimitives.dbg.json +1 -1
  144. package/build/contracts/src/libraries/CryptographyPrimitives.sol/CryptographyPrimitives.json +2 -2
  145. package/build/contracts/src/libraries/DecimalsConverterHelper.sol/DecimalsConverterHelper.dbg.json +1 -1
  146. package/build/contracts/src/libraries/DecimalsConverterHelper.sol/DecimalsConverterHelper.json +2 -2
  147. package/build/contracts/src/libraries/DelegateCallAware.sol/DelegateCallAware.dbg.json +1 -1
  148. package/build/contracts/src/libraries/DoubleLogicUUPSUpgradeable.sol/DoubleLogicUUPSUpgradeable.dbg.json +1 -1
  149. package/build/contracts/src/libraries/GasRefundEnabled.sol/GasRefundEnabled.dbg.json +1 -1
  150. package/build/contracts/src/libraries/IGasRefunder.sol/IGasRefunder.dbg.json +1 -1
  151. package/build/contracts/src/libraries/IReader4844.sol/IReader4844.dbg.json +1 -1
  152. package/build/contracts/src/libraries/MerkleLib.sol/MerkleLib.dbg.json +1 -1
  153. package/build/contracts/src/libraries/MerkleLib.sol/MerkleLib.json +2 -2
  154. package/build/contracts/src/libraries/UUPSNotUpgradeable.sol/UUPSNotUpgradeable.dbg.json +1 -1
  155. package/build/contracts/src/mocks/Benchmarks.sol/Benchmarks.dbg.json +1 -1
  156. package/build/contracts/src/mocks/Benchmarks.sol/Benchmarks.json +2 -2
  157. package/build/contracts/src/mocks/BridgeStub.sol/BridgeStub.dbg.json +1 -1
  158. package/build/contracts/src/mocks/BridgeStub.sol/BridgeStub.json +8 -8
  159. package/build/contracts/src/mocks/BridgeUnproxied.sol/BridgeUnproxied.dbg.json +1 -1
  160. package/build/contracts/src/mocks/BridgeUnproxied.sol/BridgeUnproxied.json +28 -2
  161. package/build/contracts/src/mocks/InboxStub.sol/InboxStub.dbg.json +1 -1
  162. package/build/contracts/src/mocks/InboxStub.sol/InboxStub.json +2 -2
  163. package/build/contracts/src/mocks/MerkleTreeAccess.sol/MerkleTreeAccess.dbg.json +4 -0
  164. package/build/contracts/src/mocks/MerkleTreeAccess.sol/MerkleTreeAccess.json +227 -0
  165. package/build/contracts/src/mocks/MockRollupEventInbox.sol/MockRollupEventInbox.dbg.json +4 -0
  166. package/build/contracts/src/mocks/MockRollupEventInbox.sol/MockRollupEventInbox.json +133 -0
  167. package/build/contracts/src/mocks/MultiCallTest.sol/MultiCallTest.dbg.json +1 -1
  168. package/build/contracts/src/mocks/MultiCallTest.sol/MultiCallTest.json +2 -2
  169. package/build/contracts/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol/PendingBlkTimeAndNrAdvanceCheck.dbg.json +1 -1
  170. package/build/contracts/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol/PendingBlkTimeAndNrAdvanceCheck.json +2 -2
  171. package/build/contracts/src/mocks/Program.sol/ProgramTest.dbg.json +1 -1
  172. package/build/contracts/src/mocks/Program.sol/ProgramTest.json +2 -2
  173. package/build/contracts/src/mocks/ProxyAdminForBinding.sol/ProxyAdminForBinding.dbg.json +1 -1
  174. package/build/contracts/src/mocks/ProxyAdminForBinding.sol/ProxyAdminForBinding.json +2 -2
  175. package/build/contracts/src/mocks/SdkStorage.sol/SdkStorage.dbg.json +1 -1
  176. package/build/contracts/src/mocks/SdkStorage.sol/SdkStorage.json +2 -2
  177. package/build/contracts/src/mocks/SequencerInboxBlobMock.sol/SequencerInboxBlobMock.dbg.json +4 -0
  178. package/build/contracts/src/mocks/SequencerInboxBlobMock.sol/SequencerInboxBlobMock.json +1632 -0
  179. package/build/contracts/src/mocks/SequencerInboxStub.sol/SequencerInboxStub.dbg.json +1 -1
  180. package/build/contracts/src/mocks/SequencerInboxStub.sol/SequencerInboxStub.json +564 -7
  181. package/build/contracts/src/mocks/Simple.sol/Simple.dbg.json +1 -1
  182. package/build/contracts/src/mocks/Simple.sol/Simple.json +2 -2
  183. package/build/contracts/src/mocks/SimpleCacheManager.sol/SimpleCacheManager.dbg.json +1 -1
  184. package/build/contracts/src/mocks/SimpleCacheManager.sol/SimpleCacheManager.json +2 -2
  185. package/build/contracts/src/mocks/SimpleOneStepProofEntry.sol/SimpleOneStepProofEntry.dbg.json +4 -0
  186. package/build/contracts/src/mocks/SimpleOneStepProofEntry.sol/SimpleOneStepProofEntry.json +142 -0
  187. package/build/contracts/src/mocks/SimpleProxy.sol/SimpleProxy.dbg.json +1 -1
  188. package/build/contracts/src/mocks/SimpleProxy.sol/SimpleProxy.json +2 -2
  189. package/build/contracts/src/mocks/TestWETH9.sol/IWETH9.dbg.json +4 -0
  190. package/build/contracts/src/mocks/TestWETH9.sol/IWETH9.json +31 -0
  191. package/build/contracts/src/mocks/TestWETH9.sol/TestWETH9.dbg.json +4 -0
  192. package/build/contracts/src/mocks/TestWETH9.sol/TestWETH9.json +317 -0
  193. package/build/contracts/src/mocks/UpgradeExecutorMock.sol/UpgradeExecutorMock.dbg.json +1 -1
  194. package/build/contracts/src/mocks/UpgradeExecutorMock.sol/UpgradeExecutorMock.json +15 -2
  195. package/build/contracts/src/node-interface/NodeInterface.sol/NodeInterface.dbg.json +1 -1
  196. package/build/contracts/src/node-interface/NodeInterfaceDebug.sol/NodeInterfaceDebug.dbg.json +1 -1
  197. package/build/contracts/src/osp/HashProofHelper.sol/HashProofHelper.dbg.json +1 -1
  198. package/build/contracts/src/osp/HashProofHelper.sol/HashProofHelper.json +2 -2
  199. package/build/contracts/src/osp/IOneStepProofEntry.sol/IOneStepProofEntry.dbg.json +1 -1
  200. package/build/contracts/src/osp/IOneStepProofEntry.sol/IOneStepProofEntry.json +33 -9
  201. package/build/contracts/src/osp/IOneStepProofEntry.sol/OneStepProofEntryLib.dbg.json +1 -1
  202. package/build/contracts/src/osp/IOneStepProofEntry.sol/OneStepProofEntryLib.json +2 -2
  203. package/build/contracts/src/osp/IOneStepProver.sol/IOneStepProver.dbg.json +1 -1
  204. package/build/contracts/src/osp/IOneStepProver.sol/IOneStepProver.json +5 -0
  205. package/build/contracts/src/osp/OneStepProofEntry.sol/OneStepProofEntry.dbg.json +1 -1
  206. package/build/contracts/src/osp/OneStepProofEntry.sol/OneStepProofEntry.json +35 -11
  207. package/build/contracts/src/osp/OneStepProver0.sol/OneStepProver0.dbg.json +1 -1
  208. package/build/contracts/src/osp/OneStepProver0.sol/OneStepProver0.json +7 -2
  209. package/build/contracts/src/osp/OneStepProverHostIo.sol/OneStepProverHostIo.dbg.json +1 -1
  210. package/build/contracts/src/osp/OneStepProverHostIo.sol/OneStepProverHostIo.json +7 -2
  211. package/build/contracts/src/osp/OneStepProverMath.sol/OneStepProverMath.dbg.json +1 -1
  212. package/build/contracts/src/osp/OneStepProverMath.sol/OneStepProverMath.json +7 -2
  213. package/build/contracts/src/osp/OneStepProverMemory.sol/OneStepProverMemory.dbg.json +1 -1
  214. package/build/contracts/src/osp/OneStepProverMemory.sol/OneStepProverMemory.json +7 -2
  215. package/build/contracts/src/precompiles/ArbAddressTable.sol/ArbAddressTable.dbg.json +1 -1
  216. package/build/contracts/src/precompiles/ArbAggregator.sol/ArbAggregator.dbg.json +1 -1
  217. package/build/contracts/src/precompiles/ArbBLS.sol/ArbBLS.dbg.json +1 -1
  218. package/build/contracts/src/precompiles/ArbDebug.sol/ArbDebug.dbg.json +1 -1
  219. package/build/contracts/src/precompiles/ArbFunctionTable.sol/ArbFunctionTable.dbg.json +1 -1
  220. package/build/contracts/src/precompiles/ArbGasInfo.sol/ArbGasInfo.dbg.json +1 -1
  221. package/build/contracts/src/precompiles/ArbInfo.sol/ArbInfo.dbg.json +1 -1
  222. package/build/contracts/src/precompiles/ArbOwner.sol/ArbOwner.dbg.json +1 -1
  223. package/build/contracts/src/precompiles/ArbOwnerPublic.sol/ArbOwnerPublic.dbg.json +1 -1
  224. package/build/contracts/src/precompiles/ArbRetryableTx.sol/ArbRetryableTx.dbg.json +1 -1
  225. package/build/contracts/src/precompiles/ArbStatistics.sol/ArbStatistics.dbg.json +1 -1
  226. package/build/contracts/src/precompiles/ArbSys.sol/ArbSys.dbg.json +1 -1
  227. package/build/contracts/src/precompiles/ArbWasm.sol/ArbWasm.dbg.json +1 -1
  228. package/build/contracts/src/precompiles/ArbWasmCache.sol/ArbWasmCache.dbg.json +1 -1
  229. package/build/contracts/src/precompiles/ArbosActs.sol/ArbosActs.dbg.json +1 -1
  230. package/build/contracts/src/precompiles/ArbosTest.sol/ArbosTest.dbg.json +1 -1
  231. package/build/contracts/src/rollup/AbsRollupEventInbox.sol/AbsRollupEventInbox.dbg.json +1 -1
  232. package/build/contracts/src/rollup/Assertion.sol/AssertionNodeLib.dbg.json +4 -0
  233. package/build/contracts/src/rollup/{Node.sol/NodeLib.json → Assertion.sol/AssertionNodeLib.json} +4 -4
  234. package/build/contracts/src/rollup/AssertionState.sol/AssertionStateLib.dbg.json +4 -0
  235. package/build/contracts/src/{challenge/ChallengeLib.sol/ChallengeLib.json → rollup/AssertionState.sol/AssertionStateLib.json} +4 -4
  236. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/BOLDUpgradeAction.dbg.json +4 -0
  237. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/BOLDUpgradeAction.json +807 -0
  238. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ConstantArrayStorage.dbg.json +4 -0
  239. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ConstantArrayStorage.json +35 -0
  240. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollup.dbg.json +4 -0
  241. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollup.json +361 -0
  242. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollupAdmin.dbg.json +4 -0
  243. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollupAdmin.json +38 -0
  244. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ISeqInboxPostUpgradeInit.dbg.json +4 -0
  245. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ISeqInboxPostUpgradeInit.json +41 -0
  246. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/RollupReader.dbg.json +4 -0
  247. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/RollupReader.json +385 -0
  248. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/StateHashPreImageLookup.dbg.json +4 -0
  249. package/build/contracts/src/rollup/BOLDUpgradeAction.sol/StateHashPreImageLookup.json +203 -0
  250. package/build/contracts/src/rollup/BridgeCreator.sol/BridgeCreator.dbg.json +1 -1
  251. package/build/contracts/src/rollup/BridgeCreator.sol/BridgeCreator.json +62 -10
  252. package/build/contracts/src/rollup/DeployHelper.sol/DeployHelper.dbg.json +1 -1
  253. package/build/contracts/src/rollup/DeployHelper.sol/DeployHelper.json +2 -2
  254. package/build/contracts/src/rollup/ERC20RollupEventInbox.sol/ERC20RollupEventInbox.dbg.json +1 -1
  255. package/build/contracts/src/rollup/ERC20RollupEventInbox.sol/ERC20RollupEventInbox.json +2 -2
  256. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/FactoryDeployerHelper.dbg.json +1 -1
  257. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/FactoryDeployerHelper.json +2 -2
  258. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IDeployHelper.dbg.json +1 -1
  259. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IERC20.dbg.json +1 -1
  260. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IERC20Bridge.dbg.json +1 -1
  261. package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IInboxBase.dbg.json +1 -1
  262. package/build/contracts/src/rollup/IRollupAdmin.sol/IRollupAdmin.dbg.json +1 -1
  263. package/build/contracts/src/rollup/IRollupAdmin.sol/IRollupAdmin.json +473 -99
  264. package/build/contracts/src/rollup/IRollupCore.sol/IRollupCore.dbg.json +1 -1
  265. package/build/contracts/src/rollup/IRollupCore.sol/IRollupCore.json +315 -221
  266. package/build/contracts/src/rollup/IRollupEventInbox.sol/IRollupEventInbox.dbg.json +1 -1
  267. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUser.dbg.json +1 -1
  268. package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUser.json +678 -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
@@ -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
+ }