@arbitrum/nitro-contracts 2.0.0 → 3.0.0-alpha.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
}
|