@hyperlane-xyz/core 1.3.4 → 1.3.6
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/contracts/hooks/OptimismMessageHook.sol +96 -0
- package/contracts/interfaces/IInterchainSecurityModule.sol +4 -2
- package/contracts/interfaces/hooks/IMessageHook.sol +9 -0
- package/contracts/isms/multisig/AbstractMerkleRootMultisigIsm.sol +64 -0
- package/contracts/isms/multisig/AbstractMessageIdMultisigIsm.sol +54 -0
- package/contracts/isms/multisig/AbstractMultisigIsm.sol +32 -56
- package/contracts/isms/multisig/LegacyMultisigIsm.sol +2 -2
- package/contracts/isms/multisig/StaticMultisigIsm.sol +49 -14
- package/contracts/isms/native/AbstractNativeISM.sol +51 -0
- package/contracts/isms/native/OptimismISM.sol +80 -0
- package/contracts/isms/routing/AbstractRoutingIsm.sol +1 -0
- package/contracts/libs/CheckpointLib.sol +10 -2
- package/contracts/libs/LegacyCheckpointLib.sol +50 -0
- package/contracts/libs/Merkle.sol +2 -1
- package/contracts/libs/isms/{MultisigIsmMetadata.sol → MerkleRootMultisigIsmMetadata.sol} +37 -21
- package/contracts/libs/isms/MessageIdMultisigIsmMetadata.sol +59 -0
- package/contracts/test/TestLegacyMultisigIsm.sol +2 -2
- package/contracts/test/TestMultisigIsm.sol +1 -1
- package/dist/@eth-optimism/contracts/index.d.ts +3 -0
- package/dist/@eth-optimism/contracts/index.d.ts.map +1 -0
- package/dist/{contracts/isms/multisig/StaticMultisigIsm.js → @eth-optimism/contracts/index.js} +1 -1
- package/dist/@eth-optimism/contracts/index.js.map +1 -0
- package/dist/@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.d.ts +102 -0
- package/dist/@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.d.ts.map +1 -0
- package/dist/{contracts/isms/multisig/StaticMultisigIsmFactory.js → @eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.js} +1 -1
- package/dist/@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.js.map +1 -0
- package/dist/@eth-optimism/contracts/libraries/bridge/index.d.ts +2 -0
- package/dist/@eth-optimism/contracts/libraries/bridge/index.d.ts.map +1 -0
- package/dist/@eth-optimism/contracts/libraries/bridge/index.js +3 -0
- package/dist/@eth-optimism/contracts/libraries/bridge/index.js.map +1 -0
- package/dist/@eth-optimism/contracts/libraries/index.d.ts +3 -0
- package/dist/@eth-optimism/contracts/libraries/index.d.ts.map +1 -0
- package/dist/@eth-optimism/contracts/libraries/index.js +4 -0
- package/dist/@eth-optimism/contracts/libraries/index.js.map +1 -0
- package/dist/@eth-optimism/index.d.ts +3 -0
- package/dist/@eth-optimism/index.d.ts.map +1 -0
- package/dist/@eth-optimism/index.js +4 -0
- package/dist/@eth-optimism/index.js.map +1 -0
- package/dist/@openzeppelin/contracts/index.d.ts +2 -0
- package/dist/@openzeppelin/contracts/index.d.ts.map +1 -1
- package/dist/@openzeppelin/contracts/vendor/index.d.ts +3 -0
- package/dist/@openzeppelin/contracts/vendor/index.d.ts.map +1 -0
- package/dist/@openzeppelin/contracts/vendor/index.js +4 -0
- package/dist/@openzeppelin/contracts/vendor/index.js.map +1 -0
- package/dist/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger.d.ts +102 -0
- package/dist/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger.d.ts.map +1 -0
- package/dist/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger.js +4 -0
- package/dist/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger.js.map +1 -0
- package/dist/@openzeppelin/contracts/vendor/optimism/index.d.ts +2 -0
- package/dist/@openzeppelin/contracts/vendor/optimism/index.d.ts.map +1 -0
- package/dist/@openzeppelin/contracts/vendor/optimism/index.js +3 -0
- package/dist/@openzeppelin/contracts/vendor/optimism/index.js.map +1 -0
- package/dist/contracts/hooks/OptimismMessageHook.d.ts +75 -0
- package/dist/contracts/hooks/OptimismMessageHook.d.ts.map +1 -0
- package/dist/contracts/hooks/OptimismMessageHook.js +4 -0
- package/dist/contracts/hooks/OptimismMessageHook.js.map +1 -0
- package/dist/contracts/hooks/index.d.ts +2 -0
- package/dist/contracts/hooks/index.d.ts.map +1 -0
- package/dist/contracts/hooks/index.js +3 -0
- package/dist/contracts/hooks/index.js.map +1 -0
- package/dist/contracts/index.d.ts +2 -0
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/interfaces/hooks/IMessageHook.d.ts +51 -0
- package/dist/contracts/interfaces/hooks/IMessageHook.d.ts.map +1 -0
- package/dist/contracts/interfaces/hooks/IMessageHook.js +4 -0
- package/dist/contracts/interfaces/hooks/IMessageHook.js.map +1 -0
- package/dist/contracts/interfaces/hooks/index.d.ts +2 -0
- package/dist/contracts/interfaces/hooks/index.d.ts.map +1 -0
- package/dist/contracts/interfaces/hooks/index.js +3 -0
- package/dist/contracts/interfaces/hooks/index.js.map +1 -0
- package/dist/contracts/interfaces/index.d.ts +2 -0
- package/dist/contracts/interfaces/index.d.ts.map +1 -1
- package/dist/contracts/isms/index.d.ts +2 -0
- package/dist/contracts/isms/index.d.ts.map +1 -1
- package/dist/contracts/isms/multisig/AbstractMerkleRootMultisigIsm.d.ts +59 -0
- package/dist/contracts/isms/multisig/AbstractMerkleRootMultisigIsm.d.ts.map +1 -0
- package/dist/contracts/isms/multisig/AbstractMerkleRootMultisigIsm.js +4 -0
- package/dist/contracts/isms/multisig/AbstractMerkleRootMultisigIsm.js.map +1 -0
- package/dist/contracts/isms/multisig/AbstractMessageIdMultisigIsm.d.ts +59 -0
- package/dist/contracts/isms/multisig/AbstractMessageIdMultisigIsm.d.ts.map +1 -0
- package/dist/contracts/isms/multisig/AbstractMessageIdMultisigIsm.js +4 -0
- package/dist/contracts/isms/multisig/AbstractMessageIdMultisigIsm.js.map +1 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm.d.ts +59 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm.d.ts.map +1 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm.js +4 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm.js.map +1 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm.d.ts +59 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm.d.ts.map +1 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm.js +4 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm.js.map +1 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory.d.ts +59 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory.d.ts.map +1 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory.js +4 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory.js.map +1 -0
- package/dist/contracts/isms/multisig/{StaticMultisigIsm.d.ts → StaticMultisigIsm.sol/StaticMessageIdMultisigIsm.d.ts} +5 -5
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm.d.ts.map +1 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm.js +4 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm.js.map +1 -0
- package/dist/contracts/isms/multisig/{StaticMultisigIsmFactory.d.ts → StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory.d.ts} +5 -5
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory.d.ts.map +1 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory.js +4 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory.js.map +1 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/index.d.ts +6 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/index.d.ts.map +1 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/index.js +3 -0
- package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/index.js.map +1 -0
- package/dist/contracts/isms/multisig/index.d.ts +4 -2
- package/dist/contracts/isms/multisig/index.d.ts.map +1 -1
- package/dist/contracts/isms/multisig/index.js +1 -0
- package/dist/contracts/isms/multisig/index.js.map +1 -1
- package/dist/contracts/isms/native/AbstractNativeISM.d.ts +83 -0
- package/dist/contracts/isms/native/AbstractNativeISM.d.ts.map +1 -0
- package/dist/contracts/isms/native/AbstractNativeISM.js +4 -0
- package/dist/contracts/isms/native/AbstractNativeISM.js.map +1 -0
- package/dist/contracts/isms/native/OptimismISM.d.ts +123 -0
- package/dist/contracts/isms/native/OptimismISM.d.ts.map +1 -0
- package/dist/contracts/isms/native/OptimismISM.js +4 -0
- package/dist/contracts/isms/native/OptimismISM.js.map +1 -0
- package/dist/contracts/isms/native/index.d.ts +3 -0
- package/dist/contracts/isms/native/index.d.ts.map +1 -0
- package/dist/contracts/isms/native/index.js +3 -0
- package/dist/contracts/isms/native/index.js.map +1 -0
- package/dist/factories/@eth-optimism/contracts/index.d.ts +2 -0
- package/dist/factories/@eth-optimism/contracts/index.d.ts.map +1 -0
- package/dist/factories/@eth-optimism/contracts/index.js +31 -0
- package/dist/factories/@eth-optimism/contracts/index.js.map +1 -0
- package/dist/factories/@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger__factory.d.ts +43 -0
- package/dist/factories/@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger__factory.d.ts.map +1 -0
- package/dist/factories/@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger__factory.js +117 -0
- package/dist/factories/@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger__factory.js.map +1 -0
- package/dist/factories/@eth-optimism/contracts/libraries/bridge/index.d.ts +2 -0
- package/dist/factories/@eth-optimism/contracts/libraries/bridge/index.d.ts.map +1 -0
- package/dist/factories/@eth-optimism/contracts/libraries/bridge/index.js +9 -0
- package/dist/factories/@eth-optimism/contracts/libraries/bridge/index.js.map +1 -0
- package/dist/factories/@eth-optimism/contracts/libraries/index.d.ts +2 -0
- package/dist/factories/@eth-optimism/contracts/libraries/index.d.ts.map +1 -0
- package/dist/factories/@eth-optimism/contracts/libraries/index.js +31 -0
- package/dist/factories/@eth-optimism/contracts/libraries/index.js.map +1 -0
- package/dist/factories/@eth-optimism/index.d.ts +2 -0
- package/dist/factories/@eth-optimism/index.d.ts.map +1 -0
- package/dist/factories/@eth-optimism/index.js +31 -0
- package/dist/factories/@eth-optimism/index.js.map +1 -0
- package/dist/factories/@openzeppelin/contracts/index.d.ts +1 -0
- package/dist/factories/@openzeppelin/contracts/index.d.ts.map +1 -1
- package/dist/factories/@openzeppelin/contracts/index.js +2 -1
- package/dist/factories/@openzeppelin/contracts/index.js.map +1 -1
- package/dist/factories/@openzeppelin/contracts/vendor/index.d.ts +2 -0
- package/dist/factories/@openzeppelin/contracts/vendor/index.d.ts.map +1 -0
- package/dist/factories/@openzeppelin/contracts/vendor/index.js +31 -0
- package/dist/factories/@openzeppelin/contracts/vendor/index.js.map +1 -0
- package/dist/factories/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger__factory.d.ts +43 -0
- package/dist/factories/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger__factory.d.ts.map +1 -0
- package/dist/factories/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger__factory.js +117 -0
- package/dist/factories/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger__factory.js.map +1 -0
- package/dist/factories/@openzeppelin/contracts/vendor/optimism/index.d.ts +2 -0
- package/dist/factories/@openzeppelin/contracts/vendor/optimism/index.d.ts.map +1 -0
- package/dist/factories/@openzeppelin/contracts/vendor/optimism/index.js +9 -0
- package/dist/factories/@openzeppelin/contracts/vendor/optimism/index.js.map +1 -0
- package/dist/factories/contracts/Mailbox__factory.d.ts +1 -1
- package/dist/factories/contracts/Mailbox__factory.js +1 -1
- package/dist/factories/contracts/ValidatorAnnounce__factory.d.ts +1 -1
- package/dist/factories/contracts/ValidatorAnnounce__factory.js +1 -1
- package/dist/factories/contracts/hooks/OptimismMessageHook__factory.d.ts +45 -0
- package/dist/factories/contracts/hooks/OptimismMessageHook__factory.d.ts.map +1 -0
- package/dist/factories/contracts/hooks/OptimismMessageHook__factory.js +125 -0
- package/dist/factories/contracts/hooks/OptimismMessageHook__factory.js.map +1 -0
- package/dist/factories/contracts/hooks/index.d.ts +2 -0
- package/dist/factories/contracts/hooks/index.d.ts.map +1 -0
- package/dist/factories/contracts/hooks/index.js +9 -0
- package/dist/factories/contracts/hooks/index.js.map +1 -0
- package/dist/factories/contracts/index.d.ts +1 -0
- package/dist/factories/contracts/index.d.ts.map +1 -1
- package/dist/factories/contracts/index.js +2 -1
- package/dist/factories/contracts/index.js.map +1 -1
- package/dist/factories/contracts/interfaces/hooks/IMessageHook__factory.d.ts +23 -0
- package/dist/factories/contracts/interfaces/hooks/IMessageHook__factory.d.ts.map +1 -0
- package/dist/factories/contracts/interfaces/hooks/IMessageHook__factory.js +42 -0
- package/dist/factories/contracts/interfaces/hooks/IMessageHook__factory.js.map +1 -0
- package/dist/factories/contracts/interfaces/hooks/index.d.ts +2 -0
- package/dist/factories/contracts/interfaces/hooks/index.d.ts.map +1 -0
- package/dist/factories/contracts/interfaces/hooks/index.js +9 -0
- package/dist/factories/contracts/interfaces/hooks/index.js.map +1 -0
- package/dist/factories/contracts/interfaces/index.d.ts +1 -0
- package/dist/factories/contracts/interfaces/index.d.ts.map +1 -1
- package/dist/factories/contracts/interfaces/index.js +2 -1
- package/dist/factories/contracts/interfaces/index.js.map +1 -1
- package/dist/factories/contracts/isms/aggregation/StaticAggregationIsmFactory__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/aggregation/StaticAggregationIsmFactory__factory.js +1 -1
- package/dist/factories/contracts/isms/aggregation/StaticAggregationIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/aggregation/StaticAggregationIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/index.d.ts +1 -0
- package/dist/factories/contracts/isms/index.d.ts.map +1 -1
- package/dist/factories/contracts/isms/index.js +2 -1
- package/dist/factories/contracts/isms/index.js.map +1 -1
- package/dist/factories/contracts/isms/multisig/AbstractMerkleRootMultisigIsm__factory.d.ts +23 -0
- package/dist/factories/contracts/isms/multisig/AbstractMerkleRootMultisigIsm__factory.d.ts.map +1 -0
- package/dist/factories/contracts/isms/multisig/AbstractMerkleRootMultisigIsm__factory.js +79 -0
- package/dist/factories/contracts/isms/multisig/AbstractMerkleRootMultisigIsm__factory.js.map +1 -0
- package/dist/factories/contracts/isms/multisig/AbstractMessageIdMultisigIsm__factory.d.ts +23 -0
- package/dist/factories/contracts/isms/multisig/AbstractMessageIdMultisigIsm__factory.d.ts.map +1 -0
- package/dist/factories/contracts/isms/multisig/AbstractMessageIdMultisigIsm__factory.js +79 -0
- package/dist/factories/contracts/isms/multisig/AbstractMessageIdMultisigIsm__factory.js.map +1 -0
- package/dist/factories/contracts/isms/multisig/LegacyMultisigIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/multisig/LegacyMultisigIsm__factory.d.ts.map +1 -1
- package/dist/factories/contracts/isms/multisig/LegacyMultisigIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/multisig/LegacyMultisigIsm__factory.js.map +1 -1
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm__factory.d.ts +23 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm__factory.d.ts.map +1 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm__factory.js +79 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm__factory.js.map +1 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory__factory.d.ts +35 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory__factory.d.ts.map +1 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory__factory.js +89 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory__factory.js.map +1 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm__factory.d.ts +35 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm__factory.d.ts.map +1 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm__factory.js +102 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm__factory.js.map +1 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory__factory.d.ts +35 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory__factory.d.ts.map +1 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory__factory.js +89 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory__factory.js.map +1 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm__factory.d.ts +35 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm__factory.d.ts.map +1 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm__factory.js +102 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm__factory.js.map +1 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/index.d.ts +6 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/index.d.ts.map +1 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/index.js +17 -0
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/index.js.map +1 -0
- package/dist/factories/contracts/isms/multisig/index.d.ts +3 -2
- package/dist/factories/contracts/isms/multisig/index.d.ts.map +1 -1
- package/dist/factories/contracts/isms/multisig/index.js +29 -5
- package/dist/factories/contracts/isms/multisig/index.js.map +1 -1
- package/dist/factories/contracts/isms/native/AbstractNativeISM__factory.d.ts +36 -0
- package/dist/factories/contracts/isms/native/AbstractNativeISM__factory.d.ts.map +1 -0
- package/dist/factories/contracts/isms/native/AbstractNativeISM__factory.js +111 -0
- package/dist/factories/contracts/isms/native/AbstractNativeISM__factory.js.map +1 -0
- package/dist/factories/contracts/isms/native/OptimismISM__factory.d.ts +66 -0
- package/dist/factories/contracts/isms/native/OptimismISM__factory.d.ts.map +1 -0
- package/dist/factories/contracts/isms/native/OptimismISM__factory.js +194 -0
- package/dist/factories/contracts/isms/native/OptimismISM__factory.js.map +1 -0
- package/dist/factories/contracts/isms/native/index.d.ts +3 -0
- package/dist/factories/contracts/isms/native/index.d.ts.map +1 -0
- package/dist/factories/contracts/isms/native/index.js +11 -0
- package/dist/factories/contracts/isms/native/index.js.map +1 -0
- package/dist/factories/contracts/isms/routing/DomainRoutingIsmFactory__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/routing/DomainRoutingIsmFactory__factory.js +1 -1
- package/dist/factories/contracts/isms/routing/DomainRoutingIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/routing/DomainRoutingIsm__factory.js +1 -1
- package/dist/factories/contracts/isms/routing/InterchainAccountIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/isms/routing/InterchainAccountIsm__factory.js +1 -1
- package/dist/factories/contracts/middleware/InterchainAccountRouter__factory.d.ts +1 -1
- package/dist/factories/contracts/middleware/InterchainAccountRouter__factory.js +1 -1
- package/dist/factories/contracts/middleware/InterchainQueryRouter__factory.d.ts +1 -1
- package/dist/factories/contracts/middleware/InterchainQueryRouter__factory.js +1 -1
- package/dist/factories/contracts/middleware/liquidity-layer/LiquidityLayerRouter__factory.d.ts +1 -1
- package/dist/factories/contracts/middleware/liquidity-layer/LiquidityLayerRouter__factory.js +1 -1
- package/dist/factories/contracts/middleware/liquidity-layer/adapters/CircleBridgeAdapter__factory.d.ts +1 -1
- package/dist/factories/contracts/middleware/liquidity-layer/adapters/CircleBridgeAdapter__factory.js +1 -1
- package/dist/factories/contracts/middleware/liquidity-layer/adapters/PortalAdapter__factory.d.ts +1 -1
- package/dist/factories/contracts/middleware/liquidity-layer/adapters/PortalAdapter__factory.js +1 -1
- package/dist/factories/contracts/mock/MockHyperlaneEnvironment__factory.d.ts +1 -1
- package/dist/factories/contracts/mock/MockHyperlaneEnvironment__factory.js +1 -1
- package/dist/factories/contracts/mock/MockMailbox__factory.d.ts +1 -1
- package/dist/factories/contracts/mock/MockMailbox__factory.js +1 -1
- package/dist/factories/contracts/test/LightTestRecipient__factory.d.ts +1 -1
- package/dist/factories/contracts/test/LightTestRecipient__factory.js +1 -1
- package/dist/factories/contracts/test/TestGasRouter__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestGasRouter__factory.js +1 -1
- package/dist/factories/contracts/test/TestHyperlaneConnectionClient__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestHyperlaneConnectionClient__factory.js +1 -1
- package/dist/factories/contracts/test/TestLegacyMultisigIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestLegacyMultisigIsm__factory.d.ts.map +1 -1
- package/dist/factories/contracts/test/TestLegacyMultisigIsm__factory.js +1 -1
- package/dist/factories/contracts/test/TestLegacyMultisigIsm__factory.js.map +1 -1
- package/dist/factories/contracts/test/TestMailbox__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestMailbox__factory.js +1 -1
- package/dist/factories/contracts/test/TestMerkle__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestMerkle__factory.js +1 -1
- package/dist/factories/contracts/test/TestMultisigIsm__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestMultisigIsm__factory.js +1 -1
- package/dist/factories/contracts/test/TestQuery__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestQuery__factory.js +1 -1
- package/dist/factories/contracts/test/TestRecipient__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestRecipient__factory.js +1 -1
- package/dist/factories/contracts/test/TestRouter__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestRouter__factory.js +1 -1
- package/dist/factories/contracts/test/TestSendReceiver__factory.d.ts +1 -1
- package/dist/factories/contracts/test/TestSendReceiver__factory.js +1 -1
- package/dist/factories/index.d.ts +1 -0
- package/dist/factories/index.d.ts.map +1 -1
- package/dist/factories/index.js +2 -1
- package/dist/factories/index.js.map +1 -1
- package/dist/index.d.ts +26 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -6
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/contracts/isms/multisig/StaticMultisigIsmFactory.sol +0 -16
- package/dist/contracts/isms/multisig/StaticMultisigIsm.d.ts.map +0 -1
- package/dist/contracts/isms/multisig/StaticMultisigIsm.js.map +0 -1
- package/dist/contracts/isms/multisig/StaticMultisigIsmFactory.d.ts.map +0 -1
- package/dist/contracts/isms/multisig/StaticMultisigIsmFactory.js.map +0 -1
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsmFactory__factory.d.ts +0 -35
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsmFactory__factory.d.ts.map +0 -1
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsmFactory__factory.js +0 -89
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsmFactory__factory.js.map +0 -1
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm__factory.d.ts +0 -35
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm__factory.d.ts.map +0 -1
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm__factory.js +0 -102
- package/dist/factories/contracts/isms/multisig/StaticMultisigIsm__factory.js.map +0 -1
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT OR Apache-2.0
|
|
2
|
+
pragma solidity >=0.8.0;
|
|
3
|
+
|
|
4
|
+
/*@@@@@@@ @@@@@@@@@
|
|
5
|
+
@@@@@@@@@ @@@@@@@@@
|
|
6
|
+
@@@@@@@@@ @@@@@@@@@
|
|
7
|
+
@@@@@@@@@ @@@@@@@@@
|
|
8
|
+
@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
9
|
+
@@@@@ HYPERLANE @@@@@@@
|
|
10
|
+
@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
11
|
+
@@@@@@@@@ @@@@@@@@@
|
|
12
|
+
@@@@@@@@@ @@@@@@@@@
|
|
13
|
+
@@@@@@@@@ @@@@@@@@@
|
|
14
|
+
@@@@@@@@@ @@@@@@@@*/
|
|
15
|
+
|
|
16
|
+
// ============ Internal Imports ============
|
|
17
|
+
import {IMessageHook} from "../interfaces/hooks/IMessageHook.sol";
|
|
18
|
+
import {OptimismISM} from "../isms/native/OptimismISM.sol";
|
|
19
|
+
|
|
20
|
+
// ============ External Imports ============
|
|
21
|
+
import {ICrossDomainMessenger} from "@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.sol";
|
|
22
|
+
import {Address} from "@openzeppelin/contracts/utils/Address.sol";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @title OptimismMessageHook
|
|
26
|
+
* @notice Message hook to inform the Optimism ISM of messages published through
|
|
27
|
+
* the native Optimism bridge.
|
|
28
|
+
*/
|
|
29
|
+
contract OptimismMessageHook is IMessageHook {
|
|
30
|
+
// ============ Constants ============
|
|
31
|
+
|
|
32
|
+
// Domain of chain on which the optimism ISM is deployed
|
|
33
|
+
uint32 public immutable destinationDomain;
|
|
34
|
+
// Messenger used to send messages from L1 -> L2
|
|
35
|
+
ICrossDomainMessenger public immutable l1Messenger;
|
|
36
|
+
// address for Optimism ISM to verify messages
|
|
37
|
+
address public immutable ism;
|
|
38
|
+
// Gas limit for sending messages to L2
|
|
39
|
+
// First 1.92e6 gas is provided by Optimism, see more here:
|
|
40
|
+
// https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions
|
|
41
|
+
uint32 internal constant GAS_LIMIT = 1_920_000;
|
|
42
|
+
|
|
43
|
+
// ============ Constructor ============
|
|
44
|
+
|
|
45
|
+
constructor(
|
|
46
|
+
uint32 _destinationDomain,
|
|
47
|
+
address _messenger,
|
|
48
|
+
address _ism
|
|
49
|
+
) {
|
|
50
|
+
require(
|
|
51
|
+
_destinationDomain != 0,
|
|
52
|
+
"OptimismHook: invalid destination domain"
|
|
53
|
+
);
|
|
54
|
+
require(_ism != address(0), "OptimismHook: invalid ISM");
|
|
55
|
+
destinationDomain = _destinationDomain;
|
|
56
|
+
|
|
57
|
+
require(
|
|
58
|
+
Address.isContract(_messenger),
|
|
59
|
+
"OptimismHook: invalid messenger"
|
|
60
|
+
);
|
|
61
|
+
l1Messenger = ICrossDomainMessenger(_messenger);
|
|
62
|
+
ism = _ism;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ============ External Functions ============
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @notice Hook to inform the optimism ISM of messages published through.
|
|
69
|
+
* @dev anyone can call this function, that's why we need to send msg.sender
|
|
70
|
+
* @param _destination The destination domain of the message.
|
|
71
|
+
* @param _messageId The message ID.
|
|
72
|
+
* @return gasOverhead The gas overhead for the function call on L2.
|
|
73
|
+
*/
|
|
74
|
+
function postDispatch(uint32 _destination, bytes32 _messageId)
|
|
75
|
+
public
|
|
76
|
+
payable
|
|
77
|
+
override
|
|
78
|
+
returns (uint256)
|
|
79
|
+
{
|
|
80
|
+
require(msg.value == 0, "OptimismHook: no value allowed");
|
|
81
|
+
require(
|
|
82
|
+
_destination == destinationDomain,
|
|
83
|
+
"OptimismHook: invalid destination domain"
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
bytes memory _payload = abi.encodeCall(
|
|
87
|
+
OptimismISM.verifyMessageId,
|
|
88
|
+
(msg.sender, _messageId)
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
l1Messenger.sendMessage(ism, _payload, GAS_LIMIT);
|
|
92
|
+
|
|
93
|
+
// calling the verifyMessageId function is ~25k gas but we get 1.92m gas from Optimism
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -3,11 +3,13 @@ pragma solidity >=0.6.11;
|
|
|
3
3
|
|
|
4
4
|
interface IInterchainSecurityModule {
|
|
5
5
|
enum Types {
|
|
6
|
-
|
|
6
|
+
NULL, // used with relayer carrying no metadata
|
|
7
7
|
ROUTING,
|
|
8
8
|
AGGREGATION,
|
|
9
9
|
LEGACY_MULTISIG,
|
|
10
|
-
|
|
10
|
+
MERKLE_ROOT_MULTISIG,
|
|
11
|
+
MESSAGE_ID_MULTISIG,
|
|
12
|
+
OPTIMISM
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
/**
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT OR Apache-2.0
|
|
2
|
+
pragma solidity >=0.8.0;
|
|
3
|
+
|
|
4
|
+
// ============ Internal Imports ============
|
|
5
|
+
import {IInterchainSecurityModule} from "../../interfaces/IInterchainSecurityModule.sol";
|
|
6
|
+
import {AbstractMultisigIsm} from "./AbstractMultisigIsm.sol";
|
|
7
|
+
import {MerkleRootMultisigIsmMetadata} from "../../libs/isms/MerkleRootMultisigIsmMetadata.sol";
|
|
8
|
+
import {Message} from "../../libs/Message.sol";
|
|
9
|
+
import {MerkleLib} from "../../libs/Merkle.sol";
|
|
10
|
+
import {CheckpointLib} from "../../libs/CheckpointLib.sol";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @title MerkleRootMultisigIsm
|
|
14
|
+
* @notice Provides abstract logic for verifying signatures on a merkle root
|
|
15
|
+
* and a merkle proof of message inclusion in that root.
|
|
16
|
+
* @dev Implement and use if you want strong censorship resistance guarantees.
|
|
17
|
+
* @dev May be adapted in future to support batch message verification against a single root.
|
|
18
|
+
*/
|
|
19
|
+
abstract contract AbstractMerkleRootMultisigIsm is AbstractMultisigIsm {
|
|
20
|
+
// ============ Constants ============
|
|
21
|
+
|
|
22
|
+
// solhint-disable-next-line const-name-snakecase
|
|
23
|
+
uint8 public constant moduleType =
|
|
24
|
+
uint8(IInterchainSecurityModule.Types.MERKLE_ROOT_MULTISIG);
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @inheritdoc AbstractMultisigIsm
|
|
28
|
+
*/
|
|
29
|
+
function digest(bytes calldata _metadata, bytes calldata _message)
|
|
30
|
+
internal
|
|
31
|
+
pure
|
|
32
|
+
override
|
|
33
|
+
returns (bytes32)
|
|
34
|
+
{
|
|
35
|
+
// We verify a merkle proof of (messageId, index) I to compute root J
|
|
36
|
+
bytes32 _root = MerkleLib.branchRoot(
|
|
37
|
+
Message.id(_message),
|
|
38
|
+
MerkleRootMultisigIsmMetadata.proof(_metadata),
|
|
39
|
+
Message.nonce(_message)
|
|
40
|
+
);
|
|
41
|
+
// We provide (messageId, index) J in metadata for digest derivation
|
|
42
|
+
return
|
|
43
|
+
CheckpointLib.digest(
|
|
44
|
+
Message.origin(_message),
|
|
45
|
+
MerkleRootMultisigIsmMetadata.originMailbox(_metadata),
|
|
46
|
+
_root,
|
|
47
|
+
MerkleRootMultisigIsmMetadata.index(_metadata),
|
|
48
|
+
MerkleRootMultisigIsmMetadata.messageId(_metadata)
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @inheritdoc AbstractMultisigIsm
|
|
54
|
+
*/
|
|
55
|
+
function signatureAt(bytes calldata _metadata, uint256 _index)
|
|
56
|
+
internal
|
|
57
|
+
pure
|
|
58
|
+
virtual
|
|
59
|
+
override
|
|
60
|
+
returns (bytes memory signature)
|
|
61
|
+
{
|
|
62
|
+
return MerkleRootMultisigIsmMetadata.signatureAt(_metadata, _index);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT OR Apache-2.0
|
|
2
|
+
pragma solidity >=0.8.0;
|
|
3
|
+
|
|
4
|
+
// ============ Internal Imports ============
|
|
5
|
+
import {IInterchainSecurityModule} from "../../interfaces/IInterchainSecurityModule.sol";
|
|
6
|
+
import {AbstractMultisigIsm} from "./AbstractMultisigIsm.sol";
|
|
7
|
+
import {MessageIdMultisigIsmMetadata} from "../../libs/isms/MessageIdMultisigIsmMetadata.sol";
|
|
8
|
+
import {Message} from "../../libs/Message.sol";
|
|
9
|
+
import {CheckpointLib} from "../../libs/CheckpointLib.sol";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @title AbstractMessageIdMultisigIsm
|
|
13
|
+
* @notice Provides abstract logic for verifying signatures on a message ID.
|
|
14
|
+
* @dev Implement and use if you want fastest and cheapest security.
|
|
15
|
+
*/
|
|
16
|
+
abstract contract AbstractMessageIdMultisigIsm is AbstractMultisigIsm {
|
|
17
|
+
// ============ Constants ============
|
|
18
|
+
|
|
19
|
+
// solhint-disable-next-line const-name-snakecase
|
|
20
|
+
uint8 public constant moduleType =
|
|
21
|
+
uint8(IInterchainSecurityModule.Types.MESSAGE_ID_MULTISIG);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @inheritdoc AbstractMultisigIsm
|
|
25
|
+
*/
|
|
26
|
+
function digest(bytes calldata _metadata, bytes calldata _message)
|
|
27
|
+
internal
|
|
28
|
+
pure
|
|
29
|
+
override
|
|
30
|
+
returns (bytes32)
|
|
31
|
+
{
|
|
32
|
+
return
|
|
33
|
+
CheckpointLib.digest(
|
|
34
|
+
Message.origin(_message),
|
|
35
|
+
MessageIdMultisigIsmMetadata.originMailbox(_metadata),
|
|
36
|
+
MessageIdMultisigIsmMetadata.root(_metadata),
|
|
37
|
+
Message.nonce(_message),
|
|
38
|
+
Message.id(_message)
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @inheritdoc AbstractMultisigIsm
|
|
44
|
+
*/
|
|
45
|
+
function signatureAt(bytes calldata _metadata, uint256 _index)
|
|
46
|
+
internal
|
|
47
|
+
pure
|
|
48
|
+
virtual
|
|
49
|
+
override
|
|
50
|
+
returns (bytes memory)
|
|
51
|
+
{
|
|
52
|
+
return MessageIdMultisigIsmMetadata.signatureAt(_metadata, _index);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -8,22 +8,17 @@ import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
|
|
|
8
8
|
import {IInterchainSecurityModule} from "../../interfaces/IInterchainSecurityModule.sol";
|
|
9
9
|
import {IMultisigIsm} from "../../interfaces/isms/IMultisigIsm.sol";
|
|
10
10
|
import {Message} from "../../libs/Message.sol";
|
|
11
|
-
import {MultisigIsmMetadata} from "../../libs/isms/MultisigIsmMetadata.sol";
|
|
12
|
-
import {CheckpointLib} from "../../libs/CheckpointLib.sol";
|
|
13
11
|
import {MerkleLib} from "../../libs/Merkle.sol";
|
|
14
12
|
|
|
15
13
|
/**
|
|
16
14
|
* @title MultisigIsm
|
|
17
15
|
* @notice Manages per-domain m-of-n Validator sets that are used to verify
|
|
18
16
|
* interchain messages.
|
|
17
|
+
* @dev See ./AbstractMerkleRootMultisigIsm.sol and ./AbstractMessageIdMultisigIsm.sol
|
|
18
|
+
* for concrete implementations of `digest` and `signatureAt`.
|
|
19
|
+
* @dev See ./StaticMultisigIsm.sol for concrete implementations.
|
|
19
20
|
*/
|
|
20
21
|
abstract contract AbstractMultisigIsm is IMultisigIsm {
|
|
21
|
-
// ============ Constants ============
|
|
22
|
-
|
|
23
|
-
// solhint-disable-next-line const-name-snakecase
|
|
24
|
-
uint8 public constant moduleType =
|
|
25
|
-
uint8(IInterchainSecurityModule.Types.MULTISIG);
|
|
26
|
-
|
|
27
22
|
// ============ Virtual Functions ============
|
|
28
23
|
// ======= OVERRIDE THESE TO IMPLEMENT =======
|
|
29
24
|
|
|
@@ -41,74 +36,55 @@ abstract contract AbstractMultisigIsm is IMultisigIsm {
|
|
|
41
36
|
virtual
|
|
42
37
|
returns (address[] memory, uint8);
|
|
43
38
|
|
|
44
|
-
// ============ Public Functions ============
|
|
45
|
-
|
|
46
39
|
/**
|
|
47
|
-
* @notice
|
|
48
|
-
*
|
|
49
|
-
* @param _metadata ABI encoded module metadata (see MultisigIsmMetadata.sol)
|
|
40
|
+
* @notice Returns the digest to be used for signature verification.
|
|
41
|
+
* @param _metadata ABI encoded module metadata
|
|
50
42
|
* @param _message Formatted Hyperlane message (see Message.sol).
|
|
43
|
+
* @return digest The digest to be signed by validators
|
|
51
44
|
*/
|
|
52
|
-
function
|
|
53
|
-
|
|
45
|
+
function digest(bytes calldata _metadata, bytes calldata _message)
|
|
46
|
+
internal
|
|
54
47
|
view
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
require(_verifyMerkleProof(_metadata, _message), "!merkle");
|
|
58
|
-
require(_verifyValidatorSignatures(_metadata, _message), "!sigs");
|
|
59
|
-
return true;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// ============ Internal Functions ============
|
|
48
|
+
virtual
|
|
49
|
+
returns (bytes32);
|
|
63
50
|
|
|
64
51
|
/**
|
|
65
|
-
* @notice
|
|
66
|
-
*
|
|
67
|
-
* @param
|
|
68
|
-
* @
|
|
52
|
+
* @notice Returns the signature at a given index from the metadata.
|
|
53
|
+
* @param _metadata ABI encoded module metadata
|
|
54
|
+
* @param _index The index of the signature to return
|
|
55
|
+
* @return signature Packed encoding of signature (65 bytes)
|
|
69
56
|
*/
|
|
70
|
-
function
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
MultisigIsmMetadata.proof(_metadata),
|
|
78
|
-
Message.nonce(_message)
|
|
79
|
-
);
|
|
80
|
-
return _calculatedRoot == MultisigIsmMetadata.root(_metadata);
|
|
81
|
-
}
|
|
57
|
+
function signatureAt(bytes calldata _metadata, uint256 _index)
|
|
58
|
+
internal
|
|
59
|
+
pure
|
|
60
|
+
virtual
|
|
61
|
+
returns (bytes memory);
|
|
62
|
+
|
|
63
|
+
// ============ Public Functions ============
|
|
82
64
|
|
|
83
65
|
/**
|
|
84
|
-
* @notice
|
|
85
|
-
*
|
|
86
|
-
* @param _metadata ABI encoded module metadata
|
|
66
|
+
* @notice Requires that m-of-n validators verify a merkle root,
|
|
67
|
+
* and verifies a me∑rkle proof of `_message` against that root.
|
|
68
|
+
* @param _metadata ABI encoded module metadata
|
|
87
69
|
* @param _message Formatted Hyperlane message (see Message.sol).
|
|
88
70
|
*/
|
|
89
|
-
function
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
71
|
+
function verify(bytes calldata _metadata, bytes calldata _message)
|
|
72
|
+
public
|
|
73
|
+
view
|
|
74
|
+
returns (bool)
|
|
75
|
+
{
|
|
76
|
+
bytes32 _digest = digest(_metadata, _message);
|
|
93
77
|
(
|
|
94
78
|
address[] memory _validators,
|
|
95
79
|
uint8 _threshold
|
|
96
80
|
) = validatorsAndThreshold(_message);
|
|
97
81
|
require(_threshold > 0, "No MultisigISM threshold present for message");
|
|
98
|
-
|
|
99
|
-
Message.origin(_message),
|
|
100
|
-
MultisigIsmMetadata.originMailbox(_metadata),
|
|
101
|
-
MultisigIsmMetadata.root(_metadata),
|
|
102
|
-
MultisigIsmMetadata.index(_metadata)
|
|
103
|
-
);
|
|
82
|
+
|
|
104
83
|
uint256 _validatorCount = _validators.length;
|
|
105
84
|
uint256 _validatorIndex = 0;
|
|
106
85
|
// Assumes that signatures are ordered by validator
|
|
107
86
|
for (uint256 i = 0; i < _threshold; ++i) {
|
|
108
|
-
address _signer = ECDSA.recover(
|
|
109
|
-
_digest,
|
|
110
|
-
MultisigIsmMetadata.signatureAt(_metadata, i)
|
|
111
|
-
);
|
|
87
|
+
address _signer = ECDSA.recover(_digest, signatureAt(_metadata, i));
|
|
112
88
|
// Loop through remaining validators until we find a match
|
|
113
89
|
while (
|
|
114
90
|
_validatorIndex < _validatorCount &&
|
|
@@ -12,7 +12,7 @@ import {Message} from "../../libs/Message.sol";
|
|
|
12
12
|
import {IMultisigIsm} from "../../interfaces/isms/IMultisigIsm.sol";
|
|
13
13
|
import {LegacyMultisigIsmMetadata} from "../../libs/isms/LegacyMultisigIsmMetadata.sol";
|
|
14
14
|
import {MerkleLib} from "../../libs/Merkle.sol";
|
|
15
|
-
import {
|
|
15
|
+
import {LegacyCheckpointLib} from "../../libs/LegacyCheckpointLib.sol";
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* @title MultisigIsm
|
|
@@ -331,7 +331,7 @@ contract LegacyMultisigIsm is IMultisigIsm, Ownable {
|
|
|
331
331
|
// non-zero computed commitment, and this check will fail
|
|
332
332
|
// as the commitment in storage will be zero.
|
|
333
333
|
require(_commitment == commitment[_origin], "!commitment");
|
|
334
|
-
_digest =
|
|
334
|
+
_digest = LegacyCheckpointLib.digest(
|
|
335
335
|
_origin,
|
|
336
336
|
LegacyMultisigIsmMetadata.originMailbox(_metadata),
|
|
337
337
|
LegacyMultisigIsmMetadata.root(_metadata),
|
|
@@ -1,33 +1,68 @@
|
|
|
1
1
|
// SPDX-License-Identifier: MIT OR Apache-2.0
|
|
2
2
|
pragma solidity >=0.8.0;
|
|
3
|
-
|
|
4
3
|
// ============ Internal Imports ============
|
|
5
4
|
import {AbstractMultisigIsm} from "./AbstractMultisigIsm.sol";
|
|
6
|
-
import {
|
|
5
|
+
import {AbstractMerkleRootMultisigIsm} from "./AbstractMerkleRootMultisigIsm.sol";
|
|
6
|
+
import {AbstractMessageIdMultisigIsm} from "./AbstractMessageIdMultisigIsm.sol";
|
|
7
7
|
import {MetaProxy} from "../../libs/MetaProxy.sol";
|
|
8
|
+
import {StaticMOfNAddressSetFactory} from "../../libs/StaticMOfNAddressSetFactory.sol";
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
|
-
* @title
|
|
11
|
-
* @notice Manages per-domain m-of-n Validator
|
|
11
|
+
* @title AbstractMetaProxyMultisigIsm
|
|
12
|
+
* @notice Manages per-domain m-of-n Validator set that is used
|
|
12
13
|
* to verify interchain messages.
|
|
13
14
|
*/
|
|
14
|
-
contract
|
|
15
|
-
// ============ Public Functions ============
|
|
16
|
-
|
|
15
|
+
abstract contract AbstractMetaProxyMultisigIsm is AbstractMultisigIsm {
|
|
17
16
|
/**
|
|
18
|
-
* @
|
|
19
|
-
* and the number of signatures required
|
|
20
|
-
* @dev Can change based on the content of _message
|
|
21
|
-
* @return validators The array of validator addresses
|
|
22
|
-
* @return threshold The number of validator signatures needed
|
|
17
|
+
* @inheritdoc AbstractMultisigIsm
|
|
23
18
|
*/
|
|
24
19
|
function validatorsAndThreshold(bytes calldata)
|
|
25
20
|
public
|
|
26
|
-
|
|
27
|
-
virtual
|
|
21
|
+
pure
|
|
28
22
|
override
|
|
29
23
|
returns (address[] memory, uint8)
|
|
30
24
|
{
|
|
31
25
|
return abi.decode(MetaProxy.metadata(), (address[], uint8));
|
|
32
26
|
}
|
|
33
27
|
}
|
|
28
|
+
|
|
29
|
+
// solhint-disable no-empty-blocks
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @title StaticMerkleRootMultisigIsm
|
|
33
|
+
* @notice Manages per-domain m-of-n validator set that is used
|
|
34
|
+
* to verify interchain messages using a merkle root signature quorum
|
|
35
|
+
* and merkle proof of inclusion.
|
|
36
|
+
*/
|
|
37
|
+
contract StaticMerkleRootMultisigIsm is
|
|
38
|
+
AbstractMerkleRootMultisigIsm,
|
|
39
|
+
AbstractMetaProxyMultisigIsm
|
|
40
|
+
{
|
|
41
|
+
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @title StaticMessageIdMultisigIsm
|
|
46
|
+
* @notice Manages per-domain m-of-n validator set that is used
|
|
47
|
+
* to verify interchain messages using a message ID signature quorum.
|
|
48
|
+
*/
|
|
49
|
+
contract StaticMessageIdMultisigIsm is
|
|
50
|
+
AbstractMessageIdMultisigIsm,
|
|
51
|
+
AbstractMetaProxyMultisigIsm
|
|
52
|
+
{
|
|
53
|
+
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// solhint-enable no-empty-blocks
|
|
57
|
+
|
|
58
|
+
contract StaticMerkleRootMultisigIsmFactory is StaticMOfNAddressSetFactory {
|
|
59
|
+
function _deployImplementation() internal override returns (address) {
|
|
60
|
+
return address(new StaticMerkleRootMultisigIsm());
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
contract StaticMessageIdMultisigIsmFactory is StaticMOfNAddressSetFactory {
|
|
65
|
+
function _deployImplementation() internal override returns (address) {
|
|
66
|
+
return address(new StaticMessageIdMultisigIsm());
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT OR Apache-2.0
|
|
2
|
+
pragma solidity >=0.8.0;
|
|
3
|
+
|
|
4
|
+
// ============ Internal Imports ============
|
|
5
|
+
|
|
6
|
+
import {IInterchainSecurityModule} from "../../interfaces/IInterchainSecurityModule.sol";
|
|
7
|
+
import {Message} from "../../libs/Message.sol";
|
|
8
|
+
import {TypeCasts} from "../../libs/TypeCasts.sol";
|
|
9
|
+
|
|
10
|
+
// ============ External Imports ============
|
|
11
|
+
|
|
12
|
+
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
|
|
13
|
+
import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
|
|
14
|
+
import {Address} from "@openzeppelin/contracts/utils/Address.sol";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @title ArbtractNativeISM
|
|
18
|
+
* @notice Uses the native bridges to verify interchain messages.
|
|
19
|
+
* @dev In the future, the hook might be moved inside the Mailbox which doesn't require storage mappings for senders.
|
|
20
|
+
* for more details see https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/2381
|
|
21
|
+
*/
|
|
22
|
+
abstract contract AbstractNativeISM is
|
|
23
|
+
IInterchainSecurityModule,
|
|
24
|
+
Initializable
|
|
25
|
+
{
|
|
26
|
+
// ============ Public Storage ============
|
|
27
|
+
|
|
28
|
+
// mapping to check if the specific messageID from a specific sender has been received
|
|
29
|
+
// @dev anyone can send an untrusted messageId, so need to check for that while verifying
|
|
30
|
+
mapping(bytes32 => mapping(address => bool)) public verifiedMessageIds;
|
|
31
|
+
|
|
32
|
+
// ============ Events ============
|
|
33
|
+
|
|
34
|
+
event ReceivedMessage(address indexed sender, bytes32 indexed messageId);
|
|
35
|
+
|
|
36
|
+
// ============ External Functions ============
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @notice Verify a message was received by ISM.
|
|
40
|
+
* @param _message Message to verify.
|
|
41
|
+
*/
|
|
42
|
+
function verify(
|
|
43
|
+
bytes calldata, /*_metadata*/
|
|
44
|
+
bytes calldata _message
|
|
45
|
+
) external view returns (bool) {
|
|
46
|
+
bytes32 _messageId = Message.id(_message);
|
|
47
|
+
address _messageSender = Message.senderAddress(_message);
|
|
48
|
+
|
|
49
|
+
return verifiedMessageIds[_messageId][_messageSender];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT OR Apache-2.0
|
|
2
|
+
pragma solidity >=0.8.0;
|
|
3
|
+
|
|
4
|
+
// ============ Internal Imports ============
|
|
5
|
+
|
|
6
|
+
import {IInterchainSecurityModule} from "../../interfaces/IInterchainSecurityModule.sol";
|
|
7
|
+
import {OptimismMessageHook} from "../../hooks/OptimismMessageHook.sol";
|
|
8
|
+
import {Message} from "../../libs/Message.sol";
|
|
9
|
+
import {TypeCasts} from "../../libs/TypeCasts.sol";
|
|
10
|
+
import {AbstractNativeISM} from "./AbstractNativeISM.sol";
|
|
11
|
+
|
|
12
|
+
// ============ External Imports ============
|
|
13
|
+
|
|
14
|
+
import {ICrossDomainMessenger} from "@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.sol";
|
|
15
|
+
import {CrossChainEnabledOptimism} from "@openzeppelin/contracts/crosschain/optimism/CrossChainEnabledOptimism.sol";
|
|
16
|
+
import {Address} from "@openzeppelin/contracts/utils/Address.sol";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @title OptimismISM
|
|
20
|
+
* @notice Uses the native Optimism bridge to verify interchain messages.
|
|
21
|
+
*/
|
|
22
|
+
contract OptimismISM is CrossChainEnabledOptimism, AbstractNativeISM {
|
|
23
|
+
// ============ Constants ============
|
|
24
|
+
|
|
25
|
+
// solhint-disable-next-line const-name-snakecase
|
|
26
|
+
uint8 public constant moduleType =
|
|
27
|
+
uint8(IInterchainSecurityModule.Types.NULL);
|
|
28
|
+
|
|
29
|
+
// ============ Public Storage ============
|
|
30
|
+
|
|
31
|
+
// Address for Hook on L1 responsible for sending message via the Optimism bridge
|
|
32
|
+
// @dev check https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/2381 for updates to native
|
|
33
|
+
address public l1Hook;
|
|
34
|
+
|
|
35
|
+
// ============ Modifiers ============
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @notice Check if sender is authorized to message `verifyMessageId`.
|
|
39
|
+
*/
|
|
40
|
+
modifier isAuthorized() {
|
|
41
|
+
require(
|
|
42
|
+
_crossChainSender() == l1Hook,
|
|
43
|
+
"OptimismISM: sender is not the hook"
|
|
44
|
+
);
|
|
45
|
+
_;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// ============ Constructor ============
|
|
49
|
+
|
|
50
|
+
constructor(address _l2Messenger) CrossChainEnabledOptimism(_l2Messenger) {
|
|
51
|
+
require(
|
|
52
|
+
Address.isContract(_l2Messenger),
|
|
53
|
+
"OptimismISM: invalid L2Messenger"
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ============ Initializer ============
|
|
58
|
+
|
|
59
|
+
function setOptimismHook(address _l1Hook) external initializer {
|
|
60
|
+
require(_l1Hook != address(0), "OptimismISM: invalid l1Hook");
|
|
61
|
+
l1Hook = _l1Hook;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// ============ External Functions ============
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* @notice Receive a message from the L2 messenger.
|
|
68
|
+
* @dev Only callable by the L2 messenger.
|
|
69
|
+
* @param _sender Address of the sender.
|
|
70
|
+
* @param _messageId Hyperlane ID for the message.
|
|
71
|
+
*/
|
|
72
|
+
function verifyMessageId(address _sender, bytes32 _messageId)
|
|
73
|
+
external
|
|
74
|
+
isAuthorized
|
|
75
|
+
{
|
|
76
|
+
verifiedMessageIds[_messageId][_sender] = true;
|
|
77
|
+
|
|
78
|
+
emit ReceivedMessage(_sender, _messageId);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -11,6 +11,7 @@ import {IRoutingIsm} from "../../interfaces/isms/IRoutingIsm.sol";
|
|
|
11
11
|
abstract contract AbstractRoutingIsm is IRoutingIsm {
|
|
12
12
|
// ============ Constants ============
|
|
13
13
|
|
|
14
|
+
// solhint-disable-next-line const-name-snakecase
|
|
14
15
|
uint8 public constant moduleType =
|
|
15
16
|
uint8(IInterchainSecurityModule.Types.ROUTING);
|
|
16
17
|
|
|
@@ -4,18 +4,25 @@ pragma solidity >=0.8.0;
|
|
|
4
4
|
// ============ External Imports ============
|
|
5
5
|
import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
|
|
6
6
|
|
|
7
|
+
import {LegacyCheckpointLib} from "./LegacyCheckpointLib.sol";
|
|
8
|
+
|
|
7
9
|
library CheckpointLib {
|
|
8
10
|
/**
|
|
9
11
|
* @notice Returns the digest validators are expected to sign when signing checkpoints.
|
|
10
12
|
* @param _origin The origin domain of the checkpoint.
|
|
11
13
|
* @param _originMailbox The address of the origin mailbox as bytes32.
|
|
14
|
+
* @param _checkpointRoot The root of the checkpoint.
|
|
15
|
+
* @param _checkpointIndex The index of the checkpoint.
|
|
16
|
+
* @param _messageId The message ID of the checkpoint.
|
|
17
|
+
* @dev Message ID must match leaf content of checkpoint root at index.
|
|
12
18
|
* @return The digest of the checkpoint.
|
|
13
19
|
*/
|
|
14
20
|
function digest(
|
|
15
21
|
uint32 _origin,
|
|
16
22
|
bytes32 _originMailbox,
|
|
17
23
|
bytes32 _checkpointRoot,
|
|
18
|
-
uint32 _checkpointIndex
|
|
24
|
+
uint32 _checkpointIndex,
|
|
25
|
+
bytes32 _messageId
|
|
19
26
|
) internal pure returns (bytes32) {
|
|
20
27
|
bytes32 _domainHash = domainHash(_origin, _originMailbox);
|
|
21
28
|
return
|
|
@@ -24,7 +31,8 @@ library CheckpointLib {
|
|
|
24
31
|
abi.encodePacked(
|
|
25
32
|
_domainHash,
|
|
26
33
|
_checkpointRoot,
|
|
27
|
-
_checkpointIndex
|
|
34
|
+
_checkpointIndex,
|
|
35
|
+
_messageId
|
|
28
36
|
)
|
|
29
37
|
)
|
|
30
38
|
);
|