@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.
Files changed (312) hide show
  1. package/contracts/hooks/OptimismMessageHook.sol +96 -0
  2. package/contracts/interfaces/IInterchainSecurityModule.sol +4 -2
  3. package/contracts/interfaces/hooks/IMessageHook.sol +9 -0
  4. package/contracts/isms/multisig/AbstractMerkleRootMultisigIsm.sol +64 -0
  5. package/contracts/isms/multisig/AbstractMessageIdMultisigIsm.sol +54 -0
  6. package/contracts/isms/multisig/AbstractMultisigIsm.sol +32 -56
  7. package/contracts/isms/multisig/LegacyMultisigIsm.sol +2 -2
  8. package/contracts/isms/multisig/StaticMultisigIsm.sol +49 -14
  9. package/contracts/isms/native/AbstractNativeISM.sol +51 -0
  10. package/contracts/isms/native/OptimismISM.sol +80 -0
  11. package/contracts/isms/routing/AbstractRoutingIsm.sol +1 -0
  12. package/contracts/libs/CheckpointLib.sol +10 -2
  13. package/contracts/libs/LegacyCheckpointLib.sol +50 -0
  14. package/contracts/libs/Merkle.sol +2 -1
  15. package/contracts/libs/isms/{MultisigIsmMetadata.sol → MerkleRootMultisigIsmMetadata.sol} +37 -21
  16. package/contracts/libs/isms/MessageIdMultisigIsmMetadata.sol +59 -0
  17. package/contracts/test/TestLegacyMultisigIsm.sol +2 -2
  18. package/contracts/test/TestMultisigIsm.sol +1 -1
  19. package/dist/@eth-optimism/contracts/index.d.ts +3 -0
  20. package/dist/@eth-optimism/contracts/index.d.ts.map +1 -0
  21. package/dist/{contracts/isms/multisig/StaticMultisigIsm.js → @eth-optimism/contracts/index.js} +1 -1
  22. package/dist/@eth-optimism/contracts/index.js.map +1 -0
  23. package/dist/@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.d.ts +102 -0
  24. package/dist/@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.d.ts.map +1 -0
  25. package/dist/{contracts/isms/multisig/StaticMultisigIsmFactory.js → @eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.js} +1 -1
  26. package/dist/@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.js.map +1 -0
  27. package/dist/@eth-optimism/contracts/libraries/bridge/index.d.ts +2 -0
  28. package/dist/@eth-optimism/contracts/libraries/bridge/index.d.ts.map +1 -0
  29. package/dist/@eth-optimism/contracts/libraries/bridge/index.js +3 -0
  30. package/dist/@eth-optimism/contracts/libraries/bridge/index.js.map +1 -0
  31. package/dist/@eth-optimism/contracts/libraries/index.d.ts +3 -0
  32. package/dist/@eth-optimism/contracts/libraries/index.d.ts.map +1 -0
  33. package/dist/@eth-optimism/contracts/libraries/index.js +4 -0
  34. package/dist/@eth-optimism/contracts/libraries/index.js.map +1 -0
  35. package/dist/@eth-optimism/index.d.ts +3 -0
  36. package/dist/@eth-optimism/index.d.ts.map +1 -0
  37. package/dist/@eth-optimism/index.js +4 -0
  38. package/dist/@eth-optimism/index.js.map +1 -0
  39. package/dist/@openzeppelin/contracts/index.d.ts +2 -0
  40. package/dist/@openzeppelin/contracts/index.d.ts.map +1 -1
  41. package/dist/@openzeppelin/contracts/vendor/index.d.ts +3 -0
  42. package/dist/@openzeppelin/contracts/vendor/index.d.ts.map +1 -0
  43. package/dist/@openzeppelin/contracts/vendor/index.js +4 -0
  44. package/dist/@openzeppelin/contracts/vendor/index.js.map +1 -0
  45. package/dist/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger.d.ts +102 -0
  46. package/dist/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger.d.ts.map +1 -0
  47. package/dist/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger.js +4 -0
  48. package/dist/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger.js.map +1 -0
  49. package/dist/@openzeppelin/contracts/vendor/optimism/index.d.ts +2 -0
  50. package/dist/@openzeppelin/contracts/vendor/optimism/index.d.ts.map +1 -0
  51. package/dist/@openzeppelin/contracts/vendor/optimism/index.js +3 -0
  52. package/dist/@openzeppelin/contracts/vendor/optimism/index.js.map +1 -0
  53. package/dist/contracts/hooks/OptimismMessageHook.d.ts +75 -0
  54. package/dist/contracts/hooks/OptimismMessageHook.d.ts.map +1 -0
  55. package/dist/contracts/hooks/OptimismMessageHook.js +4 -0
  56. package/dist/contracts/hooks/OptimismMessageHook.js.map +1 -0
  57. package/dist/contracts/hooks/index.d.ts +2 -0
  58. package/dist/contracts/hooks/index.d.ts.map +1 -0
  59. package/dist/contracts/hooks/index.js +3 -0
  60. package/dist/contracts/hooks/index.js.map +1 -0
  61. package/dist/contracts/index.d.ts +2 -0
  62. package/dist/contracts/index.d.ts.map +1 -1
  63. package/dist/contracts/interfaces/hooks/IMessageHook.d.ts +51 -0
  64. package/dist/contracts/interfaces/hooks/IMessageHook.d.ts.map +1 -0
  65. package/dist/contracts/interfaces/hooks/IMessageHook.js +4 -0
  66. package/dist/contracts/interfaces/hooks/IMessageHook.js.map +1 -0
  67. package/dist/contracts/interfaces/hooks/index.d.ts +2 -0
  68. package/dist/contracts/interfaces/hooks/index.d.ts.map +1 -0
  69. package/dist/contracts/interfaces/hooks/index.js +3 -0
  70. package/dist/contracts/interfaces/hooks/index.js.map +1 -0
  71. package/dist/contracts/interfaces/index.d.ts +2 -0
  72. package/dist/contracts/interfaces/index.d.ts.map +1 -1
  73. package/dist/contracts/isms/index.d.ts +2 -0
  74. package/dist/contracts/isms/index.d.ts.map +1 -1
  75. package/dist/contracts/isms/multisig/AbstractMerkleRootMultisigIsm.d.ts +59 -0
  76. package/dist/contracts/isms/multisig/AbstractMerkleRootMultisigIsm.d.ts.map +1 -0
  77. package/dist/contracts/isms/multisig/AbstractMerkleRootMultisigIsm.js +4 -0
  78. package/dist/contracts/isms/multisig/AbstractMerkleRootMultisigIsm.js.map +1 -0
  79. package/dist/contracts/isms/multisig/AbstractMessageIdMultisigIsm.d.ts +59 -0
  80. package/dist/contracts/isms/multisig/AbstractMessageIdMultisigIsm.d.ts.map +1 -0
  81. package/dist/contracts/isms/multisig/AbstractMessageIdMultisigIsm.js +4 -0
  82. package/dist/contracts/isms/multisig/AbstractMessageIdMultisigIsm.js.map +1 -0
  83. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm.d.ts +59 -0
  84. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm.d.ts.map +1 -0
  85. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm.js +4 -0
  86. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm.js.map +1 -0
  87. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm.d.ts +59 -0
  88. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm.d.ts.map +1 -0
  89. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm.js +4 -0
  90. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm.js.map +1 -0
  91. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory.d.ts +59 -0
  92. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory.d.ts.map +1 -0
  93. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory.js +4 -0
  94. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory.js.map +1 -0
  95. package/dist/contracts/isms/multisig/{StaticMultisigIsm.d.ts → StaticMultisigIsm.sol/StaticMessageIdMultisigIsm.d.ts} +5 -5
  96. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm.d.ts.map +1 -0
  97. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm.js +4 -0
  98. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm.js.map +1 -0
  99. package/dist/contracts/isms/multisig/{StaticMultisigIsmFactory.d.ts → StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory.d.ts} +5 -5
  100. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory.d.ts.map +1 -0
  101. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory.js +4 -0
  102. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory.js.map +1 -0
  103. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/index.d.ts +6 -0
  104. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/index.d.ts.map +1 -0
  105. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/index.js +3 -0
  106. package/dist/contracts/isms/multisig/StaticMultisigIsm.sol/index.js.map +1 -0
  107. package/dist/contracts/isms/multisig/index.d.ts +4 -2
  108. package/dist/contracts/isms/multisig/index.d.ts.map +1 -1
  109. package/dist/contracts/isms/multisig/index.js +1 -0
  110. package/dist/contracts/isms/multisig/index.js.map +1 -1
  111. package/dist/contracts/isms/native/AbstractNativeISM.d.ts +83 -0
  112. package/dist/contracts/isms/native/AbstractNativeISM.d.ts.map +1 -0
  113. package/dist/contracts/isms/native/AbstractNativeISM.js +4 -0
  114. package/dist/contracts/isms/native/AbstractNativeISM.js.map +1 -0
  115. package/dist/contracts/isms/native/OptimismISM.d.ts +123 -0
  116. package/dist/contracts/isms/native/OptimismISM.d.ts.map +1 -0
  117. package/dist/contracts/isms/native/OptimismISM.js +4 -0
  118. package/dist/contracts/isms/native/OptimismISM.js.map +1 -0
  119. package/dist/contracts/isms/native/index.d.ts +3 -0
  120. package/dist/contracts/isms/native/index.d.ts.map +1 -0
  121. package/dist/contracts/isms/native/index.js +3 -0
  122. package/dist/contracts/isms/native/index.js.map +1 -0
  123. package/dist/factories/@eth-optimism/contracts/index.d.ts +2 -0
  124. package/dist/factories/@eth-optimism/contracts/index.d.ts.map +1 -0
  125. package/dist/factories/@eth-optimism/contracts/index.js +31 -0
  126. package/dist/factories/@eth-optimism/contracts/index.js.map +1 -0
  127. package/dist/factories/@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger__factory.d.ts +43 -0
  128. package/dist/factories/@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger__factory.d.ts.map +1 -0
  129. package/dist/factories/@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger__factory.js +117 -0
  130. package/dist/factories/@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger__factory.js.map +1 -0
  131. package/dist/factories/@eth-optimism/contracts/libraries/bridge/index.d.ts +2 -0
  132. package/dist/factories/@eth-optimism/contracts/libraries/bridge/index.d.ts.map +1 -0
  133. package/dist/factories/@eth-optimism/contracts/libraries/bridge/index.js +9 -0
  134. package/dist/factories/@eth-optimism/contracts/libraries/bridge/index.js.map +1 -0
  135. package/dist/factories/@eth-optimism/contracts/libraries/index.d.ts +2 -0
  136. package/dist/factories/@eth-optimism/contracts/libraries/index.d.ts.map +1 -0
  137. package/dist/factories/@eth-optimism/contracts/libraries/index.js +31 -0
  138. package/dist/factories/@eth-optimism/contracts/libraries/index.js.map +1 -0
  139. package/dist/factories/@eth-optimism/index.d.ts +2 -0
  140. package/dist/factories/@eth-optimism/index.d.ts.map +1 -0
  141. package/dist/factories/@eth-optimism/index.js +31 -0
  142. package/dist/factories/@eth-optimism/index.js.map +1 -0
  143. package/dist/factories/@openzeppelin/contracts/index.d.ts +1 -0
  144. package/dist/factories/@openzeppelin/contracts/index.d.ts.map +1 -1
  145. package/dist/factories/@openzeppelin/contracts/index.js +2 -1
  146. package/dist/factories/@openzeppelin/contracts/index.js.map +1 -1
  147. package/dist/factories/@openzeppelin/contracts/vendor/index.d.ts +2 -0
  148. package/dist/factories/@openzeppelin/contracts/vendor/index.d.ts.map +1 -0
  149. package/dist/factories/@openzeppelin/contracts/vendor/index.js +31 -0
  150. package/dist/factories/@openzeppelin/contracts/vendor/index.js.map +1 -0
  151. package/dist/factories/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger__factory.d.ts +43 -0
  152. package/dist/factories/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger__factory.d.ts.map +1 -0
  153. package/dist/factories/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger__factory.js +117 -0
  154. package/dist/factories/@openzeppelin/contracts/vendor/optimism/ICrossDomainMessenger__factory.js.map +1 -0
  155. package/dist/factories/@openzeppelin/contracts/vendor/optimism/index.d.ts +2 -0
  156. package/dist/factories/@openzeppelin/contracts/vendor/optimism/index.d.ts.map +1 -0
  157. package/dist/factories/@openzeppelin/contracts/vendor/optimism/index.js +9 -0
  158. package/dist/factories/@openzeppelin/contracts/vendor/optimism/index.js.map +1 -0
  159. package/dist/factories/contracts/Mailbox__factory.d.ts +1 -1
  160. package/dist/factories/contracts/Mailbox__factory.js +1 -1
  161. package/dist/factories/contracts/ValidatorAnnounce__factory.d.ts +1 -1
  162. package/dist/factories/contracts/ValidatorAnnounce__factory.js +1 -1
  163. package/dist/factories/contracts/hooks/OptimismMessageHook__factory.d.ts +45 -0
  164. package/dist/factories/contracts/hooks/OptimismMessageHook__factory.d.ts.map +1 -0
  165. package/dist/factories/contracts/hooks/OptimismMessageHook__factory.js +125 -0
  166. package/dist/factories/contracts/hooks/OptimismMessageHook__factory.js.map +1 -0
  167. package/dist/factories/contracts/hooks/index.d.ts +2 -0
  168. package/dist/factories/contracts/hooks/index.d.ts.map +1 -0
  169. package/dist/factories/contracts/hooks/index.js +9 -0
  170. package/dist/factories/contracts/hooks/index.js.map +1 -0
  171. package/dist/factories/contracts/index.d.ts +1 -0
  172. package/dist/factories/contracts/index.d.ts.map +1 -1
  173. package/dist/factories/contracts/index.js +2 -1
  174. package/dist/factories/contracts/index.js.map +1 -1
  175. package/dist/factories/contracts/interfaces/hooks/IMessageHook__factory.d.ts +23 -0
  176. package/dist/factories/contracts/interfaces/hooks/IMessageHook__factory.d.ts.map +1 -0
  177. package/dist/factories/contracts/interfaces/hooks/IMessageHook__factory.js +42 -0
  178. package/dist/factories/contracts/interfaces/hooks/IMessageHook__factory.js.map +1 -0
  179. package/dist/factories/contracts/interfaces/hooks/index.d.ts +2 -0
  180. package/dist/factories/contracts/interfaces/hooks/index.d.ts.map +1 -0
  181. package/dist/factories/contracts/interfaces/hooks/index.js +9 -0
  182. package/dist/factories/contracts/interfaces/hooks/index.js.map +1 -0
  183. package/dist/factories/contracts/interfaces/index.d.ts +1 -0
  184. package/dist/factories/contracts/interfaces/index.d.ts.map +1 -1
  185. package/dist/factories/contracts/interfaces/index.js +2 -1
  186. package/dist/factories/contracts/interfaces/index.js.map +1 -1
  187. package/dist/factories/contracts/isms/aggregation/StaticAggregationIsmFactory__factory.d.ts +1 -1
  188. package/dist/factories/contracts/isms/aggregation/StaticAggregationIsmFactory__factory.js +1 -1
  189. package/dist/factories/contracts/isms/aggregation/StaticAggregationIsm__factory.d.ts +1 -1
  190. package/dist/factories/contracts/isms/aggregation/StaticAggregationIsm__factory.js +1 -1
  191. package/dist/factories/contracts/isms/index.d.ts +1 -0
  192. package/dist/factories/contracts/isms/index.d.ts.map +1 -1
  193. package/dist/factories/contracts/isms/index.js +2 -1
  194. package/dist/factories/contracts/isms/index.js.map +1 -1
  195. package/dist/factories/contracts/isms/multisig/AbstractMerkleRootMultisigIsm__factory.d.ts +23 -0
  196. package/dist/factories/contracts/isms/multisig/AbstractMerkleRootMultisigIsm__factory.d.ts.map +1 -0
  197. package/dist/factories/contracts/isms/multisig/AbstractMerkleRootMultisigIsm__factory.js +79 -0
  198. package/dist/factories/contracts/isms/multisig/AbstractMerkleRootMultisigIsm__factory.js.map +1 -0
  199. package/dist/factories/contracts/isms/multisig/AbstractMessageIdMultisigIsm__factory.d.ts +23 -0
  200. package/dist/factories/contracts/isms/multisig/AbstractMessageIdMultisigIsm__factory.d.ts.map +1 -0
  201. package/dist/factories/contracts/isms/multisig/AbstractMessageIdMultisigIsm__factory.js +79 -0
  202. package/dist/factories/contracts/isms/multisig/AbstractMessageIdMultisigIsm__factory.js.map +1 -0
  203. package/dist/factories/contracts/isms/multisig/LegacyMultisigIsm__factory.d.ts +1 -1
  204. package/dist/factories/contracts/isms/multisig/LegacyMultisigIsm__factory.d.ts.map +1 -1
  205. package/dist/factories/contracts/isms/multisig/LegacyMultisigIsm__factory.js +1 -1
  206. package/dist/factories/contracts/isms/multisig/LegacyMultisigIsm__factory.js.map +1 -1
  207. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm__factory.d.ts +23 -0
  208. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm__factory.d.ts.map +1 -0
  209. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm__factory.js +79 -0
  210. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/AbstractMetaProxyMultisigIsm__factory.js.map +1 -0
  211. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory__factory.d.ts +35 -0
  212. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory__factory.d.ts.map +1 -0
  213. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory__factory.js +89 -0
  214. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsmFactory__factory.js.map +1 -0
  215. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm__factory.d.ts +35 -0
  216. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm__factory.d.ts.map +1 -0
  217. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm__factory.js +102 -0
  218. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMerkleRootMultisigIsm__factory.js.map +1 -0
  219. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory__factory.d.ts +35 -0
  220. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory__factory.d.ts.map +1 -0
  221. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory__factory.js +89 -0
  222. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsmFactory__factory.js.map +1 -0
  223. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm__factory.d.ts +35 -0
  224. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm__factory.d.ts.map +1 -0
  225. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm__factory.js +102 -0
  226. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/StaticMessageIdMultisigIsm__factory.js.map +1 -0
  227. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/index.d.ts +6 -0
  228. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/index.d.ts.map +1 -0
  229. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/index.js +17 -0
  230. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm.sol/index.js.map +1 -0
  231. package/dist/factories/contracts/isms/multisig/index.d.ts +3 -2
  232. package/dist/factories/contracts/isms/multisig/index.d.ts.map +1 -1
  233. package/dist/factories/contracts/isms/multisig/index.js +29 -5
  234. package/dist/factories/contracts/isms/multisig/index.js.map +1 -1
  235. package/dist/factories/contracts/isms/native/AbstractNativeISM__factory.d.ts +36 -0
  236. package/dist/factories/contracts/isms/native/AbstractNativeISM__factory.d.ts.map +1 -0
  237. package/dist/factories/contracts/isms/native/AbstractNativeISM__factory.js +111 -0
  238. package/dist/factories/contracts/isms/native/AbstractNativeISM__factory.js.map +1 -0
  239. package/dist/factories/contracts/isms/native/OptimismISM__factory.d.ts +66 -0
  240. package/dist/factories/contracts/isms/native/OptimismISM__factory.d.ts.map +1 -0
  241. package/dist/factories/contracts/isms/native/OptimismISM__factory.js +194 -0
  242. package/dist/factories/contracts/isms/native/OptimismISM__factory.js.map +1 -0
  243. package/dist/factories/contracts/isms/native/index.d.ts +3 -0
  244. package/dist/factories/contracts/isms/native/index.d.ts.map +1 -0
  245. package/dist/factories/contracts/isms/native/index.js +11 -0
  246. package/dist/factories/contracts/isms/native/index.js.map +1 -0
  247. package/dist/factories/contracts/isms/routing/DomainRoutingIsmFactory__factory.d.ts +1 -1
  248. package/dist/factories/contracts/isms/routing/DomainRoutingIsmFactory__factory.js +1 -1
  249. package/dist/factories/contracts/isms/routing/DomainRoutingIsm__factory.d.ts +1 -1
  250. package/dist/factories/contracts/isms/routing/DomainRoutingIsm__factory.js +1 -1
  251. package/dist/factories/contracts/isms/routing/InterchainAccountIsm__factory.d.ts +1 -1
  252. package/dist/factories/contracts/isms/routing/InterchainAccountIsm__factory.js +1 -1
  253. package/dist/factories/contracts/middleware/InterchainAccountRouter__factory.d.ts +1 -1
  254. package/dist/factories/contracts/middleware/InterchainAccountRouter__factory.js +1 -1
  255. package/dist/factories/contracts/middleware/InterchainQueryRouter__factory.d.ts +1 -1
  256. package/dist/factories/contracts/middleware/InterchainQueryRouter__factory.js +1 -1
  257. package/dist/factories/contracts/middleware/liquidity-layer/LiquidityLayerRouter__factory.d.ts +1 -1
  258. package/dist/factories/contracts/middleware/liquidity-layer/LiquidityLayerRouter__factory.js +1 -1
  259. package/dist/factories/contracts/middleware/liquidity-layer/adapters/CircleBridgeAdapter__factory.d.ts +1 -1
  260. package/dist/factories/contracts/middleware/liquidity-layer/adapters/CircleBridgeAdapter__factory.js +1 -1
  261. package/dist/factories/contracts/middleware/liquidity-layer/adapters/PortalAdapter__factory.d.ts +1 -1
  262. package/dist/factories/contracts/middleware/liquidity-layer/adapters/PortalAdapter__factory.js +1 -1
  263. package/dist/factories/contracts/mock/MockHyperlaneEnvironment__factory.d.ts +1 -1
  264. package/dist/factories/contracts/mock/MockHyperlaneEnvironment__factory.js +1 -1
  265. package/dist/factories/contracts/mock/MockMailbox__factory.d.ts +1 -1
  266. package/dist/factories/contracts/mock/MockMailbox__factory.js +1 -1
  267. package/dist/factories/contracts/test/LightTestRecipient__factory.d.ts +1 -1
  268. package/dist/factories/contracts/test/LightTestRecipient__factory.js +1 -1
  269. package/dist/factories/contracts/test/TestGasRouter__factory.d.ts +1 -1
  270. package/dist/factories/contracts/test/TestGasRouter__factory.js +1 -1
  271. package/dist/factories/contracts/test/TestHyperlaneConnectionClient__factory.d.ts +1 -1
  272. package/dist/factories/contracts/test/TestHyperlaneConnectionClient__factory.js +1 -1
  273. package/dist/factories/contracts/test/TestLegacyMultisigIsm__factory.d.ts +1 -1
  274. package/dist/factories/contracts/test/TestLegacyMultisigIsm__factory.d.ts.map +1 -1
  275. package/dist/factories/contracts/test/TestLegacyMultisigIsm__factory.js +1 -1
  276. package/dist/factories/contracts/test/TestLegacyMultisigIsm__factory.js.map +1 -1
  277. package/dist/factories/contracts/test/TestMailbox__factory.d.ts +1 -1
  278. package/dist/factories/contracts/test/TestMailbox__factory.js +1 -1
  279. package/dist/factories/contracts/test/TestMerkle__factory.d.ts +1 -1
  280. package/dist/factories/contracts/test/TestMerkle__factory.js +1 -1
  281. package/dist/factories/contracts/test/TestMultisigIsm__factory.d.ts +1 -1
  282. package/dist/factories/contracts/test/TestMultisigIsm__factory.js +1 -1
  283. package/dist/factories/contracts/test/TestQuery__factory.d.ts +1 -1
  284. package/dist/factories/contracts/test/TestQuery__factory.js +1 -1
  285. package/dist/factories/contracts/test/TestRecipient__factory.d.ts +1 -1
  286. package/dist/factories/contracts/test/TestRecipient__factory.js +1 -1
  287. package/dist/factories/contracts/test/TestRouter__factory.d.ts +1 -1
  288. package/dist/factories/contracts/test/TestRouter__factory.js +1 -1
  289. package/dist/factories/contracts/test/TestSendReceiver__factory.d.ts +1 -1
  290. package/dist/factories/contracts/test/TestSendReceiver__factory.js +1 -1
  291. package/dist/factories/index.d.ts +1 -0
  292. package/dist/factories/index.d.ts.map +1 -1
  293. package/dist/factories/index.js +2 -1
  294. package/dist/factories/index.js.map +1 -1
  295. package/dist/index.d.ts +26 -4
  296. package/dist/index.d.ts.map +1 -1
  297. package/dist/index.js +27 -6
  298. package/dist/index.js.map +1 -1
  299. package/package.json +6 -6
  300. package/contracts/isms/multisig/StaticMultisigIsmFactory.sol +0 -16
  301. package/dist/contracts/isms/multisig/StaticMultisigIsm.d.ts.map +0 -1
  302. package/dist/contracts/isms/multisig/StaticMultisigIsm.js.map +0 -1
  303. package/dist/contracts/isms/multisig/StaticMultisigIsmFactory.d.ts.map +0 -1
  304. package/dist/contracts/isms/multisig/StaticMultisigIsmFactory.js.map +0 -1
  305. package/dist/factories/contracts/isms/multisig/StaticMultisigIsmFactory__factory.d.ts +0 -35
  306. package/dist/factories/contracts/isms/multisig/StaticMultisigIsmFactory__factory.d.ts.map +0 -1
  307. package/dist/factories/contracts/isms/multisig/StaticMultisigIsmFactory__factory.js +0 -89
  308. package/dist/factories/contracts/isms/multisig/StaticMultisigIsmFactory__factory.js.map +0 -1
  309. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm__factory.d.ts +0 -35
  310. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm__factory.d.ts.map +0 -1
  311. package/dist/factories/contracts/isms/multisig/StaticMultisigIsm__factory.js +0 -102
  312. 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
