@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.
- package/build/contracts/@openzeppelin/contracts/access/Ownable.sol/Ownable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/interfaces/draft-IERC1822.sol/IERC1822Proxiable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol/ERC1967Proxy.json +2 -2
- package/build/contracts/@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol/ERC1967Upgrade.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/Proxy.sol/Proxy.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/beacon/IBeacon.sol/IBeacon.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol/UpgradeableBeacon.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol/UpgradeableBeacon.json +2 -2
- package/build/contracts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +2 -2
- package/build/contracts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +2 -2
- package/build/contracts/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol/UUPSUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/security/ReentrancyGuard.sol/ReentrancyGuard.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/token/ERC20/ERC20.sol/ERC20.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/token/ERC20/ERC20.sol/ERC20.json +2 -2
- package/build/contracts/@openzeppelin/contracts/token/ERC20/IERC20.sol/IERC20.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol/IERC20Metadata.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit.dbg.json +4 -0
- package/build/contracts/@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol/IERC20Permit.json +86 -0
- package/build/contracts/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol/SafeERC20.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol/SafeERC20.json +2 -2
- package/build/contracts/@openzeppelin/contracts/utils/Address.sol/Address.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/utils/Address.sol/Address.json +2 -2
- package/build/contracts/@openzeppelin/contracts/utils/Context.sol/Context.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/utils/Create2.sol/Create2.dbg.json +4 -0
- package/build/contracts/@openzeppelin/contracts/utils/Create2.sol/Create2.json +10 -0
- package/build/contracts/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/utils/StorageSlot.sol/StorageSlot.json +2 -2
- package/build/contracts/@openzeppelin/contracts/utils/Strings.sol/Strings.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts/utils/Strings.sol/Strings.json +2 -2
- package/build/contracts/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol/AccessControlUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol/AccessControlUpgradeable.json +13 -0
- package/build/contracts/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol/IAccessControlUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol/OwnableUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol/OwnableUpgradeable.json +13 -0
- package/build/contracts/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol/Initializable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol/Initializable.json +15 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol/PausableUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol/PausableUpgradeable.json +13 -0
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol/AddressUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol/AddressUpgradeable.json +2 -2
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol/ContextUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol/ContextUpgradeable.json +15 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/Create2Upgradeable.sol/Create2Upgradeable.dbg.json +4 -0
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/Create2Upgradeable.sol/Create2Upgradeable.json +10 -0
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol/StorageSlotUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol/StorageSlotUpgradeable.json +2 -2
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol/StringsUpgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol/StringsUpgradeable.json +2 -2
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol/ERC165Upgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol/ERC165Upgradeable.json +13 -0
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol/IERC165Upgradeable.dbg.json +1 -1
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol/EnumerableSetUpgradeable.dbg.json +4 -0
- package/build/contracts/@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol/EnumerableSetUpgradeable.json +10 -0
- package/build/contracts/src/assertionStakingPool/AbsBoldStakingPool.sol/AbsBoldStakingPool.dbg.json +4 -0
- package/build/contracts/{@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol/IERC20Upgradeable.json → src/assertionStakingPool/AbsBoldStakingPool.sol/AbsBoldStakingPool.json} +41 -95
- package/build/contracts/src/assertionStakingPool/AssertionStakingPool.sol/AssertionStakingPool.dbg.json +4 -0
- package/build/contracts/src/assertionStakingPool/AssertionStakingPool.sol/AssertionStakingPool.json +340 -0
- package/build/contracts/src/assertionStakingPool/AssertionStakingPoolCreator.sol/AssertionStakingPoolCreator.dbg.json +4 -0
- package/build/contracts/src/assertionStakingPool/AssertionStakingPoolCreator.sol/AssertionStakingPoolCreator.json +89 -0
- package/build/contracts/src/assertionStakingPool/EdgeStakingPool.sol/EdgeStakingPool.dbg.json +4 -0
- package/build/contracts/src/assertionStakingPool/EdgeStakingPool.sol/EdgeStakingPool.json +248 -0
- package/build/contracts/src/assertionStakingPool/EdgeStakingPoolCreator.sol/EdgeStakingPoolCreator.dbg.json +4 -0
- package/build/contracts/src/assertionStakingPool/EdgeStakingPoolCreator.sol/EdgeStakingPoolCreator.json +83 -0
- package/build/contracts/src/assertionStakingPool/StakingPoolCreatorUtils.sol/StakingPoolCreatorUtils.dbg.json +4 -0
- package/build/contracts/src/assertionStakingPool/StakingPoolCreatorUtils.sol/StakingPoolCreatorUtils.json +16 -0
- package/build/contracts/src/assertionStakingPool/interfaces/IAbsBoldStakingPool.sol/IAbsBoldStakingPool.dbg.json +4 -0
- package/build/contracts/src/assertionStakingPool/interfaces/IAbsBoldStakingPool.sol/IAbsBoldStakingPool.json +140 -0
- package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPool.sol/IAssertionStakingPool.dbg.json +4 -0
- package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPool.sol/IAssertionStakingPool.json +324 -0
- package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPoolCreator.sol/IAssertionStakingPoolCreator.dbg.json +4 -0
- package/build/contracts/src/assertionStakingPool/interfaces/IAssertionStakingPoolCreator.sol/IAssertionStakingPoolCreator.json +84 -0
- package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPool.sol/IEdgeStakingPool.dbg.json +4 -0
- package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPool.sol/IEdgeStakingPool.json +232 -0
- package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPoolCreator.sol/IEdgeStakingPoolCreator.dbg.json +4 -0
- package/build/contracts/src/assertionStakingPool/interfaces/IEdgeStakingPoolCreator.sol/IEdgeStakingPoolCreator.json +78 -0
- package/build/contracts/src/bridge/AbsBridge.sol/AbsBridge.dbg.json +1 -1
- package/build/contracts/src/bridge/AbsBridge.sol/AbsBridge.json +13 -0
- package/build/contracts/src/bridge/AbsInbox.sol/AbsInbox.dbg.json +1 -1
- package/build/contracts/src/bridge/AbsInbox.sol/AbsInbox.json +20 -7
- package/build/contracts/src/bridge/AbsOutbox.sol/AbsOutbox.dbg.json +1 -1
- package/build/contracts/src/bridge/Bridge.sol/Bridge.dbg.json +1 -1
- package/build/contracts/src/bridge/Bridge.sol/Bridge.json +15 -2
- package/build/contracts/src/bridge/DelayBuffer.sol/DelayBuffer.dbg.json +4 -0
- package/build/contracts/src/bridge/DelayBuffer.sol/DelayBuffer.json +24 -0
- package/build/contracts/src/bridge/ERC20Bridge.sol/ERC20Bridge.dbg.json +1 -1
- package/build/contracts/src/bridge/ERC20Bridge.sol/ERC20Bridge.json +15 -2
- package/build/contracts/src/bridge/ERC20Inbox.sol/ERC20Inbox.dbg.json +1 -1
- package/build/contracts/src/bridge/ERC20Inbox.sol/ERC20Inbox.json +22 -9
- package/build/contracts/src/bridge/ERC20Outbox.sol/ERC20Outbox.dbg.json +1 -1
- package/build/contracts/src/bridge/ERC20Outbox.sol/ERC20Outbox.json +2 -2
- package/build/contracts/src/bridge/GasRefunder.sol/GasRefunder.dbg.json +1 -1
- package/build/contracts/src/bridge/GasRefunder.sol/GasRefunder.json +2 -2
- package/build/contracts/src/bridge/IBridge.sol/IBridge.dbg.json +1 -1
- package/build/contracts/src/bridge/IDelayedMessageProvider.sol/IDelayedMessageProvider.dbg.json +1 -1
- package/build/contracts/src/bridge/IERC20Bridge.sol/IERC20Bridge.dbg.json +1 -1
- package/build/contracts/src/bridge/IERC20Inbox.sol/IERC20Inbox.dbg.json +1 -1
- package/build/contracts/src/bridge/IERC20Inbox.sol/IERC20Inbox.json +1 -1
- package/build/contracts/src/bridge/IEthBridge.sol/IEthBridge.dbg.json +1 -1
- package/build/contracts/src/bridge/IInbox.sol/IInbox.dbg.json +1 -1
- package/build/contracts/src/bridge/IInbox.sol/IInbox.json +1 -1
- package/build/contracts/src/bridge/IInboxBase.sol/IInboxBase.dbg.json +1 -1
- package/build/contracts/src/bridge/IInboxBase.sol/IInboxBase.json +1 -1
- package/build/contracts/src/bridge/IOutbox.sol/IOutbox.dbg.json +1 -1
- package/build/contracts/src/bridge/IOwnable.sol/IOwnable.dbg.json +1 -1
- package/build/contracts/src/bridge/ISequencerInbox.sol/ISequencerInbox.dbg.json +1 -1
- package/build/contracts/src/bridge/ISequencerInbox.sol/ISequencerInbox.json +441 -0
- package/build/contracts/src/bridge/Inbox.sol/Inbox.dbg.json +1 -1
- package/build/contracts/src/bridge/Inbox.sol/Inbox.json +22 -4
- package/build/contracts/src/bridge/Messages.sol/Messages.dbg.json +1 -1
- package/build/contracts/src/bridge/Messages.sol/Messages.json +2 -2
- package/build/contracts/src/bridge/Outbox.sol/Outbox.dbg.json +1 -1
- package/build/contracts/src/bridge/Outbox.sol/Outbox.json +2 -2
- package/build/contracts/src/bridge/SequencerInbox.sol/SequencerInbox.dbg.json +1 -1
- package/build/contracts/src/bridge/SequencerInbox.sol/SequencerInbox.json +564 -7
- package/build/contracts/src/chain/CacheManager.sol/CacheManager.dbg.json +1 -1
- package/build/contracts/src/chain/CacheManager.sol/CacheManager.json +15 -2
- package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/EdgeChallengeManager.dbg.json +4 -0
- package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/EdgeChallengeManager.json +1631 -0
- package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/IEdgeChallengeManager.dbg.json +4 -0
- package/build/contracts/src/challengeV2/EdgeChallengeManager.sol/IEdgeChallengeManager.json +762 -0
- package/build/contracts/src/challengeV2/IAssertionChain.sol/IAssertionChain.dbg.json +4 -0
- package/build/contracts/src/challengeV2/IAssertionChain.sol/IAssertionChain.json +247 -0
- package/build/contracts/src/challengeV2/libraries/ArrayUtilsLib.sol/ArrayUtilsLib.dbg.json +4 -0
- package/build/contracts/src/challengeV2/libraries/ArrayUtilsLib.sol/ArrayUtilsLib.json +10 -0
- package/build/contracts/src/challengeV2/libraries/ChallengeEdgeLib.sol/ChallengeEdgeLib.dbg.json +4 -0
- package/build/contracts/src/challengeV2/libraries/ChallengeEdgeLib.sol/ChallengeEdgeLib.json +10 -0
- package/build/contracts/src/challengeV2/libraries/EdgeChallengeManagerLib.sol/EdgeChallengeManagerLib.dbg.json +4 -0
- package/build/contracts/src/challengeV2/libraries/EdgeChallengeManagerLib.sol/EdgeChallengeManagerLib.json +24 -0
- package/build/contracts/src/challengeV2/libraries/MerkleTreeAccumulatorLib.sol/MerkleTreeAccumulatorLib.dbg.json +4 -0
- package/build/contracts/src/challengeV2/libraries/MerkleTreeAccumulatorLib.sol/MerkleTreeAccumulatorLib.json +24 -0
- package/build/contracts/src/challengeV2/libraries/UintUtilsLib.sol/UintUtilsLib.dbg.json +4 -0
- package/build/contracts/src/challengeV2/libraries/UintUtilsLib.sol/UintUtilsLib.json +10 -0
- package/build/contracts/src/libraries/AddressAliasHelper.sol/AddressAliasHelper.dbg.json +1 -1
- package/build/contracts/src/libraries/AddressAliasHelper.sol/AddressAliasHelper.json +2 -2
- package/build/contracts/src/libraries/AdminFallbackProxy.sol/AdminFallbackProxy.dbg.json +1 -1
- package/build/contracts/src/libraries/AdminFallbackProxy.sol/AdminFallbackProxy.json +2 -2
- package/build/contracts/src/libraries/AdminFallbackProxy.sol/DoubleLogicERC1967Upgrade.dbg.json +1 -1
- package/build/contracts/src/libraries/ArbitrumChecker.sol/ArbitrumChecker.dbg.json +1 -1
- package/build/contracts/src/libraries/ArbitrumChecker.sol/ArbitrumChecker.json +2 -2
- package/build/contracts/src/libraries/CryptographyPrimitives.sol/CryptographyPrimitives.dbg.json +1 -1
- package/build/contracts/src/libraries/CryptographyPrimitives.sol/CryptographyPrimitives.json +2 -2
- package/build/contracts/src/libraries/DecimalsConverterHelper.sol/DecimalsConverterHelper.dbg.json +1 -1
- package/build/contracts/src/libraries/DecimalsConverterHelper.sol/DecimalsConverterHelper.json +2 -2
- package/build/contracts/src/libraries/DelegateCallAware.sol/DelegateCallAware.dbg.json +1 -1
- package/build/contracts/src/libraries/DoubleLogicUUPSUpgradeable.sol/DoubleLogicUUPSUpgradeable.dbg.json +1 -1
- package/build/contracts/src/libraries/GasRefundEnabled.sol/GasRefundEnabled.dbg.json +1 -1
- package/build/contracts/src/libraries/IGasRefunder.sol/IGasRefunder.dbg.json +1 -1
- package/build/contracts/src/libraries/IReader4844.sol/IReader4844.dbg.json +1 -1
- package/build/contracts/src/libraries/MerkleLib.sol/MerkleLib.dbg.json +1 -1
- package/build/contracts/src/libraries/MerkleLib.sol/MerkleLib.json +2 -2
- package/build/contracts/src/libraries/UUPSNotUpgradeable.sol/UUPSNotUpgradeable.dbg.json +1 -1
- package/build/contracts/src/mocks/Benchmarks.sol/Benchmarks.dbg.json +1 -1
- package/build/contracts/src/mocks/Benchmarks.sol/Benchmarks.json +2 -2
- package/build/contracts/src/mocks/BridgeStub.sol/BridgeStub.dbg.json +1 -1
- package/build/contracts/src/mocks/BridgeStub.sol/BridgeStub.json +8 -8
- package/build/contracts/src/mocks/BridgeUnproxied.sol/BridgeUnproxied.dbg.json +1 -1
- package/build/contracts/src/mocks/BridgeUnproxied.sol/BridgeUnproxied.json +28 -2
- package/build/contracts/src/mocks/InboxStub.sol/InboxStub.dbg.json +1 -1
- package/build/contracts/src/mocks/InboxStub.sol/InboxStub.json +2 -2
- package/build/contracts/src/mocks/MerkleTreeAccess.sol/MerkleTreeAccess.dbg.json +4 -0
- package/build/contracts/src/mocks/MerkleTreeAccess.sol/MerkleTreeAccess.json +227 -0
- package/build/contracts/src/mocks/MockRollupEventInbox.sol/MockRollupEventInbox.dbg.json +4 -0
- package/build/contracts/src/mocks/MockRollupEventInbox.sol/MockRollupEventInbox.json +133 -0
- package/build/contracts/src/mocks/MultiCallTest.sol/MultiCallTest.dbg.json +1 -1
- package/build/contracts/src/mocks/MultiCallTest.sol/MultiCallTest.json +2 -2
- package/build/contracts/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol/PendingBlkTimeAndNrAdvanceCheck.dbg.json +1 -1
- package/build/contracts/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol/PendingBlkTimeAndNrAdvanceCheck.json +2 -2
- package/build/contracts/src/mocks/Program.sol/ProgramTest.dbg.json +1 -1
- package/build/contracts/src/mocks/Program.sol/ProgramTest.json +2 -2
- package/build/contracts/src/mocks/ProxyAdminForBinding.sol/ProxyAdminForBinding.dbg.json +1 -1
- package/build/contracts/src/mocks/ProxyAdminForBinding.sol/ProxyAdminForBinding.json +2 -2
- package/build/contracts/src/mocks/SdkStorage.sol/SdkStorage.dbg.json +1 -1
- package/build/contracts/src/mocks/SdkStorage.sol/SdkStorage.json +2 -2
- package/build/contracts/src/mocks/SequencerInboxBlobMock.sol/SequencerInboxBlobMock.dbg.json +4 -0
- package/build/contracts/src/mocks/SequencerInboxBlobMock.sol/SequencerInboxBlobMock.json +1632 -0
- package/build/contracts/src/mocks/SequencerInboxStub.sol/SequencerInboxStub.dbg.json +1 -1
- package/build/contracts/src/mocks/SequencerInboxStub.sol/SequencerInboxStub.json +564 -7
- package/build/contracts/src/mocks/Simple.sol/Simple.dbg.json +1 -1
- package/build/contracts/src/mocks/Simple.sol/Simple.json +2 -2
- package/build/contracts/src/mocks/SimpleCacheManager.sol/SimpleCacheManager.dbg.json +1 -1
- package/build/contracts/src/mocks/SimpleCacheManager.sol/SimpleCacheManager.json +2 -2
- package/build/contracts/src/mocks/SimpleOneStepProofEntry.sol/SimpleOneStepProofEntry.dbg.json +4 -0
- package/build/contracts/src/mocks/SimpleOneStepProofEntry.sol/SimpleOneStepProofEntry.json +142 -0
- package/build/contracts/src/mocks/SimpleProxy.sol/SimpleProxy.dbg.json +1 -1
- package/build/contracts/src/mocks/SimpleProxy.sol/SimpleProxy.json +2 -2
- package/build/contracts/src/mocks/TestWETH9.sol/IWETH9.dbg.json +4 -0
- package/build/contracts/src/mocks/TestWETH9.sol/IWETH9.json +31 -0
- package/build/contracts/src/mocks/TestWETH9.sol/TestWETH9.dbg.json +4 -0
- package/build/contracts/src/mocks/TestWETH9.sol/TestWETH9.json +317 -0
- package/build/contracts/src/mocks/UpgradeExecutorMock.sol/UpgradeExecutorMock.dbg.json +1 -1
- package/build/contracts/src/mocks/UpgradeExecutorMock.sol/UpgradeExecutorMock.json +15 -2
- package/build/contracts/src/node-interface/NodeInterface.sol/NodeInterface.dbg.json +1 -1
- package/build/contracts/src/node-interface/NodeInterfaceDebug.sol/NodeInterfaceDebug.dbg.json +1 -1
- package/build/contracts/src/osp/HashProofHelper.sol/HashProofHelper.dbg.json +1 -1
- package/build/contracts/src/osp/HashProofHelper.sol/HashProofHelper.json +2 -2
- package/build/contracts/src/osp/IOneStepProofEntry.sol/IOneStepProofEntry.dbg.json +1 -1
- package/build/contracts/src/osp/IOneStepProofEntry.sol/IOneStepProofEntry.json +33 -9
- package/build/contracts/src/osp/IOneStepProofEntry.sol/OneStepProofEntryLib.dbg.json +1 -1
- package/build/contracts/src/osp/IOneStepProofEntry.sol/OneStepProofEntryLib.json +2 -2
- package/build/contracts/src/osp/IOneStepProver.sol/IOneStepProver.dbg.json +1 -1
- package/build/contracts/src/osp/IOneStepProver.sol/IOneStepProver.json +5 -0
- package/build/contracts/src/osp/OneStepProofEntry.sol/OneStepProofEntry.dbg.json +1 -1
- package/build/contracts/src/osp/OneStepProofEntry.sol/OneStepProofEntry.json +35 -11
- package/build/contracts/src/osp/OneStepProver0.sol/OneStepProver0.dbg.json +1 -1
- package/build/contracts/src/osp/OneStepProver0.sol/OneStepProver0.json +7 -2
- package/build/contracts/src/osp/OneStepProverHostIo.sol/OneStepProverHostIo.dbg.json +1 -1
- package/build/contracts/src/osp/OneStepProverHostIo.sol/OneStepProverHostIo.json +7 -2
- package/build/contracts/src/osp/OneStepProverMath.sol/OneStepProverMath.dbg.json +1 -1
- package/build/contracts/src/osp/OneStepProverMath.sol/OneStepProverMath.json +7 -2
- package/build/contracts/src/osp/OneStepProverMemory.sol/OneStepProverMemory.dbg.json +1 -1
- package/build/contracts/src/osp/OneStepProverMemory.sol/OneStepProverMemory.json +7 -2
- package/build/contracts/src/precompiles/ArbAddressTable.sol/ArbAddressTable.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbAggregator.sol/ArbAggregator.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbBLS.sol/ArbBLS.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbDebug.sol/ArbDebug.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbFunctionTable.sol/ArbFunctionTable.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbGasInfo.sol/ArbGasInfo.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbInfo.sol/ArbInfo.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbOwner.sol/ArbOwner.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbOwnerPublic.sol/ArbOwnerPublic.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbRetryableTx.sol/ArbRetryableTx.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbStatistics.sol/ArbStatistics.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbSys.sol/ArbSys.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbWasm.sol/ArbWasm.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbWasmCache.sol/ArbWasmCache.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbosActs.sol/ArbosActs.dbg.json +1 -1
- package/build/contracts/src/precompiles/ArbosTest.sol/ArbosTest.dbg.json +1 -1
- package/build/contracts/src/rollup/AbsRollupEventInbox.sol/AbsRollupEventInbox.dbg.json +1 -1
- package/build/contracts/src/rollup/Assertion.sol/AssertionNodeLib.dbg.json +4 -0
- package/build/contracts/src/rollup/{Node.sol/NodeLib.json → Assertion.sol/AssertionNodeLib.json} +4 -4
- package/build/contracts/src/rollup/AssertionState.sol/AssertionStateLib.dbg.json +4 -0
- package/build/contracts/src/{challenge/ChallengeLib.sol/ChallengeLib.json → rollup/AssertionState.sol/AssertionStateLib.json} +4 -4
- package/build/contracts/src/rollup/BOLDUpgradeAction.sol/BOLDUpgradeAction.dbg.json +4 -0
- package/build/contracts/src/rollup/BOLDUpgradeAction.sol/BOLDUpgradeAction.json +807 -0
- package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ConstantArrayStorage.dbg.json +4 -0
- package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ConstantArrayStorage.json +35 -0
- package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollup.dbg.json +4 -0
- package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollup.json +361 -0
- package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollupAdmin.dbg.json +4 -0
- package/build/contracts/src/rollup/BOLDUpgradeAction.sol/IOldRollupAdmin.json +38 -0
- package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ISeqInboxPostUpgradeInit.dbg.json +4 -0
- package/build/contracts/src/rollup/BOLDUpgradeAction.sol/ISeqInboxPostUpgradeInit.json +41 -0
- package/build/contracts/src/rollup/BOLDUpgradeAction.sol/RollupReader.dbg.json +4 -0
- package/build/contracts/src/rollup/BOLDUpgradeAction.sol/RollupReader.json +385 -0
- package/build/contracts/src/rollup/BOLDUpgradeAction.sol/StateHashPreImageLookup.dbg.json +4 -0
- package/build/contracts/src/rollup/BOLDUpgradeAction.sol/StateHashPreImageLookup.json +203 -0
- package/build/contracts/src/rollup/BridgeCreator.sol/BridgeCreator.dbg.json +1 -1
- package/build/contracts/src/rollup/BridgeCreator.sol/BridgeCreator.json +62 -10
- package/build/contracts/src/rollup/DeployHelper.sol/DeployHelper.dbg.json +1 -1
- package/build/contracts/src/rollup/DeployHelper.sol/DeployHelper.json +2 -2
- package/build/contracts/src/rollup/ERC20RollupEventInbox.sol/ERC20RollupEventInbox.dbg.json +1 -1
- package/build/contracts/src/rollup/ERC20RollupEventInbox.sol/ERC20RollupEventInbox.json +2 -2
- package/build/contracts/src/rollup/FactoryDeployerHelper.sol/FactoryDeployerHelper.dbg.json +1 -1
- package/build/contracts/src/rollup/FactoryDeployerHelper.sol/FactoryDeployerHelper.json +2 -2
- package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IDeployHelper.dbg.json +1 -1
- package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IERC20.dbg.json +1 -1
- package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IERC20Bridge.dbg.json +1 -1
- package/build/contracts/src/rollup/FactoryDeployerHelper.sol/IInboxBase.dbg.json +1 -1
- package/build/contracts/src/rollup/IRollupAdmin.sol/IRollupAdmin.dbg.json +1 -1
- package/build/contracts/src/rollup/IRollupAdmin.sol/IRollupAdmin.json +473 -99
- package/build/contracts/src/rollup/IRollupCore.sol/IRollupCore.dbg.json +1 -1
- package/build/contracts/src/rollup/IRollupCore.sol/IRollupCore.json +315 -221
- package/build/contracts/src/rollup/IRollupEventInbox.sol/IRollupEventInbox.dbg.json +1 -1
- package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUser.dbg.json +1 -1
- package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUser.json +678 -494
- package/build/contracts/src/rollup/RollupAdminLogic.sol/RollupAdminLogic.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupAdminLogic.sol/RollupAdminLogic.json +806 -435
- package/build/contracts/src/rollup/RollupCore.sol/RollupCore.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupCore.sol/RollupCore.json +323 -235
- package/build/contracts/src/rollup/RollupCreator.sol/RollupCreator.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupCreator.sol/RollupCreator.json +98 -36
- package/build/contracts/src/rollup/RollupEventInbox.sol/RollupEventInbox.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupEventInbox.sol/RollupEventInbox.json +2 -2
- package/build/contracts/src/rollup/RollupLib.sol/RollupLib.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupLib.sol/RollupLib.json +2 -2
- package/build/contracts/src/rollup/RollupProxy.sol/RollupProxy.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupProxy.sol/RollupProxy.json +97 -16
- package/build/contracts/src/rollup/RollupUserLogic.sol/RollupUserLogic.dbg.json +1 -1
- package/build/contracts/src/rollup/RollupUserLogic.sol/RollupUserLogic.json +924 -530
- package/build/contracts/src/rollup/ValidatorWallet.sol/ValidatorWallet.dbg.json +1 -1
- package/build/contracts/src/rollup/ValidatorWallet.sol/ValidatorWallet.json +15 -43
- package/build/contracts/src/rollup/ValidatorWalletCreator.sol/ValidatorWalletCreator.dbg.json +1 -1
- package/build/contracts/src/rollup/ValidatorWalletCreator.sol/ValidatorWalletCreator.json +2 -2
- package/build/contracts/src/state/Deserialize.sol/Deserialize.dbg.json +1 -1
- package/build/contracts/src/state/Deserialize.sol/Deserialize.json +2 -2
- package/build/contracts/src/state/GlobalState.sol/GlobalStateLib.dbg.json +1 -1
- package/build/contracts/src/state/GlobalState.sol/GlobalStateLib.json +2 -2
- package/build/contracts/src/state/Instructions.sol/Instructions.dbg.json +1 -1
- package/build/contracts/src/state/Instructions.sol/Instructions.json +2 -2
- package/build/contracts/src/state/Machine.sol/MachineLib.dbg.json +1 -1
- package/build/contracts/src/state/Machine.sol/MachineLib.json +2 -2
- package/build/contracts/src/state/MerkleProof.sol/MerkleProofLib.dbg.json +1 -1
- package/build/contracts/src/state/MerkleProof.sol/MerkleProofLib.json +2 -2
- package/build/contracts/src/state/Module.sol/ModuleLib.dbg.json +1 -1
- package/build/contracts/src/state/Module.sol/ModuleLib.json +2 -2
- package/build/contracts/src/state/ModuleMemory.sol/ModuleMemoryLib.dbg.json +1 -1
- package/build/contracts/src/state/ModuleMemory.sol/ModuleMemoryLib.json +2 -2
- package/build/contracts/src/state/ModuleMemoryCompact.sol/ModuleMemoryCompactLib.dbg.json +1 -1
- package/build/contracts/src/state/ModuleMemoryCompact.sol/ModuleMemoryCompactLib.json +2 -2
- package/build/contracts/src/state/MultiStack.sol/MultiStackLib.dbg.json +1 -1
- package/build/contracts/src/state/MultiStack.sol/MultiStackLib.json +2 -2
- package/build/contracts/src/state/PcArray.sol/PcArrayLib.dbg.json +1 -1
- package/build/contracts/src/state/PcArray.sol/PcArrayLib.json +2 -2
- package/build/contracts/src/state/StackFrame.sol/StackFrameLib.dbg.json +1 -1
- package/build/contracts/src/state/StackFrame.sol/StackFrameLib.json +2 -2
- package/build/contracts/src/state/Value.sol/ValueLib.dbg.json +1 -1
- package/build/contracts/src/state/Value.sol/ValueLib.json +2 -2
- package/build/contracts/src/state/ValueArray.sol/ValueArrayLib.dbg.json +1 -1
- package/build/contracts/src/state/ValueArray.sol/ValueArrayLib.json +2 -2
- package/build/contracts/src/state/ValueStack.sol/ValueStackLib.dbg.json +1 -1
- package/build/contracts/src/state/ValueStack.sol/ValueStackLib.json +2 -2
- package/build/contracts/src/test-helpers/BridgeTester.sol/BridgeTester.dbg.json +1 -1
- package/build/contracts/src/test-helpers/BridgeTester.sol/BridgeTester.json +15 -2
- package/build/contracts/src/test-helpers/CryptographyPrimitivesTester.sol/CryptographyPrimitivesTester.dbg.json +1 -1
- package/build/contracts/src/test-helpers/CryptographyPrimitivesTester.sol/CryptographyPrimitivesTester.json +2 -2
- package/build/contracts/src/test-helpers/EthVault.sol/EthVault.dbg.json +1 -1
- package/build/contracts/src/test-helpers/EthVault.sol/EthVault.json +2 -2
- package/build/contracts/src/test-helpers/MessageTester.sol/MessageTester.dbg.json +1 -1
- package/build/contracts/src/test-helpers/MessageTester.sol/MessageTester.json +2 -2
- package/build/contracts/src/test-helpers/OutboxWithoutOptTester.sol/OutboxWithoutOptTester.dbg.json +1 -1
- package/build/contracts/src/test-helpers/OutboxWithoutOptTester.sol/OutboxWithoutOptTester.json +2 -2
- package/build/contracts/src/test-helpers/RollupMock.sol/RollupMock.dbg.json +1 -1
- package/build/contracts/src/test-helpers/RollupMock.sol/RollupMock.json +2 -15
- package/build/contracts/src/test-helpers/TestToken.sol/TestToken.dbg.json +1 -1
- package/build/contracts/src/test-helpers/TestToken.sol/TestToken.json +2 -2
- package/build/contracts/src/test-helpers/ValueArrayTester.sol/ValueArrayTester.dbg.json +1 -1
- package/build/contracts/src/test-helpers/ValueArrayTester.sol/ValueArrayTester.json +2 -2
- package/out/yul/Reader4844.yul/Reader4844.json +1 -1
- package/package.json +16 -6
- package/src/assertionStakingPool/AbsBoldStakingPool.sol +66 -0
- package/src/assertionStakingPool/AssertionStakingPool.sol +70 -0
- package/src/assertionStakingPool/AssertionStakingPoolCreator.sol +35 -0
- package/src/assertionStakingPool/EdgeStakingPool.sol +57 -0
- package/src/assertionStakingPool/EdgeStakingPoolCreator.sol +34 -0
- package/src/assertionStakingPool/StakingPoolCreatorUtils.sol +25 -0
- package/src/assertionStakingPool/interfaces/IAbsBoldStakingPool.sol +41 -0
- package/src/assertionStakingPool/interfaces/IAssertionStakingPool.sol +36 -0
- package/src/assertionStakingPool/interfaces/IAssertionStakingPoolCreator.sol +31 -0
- package/src/assertionStakingPool/interfaces/IEdgeStakingPool.sol +27 -0
- package/src/assertionStakingPool/interfaces/IEdgeStakingPoolCreator.sol +28 -0
- package/src/bridge/AbsBridge.sol +38 -48
- package/src/bridge/AbsInbox.sol +88 -97
- package/src/bridge/AbsOutbox.sol +23 -37
- package/src/bridge/Bridge.sol +6 -4
- package/src/bridge/DelayBuffer.sol +123 -0
- package/src/bridge/DelayBufferTypes.sol +38 -0
- package/src/bridge/ERC20Bridge.sol +8 -4
- package/src/bridge/ERC20Inbox.sol +46 -53
- package/src/bridge/ERC20Outbox.sol +7 -3
- package/src/bridge/GasRefunder.sol +38 -24
- package/src/bridge/IBridge.sol +30 -21
- package/src/bridge/IERC20Bridge.sol +1 -1
- package/src/bridge/IERC20Inbox.sol +4 -2
- package/src/bridge/IEthBridge.sol +4 -2
- package/src/bridge/IInbox.sol +4 -2
- package/src/bridge/IInboxBase.sol +17 -13
- package/src/bridge/IOutbox.sol +13 -8
- package/src/bridge/ISequencerInbox.sol +118 -13
- package/src/bridge/Inbox.sol +131 -151
- package/src/bridge/Messages.sol +48 -18
- package/src/bridge/Outbox.sol +6 -2
- package/src/bridge/SequencerInbox.sol +339 -274
- package/src/chain/CacheManager.sol +49 -18
- package/src/challengeV2/EdgeChallengeManager.sol +783 -0
- package/src/challengeV2/IAssertionChain.sol +39 -0
- package/src/challengeV2/libraries/ArrayUtilsLib.sol +61 -0
- package/src/challengeV2/libraries/ChallengeEdgeLib.sol +333 -0
- package/src/challengeV2/libraries/ChallengeErrors.sol +108 -0
- package/src/challengeV2/libraries/EdgeChallengeManagerLib.sol +930 -0
- package/src/challengeV2/libraries/Enums.sol +26 -0
- package/src/challengeV2/libraries/MerkleTreeAccumulatorLib.sol +390 -0
- package/src/challengeV2/libraries/UintUtilsLib.sol +74 -0
- package/src/libraries/AddressAliasHelper.sol +6 -2
- package/src/libraries/AdminFallbackProxy.sol +8 -4
- package/src/libraries/ArbitrumChecker.sol +3 -4
- package/src/libraries/CryptographyPrimitives.sol +39 -46
- package/src/libraries/DecimalsConverterHelper.sol +2 -4
- package/src/libraries/DoubleLogicUUPSUpgradeable.sol +10 -7
- package/src/libraries/Error.sol +18 -12
- package/src/libraries/GasRefundEnabled.sol +3 -4
- package/src/libraries/MerkleLib.sol +6 -5
- package/src/libraries/UUPSNotUpgradeable.sol +2 -4
- package/src/mocks/BridgeStub.sol +50 -48
- package/src/mocks/BridgeUnproxied.sol +2 -0
- package/src/mocks/InboxStub.sol +22 -17
- package/src/mocks/MerkleTreeAccess.sol +72 -0
- package/src/mocks/MockRollupEventInbox.sol +59 -0
- package/src/mocks/MultiCallTest.sol +3 -1
- package/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol +3 -1
- package/src/mocks/Program.sol +9 -7
- package/src/mocks/SequencerInboxBlobMock.sol +38 -0
- package/src/mocks/SequencerInboxStub.sol +9 -12
- package/src/mocks/Simple.sol +13 -25
- package/src/mocks/SimpleCacheManager.sol +10 -3
- package/src/mocks/SimpleOneStepProofEntry.sol +60 -0
- package/src/mocks/SimpleProxy.sol +3 -1
- package/src/mocks/TestWETH9.sol +30 -0
- package/src/mocks/UpgradeExecutorMock.sol +10 -17
- package/src/node-interface/NodeInterface.sol +23 -22
- package/src/node-interface/NodeInterfaceDebug.sol +5 -3
- package/src/osp/HashProofHelper.sol +9 -10
- package/src/osp/IOneStepProofEntry.sol +14 -9
- package/src/osp/IOneStepProver.sol +1 -0
- package/src/osp/OneStepProofEntry.sol +63 -54
- package/src/osp/OneStepProver0.sol +14 -27
- package/src/osp/OneStepProverHostIo.sol +31 -58
- package/src/osp/OneStepProverMath.sol +15 -23
- package/src/osp/OneStepProverMemory.sol +9 -23
- package/src/precompiles/ArbAddressTable.sol +19 -9
- package/src/precompiles/ArbAggregator.sol +12 -4
- package/src/precompiles/ArbBLS.sol +1 -3
- package/src/precompiles/ArbDebug.sol +5 -11
- package/src/precompiles/ArbFunctionTable.sol +7 -10
- package/src/precompiles/ArbGasInfo.sol +9 -43
- package/src/precompiles/ArbInfo.sol +6 -2
- package/src/precompiles/ArbOwner.sol +101 -34
- package/src/precompiles/ArbOwnerPublic.sol +6 -2
- package/src/precompiles/ArbRetryableTx.sol +15 -5
- package/src/precompiles/ArbStatistics.sol +1 -8
- package/src/precompiles/ArbSys.sol +16 -18
- package/src/precompiles/ArbWasm.sol +24 -14
- package/src/precompiles/ArbWasmCache.sol +15 -5
- package/src/precompiles/ArbosTest.sol +3 -1
- package/src/rollup/AbsRollupEventInbox.sol +15 -16
- package/src/rollup/Assertion.sol +100 -0
- package/src/rollup/AssertionState.sol +29 -0
- package/src/rollup/BOLDUpgradeAction.sol +631 -0
- package/src/rollup/BridgeCreator.sol +42 -15
- package/src/rollup/Config.sol +15 -7
- package/src/rollup/DeployHelper.sol +12 -31
- package/src/rollup/ERC20RollupEventInbox.sol +8 -9
- package/src/rollup/FactoryDeployerHelper.sol +8 -10
- package/src/rollup/IRollupAdmin.sol +127 -45
- package/src/rollup/IRollupCore.sol +64 -84
- package/src/rollup/IRollupEventInbox.sol +3 -1
- package/src/rollup/IRollupLogic.sol +36 -69
- package/src/rollup/RollupAdminLogic.sol +224 -203
- package/src/rollup/RollupCore.sol +407 -428
- package/src/rollup/RollupCreator.sol +88 -75
- package/src/rollup/RollupEventInbox.sol +7 -7
- package/src/rollup/RollupLib.sol +50 -86
- package/src/rollup/RollupProxy.sol +8 -12
- package/src/rollup/RollupUserLogic.sol +279 -642
- package/src/rollup/ValidatorUtils.sol +0 -242
- package/src/rollup/ValidatorWallet.sol +22 -38
- package/src/rollup/ValidatorWalletCreator.sol +8 -8
- package/src/state/Deserialize.sol +74 -96
- package/src/state/GlobalState.sol +74 -20
- package/src/state/Instructions.sol +4 -3
- package/src/state/Machine.sol +18 -19
- package/src/state/Module.sol +14 -13
- package/src/state/ModuleMemory.sol +6 -25
- package/src/state/ModuleMemoryCompact.sol +3 -1
- package/src/state/MultiStack.sol +16 -20
- package/src/state/PcArray.sol +7 -7
- package/src/state/StackFrame.sol +21 -14
- package/src/state/Value.sol +18 -6
- package/src/state/ValueArray.sol +7 -7
- package/src/state/ValueStack.sol +9 -3
- package/src/test-helpers/BridgeTester.sol +32 -42
- package/src/test-helpers/CryptographyPrimitivesTester.sol +12 -13
- package/src/test-helpers/EthVault.sol +4 -2
- package/src/test-helpers/InterfaceCompatibilityTester.sol +1 -1
- package/src/test-helpers/MessageTester.sol +3 -10
- package/src/test-helpers/OutboxWithoutOptTester.sol +12 -19
- package/src/test-helpers/RollupMock.sol +3 -7
- package/src/test-helpers/TestToken.sol +4 -2
- package/build/contracts/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol/IERC20Upgradeable.dbg.json +0 -4
- package/build/contracts/src/challenge/ChallengeLib.sol/ChallengeLib.dbg.json +0 -4
- package/build/contracts/src/challenge/ChallengeManager.sol/ChallengeManager.dbg.json +0 -4
- package/build/contracts/src/challenge/ChallengeManager.sol/ChallengeManager.json +0 -746
- package/build/contracts/src/challenge/IChallengeManager.sol/IChallengeManager.dbg.json +0 -4
- package/build/contracts/src/challenge/IChallengeManager.sol/IChallengeManager.json +0 -441
- package/build/contracts/src/challenge/IChallengeResultReceiver.sol/IChallengeResultReceiver.dbg.json +0 -4
- package/build/contracts/src/challenge/IChallengeResultReceiver.sol/IChallengeResultReceiver.json +0 -34
- package/build/contracts/src/mocks/MockResultReceiver.sol/MockResultReceiver.dbg.json +0 -4
- package/build/contracts/src/mocks/MockResultReceiver.sol/MockResultReceiver.json +0 -188
- package/build/contracts/src/mocks/SingleExecutionChallenge.sol/SingleExecutionChallenge.dbg.json +0 -4
- package/build/contracts/src/mocks/SingleExecutionChallenge.sol/SingleExecutionChallenge.json +0 -797
- package/build/contracts/src/mocks/TimedOutChallengeManager.sol/TimedOutChallengeManager.dbg.json +0 -4
- package/build/contracts/src/mocks/TimedOutChallengeManager.sol/TimedOutChallengeManager.json +0 -746
- package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserAbs.dbg.json +0 -4
- package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserAbs.json +0 -1327
- package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserERC20.dbg.json +0 -4
- package/build/contracts/src/rollup/IRollupLogic.sol/IRollupUserERC20.json +0 -1461
- package/build/contracts/src/rollup/Node.sol/NodeLib.dbg.json +0 -4
- package/build/contracts/src/rollup/RollupUserLogic.sol/AbsRollupUserLogic.dbg.json +0 -4
- package/build/contracts/src/rollup/RollupUserLogic.sol/AbsRollupUserLogic.json +0 -1609
- package/build/contracts/src/rollup/RollupUserLogic.sol/ERC20RollupUserLogic.dbg.json +0 -4
- package/build/contracts/src/rollup/RollupUserLogic.sol/ERC20RollupUserLogic.json +0 -1743
- package/build/contracts/src/rollup/ValidatorUtils.sol/ValidatorUtils.dbg.json +0 -4
- package/build/contracts/src/rollup/ValidatorUtils.sol/ValidatorUtils.json +0 -379
- package/src/challenge/ChallengeLib.sol +0 -88
- package/src/challenge/ChallengeManager.sol +0 -375
- package/src/challenge/IChallengeManager.sol +0 -86
- package/src/challenge/IChallengeResultReceiver.sol +0 -13
- package/src/mocks/MockResultReceiver.sol +0 -59
- package/src/mocks/SingleExecutionChallenge.sol +0 -41
- package/src/mocks/TimedOutChallengeManager.sol +0 -13
- 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
|
+
}
|