- UNUSED,
6
+ NULL, // used with relayer carrying no metadata
7
7
  ROUTING,
8
8
  AGGREGATION,
9
9
  LEGACY_MULTISIG,
10
- MULTISIG
10
+ MERKLE_ROOT_MULTISIG,
11
+ MESSAGE_ID_MULTISIG,
12
+ OPTIMISM
11
13
  }
12
14
 
13
15
  /**
@@ -0,0 +1,9 @@
1
+ // SPDX-License-Identifier: MIT OR Apache-2.0
2
+ pragma solidity >=0.8.0;
3
+
4
+ interface IMessageHook {
5
+ function postDispatch(uint32 _destination, bytes32 _messageId)
6
+ external
7
+ payable
8
+ returns (uint256);
9
+ }
@@ -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 Requires that m-of-n validators verify a merkle root,
48
- * and verifies a merkle proof of `_message` against that root.
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 verify(bytes calldata _metadata, bytes calldata _message)
53
- public
45
+ function digest(bytes calldata _metadata, bytes calldata _message)
46
+ internal
54
47
  view
55
- returns (bool)
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 Verifies the merkle proof of `_message` against the provided
66
- * checkpoint.
67
- * @param _metadata ABI encoded module metadata (see MultisigIsmMetadata.sol)
68
- * @param _message Formatted Hyperlane message (see Message.sol).
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 _verifyMerkleProof(
71
- bytes calldata _metadata,
72
- bytes calldata _message
73
- ) internal pure returns (bool) {
74
- // calculate the expected root based on the proof
75
- bytes32 _calculatedRoot = MerkleLib.branchRoot(
76
- Message.id(_message),
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 Verifies that a quorum of the origin domain's validators signed
85
- * the provided checkpoint.
86
- * @param _metadata ABI encoded module metadata (see MultisigIsmMetadata.sol)
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 _verifyValidatorSignatures(
90
- bytes calldata _metadata,
91
- bytes calldata _message
92
- ) internal view returns (bool) {
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
- bytes32 _digest = CheckpointLib.digest(
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 {CheckpointLib} from "../../libs/CheckpointLib.sol";
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 = CheckpointLib.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 {MultisigIsmMetadata} from "../../libs/isms/MultisigIsmMetadata.sol";
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 StaticMultisigIsm
11
- * @notice Manages per-domain m-of-n Validator sets that are used
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 StaticMultisigIsm is AbstractMultisigIsm {
15
- // ============ Public Functions ============
16
-
15
+ abstract contract AbstractMetaProxyMultisigIsm is AbstractMultisigIsm {
17
16
  /**
18
- * @notice Returns the set of validators responsible for verifying _message
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
- view
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
  );